Re: [RFC v1 07/25] target/arm/kvm: Create scratch Realm VM when requested
Mathieu Poirier <[email protected]>
| Newsgroups | org.nongnu.qemu-arm,org.kernel.vger.kvm,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <allFD6P0162v4Dcp@p14s> |
On Mon, Jul 13, 2026 at 03:30:31PM +1000, Gavin Shan wrote: > 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; > Addressed. > > > 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 >