diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib/riscv')
| -rw-r--r-- | tools/testing/selftests/kvm/lib/riscv/processor.c | 29 | ||||
| -rw-r--r-- | tools/testing/selftests/kvm/lib/riscv/ucall.c | 42 | 
2 files changed, 23 insertions, 48 deletions
| diff --git a/tools/testing/selftests/kvm/lib/riscv/processor.c b/tools/testing/selftests/kvm/lib/riscv/processor.c index 604478151212..d146ca71e0c0 100644 --- a/tools/testing/selftests/kvm/lib/riscv/processor.c +++ b/tools/testing/selftests/kvm/lib/riscv/processor.c @@ -55,13 +55,15 @@ static uint64_t pte_index(struct kvm_vm *vm, vm_vaddr_t gva, int level)  void virt_arch_pgd_alloc(struct kvm_vm *vm)  { -	if (!vm->pgd_created) { -		vm_paddr_t paddr = vm_phy_pages_alloc(vm, -			page_align(vm, ptrs_per_pte(vm) * 8) / vm->page_size, -			KVM_GUEST_PAGE_TABLE_MIN_PADDR, 0); -		vm->pgd = paddr; -		vm->pgd_created = true; -	} +	size_t nr_pages = page_align(vm, ptrs_per_pte(vm) * 8) / vm->page_size; + +	if (vm->pgd_created) +		return; + +	vm->pgd = vm_phy_pages_alloc(vm, nr_pages, +				     KVM_GUEST_PAGE_TABLE_MIN_PADDR, +				     vm->memslots[MEM_REGION_PT]); +	vm->pgd_created = true;  }  void virt_arch_pg_map(struct kvm_vm *vm, uint64_t vaddr, uint64_t paddr) @@ -279,15 +281,18 @@ struct kvm_vcpu *vm_arch_vcpu_add(struct kvm_vm *vm, uint32_t vcpu_id,  				  void *guest_code)  {  	int r; -	size_t stack_size = vm->page_size == 4096 ? -					DEFAULT_STACK_PGS * vm->page_size : -					vm->page_size; -	unsigned long stack_vaddr = vm_vaddr_alloc(vm, stack_size, -					DEFAULT_RISCV_GUEST_STACK_VADDR_MIN); +	size_t stack_size; +	unsigned long stack_vaddr;  	unsigned long current_gp = 0;  	struct kvm_mp_state mps;  	struct kvm_vcpu *vcpu; +	stack_size = vm->page_size == 4096 ? DEFAULT_STACK_PGS * vm->page_size : +					     vm->page_size; +	stack_vaddr = __vm_vaddr_alloc(vm, stack_size, +				       DEFAULT_RISCV_GUEST_STACK_VADDR_MIN, +				       MEM_REGION_DATA); +  	vcpu = __vm_vcpu_add(vm, vcpu_id);  	riscv_vcpu_mmu_setup(vcpu); diff --git a/tools/testing/selftests/kvm/lib/riscv/ucall.c b/tools/testing/selftests/kvm/lib/riscv/ucall.c index 087b9740bc8f..9a3476a2dfca 100644 --- a/tools/testing/selftests/kvm/lib/riscv/ucall.c +++ b/tools/testing/selftests/kvm/lib/riscv/ucall.c @@ -10,11 +10,7 @@  #include "kvm_util.h"  #include "processor.h" -void ucall_init(struct kvm_vm *vm, void *arg) -{ -} - -void ucall_uninit(struct kvm_vm *vm) +void ucall_arch_init(struct kvm_vm *vm, vm_paddr_t mmio_gpa)  {  } @@ -44,47 +40,22 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,  	return ret;  } -void ucall(uint64_t cmd, int nargs, ...) +void ucall_arch_do_ucall(vm_vaddr_t uc)  { -	struct ucall uc = { -		.cmd = cmd, -	}; -	va_list va; -	int i; - -	nargs = min(nargs, UCALL_MAX_ARGS); - -	va_start(va, nargs); -	for (i = 0; i < nargs; ++i) -		uc.args[i] = va_arg(va, uint64_t); -	va_end(va); -  	sbi_ecall(KVM_RISCV_SELFTESTS_SBI_EXT,  		  KVM_RISCV_SELFTESTS_SBI_UCALL, -		  (vm_vaddr_t)&uc, 0, 0, 0, 0, 0); +		  uc, 0, 0, 0, 0, 0);  } -uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc) +void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)  {  	struct kvm_run *run = vcpu->run; -	struct ucall ucall = {}; - -	if (uc) -		memset(uc, 0, sizeof(*uc));  	if (run->exit_reason == KVM_EXIT_RISCV_SBI &&  	    run->riscv_sbi.extension_id == KVM_RISCV_SELFTESTS_SBI_EXT) {  		switch (run->riscv_sbi.function_id) {  		case KVM_RISCV_SELFTESTS_SBI_UCALL: -			memcpy(&ucall, -			       addr_gva2hva(vcpu->vm, run->riscv_sbi.args[0]), -			       sizeof(ucall)); - -			vcpu_run_complete_io(vcpu); -			if (uc) -				memcpy(uc, &ucall, sizeof(ucall)); - -			break; +			return (void *)run->riscv_sbi.args[0];  		case KVM_RISCV_SELFTESTS_SBI_UNEXP:  			vcpu_dump(stderr, vcpu, 2);  			TEST_ASSERT(0, "Unexpected trap taken by guest"); @@ -93,6 +64,5 @@ uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc)  			break;  		}  	} - -	return ucall.cmd; +	return NULL;  } |