mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 17:12:50 -04:00
Use u64 instead of uint64_t to make the KVM selftests code more concise and more similar to the kernel (since selftests are primarily developed by kernel developers). This commit was generated with the following command: git ls-files tools/testing/selftests/kvm | xargs sed -i 's/uint64_t/u64/g' Then by manually adjusting whitespace to make checkpatch.pl happy. Include <linux/types.h> in include/kvm_util_types.h, iinclude/test_util.h, and include/x86/pmu.h to pick up the tools-defined u64. Arguably, all headers (especially kvm_util_types.h) should have already been including stdint.h to get uint64_t from the libc headers, but the missing dependency only rears its head once KVM uses u64 instead of uint64_t. No functional change intended. Signed-off-by: David Matlack <dmatlack@google.com> [sean: rename pread_uint64() => pread_u64, expand on types.h include] Link: https://patch.msgid.link/20260420212004.3938325-5-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
117 lines
3.6 KiB
C
117 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2018, Google LLC.
|
|
*/
|
|
#ifndef SELFTEST_KVM_UCALL_COMMON_H
|
|
#define SELFTEST_KVM_UCALL_COMMON_H
|
|
#include "test_util.h"
|
|
#include "ucall.h"
|
|
|
|
/* Common ucalls */
|
|
enum {
|
|
UCALL_NONE,
|
|
UCALL_SYNC,
|
|
UCALL_ABORT,
|
|
UCALL_PRINTF,
|
|
UCALL_DONE,
|
|
UCALL_UNHANDLED,
|
|
};
|
|
|
|
#define UCALL_MAX_ARGS 7
|
|
#define UCALL_BUFFER_LEN 1024
|
|
|
|
struct ucall {
|
|
u64 cmd;
|
|
u64 args[UCALL_MAX_ARGS];
|
|
char buffer[UCALL_BUFFER_LEN];
|
|
|
|
/* Host virtual address of this struct. */
|
|
struct ucall *hva;
|
|
};
|
|
|
|
void ucall_arch_init(struct kvm_vm *vm, gpa_t mmio_gpa);
|
|
void ucall_arch_do_ucall(gva_t uc);
|
|
void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu);
|
|
|
|
void ucall(u64 cmd, int nargs, ...);
|
|
__printf(2, 3) void ucall_fmt(u64 cmd, const char *fmt, ...);
|
|
__printf(5, 6) void ucall_assert(u64 cmd, const char *exp,
|
|
const char *file, unsigned int line,
|
|
const char *fmt, ...);
|
|
u64 get_ucall(struct kvm_vcpu *vcpu, struct ucall *uc);
|
|
void ucall_init(struct kvm_vm *vm, gpa_t mmio_gpa);
|
|
int ucall_nr_pages_required(u64 page_size);
|
|
|
|
/*
|
|
* Perform userspace call without any associated data. This bare call avoids
|
|
* allocating a ucall struct, which can be useful if the atomic operations in
|
|
* the full ucall() are problematic and/or unwanted. Note, this will come out
|
|
* as UCALL_NONE on the backend.
|
|
*/
|
|
#define GUEST_UCALL_NONE() ucall_arch_do_ucall((gva_t)NULL)
|
|
|
|
#define GUEST_SYNC_ARGS(stage, arg1, arg2, arg3, arg4) \
|
|
ucall(UCALL_SYNC, 6, "hello", stage, arg1, arg2, arg3, arg4)
|
|
#define GUEST_SYNC(stage) ucall(UCALL_SYNC, 2, "hello", stage)
|
|
#define GUEST_SYNC1(arg0) ucall(UCALL_SYNC, 1, arg0)
|
|
#define GUEST_SYNC2(arg0, arg1) ucall(UCALL_SYNC, 2, arg0, arg1)
|
|
#define GUEST_SYNC3(arg0, arg1, arg2) \
|
|
ucall(UCALL_SYNC, 3, arg0, arg1, arg2)
|
|
#define GUEST_SYNC4(arg0, arg1, arg2, arg3) \
|
|
ucall(UCALL_SYNC, 4, arg0, arg1, arg2, arg3)
|
|
#define GUEST_SYNC5(arg0, arg1, arg2, arg3, arg4) \
|
|
ucall(UCALL_SYNC, 5, arg0, arg1, arg2, arg3, arg4)
|
|
#define GUEST_SYNC6(arg0, arg1, arg2, arg3, arg4, arg5) \
|
|
ucall(UCALL_SYNC, 6, arg0, arg1, arg2, arg3, arg4, arg5)
|
|
|
|
#define GUEST_PRINTF(_fmt, _args...) ucall_fmt(UCALL_PRINTF, _fmt, ##_args)
|
|
#define GUEST_DONE() ucall(UCALL_DONE, 0)
|
|
|
|
#define REPORT_GUEST_PRINTF(ucall) pr_info("%s", (ucall).buffer)
|
|
|
|
enum guest_assert_builtin_args {
|
|
GUEST_ERROR_STRING,
|
|
GUEST_FILE,
|
|
GUEST_LINE,
|
|
GUEST_ASSERT_BUILTIN_NARGS
|
|
};
|
|
|
|
#define ____GUEST_ASSERT(_condition, _exp, _fmt, _args...) \
|
|
do { \
|
|
if (!(_condition)) \
|
|
ucall_assert(UCALL_ABORT, _exp, __FILE__, __LINE__, _fmt, ##_args); \
|
|
} while (0)
|
|
|
|
#define __GUEST_ASSERT(_condition, _fmt, _args...) \
|
|
____GUEST_ASSERT(_condition, #_condition, _fmt, ##_args)
|
|
|
|
#define GUEST_ASSERT(_condition) \
|
|
__GUEST_ASSERT(_condition, #_condition)
|
|
|
|
#define GUEST_FAIL(_fmt, _args...) \
|
|
ucall_assert(UCALL_ABORT, "Unconditional guest failure", \
|
|
__FILE__, __LINE__, _fmt, ##_args)
|
|
|
|
#define GUEST_ASSERT_EQ(a, b) \
|
|
do { \
|
|
typeof(a) __a = (a); \
|
|
typeof(b) __b = (b); \
|
|
____GUEST_ASSERT(__a == __b, #a " == " #b, "%#lx != %#lx (%s != %s)", \
|
|
(unsigned long)(__a), (unsigned long)(__b), #a, #b); \
|
|
} while (0)
|
|
|
|
#define GUEST_ASSERT_NE(a, b) \
|
|
do { \
|
|
typeof(a) __a = (a); \
|
|
typeof(b) __b = (b); \
|
|
____GUEST_ASSERT(__a != __b, #a " != " #b, "%#lx == %#lx (%s == %s)", \
|
|
(unsigned long)(__a), (unsigned long)(__b), #a, #b); \
|
|
} while (0)
|
|
|
|
#define REPORT_GUEST_ASSERT(ucall) \
|
|
test_assert(false, (const char *)(ucall).args[GUEST_ERROR_STRING], \
|
|
(const char *)(ucall).args[GUEST_FILE], \
|
|
(ucall).args[GUEST_LINE], "%s", (ucall).buffer)
|
|
|
|
#endif /* SELFTEST_KVM_UCALL_COMMON_H */
|