Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[sfrench/cifs-2.6.git] / include / asm-x86_64 / bug.h
1 #ifndef __ASM_X8664_BUG_H
2 #define __ASM_X8664_BUG_H 1
3
4 #include <linux/stringify.h>
5
6 /*
7  * Tell the user there is some problem.  The exception handler decodes 
8  * this frame.
9  */
10 struct bug_frame {
11         unsigned char ud2[2];
12         unsigned char push;
13         signed int filename;
14         unsigned char ret;
15         unsigned short line;
16 } __attribute__((packed));
17
18 #ifdef CONFIG_BUG
19 #define HAVE_ARCH_BUG
20 /* We turn the bug frame into valid instructions to not confuse
21    the disassembler. Thanks to Jan Beulich & Suresh Siddha
22    for nice instruction selection.
23    The magic numbers generate mov $64bitimm,%eax ; ret $offset. */
24 #define BUG()                                                           \
25         asm volatile(                                                   \
26         "ud2 ; pushq $%c1 ; ret $%c0" ::                                \
27                      "i"(__LINE__), "i" (__FILE__))
28 void out_of_line_bug(void);
29 #else
30 static inline void out_of_line_bug(void) { }
31 #endif
32
33 #include <asm-generic/bug.h>
34 #endif