diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib/ucall_common.c')
| -rw-r--r-- | tools/testing/selftests/kvm/lib/ucall_common.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/tools/testing/selftests/kvm/lib/ucall_common.c b/tools/testing/selftests/kvm/lib/ucall_common.c index 0cc0971ce60e..2f0e2ea941cc 100644 --- a/tools/testing/selftests/kvm/lib/ucall_common.c +++ b/tools/testing/selftests/kvm/lib/ucall_common.c @@ -4,6 +4,8 @@  #include "linux/bitmap.h"  #include "linux/atomic.h" +#define GUEST_UCALL_FAILED -1 +  struct ucall_header {  	DECLARE_BITMAP(in_use, KVM_MAX_VCPUS);  	struct ucall ucalls[KVM_MAX_VCPUS]; @@ -41,7 +43,8 @@ static struct ucall *ucall_alloc(void)  	struct ucall *uc;  	int i; -	GUEST_ASSERT(ucall_pool); +	if (!ucall_pool) +		goto ucall_failed;  	for (i = 0; i < KVM_MAX_VCPUS; ++i) {  		if (!test_and_set_bit(i, ucall_pool->in_use)) { @@ -51,7 +54,13 @@ static struct ucall *ucall_alloc(void)  		}  	} -	GUEST_ASSERT(0); +ucall_failed: +	/* +	 * If the vCPU cannot grab a ucall structure, make a bare ucall with a +	 * magic value to signal to get_ucall() that things went sideways. +	 * GUEST_ASSERT() depends on ucall_alloc() and so cannot be used here. +	 */ +	ucall_arch_do_ucall(GUEST_UCALL_FAILED);  	return NULL;  } @@ -93,6 +102,9 @@ uint64_t get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc)  	addr = ucall_arch_get_ucall(vcpu);  	if (addr) { +		TEST_ASSERT(addr != (void *)GUEST_UCALL_FAILED, +			    "Guest failed to allocate ucall struct"); +  		memcpy(uc, addr, sizeof(*uc));  		vcpu_run_complete_io(vcpu);  	} else { |