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; +} 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 -- 2.43.0
