diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib')
| -rw-r--r-- | tools/testing/selftests/kvm/lib/aarch64/processor.c | 2 | ||||
| -rw-r--r-- | tools/testing/selftests/kvm/lib/guest_modes.c | 16 | ||||
| -rw-r--r-- | tools/testing/selftests/kvm/lib/kvm_util.c | 5 | 
3 files changed, 22 insertions, 1 deletions
| diff --git a/tools/testing/selftests/kvm/lib/aarch64/processor.c b/tools/testing/selftests/kvm/lib/aarch64/processor.c index 9f49f6caafe5..632b74d6b3ca 100644 --- a/tools/testing/selftests/kvm/lib/aarch64/processor.c +++ b/tools/testing/selftests/kvm/lib/aarch64/processor.c @@ -401,7 +401,7 @@ unexpected_exception:  void vm_init_descriptor_tables(struct kvm_vm *vm)  {  	vm->handlers = vm_vaddr_alloc(vm, sizeof(struct handlers), -			vm->page_size, 0, 0); +			vm->page_size);  	*(vm_vaddr_t *)addr_gva2hva(vm, (vm_vaddr_t)(&exception_handlers)) = vm->handlers;  } 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 5b56b57b3c20..10a8ed691c66 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);  	} |