[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 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> v4: * Shuffle #ifdefary * Correct the documentation for x86_emulate() * Use true/false in likely/unlikely definitions v3: * New --- tools/tests/x86_emulator/test_x86_emulator.c | 1 + tools/tests/x86_emulator/x86_emulate.c | 4 +++- xen/arch/x86/x86_emulate/x86_emulate.c | 3 +++ xen/arch/x86/x86_emulate/x86_emulate.h | 27 ++++++++++++++++++++++++++- 4 files changed, 33 insertions(+), 2 deletions(-) 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..897b9ab 100644 --- a/tools/tests/x86_emulator/x86_emulate.c +++ b/tools/tests/x86_emulator/x86_emulate.c @@ -16,7 +16,6 @@ typedef bool bool_t; #define EFER_LMA (1 << 10) #define BUG() abort() -#define ASSERT assert #define ASSERT_UNREACHABLE() assert(!__LINE__) #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) @@ -50,4 +49,7 @@ typedef bool bool_t; #define __init #define __maybe_unused __attribute__((__unused__)) +#define likely(x) __builtin_expect(!!(x), true) +#define unlikely(x) __builtin_expect(!!(x), false) + #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 bfcc05d..3e602da 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -2404,6 +2404,9 @@ x86_decode( #undef insn_fetch_bytes #undef insn_fetch_type +/* Undo DEBUG wrapper. */ +#undef x86_emulate + 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..60f9105 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__ +#if !defined(__XEN__) && !defined(ASSERT) +#define ASSERT assert +#endif + #define MAX_INST_LEN 15 struct x86_emulate_ctxt; @@ -546,13 +550,34 @@ struct x86_emulate_stub { /* * x86_emulate: Emulate an instruction. - * Returns -1 on failure, 0 on success. + * Returns X86EMUL_* constants. */ int x86_emulate( struct x86_emulate_ctxt *ctxt, const struct x86_emulate_ops *ops); +#ifndef NDEBUG +/* + * In debug builds, wrap x86_emulate() with some assertions about its expected + * behaviour. + */ +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. -- 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 |