Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
target/riscv/cpu.c: split kvm prop handling to its own helper
Future patches will split the existing Property arrays even further, and
the existing code in riscv_cpu_add_user_properties() will start to scale
bad with it because it's dealing with KVM constraints mixed in with TCG
constraints. We're going to pay a high price to share a couple of common
lines of code between the two.

Create a new riscv_cpu_add_kvm_properties() that will be forked from
riscv_cpu_add_user_properties() if we're running KVM. The helper
includes all properties that a KVM CPU will add. The rest of
riscv_cpu_add_user_properties() body will then be relieved from having
to deal with KVM constraints.

Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Message-ID: <20230901194627.1214811-4-dbarboza@ventanamicro.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
  • Loading branch information
danielhb authored and alistair23 committed Sep 8, 2023
1 parent 34851d4 commit 425d2ca
Showing 1 changed file with 42 additions and 23 deletions.
65 changes: 42 additions & 23 deletions target/riscv/cpu.c
Expand Up @@ -1943,6 +1943,46 @@ static void cpu_set_cfg_unavailable(Object *obj, Visitor *v,
}
#endif

#ifndef CONFIG_USER_ONLY
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_properties(Object *obj)
{
Property *prop;
DeviceState *dev = DEVICE(obj);

kvm_riscv_init_user_properties(obj);
riscv_cpu_add_misa_properties(obj);

for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {
riscv_cpu_add_kvm_unavail_prop(obj, prop->name);
}

for (int i = 0; i < ARRAY_SIZE(riscv_cpu_options); i++) {
/* Check if KVM created the property already */
if (object_property_find(obj, riscv_cpu_options[i].name)) {
continue;
}
qdev_property_add_static(dev, &riscv_cpu_options[i]);
}
}
#endif

/*
* Add CPU properties with user-facing flags.
*
Expand All @@ -1958,39 +1998,18 @@ static void riscv_cpu_add_user_properties(Object *obj)
riscv_add_satp_mode_properties(obj);

if (kvm_enabled()) {
kvm_riscv_init_user_properties(obj);
riscv_cpu_add_kvm_properties(obj);
return;
}
#endif

riscv_cpu_add_misa_properties(obj);

for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {
#ifndef CONFIG_USER_ONLY
if (kvm_enabled()) {
/* Check if KVM created the property already */
if (object_property_find(obj, prop->name)) {
continue;
}

/*
* 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);
continue;
}
#endif
qdev_property_add_static(dev, prop);
}

for (int i = 0; i < ARRAY_SIZE(riscv_cpu_options); i++) {
/* Check if KVM created the property already */
if (object_property_find(obj, riscv_cpu_options[i].name)) {
continue;
}
qdev_property_add_static(dev, &riscv_cpu_options[i]);
}
}
Expand Down

0 comments on commit 425d2ca

Please sign in to comment.