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
>