KVM: arm64: Remove the target table
Finally, remove the target table. Merge the code that checks the tables into kvm_reset_sys_regs() as there is now only one table. Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20200622113317.20477-6-james.morse@arm.com
This commit is contained in:
parent
dcaffa7bf9
commit
750ed56693
@ -19,13 +19,6 @@ struct kvm_sys_reg_table {
|
|||||||
size_t num;
|
size_t num;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct kvm_sys_reg_target_table {
|
|
||||||
struct kvm_sys_reg_table table64;
|
|
||||||
struct kvm_sys_reg_table table32;
|
|
||||||
};
|
|
||||||
|
|
||||||
void kvm_check_target_sys_reg_table(struct kvm_sys_reg_target_table *table);
|
|
||||||
|
|
||||||
int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
int kvm_handle_cp14_load_store(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
||||||
int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
int kvm_handle_cp14_32(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
||||||
int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
int kvm_handle_cp14_64(struct kvm_vcpu *vcpu, struct kvm_run *run);
|
||||||
|
@ -14,7 +14,7 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \
|
|||||||
$(KVM)/vfio.o $(KVM)/irqchip.o \
|
$(KVM)/vfio.o $(KVM)/irqchip.o \
|
||||||
arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
|
arm.o mmu.o mmio.o psci.o perf.o hypercalls.o pvtime.o \
|
||||||
inject_fault.o regmap.o va_layout.o hyp.o hyp-init.o handle_exit.o \
|
inject_fault.o regmap.o va_layout.o hyp.o hyp-init.o handle_exit.o \
|
||||||
guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o \
|
guest.o debug.o reset.o sys_regs.o \
|
||||||
vgic-sys-reg-v3.o fpsimd.o pmu.o \
|
vgic-sys-reg-v3.o fpsimd.o pmu.o \
|
||||||
aarch32.o arch_timer.o \
|
aarch32.o arch_timer.o \
|
||||||
vgic/vgic.o vgic/vgic-init.o \
|
vgic/vgic.o vgic/vgic-init.o \
|
||||||
|
@ -2137,28 +2137,6 @@ static int check_sysreg_table(const struct sys_reg_desc *table, unsigned int n,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_check_target_sys_reg_table(struct kvm_sys_reg_target_table *table)
|
|
||||||
{
|
|
||||||
BUG_ON(check_sysreg_table(table->table64.table, table->table64.num, false));
|
|
||||||
BUG_ON(check_sysreg_table(table->table32.table, table->table32.num, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get specific register table for this target. */
|
|
||||||
static const struct sys_reg_desc *get_target_table(unsigned target,
|
|
||||||
bool mode_is_64,
|
|
||||||
size_t *num)
|
|
||||||
{
|
|
||||||
struct kvm_sys_reg_target_table *table = &genericv8_target_table;
|
|
||||||
|
|
||||||
if (mode_is_64) {
|
|
||||||
*num = table->table64.num;
|
|
||||||
return table->table64.table;
|
|
||||||
} else {
|
|
||||||
*num = table->table32.num;
|
|
||||||
return table->table32.table;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int match_sys_reg(const void *key, const void *elt)
|
static int match_sys_reg(const void *key, const void *elt)
|
||||||
{
|
{
|
||||||
const unsigned long pval = (unsigned long)key;
|
const unsigned long pval = (unsigned long)key;
|
||||||
@ -2393,14 +2371,20 @@ static int emulate_sys_reg(struct kvm_vcpu *vcpu,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset_sys_reg_descs(struct kvm_vcpu *vcpu,
|
/**
|
||||||
const struct sys_reg_desc *table, size_t num)
|
* kvm_reset_sys_regs - sets system registers to reset value
|
||||||
|
* @vcpu: The VCPU pointer
|
||||||
|
*
|
||||||
|
* This function finds the right table above and sets the registers on the
|
||||||
|
* virtual CPU struct to their architecturally defined reset values.
|
||||||
|
*/
|
||||||
|
void kvm_reset_sys_regs(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
|
||||||
for (i = 0; i < num; i++)
|
for (i = 0; i < ARRAY_SIZE(sys_reg_descs); i++)
|
||||||
if (table[i].reset)
|
if (sys_reg_descs[i].reset)
|
||||||
table[i].reset(vcpu, &table[i]);
|
sys_reg_descs[i].reset(vcpu, &sys_reg_descs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2869,22 +2853,3 @@ void kvm_sys_reg_table_init(void)
|
|||||||
/* Clear all higher bits. */
|
/* Clear all higher bits. */
|
||||||
cache_levels &= (1 << (i*3))-1;
|
cache_levels &= (1 << (i*3))-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* kvm_reset_sys_regs - sets system registers to reset value
|
|
||||||
* @vcpu: The VCPU pointer
|
|
||||||
*
|
|
||||||
* This function finds the right table above and sets the registers on the
|
|
||||||
* virtual CPU struct to their architecturally defined reset values.
|
|
||||||
*/
|
|
||||||
void kvm_reset_sys_regs(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
size_t num;
|
|
||||||
const struct sys_reg_desc *table;
|
|
||||||
|
|
||||||
/* Generic chip reset first (so target could override). */
|
|
||||||
reset_sys_reg_descs(vcpu, sys_reg_descs, ARRAY_SIZE(sys_reg_descs));
|
|
||||||
|
|
||||||
table = get_target_table(vcpu->arch.target, true, &num);
|
|
||||||
reset_sys_reg_descs(vcpu, table, num);
|
|
||||||
}
|
|
||||||
|
@ -165,6 +165,4 @@ const struct sys_reg_desc *find_reg_by_id(u64 id,
|
|||||||
CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)), \
|
CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)), \
|
||||||
Op2(sys_reg_Op2(reg))
|
Op2(sys_reg_Op2(reg))
|
||||||
|
|
||||||
extern struct kvm_sys_reg_target_table genericv8_target_table;
|
|
||||||
|
|
||||||
#endif /* __ARM64_KVM_SYS_REGS_LOCAL_H__ */
|
#endif /* __ARM64_KVM_SYS_REGS_LOCAL_H__ */
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2012,2013 - ARM Ltd
|
|
||||||
* Author: Marc Zyngier <marc.zyngier@arm.com>
|
|
||||||
*
|
|
||||||
* Based on arch/arm/kvm/coproc_a15.c:
|
|
||||||
* Copyright (C) 2012 - Virtual Open Systems and Columbia University
|
|
||||||
* Authors: Rusty Russell <rusty@rustcorp.au>
|
|
||||||
* Christoffer Dall <c.dall@virtualopensystems.com>
|
|
||||||
*/
|
|
||||||
#include <linux/kvm_host.h>
|
|
||||||
#include <asm/cputype.h>
|
|
||||||
#include <asm/kvm_arm.h>
|
|
||||||
#include <asm/kvm_asm.h>
|
|
||||||
#include <asm/kvm_emulate.h>
|
|
||||||
#include <asm/kvm_coproc.h>
|
|
||||||
#include <asm/sysreg.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include "sys_regs.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Implementation specific sys-reg registers.
|
|
||||||
* Important: Must be sorted ascending by Op0, Op1, CRn, CRm, Op2
|
|
||||||
*/
|
|
||||||
static const struct sys_reg_desc genericv8_sys_regs[] = {
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct sys_reg_desc genericv8_cp15_regs[] = {
|
|
||||||
};
|
|
||||||
|
|
||||||
struct kvm_sys_reg_target_table genericv8_target_table = {
|
|
||||||
.table64 = {
|
|
||||||
.table = genericv8_sys_regs,
|
|
||||||
.num = ARRAY_SIZE(genericv8_sys_regs),
|
|
||||||
},
|
|
||||||
.table32 = {
|
|
||||||
.table = genericv8_cp15_regs,
|
|
||||||
.num = ARRAY_SIZE(genericv8_cp15_regs),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init sys_reg_genericv8_init(void)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 1; i < ARRAY_SIZE(genericv8_sys_regs); i++)
|
|
||||||
BUG_ON(cmp_sys_reg(&genericv8_sys_regs[i-1],
|
|
||||||
&genericv8_sys_regs[i]) >= 0);
|
|
||||||
|
|
||||||
kvm_check_target_sys_reg_table(&genericv8_target_table);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
late_initcall(sys_reg_genericv8_init);
|
|
Loading…
x
Reference in New Issue
Block a user