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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.