Skip to content

Commit

Permalink
target/riscv/cpu.c: split kvm prop handling to its own helper
Browse files Browse the repository at this point in the history
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
Original file line number Diff line number Diff line change
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.