[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 3/7] x86emul/test: factor out emul_test_{read_cr, cpuid}
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- tools/tests/x86_emulator/test_x86_emulator.c | 59 +++++----------------------- tools/tests/x86_emulator/x86_emulate.c | 39 ++++++++++++++++++ tools/tests/x86_emulator/x86_emulate.h | 19 +++++++++ 3 files changed, 68 insertions(+), 49 deletions(-) diff --git a/tools/tests/x86_emulator/test_x86_emulator.c b/tools/tests/x86_emulator/test_x86_emulator.c index 0d80bff..6099401 100644 --- a/tools/tests/x86_emulator/test_x86_emulator.c +++ b/tools/tests/x86_emulator/test_x86_emulator.c @@ -92,51 +92,33 @@ static int cmpxchg( return X86EMUL_OKAY; } -static int cpuid( - unsigned int *eax, - unsigned int *ebx, - unsigned int *ecx, - unsigned int *edx, - struct x86_emulate_ctxt *ctxt) -{ - unsigned int leaf = *eax; - - asm ("cpuid" : "+a" (*eax), "+c" (*ecx), "=d" (*edx), "=b" (*ebx)); - - /* The emulator doesn't itself use MOVBE, so we can always run the test. */ - if ( leaf == 1 ) - *ecx |= 1U << 22; - - return X86EMUL_OKAY; -} - #define cache_line_size() ({ \ unsigned int eax = 1, ebx, ecx = 0, edx; \ - cpuid(&eax, &ebx, &ecx, &edx, NULL); \ + emul_test_cpuid(&eax, &ebx, &ecx, &edx, NULL); \ edx & (1U << 19) ? (ebx >> 5) & 0x7f8 : 0; \ }) #define cpu_has_mmx ({ \ unsigned int eax = 1, ecx = 0, edx; \ - cpuid(&eax, &ecx, &ecx, &edx, NULL); \ + emul_test_cpuid(&eax, &ecx, &ecx, &edx, NULL); \ (edx & (1U << 23)) != 0; \ }) #define cpu_has_sse ({ \ unsigned int eax = 1, ecx = 0, edx; \ - cpuid(&eax, &ecx, &ecx, &edx, NULL); \ + emul_test_cpuid(&eax, &ecx, &ecx, &edx, NULL); \ (edx & (1U << 25)) != 0; \ }) #define cpu_has_sse2 ({ \ unsigned int eax = 1, ecx = 0, edx; \ - cpuid(&eax, &ecx, &ecx, &edx, NULL); \ + emul_test_cpuid(&eax, &ecx, &ecx, &edx, NULL); \ (edx & (1U << 26)) != 0; \ }) #define cpu_has_xsave ({ \ unsigned int eax = 1, ecx = 0; \ - cpuid(&eax, &eax, &ecx, &eax, NULL); \ + emul_test_cpuid(&eax, &eax, &ecx, &eax, NULL); \ /* Intentionally checking OSXSAVE here. */ \ (ecx & (1U << 27)) != 0; \ }) @@ -152,7 +134,7 @@ static inline uint64_t xgetbv(uint32_t xcr) #define cpu_has_avx ({ \ unsigned int eax = 1, ecx = 0; \ - cpuid(&eax, &eax, &ecx, &eax, NULL); \ + emul_test_cpuid(&eax, &eax, &ecx, &eax, NULL); \ if ( !(ecx & (1U << 27)) || ((xgetbv(0) & 6) != 6) ) \ ecx = 0; \ (ecx & (1U << 28)) != 0; \ @@ -160,37 +142,16 @@ static inline uint64_t xgetbv(uint32_t xcr) #define cpu_has_avx2 ({ \ unsigned int eax = 1, ebx, ecx = 0; \ - cpuid(&eax, &ebx, &ecx, &eax, NULL); \ + emul_test_cpuid(&eax, &ebx, &ecx, &eax, NULL); \ if ( !(ecx & (1U << 27)) || ((xgetbv(0) & 6) != 6) ) \ ebx = 0; \ else { \ eax = 7, ecx = 0; \ - cpuid(&eax, &ebx, &ecx, &eax, NULL); \ + emul_test_cpuid(&eax, &ebx, &ecx, &eax, NULL); \ } \ (ebx & (1U << 5)) != 0; \ }) -static int read_cr( - unsigned int reg, - unsigned long *val, - struct x86_emulate_ctxt *ctxt) -{ - /* Fake just enough state for the emulator's _get_fpu() to be happy. */ - switch ( reg ) - { - case 0: - *val = 0x00000001; /* PE */ - return X86EMUL_OKAY; - - case 4: - /* OSFXSR, OSXMMEXCPT, and maybe OSXSAVE */ - *val = 0x00000600 | (cpu_has_xsave ? 0x00040000 : 0); - return X86EMUL_OKAY; - } - - return X86EMUL_UNHANDLEABLE; -} - int get_fpu( void (*exception_callback)(void *, struct cpu_user_regs *), void *exception_callback_arg, @@ -221,8 +182,8 @@ static struct x86_emulate_ops emulops = { .insn_fetch = fetch, .write = write, .cmpxchg = cmpxchg, - .cpuid = cpuid, - .read_cr = read_cr, + .cpuid = emul_test_cpuid, + .read_cr = emul_test_read_cr, .get_fpu = get_fpu, }; diff --git a/tools/tests/x86_emulator/x86_emulate.c b/tools/tests/x86_emulator/x86_emulate.c index 78e6380..b4bd61c 100644 --- a/tools/tests/x86_emulator/x86_emulate.c +++ b/tools/tests/x86_emulator/x86_emulate.c @@ -40,4 +40,43 @@ bool emul_test_make_stack_executable(void) return stack_exec; } +int emul_test_cpuid( + unsigned int *eax, + unsigned int *ebx, + unsigned int *ecx, + unsigned int *edx, + struct x86_emulate_ctxt *ctxt) +{ + unsigned int leaf = *eax; + + asm ("cpuid" : "+a" (*eax), "+c" (*ecx), "=d" (*edx), "=b" (*ebx)); + + /* The emulator doesn't itself use MOVBE, so we can always run the test. */ + if ( leaf == 1 ) + *ecx |= 1U << 22; + + return X86EMUL_OKAY; +} + +int emul_test_read_cr( + unsigned int reg, + unsigned long *val, + struct x86_emulate_ctxt *ctxt) +{ + /* Fake just enough state for the emulator's _get_fpu() to be happy. */ + switch ( reg ) + { + case 0: + *val = 0x00000001; /* PE */ + return X86EMUL_OKAY; + + case 4: + /* OSFXSR, OSXMMEXCPT, and maybe OSXSAVE */ + *val = 0x00000600 | (cpu_has_xsave ? 0x00040000 : 0); + return X86EMUL_OKAY; + } + + return X86EMUL_UNHANDLEABLE; +} + #include "x86_emulate/x86_emulate.c" diff --git a/tools/tests/x86_emulator/x86_emulate.h b/tools/tests/x86_emulator/x86_emulate.h index a9b874c..b213f2d 100644 --- a/tools/tests/x86_emulator/x86_emulate.h +++ b/tools/tests/x86_emulator/x86_emulate.h @@ -37,3 +37,22 @@ bool emul_test_make_stack_executable(void); #include "x86_emulate/x86_emulate.h" + +#define cpu_has_xsave ({ \ + unsigned int eax = 1, ecx = 0; \ + emul_test_cpuid(&eax, &eax, &ecx, &eax, NULL); \ + /* Intentionally checking OSXSAVE here. */ \ + (ecx & (1U << 27)) != 0; \ +}) + +int emul_test_cpuid( + unsigned int *eax, + unsigned int *ebx, + unsigned int *ecx, + unsigned int *edx, + struct x86_emulate_ctxt *ctxt); + +int emul_test_read_cr( + unsigned int reg, + unsigned long *val, + struct x86_emulate_ctxt *ctxt); -- 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 |