Hi Marc, On 8/22/21 4:44 PM, Marc Zyngier wrote: > Although we probe for the IPA limits imposed by KVM (and the hardware) > when computing the memory map, we still use the old style '0' when > creating a scratch VM in kvm_arm_create_scratch_host_vcpu(). > > On systems that are severely IPA challenged (such as the Apple M1), > this results in a failure as KVM cannot use the default 40bit that > '0' represents. > > Instead, probe for the extension and use the reported IPA limit > if available. > > Cc: Andrew Jones <drjones@xxxxxxxxxx> > Cc: Eric Auger <eric.auger@xxxxxxxxxx> > Cc: Peter Maydell <peter.maydell@xxxxxxxxxx> > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> Reviewed-by: Eric Auger <eric.auger@xxxxxxxxxx> Eric > --- > target/arm/kvm.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index d8381ba224..cc3371a99b 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -70,12 +70,17 @@ bool kvm_arm_create_scratch_host_vcpu(const uint32_t *cpus_to_try, > struct kvm_vcpu_init *init) > { > int ret = 0, kvmfd = -1, vmfd = -1, cpufd = -1; > + int max_vm_pa_size; > > kvmfd = qemu_open_old("/dev/kvm", O_RDWR); > if (kvmfd < 0) { > goto err; > } > - vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0); > + max_vm_pa_size = ioctl(kvmfd, KVM_CHECK_EXTENSION, KVM_CAP_ARM_VM_IPA_SIZE); > + if (max_vm_pa_size < 0) { > + max_vm_pa_size = 0; > + } > + vmfd = ioctl(kvmfd, KVM_CREATE_VM, max_vm_pa_size); > if (vmfd < 0) { > goto err; > }