From: "Andi Kleen" This avoids confusing the disassembler. Costs 2 bytes per BUG. Thanks to Suresh Siddha and Jan Beulich for suggesting suitable instructions. Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- include/asm-x86_64/bug.h | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff -puN include/asm-x86_64/bug.h~x86_64-turn-bug-data-into-valid-instruction include/asm-x86_64/bug.h --- devel/include/asm-x86_64/bug.h~x86_64-turn-bug-data-into-valid-instruction 2005-07-27 12:36:44.000000000 -0700 +++ devel-akpm/include/asm-x86_64/bug.h 2005-07-27 12:36:44.000000000 -0700 @@ -8,17 +8,24 @@ * this frame. */ struct bug_frame { - unsigned char ud2[2]; + unsigned char ud2[2]; + unsigned char mov; /* should use 32bit offset instead, but the assembler doesn't like it */ char *filename; + unsigned char ret; unsigned short line; } __attribute__((packed)); #ifdef CONFIG_BUG #define HAVE_ARCH_BUG -#define BUG() \ - asm volatile("ud2 ; .quad %c1 ; .short %c0" :: \ +/* We turn the bug frame into valid instructions to not confuse + the disassembler. Thanks to Jan Beulich & Suresh Siddha + for nice instruction selection. + The magic numbers generate mov $64bitimm,%eax ; ret $offset. */ +#define BUG() \ + asm volatile( \ + "ud2 ; .byte 0xa3 ; .quad %c1 ; .byte 0xc2 ; .short %c0" :: \ "i"(__LINE__), "i" (__stringify(__FILE__))) void out_of_line_bug(void); #else _