Skip to content

Commit 6b33e0d

Browse files
James MorseMarc Zyngier
authored andcommitted
KVM: arm64: Drop the target_table[] indirection
KVM for 32bit arm had a get/set target mechanism to allow for micro-architecture differences that are visible in system registers to be described. KVM's user-space can query the supported targets for a CPU, and create vCPUs for that target. The target can override the handling of system registers to provide different reset or RES0 behaviour. On 32bit arm this was used to provide different ACTLR reset values for A7 and A15. On 64bit arm, the first few CPUs out of the gate used this mechanism, before it was deemed redundant in commit bca556a ("arm64/kvm: Add generic v8 KVM target"). All future CPUs use the KVM_ARM_TARGET_GENERIC_V8 target. The 64bit target_table[] stuff exists to preserve the ABI to user-space. As all targets registers genericv8_target_table, there is no reason to look the target up. Until we can merge genericv8_target_table with the main sys_regs array, kvm_register_target_sys_reg_table() becomes kvm_check_target_sys_reg_table(), which uses BUG_ON() in keeping with the other callers in this file. Signed-off-by: James Morse <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent b3a9e3b commit 6b33e0d

File tree

4 files changed

+9
-27
lines changed

4 files changed

+9
-27
lines changed

arch/arm64/include/asm/kvm_coproc.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ struct kvm_sys_reg_target_table {
2424
struct kvm_sys_reg_table table32;
2525
};
2626

27-
void kvm_register_target_sys_reg_table(unsigned int target,
28-
struct kvm_sys_reg_target_table *table);
27+
void kvm_check_target_sys_reg_table(struct kvm_sys_reg_target_table *table);
2928

3029
int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
3130
int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);

arch/arm64/kvm/sys_regs.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,27 +2109,19 @@ static int check_sysreg_table(const struct sys_reg_desc *table, unsigned int n,
21092109
return 0;
21102110
}
21112111

2112-
/* Target specific emulation tables */
2113-
static struct kvm_sys_reg_target_table *target_tables[KVM_ARM_NUM_TARGETS];
2114-
2115-
void kvm_register_target_sys_reg_table(unsigned int target,
2116-
struct kvm_sys_reg_target_table *table)
2112+
void kvm_check_target_sys_reg_table(struct kvm_sys_reg_target_table *table)
21172113
{
2118-
if (check_sysreg_table(table->table64.table, table->table64.num, false) ||
2119-
check_sysreg_table(table->table32.table, table->table32.num, true))
2120-
return;
2121-
2122-
target_tables[target] = table;
2114+
BUG_ON(check_sysreg_table(table->table64.table, table->table64.num, false));
2115+
BUG_ON(check_sysreg_table(table->table32.table, table->table32.num, true));
21232116
}
21242117

21252118
/* Get specific register table for this target. */
21262119
static const struct sys_reg_desc *get_target_table(unsigned target,
21272120
bool mode_is_64,
21282121
size_t *num)
21292122
{
2130-
struct kvm_sys_reg_target_table *table;
2123+
struct kvm_sys_reg_target_table *table = &genericv8_target_table;
21312124

2132-
table = target_tables[target];
21332125
if (mode_is_64) {
21342126
*num = table->table64.num;
21352127
return table->table64.table;

arch/arm64/kvm/sys_regs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,6 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
165165
CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)), \
166166
Op2(sys_reg_Op2(reg))
167167

168+
extern struct kvm_sys_reg_target_table genericv8_target_table;
169+
168170
#endif /* __ARM64_KVM_SYS_REGS_LOCAL_H__ */

arch/arm64/kvm/sys_regs_generic_v8.c

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static const struct sys_reg_desc genericv8_cp15_regs[] = {
5959
access_actlr },
6060
};
6161

62-
static struct kvm_sys_reg_target_table genericv8_target_table = {
62+
struct kvm_sys_reg_target_table genericv8_target_table = {
6363
.table64 = {
6464
.table = genericv8_sys_regs,
6565
.num = ARRAY_SIZE(genericv8_sys_regs),
@@ -78,18 +78,7 @@ static int __init sys_reg_genericv8_init(void)
7878
BUG_ON(cmp_sys_reg(&genericv8_sys_regs[i-1],
7979
&genericv8_sys_regs[i]) >= 0);
8080

81-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_AEM_V8,
82-
&genericv8_target_table);
83-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_FOUNDATION_V8,
84-
&genericv8_target_table);
85-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_CORTEX_A53,
86-
&genericv8_target_table);
87-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_CORTEX_A57,
88-
&genericv8_target_table);
89-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_XGENE_POTENZA,
90-
&genericv8_target_table);
91-
kvm_register_target_sys_reg_table(KVM_ARM_TARGET_GENERIC_V8,
92-
&genericv8_target_table);
81+
kvm_check_target_sys_reg_table(&genericv8_target_table);
9382

9483
return 0;
9584
}

0 commit comments

Comments
 (0)