diff --git a/xen/arch/x86/include/asm/bug.h b/xen/arch/x86/include/asm/bug.h index 3a4f41e380..211b480f26 100644 --- a/xen/arch/x86/include/asm/bug.h +++ b/xen/arch/x86/include/asm/bug.h @@ -21,7 +21,7 @@ #ifndef __ASSEMBLER__ -#define BUG_INSTR "ud2" +#define BUG_INSTR ".byte 0xd6" /* UDB, requiring gas 2.46 */ #define BUG_ASM_CONST "c" #else /* !__ASSEMBLER__ */ @@ -37,7 +37,7 @@ .error "Invalid BUGFRAME index" .endif - .L\@ud: ud2a + .L\@ud: .byte 0xd6 /* UDB, requiring gas 2.46 */ .pushsection .rodata.str1, "aMS", @progbits, 1 .L\@s1: .asciz "\file_str" diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 8aa1e4181b..855147d7f3 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -1338,7 +1338,7 @@ void asmlinkage do_trap(struct cpu_user_regs *regs) void asmlinkage do_invalid_op(struct cpu_user_regs *regs) { - u8 bug_insn[2]; + uint8_t bug_insn; const void *eip = (const void *)regs->rip; int id; @@ -1350,8 +1350,8 @@ void asmlinkage do_invalid_op(struct cpu_user_regs *regs) } if ( !is_active_kernel_text(regs->rip) || - copy_from_unsafe(bug_insn, eip, sizeof(bug_insn)) || - memcmp(bug_insn, "\xf\xb", sizeof(bug_insn)) ) + copy_from_unsafe(&bug_insn, eip, sizeof(bug_insn)) || + bug_insn != 0xd6 /* UDB */ ) goto die; id = do_bug_frame(regs, regs->rip); diff --git a/xen/arch/x86/x86_emulate/decode.c b/xen/arch/x86/x86_emulate/decode.c index 2fe77c4d8d..346777422b 100644 --- a/xen/arch/x86/x86_emulate/decode.c +++ b/xen/arch/x86/x86_emulate/decode.c @@ -652,7 +652,7 @@ decode_onebyte(struct x86_emulate_state *s, case 0xce: /* into */ case 0xd4: /* aam */ case 0xd5: /* aad */ - case 0xd6: /* salc */ + case 0xd6: /* salc / udb */ s->not_64bit = true; break;