On 7/8/26 8:42 AM, Mathieu Poirier wrote:
From: Jean-Philippe Brucker <[email protected]>

When a Realm is requested, create a scratch Realm VM by setting bit 8
of the argument given to the KVM_CREATE_VM ioctl().  Bit 7-0 are reserved
for the guest PA size.

Signed-off-by: Jean-Philippe Brucker <[email protected]>
Signed-off-by: Mathieu Poirier <[email protected]>
---
  target/arm/kvm-rme.c  | 8 ++++++++
  target/arm/kvm-stub.c | 5 +++++
  target/arm/kvm.c      | 4 +++-
  target/arm/kvm_arm.h  | 8 ++++++++
  4 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/target/arm/kvm-rme.c b/target/arm/kvm-rme.c
index 90c1d30ba24c..f763d5ed6199 100644
--- a/target/arm/kvm-rme.c
+++ b/target/arm/kvm-rme.c
@@ -99,3 +99,11 @@ void kvm_arm_rme_vcpu_init(ARMCPU *cpu)
cpu->kvm_rme = true;
  }
+
+int kvm_arm_rme_vm_type(void)
+{
+    if (rme_guest) {
+        return KVM_VM_TYPE_ARM_REALM;
+    }
+    return 0;
+}

We had official name for 0, which is KVM_VM_TYPE_ARM_NORMAL. Another question if
it's worthwhile to have this helper since it's equivalent to something as below,
which can be directly applied to the caller.


    int vm_type = (current_machine && current_machine->cgs) ? 
KVM_VM_TYPE_ARM_REALM :
                                                              
KVM_VM_TYPE_ARM_NORMAL;


diff --git a/target/arm/kvm-stub.c b/target/arm/kvm-stub.c
index 4ab6f08637d1..6d52f172c5df 100644
--- a/target/arm/kvm-stub.c
+++ b/target/arm/kvm-stub.c
@@ -129,3 +129,8 @@ void kvm_arm_rme_vcpu_init(ARMCPU *cpu)
  {
      g_assert_not_reached();
  }
+
+int kvm_arm_rme_vm_type(void)
+{
+    g_assert_not_reached();
+}
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 4c212ed0c337..6aa1cd04e484 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -108,6 +108,7 @@ bool kvm_arm_create_scratch_host_vcpu(int *fdarray,
  {
      int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1;
      int max_vm_pa_size;
+    int vm_type;
kvmfd = qemu_open_old("/dev/kvm", O_RDWR);
      if (kvmfd < 0) {
@@ -117,8 +118,9 @@ bool kvm_arm_create_scratch_host_vcpu(int *fdarray,
      if (max_vm_pa_size < 0) {
          max_vm_pa_size = 0;
      }
+    vm_type = kvm_arm_rme_vm_type();
      do {
-        vmfd = ioctl(kvmfd, KVM_CREATE_VM, max_vm_pa_size);
+        vmfd = ioctl(kvmfd, KVM_CREATE_VM, max_vm_pa_size | vm_type);
      } while (vmfd == -1 && errno == EINTR);
      if (vmfd < 0) {
          goto err;
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
index 12ed1eee18b4..65ec1b970606 100644
--- a/target/arm/kvm_arm.h
+++ b/target/arm/kvm_arm.h
@@ -259,4 +259,12 @@ int kvm_arm_rme_init(MachineState *ms, KVMState *s);
   */
  void kvm_arm_rme_vcpu_init(ARMCPU *cpu);
+/**
+ * kvm_arm_rme_vm_type
+ * @ms: the machine state
+ *
+ * Returns the Realm KVM VM type if the user requested a Realm, 0 otherwise.
+ */
+int kvm_arm_rme_vm_type(void);
+
  #endif

Thanks,
Gavin


Reply via email to