ucall_common.h (1829B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * tools/testing/selftests/kvm/include/kvm_util.h 4 * 5 * Copyright (C) 2018, Google LLC. 6 */ 7#ifndef SELFTEST_KVM_UCALL_COMMON_H 8#define SELFTEST_KVM_UCALL_COMMON_H 9 10/* Common ucalls */ 11enum { 12 UCALL_NONE, 13 UCALL_SYNC, 14 UCALL_ABORT, 15 UCALL_DONE, 16 UCALL_UNHANDLED, 17}; 18 19#define UCALL_MAX_ARGS 6 20 21struct ucall { 22 uint64_t cmd; 23 uint64_t args[UCALL_MAX_ARGS]; 24}; 25 26void ucall_init(struct kvm_vm *vm, void *arg); 27void ucall_uninit(struct kvm_vm *vm); 28void ucall(uint64_t cmd, int nargs, ...); 29uint64_t get_ucall(struct kvm_vm *vm, uint32_t vcpu_id, struct ucall *uc); 30 31#define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4) \ 32 ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4) 33#define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage) 34#define GUEST_DONE() ucall(UCALL_DONE, 0) 35#define __GUEST_ASSERT(_condition, _condstr, _nargs, _args...) do { \ 36 if (!(_condition)) \ 37 ucall(UCALL_ABORT, 2 + _nargs, \ 38 "Failed guest assert: " \ 39 _condstr, __LINE__, _args); \ 40} while (0) 41 42#define GUEST_ASSERT(_condition) \ 43 __GUEST_ASSERT(_condition, #_condition, 0, 0) 44 45#define GUEST_ASSERT_1(_condition, arg1) \ 46 __GUEST_ASSERT(_condition, #_condition, 1, (arg1)) 47 48#define GUEST_ASSERT_2(_condition, arg1, arg2) \ 49 __GUEST_ASSERT(_condition, #_condition, 2, (arg1), (arg2)) 50 51#define GUEST_ASSERT_3(_condition, arg1, arg2, arg3) \ 52 __GUEST_ASSERT(_condition, #_condition, 3, (arg1), (arg2), (arg3)) 53 54#define GUEST_ASSERT_4(_condition, arg1, arg2, arg3, arg4) \ 55 __GUEST_ASSERT(_condition, #_condition, 4, (arg1), (arg2), (arg3), (arg4)) 56 57#define GUEST_ASSERT_EQ(a, b) __GUEST_ASSERT((a) == (b), #a " == " #b, 2, a, b) 58 59#endif /* SELFTEST_KVM_UCALL_COMMON_H */