diff mbox series

[PATCH/RFC] KVM: selftests: introduce P44V64 for z196 and EC12

Message ID 20210701153853.33063-1-borntraeger@de.ibm.com (mailing list archive)
State New, archived
Headers show
Series [PATCH/RFC] KVM: selftests: introduce P44V64 for z196 and EC12 | expand

Commit Message

Christian Borntraeger July 1, 2021, 3:38 p.m. UTC
Older machines likes z196 and zEC12 do only support 44 bits of physical
addresses. Make this the default and check via IBC if we are on a later
machine. We then add P47V64 as an additional model.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
---
 tools/testing/selftests/kvm/include/kvm_util.h |  3 ++-
 tools/testing/selftests/kvm/lib/guest_modes.c  | 16 ++++++++++++++++
 tools/testing/selftests/kvm/lib/kvm_util.c     |  5 +++++
 3 files changed, 23 insertions(+), 1 deletion(-)

Comments

David Hildenbrand July 5, 2021, 9:53 a.m. UTC | #1
On 01.07.21 17:38, Christian Borntraeger wrote:
> Older machines likes z196 and zEC12 do only support 44 bits of physical
> addresses. Make this the default and check via IBC if we are on a later
> machine. We then add P47V64 as an additional model.
> 
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")

[...]

> +#ifdef __s390x__
> +	{
> +		int kvm_fd, vm_fd;
> +		struct kvm_s390_vm_cpu_processor info;
> +
> +		kvm_fd = open_kvm_dev_path_or_exit();
> +		vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
> +		kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
> +				  KVM_S390_VM_CPU_PROCESSOR, &info, false);

Can we always assume to run on a kernel where this won't fail?

> +		close(vm_fd);
> +		close(kvm_fd);
> +		/* Starting with z13 we have 47bits of physical address */

This matches the definition in the QEMU cpu models.

> +		if (info.ibc >= 0x30)
> +			guest_mode_append(VM_MODE_P47V64_4K, true, true);
> +	}
> +#endif


In general, LGTM
Christian Borntraeger July 5, 2021, 9:59 a.m. UTC | #2
On 05.07.21 11:53, David Hildenbrand wrote:
> On 01.07.21 17:38, Christian Borntraeger wrote:
>> Older machines likes z196 and zEC12 do only support 44 bits of physical
>> addresses. Make this the default and check via IBC if we are on a later
>> machine. We then add P47V64 as an additional model.
>>
>> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
>> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
> 
> [...]
> 
>> +#ifdef __s390x__
>> +    {
>> +        int kvm_fd, vm_fd;
>> +        struct kvm_s390_vm_cpu_processor info;
>> +
>> +        kvm_fd = open_kvm_dev_path_or_exit();
>> +        vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
>> +        kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
>> +                  KVM_S390_VM_CPU_PROCESSOR, &info, false);
> 
> Can we always assume to run on a kernel where this won't fail?

As far as I can tell, the selftests are bundled with a given kernel (and
there it should not fail). I guess most selftests will fail with a 3.x
kernel and we do not care?
> 
>> +        close(vm_fd);
>> +        close(kvm_fd);
>> +        /* Starting with z13 we have 47bits of physical address */
> 
> This matches the definition in the QEMU cpu models.
> 
>> +        if (info.ibc >= 0x30)
>> +            guest_mode_append(VM_MODE_P47V64_4K, true, true);
>> +    }
>> +#endif
> 
> 
> In general, LGTM
> 
>
David Hildenbrand July 5, 2021, 10:05 a.m. UTC | #3
On 05.07.21 11:59, Christian Borntraeger wrote:
> 
> 
> On 05.07.21 11:53, David Hildenbrand wrote:
>> On 01.07.21 17:38, Christian Borntraeger wrote:
>>> Older machines likes z196 and zEC12 do only support 44 bits of physical
>>> addresses. Make this the default and check via IBC if we are on a later
>>> machine. We then add P47V64 as an additional model.
>>>
>>> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
>>> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
>>
>> [...]
>>
>>> +#ifdef __s390x__
>>> +    {
>>> +        int kvm_fd, vm_fd;
>>> +        struct kvm_s390_vm_cpu_processor info;
>>> +
>>> +        kvm_fd = open_kvm_dev_path_or_exit();
>>> +        vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
>>> +        kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
>>> +                  KVM_S390_VM_CPU_PROCESSOR, &info, false);
>>
>> Can we always assume to run on a kernel where this won't fail?
> 
> As far as I can tell, the selftests are bundled with a given kernel (and
> there it should not fail). I guess most selftests will fail with a 3.x
> kernel and we do not care?

Fair enough

Reviewed-by: David Hildenbrand <david@redhat.com>
Thomas Huth July 5, 2021, 10:16 a.m. UTC | #4
On 01/07/2021 17.38, Christian Borntraeger wrote:
> Older machines likes z196 and zEC12 do only support 44 bits of physical
> addresses. Make this the default and check via IBC if we are on a later
> machine. We then add P47V64 as an additional model.
> 
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
> ---
>   tools/testing/selftests/kvm/include/kvm_util.h |  3 ++-
>   tools/testing/selftests/kvm/lib/guest_modes.c  | 16 ++++++++++++++++
>   tools/testing/selftests/kvm/lib/kvm_util.c     |  5 +++++
>   3 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 35739567189e..74d73532fce9 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -44,6 +44,7 @@ enum vm_guest_mode {
>   	VM_MODE_P40V48_64K,
>   	VM_MODE_PXXV48_4K,	/* For 48bits VA but ANY bits PA */
>   	VM_MODE_P47V64_4K,
> +	VM_MODE_P44V64_4K,
>   	NUM_VM_MODES,
>   };
>   
> @@ -61,7 +62,7 @@ enum vm_guest_mode {
>   
>   #elif defined(__s390x__)
>   
> -#define VM_MODE_DEFAULT			VM_MODE_P47V64_4K
> +#define VM_MODE_DEFAULT			VM_MODE_P44V64_4K
>   #define MIN_PAGE_SHIFT			12U
>   #define ptes_per_page(page_size)	((page_size) / 16)
>   
> diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
> index 25bff307c71f..c330f414ef96 100644
> --- a/tools/testing/selftests/kvm/lib/guest_modes.c
> +++ b/tools/testing/selftests/kvm/lib/guest_modes.c
> @@ -22,6 +22,22 @@ void guest_modes_append_default(void)
>   		}
>   	}
>   #endif
> +#ifdef __s390x__
> +	{
> +		int kvm_fd, vm_fd;
> +		struct kvm_s390_vm_cpu_processor info;
> +
> +		kvm_fd = open_kvm_dev_path_or_exit();
> +		vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
> +		kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
> +				  KVM_S390_VM_CPU_PROCESSOR, &info, false);
> +		close(vm_fd);
> +		close(kvm_fd);
> +		/* Starting with z13 we have 47bits of physical address */
> +		if (info.ibc >= 0x30)
> +			guest_mode_append(VM_MODE_P47V64_4K, true, true);

Wouldn't it make more sense to check the processor number in /proc/cpuinfo? 
... well, I guess both ways of checking have their advantages and 
disadvantages, so anyway:

Reviewed-by: Thomas Huth <thuth@redhat.com>
Cornelia Huck July 5, 2021, 10:34 a.m. UTC | #5
On Thu, Jul 01 2021, Christian Borntraeger <borntraeger@de.ibm.com> wrote:

> Older machines likes z196 and zEC12 do only support 44 bits of physical

s/likes/like/

> addresses. Make this the default and check via IBC if we are on a later
> machine. We then add P47V64 as an additional model.
>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
> ---
>  tools/testing/selftests/kvm/include/kvm_util.h |  3 ++-
>  tools/testing/selftests/kvm/lib/guest_modes.c  | 16 ++++++++++++++++
>  tools/testing/selftests/kvm/lib/kvm_util.c     |  5 +++++
>  3 files changed, 23 insertions(+), 1 deletion(-)
>

Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Christian Borntraeger July 6, 2021, 7:40 a.m. UTC | #6
Paolo,

since you have not yet pulled my queue for 5.14. Shall I add the two selftest patches and send a new
pull request?

On 01.07.21 17:38, Christian Borntraeger wrote:
> Older machines likes z196 and zEC12 do only support 44 bits of physical
> addresses. Make this the default and check via IBC if we are on a later
> machine. We then add P47V64 as an additional model.
> 
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
> ---
>   tools/testing/selftests/kvm/include/kvm_util.h |  3 ++-
>   tools/testing/selftests/kvm/lib/guest_modes.c  | 16 ++++++++++++++++
>   tools/testing/selftests/kvm/lib/kvm_util.c     |  5 +++++
>   3 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
> index 35739567189e..74d73532fce9 100644
> --- a/tools/testing/selftests/kvm/include/kvm_util.h
> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
> @@ -44,6 +44,7 @@ enum vm_guest_mode {
>   	VM_MODE_P40V48_64K,
>   	VM_MODE_PXXV48_4K,	/* For 48bits VA but ANY bits PA */
>   	VM_MODE_P47V64_4K,
> +	VM_MODE_P44V64_4K,
>   	NUM_VM_MODES,
>   };
>   
> @@ -61,7 +62,7 @@ enum vm_guest_mode {
>   
>   #elif defined(__s390x__)
>   
> -#define VM_MODE_DEFAULT			VM_MODE_P47V64_4K
> +#define VM_MODE_DEFAULT			VM_MODE_P44V64_4K
>   #define MIN_PAGE_SHIFT			12U
>   #define ptes_per_page(page_size)	((page_size) / 16)
>   
> diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
> index 25bff307c71f..c330f414ef96 100644
> --- a/tools/testing/selftests/kvm/lib/guest_modes.c
> +++ b/tools/testing/selftests/kvm/lib/guest_modes.c
> @@ -22,6 +22,22 @@ void guest_modes_append_default(void)
>   		}
>   	}
>   #endif
> +#ifdef __s390x__
> +	{
> +		int kvm_fd, vm_fd;
> +		struct kvm_s390_vm_cpu_processor info;
> +
> +		kvm_fd = open_kvm_dev_path_or_exit();
> +		vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
> +		kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
> +				  KVM_S390_VM_CPU_PROCESSOR, &info, false);
> +		close(vm_fd);
> +		close(kvm_fd);
> +		/* Starting with z13 we have 47bits of physical address */
> +		if (info.ibc >= 0x30)
> +			guest_mode_append(VM_MODE_P47V64_4K, true, true);
> +	}
> +#endif
>   }
>   
>   void for_each_guest_mode(void (*func)(enum vm_guest_mode, void *), void *arg)
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index a2b732cf96ea..8606000c439e 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -176,6 +176,7 @@ const char *vm_guest_mode_string(uint32_t i)
>   		[VM_MODE_P40V48_64K]	= "PA-bits:40,  VA-bits:48, 64K pages",
>   		[VM_MODE_PXXV48_4K]	= "PA-bits:ANY, VA-bits:48,  4K pages",
>   		[VM_MODE_P47V64_4K]	= "PA-bits:47,  VA-bits:64,  4K pages",
> +		[VM_MODE_P44V64_4K]	= "PA-bits:44,  VA-bits:64,  4K pages",
>   	};
>   	_Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES,
>   		       "Missing new mode strings?");
> @@ -194,6 +195,7 @@ const struct vm_guest_mode_params vm_guest_mode_params[] = {
>   	{ 40, 48, 0x10000, 16 },
>   	{  0,  0,  0x1000, 12 },
>   	{ 47, 64,  0x1000, 12 },
> +	{ 44, 64,  0x1000, 12 },
>   };
>   _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES,
>   	       "Missing new mode params?");
> @@ -282,6 +284,9 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
>   	case VM_MODE_P47V64_4K:
>   		vm->pgtable_levels = 5;
>   		break;
> +	case VM_MODE_P44V64_4K:
> +		vm->pgtable_levels = 5;
> +		break;
>   	default:
>   		TEST_FAIL("Unknown guest mode, mode: 0x%x", mode);
>   	}
>
Christian Borntraeger July 6, 2021, 7:45 a.m. UTC | #7
On 06.07.21 09:40, Christian Borntraeger wrote:
> Paolo,
> 
> since you have not yet pulled my queue for 5.14. Shall I add the two selftest patches and send a new
> pull request?

Hmm, I cant put it on top of the next queue since I would need to rebase.
So lets do the original pull request and I will do another one
on top of kvm/master for the 2 selftest patches.
> 
> On 01.07.21 17:38, Christian Borntraeger wrote:
>> Older machines likes z196 and zEC12 do only support 44 bits of physical
>> addresses. Make this the default and check via IBC if we are on a later
>> machine. We then add P47V64 as an additional model.
>>
>> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
>> Fixes: 1bc603af73dd ("KVM: selftests: introduce P47V64 for s390x")
>> ---
>>   tools/testing/selftests/kvm/include/kvm_util.h |  3 ++-
>>   tools/testing/selftests/kvm/lib/guest_modes.c  | 16 ++++++++++++++++
>>   tools/testing/selftests/kvm/lib/kvm_util.c     |  5 +++++
>>   3 files changed, 23 insertions(+), 1 deletion(-)
>>
>> diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
>> index 35739567189e..74d73532fce9 100644
>> --- a/tools/testing/selftests/kvm/include/kvm_util.h
>> +++ b/tools/testing/selftests/kvm/include/kvm_util.h
>> @@ -44,6 +44,7 @@ enum vm_guest_mode {
>>       VM_MODE_P40V48_64K,
>>       VM_MODE_PXXV48_4K,    /* For 48bits VA but ANY bits PA */
>>       VM_MODE_P47V64_4K,
>> +    VM_MODE_P44V64_4K,
>>       NUM_VM_MODES,
>>   };
>> @@ -61,7 +62,7 @@ enum vm_guest_mode {
>>   #elif defined(__s390x__)
>> -#define VM_MODE_DEFAULT            VM_MODE_P47V64_4K
>> +#define VM_MODE_DEFAULT            VM_MODE_P44V64_4K
>>   #define MIN_PAGE_SHIFT            12U
>>   #define ptes_per_page(page_size)    ((page_size) / 16)
>> diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
>> index 25bff307c71f..c330f414ef96 100644
>> --- a/tools/testing/selftests/kvm/lib/guest_modes.c
>> +++ b/tools/testing/selftests/kvm/lib/guest_modes.c
>> @@ -22,6 +22,22 @@ void guest_modes_append_default(void)
>>           }
>>       }
>>   #endif
>> +#ifdef __s390x__
>> +    {
>> +        int kvm_fd, vm_fd;
>> +        struct kvm_s390_vm_cpu_processor info;
>> +
>> +        kvm_fd = open_kvm_dev_path_or_exit();
>> +        vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
>> +        kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
>> +                  KVM_S390_VM_CPU_PROCESSOR, &info, false);
>> +        close(vm_fd);
>> +        close(kvm_fd);
>> +        /* Starting with z13 we have 47bits of physical address */
>> +        if (info.ibc >= 0x30)
>> +            guest_mode_append(VM_MODE_P47V64_4K, true, true);
>> +    }
>> +#endif
>>   }
>>   void for_each_guest_mode(void (*func)(enum vm_guest_mode, void *), void *arg)
>> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
>> index a2b732cf96ea..8606000c439e 100644
>> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
>> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
>> @@ -176,6 +176,7 @@ const char *vm_guest_mode_string(uint32_t i)
>>           [VM_MODE_P40V48_64K]    = "PA-bits:40,  VA-bits:48, 64K pages",
>>           [VM_MODE_PXXV48_4K]    = "PA-bits:ANY, VA-bits:48,  4K pages",
>>           [VM_MODE_P47V64_4K]    = "PA-bits:47,  VA-bits:64,  4K pages",
>> +        [VM_MODE_P44V64_4K]    = "PA-bits:44,  VA-bits:64,  4K pages",
>>       };
>>       _Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES,
>>                  "Missing new mode strings?");
>> @@ -194,6 +195,7 @@ const struct vm_guest_mode_params vm_guest_mode_params[] = {
>>       { 40, 48, 0x10000, 16 },
>>       {  0,  0,  0x1000, 12 },
>>       { 47, 64,  0x1000, 12 },
>> +    { 44, 64,  0x1000, 12 },
>>   };
>>   _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES,
>>              "Missing new mode params?");
>> @@ -282,6 +284,9 @@ struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
>>       case VM_MODE_P47V64_4K:
>>           vm->pgtable_levels = 5;
>>           break;
>> +    case VM_MODE_P44V64_4K:
>> +        vm->pgtable_levels = 5;
>> +        break;
>>       default:
>>           TEST_FAIL("Unknown guest mode, mode: 0x%x", mode);
>>       }
>>
Christian Borntraeger July 6, 2021, 8:18 a.m. UTC | #8
On 06.07.21 09:45, Christian Borntraeger wrote:
> On 06.07.21 09:40, Christian Borntraeger wrote:
>> Paolo,
>>
>> since you have not yet pulled my queue for 5.14. Shall I add the two selftest patches and send a new
>> pull request?
> 
> Hmm, I cant put it on top of the next queue since I would need to rebase.
> So lets do the original pull request and I will do another one
> on top of kvm/master for the 2 selftest patches.

And I just realized that you did already pull the s390x and sent it to Linus.
Pull request for the selftest patches will follow soon.
diff mbox series

Patch

diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index 35739567189e..74d73532fce9 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -44,6 +44,7 @@  enum vm_guest_mode {
 	VM_MODE_P40V48_64K,
 	VM_MODE_PXXV48_4K,	/* For 48bits VA but ANY bits PA */
 	VM_MODE_P47V64_4K,
+	VM_MODE_P44V64_4K,
 	NUM_VM_MODES,
 };
 
@@ -61,7 +62,7 @@  enum vm_guest_mode {
 
 #elif defined(__s390x__)
 
-#define VM_MODE_DEFAULT			VM_MODE_P47V64_4K
+#define VM_MODE_DEFAULT			VM_MODE_P44V64_4K
 #define MIN_PAGE_SHIFT			12U
 #define ptes_per_page(page_size)	((page_size) / 16)
 
diff --git a/tools/testing/selftests/kvm/lib/guest_modes.c b/tools/testing/selftests/kvm/lib/guest_modes.c
index 25bff307c71f..c330f414ef96 100644
--- a/tools/testing/selftests/kvm/lib/guest_modes.c
+++ b/tools/testing/selftests/kvm/lib/guest_modes.c
@@ -22,6 +22,22 @@  void guest_modes_append_default(void)
 		}
 	}
 #endif
+#ifdef __s390x__
+	{
+		int kvm_fd, vm_fd;
+		struct kvm_s390_vm_cpu_processor info;
+
+		kvm_fd = open_kvm_dev_path_or_exit();
+		vm_fd = ioctl(kvm_fd, KVM_CREATE_VM, 0);
+		kvm_device_access(vm_fd, KVM_S390_VM_CPU_MODEL,
+				  KVM_S390_VM_CPU_PROCESSOR, &info, false);
+		close(vm_fd);
+		close(kvm_fd);
+		/* Starting with z13 we have 47bits of physical address */
+		if (info.ibc >= 0x30)
+			guest_mode_append(VM_MODE_P47V64_4K, true, true);
+	}
+#endif
 }
 
 void for_each_guest_mode(void (*func)(enum vm_guest_mode, void *), void *arg)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index a2b732cf96ea..8606000c439e 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -176,6 +176,7 @@  const char *vm_guest_mode_string(uint32_t i)
 		[VM_MODE_P40V48_64K]	= "PA-bits:40,  VA-bits:48, 64K pages",
 		[VM_MODE_PXXV48_4K]	= "PA-bits:ANY, VA-bits:48,  4K pages",
 		[VM_MODE_P47V64_4K]	= "PA-bits:47,  VA-bits:64,  4K pages",
+		[VM_MODE_P44V64_4K]	= "PA-bits:44,  VA-bits:64,  4K pages",
 	};
 	_Static_assert(sizeof(strings)/sizeof(char *) == NUM_VM_MODES,
 		       "Missing new mode strings?");
@@ -194,6 +195,7 @@  const struct vm_guest_mode_params vm_guest_mode_params[] = {
 	{ 40, 48, 0x10000, 16 },
 	{  0,  0,  0x1000, 12 },
 	{ 47, 64,  0x1000, 12 },
+	{ 44, 64,  0x1000, 12 },
 };
 _Static_assert(sizeof(vm_guest_mode_params)/sizeof(struct vm_guest_mode_params) == NUM_VM_MODES,
 	       "Missing new mode params?");
@@ -282,6 +284,9 @@  struct kvm_vm *vm_create(enum vm_guest_mode mode, uint64_t phy_pages, int perm)
 	case VM_MODE_P47V64_4K:
 		vm->pgtable_levels = 5;
 		break;
+	case VM_MODE_P44V64_4K:
+		vm->pgtable_levels = 5;
+		break;
 	default:
 		TEST_FAIL("Unknown guest mode, mode: 0x%x", mode);
 	}