mirror of https://gitee.com/openkylin/linux.git
selftests/x86: Add tests for the STR and SLDT instructions
The STR and SLDT instructions are not valid when running on virtual-8086 mode and generate an invalid operand exception. These two instructions are protected by the Intel User-Mode Instruction Prevention (UMIP) security feature. In protected mode, if UMIP is enabled, these instructions generate a general protection fault if called from CPL > 0. Linux traps the general protection fault and emulates the instructions sgdt, sidt and smsw; but not str and sldt. These tests are added to verify that the emulation code does not emulate these two instructions but the expected invalid operand exception is seen. Tests fallback to exit with INT3 in case emulation does happen. Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Borislav Petkov <bp@suse.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Chen Yucong <slaoub@gmail.com> Cc: Chris Metcalf <cmetcalf@mellanox.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Huang Rui <ray.huang@amd.com> Cc: Jiri Slaby <jslaby@suse.cz> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Michael S. Tsirkin <mst@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Paul Gortmaker <paul.gortmaker@windriver.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Ravi V. Shankar <ravi.v.shankar@intel.com> Cc: Shuah Khan <shuah@kernel.org> Cc: Tony Luck <tony.luck@intel.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: ricardo.neri@intel.com Link: http://lkml.kernel.org/r/1509935277-22138-13-git-send-email-ricardo.neri-calderon@linux.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
9390afebe1
commit
a9e017d561
|
@ -111,6 +111,11 @@ asm (
|
|||
"smsw %ax\n\t"
|
||||
"mov %ax, (2080)\n\t"
|
||||
"int3\n\t"
|
||||
"vmcode_umip_str:\n\t"
|
||||
"str %eax\n\t"
|
||||
"vmcode_umip_sldt:\n\t"
|
||||
"sldt %eax\n\t"
|
||||
"int3\n\t"
|
||||
".size vmcode, . - vmcode\n\t"
|
||||
"end_vmcode:\n\t"
|
||||
".code32\n\t"
|
||||
|
@ -119,7 +124,8 @@ asm (
|
|||
|
||||
extern unsigned char vmcode[], end_vmcode[];
|
||||
extern unsigned char vmcode_bound[], vmcode_sysenter[], vmcode_syscall[],
|
||||
vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_umip[];
|
||||
vmcode_sti[], vmcode_int3[], vmcode_int80[], vmcode_umip[],
|
||||
vmcode_umip_str[], vmcode_umip_sldt[];
|
||||
|
||||
/* Returns false if the test was skipped. */
|
||||
static bool do_test(struct vm86plus_struct *v86, unsigned long eip,
|
||||
|
@ -226,6 +232,16 @@ void do_umip_tests(struct vm86plus_struct *vm86, unsigned char *test_mem)
|
|||
printf("[FAIL]\tAll the results of SIDT should be the same.\n");
|
||||
else
|
||||
printf("[PASS]\tAll the results from SIDT are identical.\n");
|
||||
|
||||
sethandler(SIGILL, sighandler, 0);
|
||||
do_test(vm86, vmcode_umip_str - vmcode, VM86_SIGNAL, 0,
|
||||
"STR instruction");
|
||||
clearhandler(SIGILL);
|
||||
|
||||
sethandler(SIGILL, sighandler, 0);
|
||||
do_test(vm86, vmcode_umip_sldt - vmcode, VM86_SIGNAL, 0,
|
||||
"SLDT instruction");
|
||||
clearhandler(SIGILL);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
|
|
Loading…
Reference in New Issue