mirror of https://github.com/xemu-project/xemu.git
target/riscv: move riscv_cpu_add_kvm_properties() to kvm.c
We'll introduce the KVM accelerator class with a 'cpu_instance_init' implementation that is going to be invoked during the common riscv_cpu_post_init() (via accel_cpu_instance_init()). This instance_init will execute KVM exclusive code that TCG doesn't care about, such as adding KVM specific properties, initing registers using a KVM scratch CPU and so on. The core of the forementioned cpu_instance_init impl is the current riscv_cpu_add_kvm_properties() that is being used by the common code via riscv_cpu_add_user_properties() in cpu.c. Move it to kvm.c, together will all the relevant artifacts, exporting and renaming it to kvm_riscv_cpu_add_kvm_properties() so cpu.c can keep using it for now. To make this work we'll need to export riscv_cpu_extensions, riscv_cpu_vendor_exts and riscv_cpu_experimental_exts from cpu.c as well. The TCG accelerator will also need to access those in the near future so this export will benefit us in the long run. Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> Reviewed-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20230925175709.35696-9-dbarboza@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
ec34cd732c
commit
32fa177604
|
@ -1366,7 +1366,7 @@ static RISCVCPUMisaExtConfig misa_ext_cfgs[] = {
|
||||||
* change MISA bits during realize() (RVG enables MISA
|
* change MISA bits during realize() (RVG enables MISA
|
||||||
* bits but the user is warned about it).
|
* bits but the user is warned about it).
|
||||||
*/
|
*/
|
||||||
static void riscv_cpu_add_misa_properties(Object *cpu_obj)
|
void riscv_cpu_add_misa_properties(Object *cpu_obj)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -1393,17 +1393,11 @@ static void riscv_cpu_add_misa_properties(Object *cpu_obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct RISCVCPUMultiExtConfig {
|
|
||||||
const char *name;
|
|
||||||
uint32_t offset;
|
|
||||||
bool enabled;
|
|
||||||
} RISCVCPUMultiExtConfig;
|
|
||||||
|
|
||||||
#define MULTI_EXT_CFG_BOOL(_name, _prop, _defval) \
|
#define MULTI_EXT_CFG_BOOL(_name, _prop, _defval) \
|
||||||
{.name = _name, .offset = CPU_CFG_OFFSET(_prop), \
|
{.name = _name, .offset = CPU_CFG_OFFSET(_prop), \
|
||||||
.enabled = _defval}
|
.enabled = _defval}
|
||||||
|
|
||||||
static const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
|
const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
|
||||||
/* Defaults for standard extensions */
|
/* Defaults for standard extensions */
|
||||||
MULTI_EXT_CFG_BOOL("sscofpmf", ext_sscofpmf, false),
|
MULTI_EXT_CFG_BOOL("sscofpmf", ext_sscofpmf, false),
|
||||||
MULTI_EXT_CFG_BOOL("Zifencei", ext_ifencei, true),
|
MULTI_EXT_CFG_BOOL("Zifencei", ext_ifencei, true),
|
||||||
|
@ -1465,7 +1459,7 @@ static const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = {
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = {
|
const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = {
|
||||||
MULTI_EXT_CFG_BOOL("xtheadba", ext_xtheadba, false),
|
MULTI_EXT_CFG_BOOL("xtheadba", ext_xtheadba, false),
|
||||||
MULTI_EXT_CFG_BOOL("xtheadbb", ext_xtheadbb, false),
|
MULTI_EXT_CFG_BOOL("xtheadbb", ext_xtheadbb, false),
|
||||||
MULTI_EXT_CFG_BOOL("xtheadbs", ext_xtheadbs, false),
|
MULTI_EXT_CFG_BOOL("xtheadbs", ext_xtheadbs, false),
|
||||||
|
@ -1483,7 +1477,7 @@ static const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* These are experimental so mark with 'x-' */
|
/* These are experimental so mark with 'x-' */
|
||||||
static const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
|
const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
|
||||||
/* ePMP 0.9.3 */
|
/* ePMP 0.9.3 */
|
||||||
MULTI_EXT_CFG_BOOL("x-epmp", epmp, false),
|
MULTI_EXT_CFG_BOOL("x-epmp", epmp, false),
|
||||||
MULTI_EXT_CFG_BOOL("x-smaia", ext_smaia, false),
|
MULTI_EXT_CFG_BOOL("x-smaia", ext_smaia, false),
|
||||||
|
@ -1509,7 +1503,7 @@ static const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = {
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property riscv_cpu_options[] = {
|
Property riscv_cpu_options[] = {
|
||||||
DEFINE_PROP_UINT8("pmu-num", RISCVCPU, cfg.pmu_num, 16),
|
DEFINE_PROP_UINT8("pmu-num", RISCVCPU, cfg.pmu_num, 16),
|
||||||
|
|
||||||
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
|
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
|
||||||
|
@ -1582,75 +1576,6 @@ static void riscv_cpu_add_multiext_prop_array(Object *obj,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KVM
|
|
||||||
static void cpu_set_cfg_unavailable(Object *obj, Visitor *v,
|
|
||||||
const char *name,
|
|
||||||
void *opaque, Error **errp)
|
|
||||||
{
|
|
||||||
const char *propname = opaque;
|
|
||||||
bool value;
|
|
||||||
|
|
||||||
if (!visit_type_bool(v, name, &value, errp)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value) {
|
|
||||||
error_setg(errp, "extension %s is not available with KVM",
|
|
||||||
propname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void riscv_cpu_add_kvm_unavail_prop(Object *obj, const char *prop_name)
|
|
||||||
{
|
|
||||||
/* Check if KVM created the property already */
|
|
||||||
if (object_property_find(obj, prop_name)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the default to disabled for every extension
|
|
||||||
* unknown to KVM and error out if the user attempts
|
|
||||||
* to enable any of them.
|
|
||||||
*/
|
|
||||||
object_property_add(obj, prop_name, "bool",
|
|
||||||
NULL, cpu_set_cfg_unavailable,
|
|
||||||
NULL, (void *)prop_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void riscv_cpu_add_kvm_unavail_prop_array(Object *obj,
|
|
||||||
const RISCVCPUMultiExtConfig *array)
|
|
||||||
{
|
|
||||||
const RISCVCPUMultiExtConfig *prop;
|
|
||||||
|
|
||||||
g_assert(array);
|
|
||||||
|
|
||||||
for (prop = array; prop && prop->name; prop++) {
|
|
||||||
riscv_cpu_add_kvm_unavail_prop(obj, prop->name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void kvm_riscv_cpu_add_kvm_properties(Object *obj)
|
|
||||||
{
|
|
||||||
Property *prop;
|
|
||||||
DeviceState *dev = DEVICE(obj);
|
|
||||||
|
|
||||||
kvm_riscv_init_user_properties(obj);
|
|
||||||
riscv_cpu_add_misa_properties(obj);
|
|
||||||
|
|
||||||
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_extensions);
|
|
||||||
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_vendor_exts);
|
|
||||||
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_experimental_exts);
|
|
||||||
|
|
||||||
for (prop = riscv_cpu_options; prop && prop->name; prop++) {
|
|
||||||
/* Check if KVM created the property already */
|
|
||||||
if (object_property_find(obj, prop->name)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
qdev_property_add_static(dev, prop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add CPU properties with user-facing flags.
|
* Add CPU properties with user-facing flags.
|
||||||
*
|
*
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "hw/core/cpu.h"
|
#include "hw/core/cpu.h"
|
||||||
#include "hw/registerfields.h"
|
#include "hw/registerfields.h"
|
||||||
|
#include "hw/qdev-properties.h"
|
||||||
#include "exec/cpu-defs.h"
|
#include "exec/cpu-defs.h"
|
||||||
#include "qemu/cpu-float.h"
|
#include "qemu/cpu-float.h"
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
|
@ -713,6 +714,19 @@ bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset);
|
||||||
int cpu_cfg_ext_get_min_version(uint32_t ext_offset);
|
int cpu_cfg_ext_get_min_version(uint32_t ext_offset);
|
||||||
void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu);
|
void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu);
|
||||||
|
|
||||||
|
typedef struct RISCVCPUMultiExtConfig {
|
||||||
|
const char *name;
|
||||||
|
uint32_t offset;
|
||||||
|
bool enabled;
|
||||||
|
} RISCVCPUMultiExtConfig;
|
||||||
|
|
||||||
|
extern const RISCVCPUMultiExtConfig riscv_cpu_extensions[];
|
||||||
|
extern const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[];
|
||||||
|
extern const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[];
|
||||||
|
extern Property riscv_cpu_options[];
|
||||||
|
|
||||||
|
void riscv_cpu_add_misa_properties(Object *cpu_obj);
|
||||||
|
|
||||||
/* CSR function table */
|
/* CSR function table */
|
||||||
extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE];
|
extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE];
|
||||||
|
|
||||||
|
|
|
@ -345,6 +345,52 @@ static void kvm_riscv_update_cpu_cfg_isa_ext(RISCVCPU *cpu, CPUState *cs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cpu_set_cfg_unavailable(Object *obj, Visitor *v,
|
||||||
|
const char *name,
|
||||||
|
void *opaque, Error **errp)
|
||||||
|
{
|
||||||
|
const char *propname = opaque;
|
||||||
|
bool value;
|
||||||
|
|
||||||
|
if (!visit_type_bool(v, name, &value, errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
error_setg(errp, "extension %s is not available with KVM",
|
||||||
|
propname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void riscv_cpu_add_kvm_unavail_prop(Object *obj, const char *prop_name)
|
||||||
|
{
|
||||||
|
/* Check if KVM created the property already */
|
||||||
|
if (object_property_find(obj, prop_name)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the default to disabled for every extension
|
||||||
|
* unknown to KVM and error out if the user attempts
|
||||||
|
* to enable any of them.
|
||||||
|
*/
|
||||||
|
object_property_add(obj, prop_name, "bool",
|
||||||
|
NULL, cpu_set_cfg_unavailable,
|
||||||
|
NULL, (void *)prop_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void riscv_cpu_add_kvm_unavail_prop_array(Object *obj,
|
||||||
|
const RISCVCPUMultiExtConfig *array)
|
||||||
|
{
|
||||||
|
const RISCVCPUMultiExtConfig *prop;
|
||||||
|
|
||||||
|
g_assert(array);
|
||||||
|
|
||||||
|
for (prop = array; prop && prop->name; prop++) {
|
||||||
|
riscv_cpu_add_kvm_unavail_prop(obj, prop->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
|
static void kvm_riscv_add_cpu_user_properties(Object *cpu_obj)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -754,7 +800,7 @@ static void kvm_riscv_init_multiext_cfg(RISCVCPU *cpu, KVMScratchCPU *kvmcpu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_riscv_init_user_properties(Object *cpu_obj)
|
static void riscv_init_user_properties(Object *cpu_obj)
|
||||||
{
|
{
|
||||||
RISCVCPU *cpu = RISCV_CPU(cpu_obj);
|
RISCVCPU *cpu = RISCV_CPU(cpu_obj);
|
||||||
KVMScratchCPU kvmcpu;
|
KVMScratchCPU kvmcpu;
|
||||||
|
@ -1272,6 +1318,26 @@ void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
|
||||||
kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled();
|
kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvm_riscv_cpu_add_kvm_properties(Object *obj)
|
||||||
|
{
|
||||||
|
DeviceState *dev = DEVICE(obj);
|
||||||
|
|
||||||
|
riscv_init_user_properties(obj);
|
||||||
|
riscv_cpu_add_misa_properties(obj);
|
||||||
|
|
||||||
|
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_extensions);
|
||||||
|
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_vendor_exts);
|
||||||
|
riscv_cpu_add_kvm_unavail_prop_array(obj, riscv_cpu_experimental_exts);
|
||||||
|
|
||||||
|
for (Property *prop = riscv_cpu_options; prop && prop->name; prop++) {
|
||||||
|
/* Check if KVM created the property already */
|
||||||
|
if (object_property_find(obj, prop->name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
qdev_property_add_static(dev, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void riscv_host_cpu_init(Object *obj)
|
static void riscv_host_cpu_init(Object *obj)
|
||||||
{
|
{
|
||||||
CPURISCVState *env = &RISCV_CPU(obj)->env;
|
CPURISCVState *env = &RISCV_CPU(obj)->env;
|
||||||
|
|
|
@ -19,10 +19,7 @@
|
||||||
#ifndef QEMU_KVM_RISCV_H
|
#ifndef QEMU_KVM_RISCV_H
|
||||||
#define QEMU_KVM_RISCV_H
|
#define QEMU_KVM_RISCV_H
|
||||||
|
|
||||||
/* Temporarily implemented in cpu.c */
|
|
||||||
void kvm_riscv_cpu_add_kvm_properties(Object *obj);
|
void kvm_riscv_cpu_add_kvm_properties(Object *obj);
|
||||||
|
|
||||||
void kvm_riscv_init_user_properties(Object *cpu_obj);
|
|
||||||
void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
|
void kvm_riscv_reset_vcpu(RISCVCPU *cpu);
|
||||||
void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
|
void kvm_riscv_set_irq(RISCVCPU *cpu, int irq, int level);
|
||||||
void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
|
void kvm_riscv_aia_create(MachineState *machine, uint64_t group_shift,
|
||||||
|
|
Loading…
Reference in New Issue