[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH XTF] Functional: Add a UMIP test
Add a "umip" test for the User-Model Instruction Prevention. The test simply tries to run sgdt/sidt/sldt/str/smsw in guest user-mode with CR4_UMIP = 1. Signed-off-by: Boqun Feng (Intel) <boqun.feng@xxxxxxxxx> --- docs/all-tests.dox | 2 + tests/umip/Makefile | 9 ++++ tests/umip/main.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 tests/umip/Makefile create mode 100644 tests/umip/main.c diff --git a/docs/all-tests.dox b/docs/all-tests.dox index 01a7a572f472..ec5328b50189 100644 --- a/docs/all-tests.dox +++ b/docs/all-tests.dox @@ -109,4 +109,6 @@ guest breakout. @section index-in-development In Development @subpage test-vvmx - Nested VT-x tests. + +@subpage test-umip - User-Mode Instruction Prevention */ diff --git a/tests/umip/Makefile b/tests/umip/Makefile new file mode 100644 index 000000000000..0248c8b247a0 --- /dev/null +++ b/tests/umip/Makefile @@ -0,0 +1,9 @@ +include $(ROOT)/build/common.mk + +NAME := umip +CATEGORY := functional +TEST-ENVS := hvm32 hvm64 + +obj-perenv += main.o + +include $(ROOT)/build/gen.mk diff --git a/tests/umip/main.c b/tests/umip/main.c new file mode 100644 index 000000000000..27b7d44f4b98 --- /dev/null +++ b/tests/umip/main.c @@ -0,0 +1,120 @@ +/** + * @file tests/umip/main.c + * @ref test-umip + * + * @page test-umip umip + * + * @todo Docs for test-umip + * + * @see tests/umip/main.c + */ +#include <xtf.h> +#include <arch/processor.h> + +const char test_title[] = "User-Mode Instruction Prevention Test"; +bool test_wants_user_mapping = true; + +unsigned long umip_sgdt(void) +{ + unsigned long fault = 0; + unsigned long tmp; + + asm volatile("1: sgdt %[tmp]; 2:" + _ASM_EXTABLE_HANDLER(1b,2b, ex_record_fault_edi) + : "+D" (fault), [tmp] "=m" (tmp) + :); + + return fault; +} + +unsigned long umip_sldt(void) +{ + unsigned long fault = 0; + unsigned long tmp; + + asm volatile("1: sldt %[tmp]; 2:" + _ASM_EXTABLE_HANDLER(1b,2b, ex_record_fault_edi) + : "+D" (fault), [tmp] "=m" (tmp) + :); + + return fault; +} + +unsigned long umip_sidt(void) +{ + unsigned long fault = 0; + unsigned long tmp; + + asm volatile("1: sidt %[tmp]; 2:" + _ASM_EXTABLE_HANDLER(1b,2b, ex_record_fault_edi) + : "+D" (fault), [tmp] "=m" (tmp) + :); + + return fault; +} + +unsigned long umip_str(void) +{ + unsigned long fault = 0; + unsigned long tmp; + + asm volatile("1: str %[tmp]; 2:" + _ASM_EXTABLE_HANDLER(1b,2b, ex_record_fault_edi) + : "+D" (fault), [tmp] "=m" (tmp) + :); + + return fault; +} + +unsigned long umip_smsw(void) +{ + unsigned long fault = 0; + unsigned long tmp; + + asm volatile("1: smsw %[tmp]; 2:" + _ASM_EXTABLE_HANDLER(1b,2b, ex_record_fault_edi) + : "+D" (fault), [tmp] "=m" (tmp) + :); + + return fault; +} + +void test_main(void) +{ + unsigned long exp; + unsigned long cr4 = read_cr4(); + + if ( !cpu_has_umip ) + xtf_failure("Fail: UMIP is not supported\n"); + + write_cr4(cr4 | X86_CR4_UMIP); + + exp = EXINFO_SYM(GP, 0); + + if ( exec_user(umip_sgdt) != exp ) + xtf_failure("Fail: sgdt didn't trigger #GP\n"); + + if ( exec_user(umip_sldt) != exp ) + xtf_failure("Fail: sldt didn't trigger #GP\n"); + + if ( exec_user(umip_sidt) != exp ) + xtf_failure("Fail: sidt didn't trigger #GP\n"); + + if ( exec_user(umip_str) != exp ) + xtf_failure("Fail: str didn't trigger #GP\n"); + + if ( exec_user(umip_smsw) != exp ) + xtf_failure("Fail: smsw didn't trigger #GP\n"); + + xtf_success(NULL); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ -- 2.13.2 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |