[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 09/24] x86/emul: Provide a wrapper to x86_emulate() to ASSERT() certain behaviour
In debug builds, confirm that some properties of x86_emulate()'s behaviour actually hold. The first property, fixed in a previous change, is that retire flags are only ever set in the X86EMUL_OKAY case. While adjusting the userspace test harness to cope with ASSERT() in x86_emulate.h, fix a build problem introduced in c/s 122dd9575c7 "x86emul: in_longmode() should not ignore ->read_msr() errors" by providing an implementation of likely()/unlikely(). Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> v3: * New --- tools/tests/x86_emulator/test_x86_emulator.c | 1 + tools/tests/x86_emulator/x86_emulate.c | 3 +++ xen/arch/x86/x86_emulate/x86_emulate.c | 5 +++++ xen/arch/x86/x86_emulate/x86_emulate.h | 25 +++++++++++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c index f255fef..b54fd11 100644 --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -1,3 +1,4 @@ +#include <assert.h> #include <errno.h> #include <limits.h> #include <stdbool.h> diff --git a/tools/tests/x86_emulator/x86_emulate.c b/tools/tests/x86_emulator/x86_emulate.c index c46b7fc..3272867 100644 --- a/tools/tests/x86_emulator/x86_emulate.c +++ b/tools/tests/x86_emulator/x86_emulate.c @@ -50,4 +50,7 @@ typedef bool bool_t; #define __init #define __maybe_unused __attribute__((__unused__)) +#define likely(x) __builtin_expect(!!(x),1) +#define unlikely(x) __builtin_expect(!!(x),0) + #include "x86_emulate/x86_emulate.c" diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index bacdee6..e4643a3 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -2404,6 +2404,11 @@ x86_decode( #undef insn_fetch_bytes #undef insn_fetch_type +/* Undo DEBUG wrapper. */ +#ifdef x86_emulate +#undef x86_emulate +#endif + int x86_emulate( struct x86_emulate_ctxt *ctxt, diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h b/xen/arch/x86/x86_emulate/x86_emulate.h index ef39601..f84ced2 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.h +++ b/xen/arch/x86/x86_emulate/x86_emulate.h @@ -23,6 +23,10 @@ #ifndef __X86_EMULATE_H__ #define __X86_EMULATE_H__ +#ifndef ASSERT +#define ASSERT assert +#endif + #define MAX_INST_LEN 15 struct x86_emulate_ctxt; @@ -554,6 +558,27 @@ x86_emulate( const struct x86_emulate_ops *ops); /* + * In debug builds, wrap x86_emulate() with some assertions about its expected + * behaviour. + */ +#ifndef NDEBUG +static inline int x86_emulate_wrapper( + struct x86_emulate_ctxt *ctxt, + const struct x86_emulate_ops *ops) +{ + int rc = x86_emulate(ctxt, ops); + + /* Retire flags should only be set for successful instruction emulation. */ + if ( rc != X86EMUL_OKAY ) + ASSERT(ctxt->retire.raw == 0); + + return rc; +} + +#define x86_emulate x86_emulate_wrapper +#endif + +/* * Given the 'reg' portion of a ModRM byte, and a register block, return a * pointer into the block that addresses the relevant register. * @highbyte_regs specifies whether to decode AH,CH,DH,BH. -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |