[PATCH] Add support midr options for arm virt machine

From: Yonggang Luo
Date: Sat Feb 15 2025 - 13:57:44 EST


---
hw/arm/virt.c | 20 ++++++++++++++++++++
include/hw/arm/virt.h | 1 +
target/arm/kvm.c | 21 +++++++++++++++++++++
3 files changed, 42 insertions(+)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 4a5a9666e9..5ba690a70d 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2236,6 +2236,10 @@ static void machvirt_init(MachineState *machine)
object_property_set_int(cpuobj, "mp-affinity",
possible_cpus->cpus[n].arch_id, NULL);

+ if (vms->midr) {
+ object_property_set_int(cpuobj, "midr", vms->midr, NULL);
+ }
+
cs =3D CPU(cpuobj);
cs->cpu_index =3D n;

@@ -3348,6 +3352,17 @@ static const TypeInfo virt_machine_info =3D {
},
};

+static char * virt_get_midr(Object *obj, Error **errp)
+{
+ VirtMachineState *vms =3D VIRT_MACHINE(obj);
+ return g_strdup_printf("0x%08x", vms->midr);
+}
+static void virt_set_midr(Object *obj, const char *value, Error **errp)
+{
+ VirtMachineState *vms =3D VIRT_MACHINE(obj);
+ vms->midr =3D strtoul(value, 0, 0);
+}
+
static void machvirt_machine_init(void)
{
type_register_static(&virt_machine_info);
@@ -3356,6 +3371,11 @@ type_init(machvirt_machine_init);

static void virt_machine_10_0_options(MachineClass *mc)
{
+ ObjectClass *oc =3D &mc->parent_class;
+ object_class_property_add_str(oc, "midr", virt_get_midr,
+ virt_set_midr);
+ object_class_property_set_description(oc, "midr",
+ "Set MDIR value for VIRT machine");
}
DEFINE_VIRT_MACHINE_AS_LATEST(10, 0)

diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index c8e94e6aed..fe200b0d76 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -179,6 +179,7 @@ struct VirtMachineState {
PCIBus *bus;
char *oem_id;
char *oem_table_id;
+ uint32_t midr;
bool ns_el2_virt_timer_irq;
};

diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index da30bdbb23..577eaee505 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -1873,6 +1873,7 @@ static int kvm_arm_sve_set_vls(ARMCPU *cpu)
}

#define ARM_CPU_ID_MPIDR 3, 0, 0, 0, 5
+#define ARM_CPU_ID_MIDR_EL1 3, 0, 0, 0, 0

int kvm_arch_init_vcpu(CPUState *cs)
{
@@ -1920,6 +1921,26 @@ int kvm_arch_init_vcpu(CPUState *cs)
return ret;
}

+ {
+ uint64_t midr =3D cpu->midr;
+ ret =3D kvm_get_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MIDR_EL1), &m=
idr);
+ if (ret) {
+ return ret;
+ }
+ printf("Get MIDR EL1 origin:0x%08x\n", (uint32_t)midr);
+ midr =3D cpu->midr;
+ ret =3D kvm_set_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MIDR_EL1), &m=
idr);
+ printf("Set MIDR EL1:0x%08x\n", (uint32_t)midr);
+ if (ret) {
+ return ret;
+ }
+ ret =3D kvm_get_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MIDR_EL1), &m=
idr);
+ printf("Get MIDR EL1:0x%08x\n", (uint32_t)midr);
+ if (ret) {
+ return ret;
+ }
+ }
+
if (cpu_isar_feature(aa64_sve, cpu)) {
ret =3D kvm_arm_sve_set_vls(cpu);
if (ret) {
--=20
2.47.1.windows.1

```
The TCG running result:
```
/home/lygstate/work/qemu/build:/usr/local/sbin:/usr/local/bin:/usr/sbin:/us=
r/bin:/sbin:/bin
/home/lygstate/work/qemu/build/qemu-system-aarch64
+ qemu-system-aarch64 -cpu cortex-a15 -accel tcg,thread=3Dmulti -m 1024M
-smp 1 -M virt,gic-version=3D3,midr=3D0x412fd050 -nographic -monitor none
-serial stdio -kernel
/home/lygstate/work/debian/arm64-kvm-hello-world/bare-metal-aarch32-qemu/he=
llo_world.elf
Hello World midr:0x412fd050
```
The KVM running result:
```
/home/lygstate/work/qemu/build:/usr/local/sbin:/usr/local/bin:/usr/sbin:/us=
r/bin:/sbin:/bin
/home/lygstate/work/qemu/build/qemu-system-aarch64
+ qemu-system-aarch64 -cpu host,aarch64=3Doff -accel kvm -m 1024M -smp 1
-M virt,gic-version=3D3,midr=3D0x412fd050 -nographic -monitor none -serial
stdio -kernel /home/lygstate/work/debian/arm64-kvm-hello-world/bare-metal-a=
arch32-qemu/hello_world.elf
Get MIDR EL1 origin:0x410fd083
Set MIDR EL1:0x412fd050
Get MIDR EL1:0x412fd050
Hello World midr:0x410fd083
```

According to this, the MIDR EL1 is updated properly, but the MIDR for
aarch32 is not updated, and I don't know how to hook the update for
MIDR for aarch32
--
=E6=AD=A4=E8=87=B4
=E7=A4=BC
=E7=BD=97=E5=8B=87=E5=88=9A
Yours
sincerely,
Yonggang Luo