((1 << BUG_LINE_LO_WIDTH) - 1)))
#define bug_msg(b) ((const char *)(b) + (b)->msg_disp[1])
+#define _ASM_BUGFRAME_TEXT(second_frame) \
+ ".Lbug%=: ud2\n" \
+ ".pushsection .bug_frames.%c[bf_type], \"a\", @progbits\n" \
+ ".p2align 2\n" \
+ ".Lfrm%=:\n" \
+ ".long (.Lbug%= - .Lfrm%=) + %c[bf_line_hi]\n" \
+ ".long (%c[bf_ptr] - .Lfrm%=) + %c[bf_line_lo]\n" \
+ ".if " #second_frame "\n" \
+ ".long 0, %c[bf_msg] - .Lfrm%=\n" \
+ ".endif\n" \
+ ".popsection\n" \
+
+#define _ASM_BUGFRAME_INFO(type, line, ptr, msg) \
+ [bf_type] "i" (type), \
+ [bf_ptr] "i" (ptr), \
+ [bf_msg] "i" (msg), \
+ [bf_line_lo] "i" ((line & ((1 << BUG_LINE_LO_WIDTH) - 1)) \
+ << BUG_DISP_WIDTH), \
+ [bf_line_hi] "i" (((line) >> BUG_LINE_LO_WIDTH) << BUG_DISP_WIDTH)
+
#define BUG_FRAME(type, line, ptr, second_frame, msg) do { \
BUILD_BUG_ON((line) >> (BUG_LINE_LO_WIDTH + BUG_LINE_HI_WIDTH)); \
- asm volatile ( ".Lbug%=: ud2\n" \
- ".pushsection .bug_frames.%c0, \"a\", @progbits\n" \
- ".p2align 2\n" \
- ".Lfrm%=:\n" \
- ".long (.Lbug%= - .Lfrm%=) + %c4\n" \
- ".long (%c1 - .Lfrm%=) + %c3\n" \
- ".if " #second_frame "\n" \
- ".long 0, %c2 - .Lfrm%=\n" \
- ".endif\n" \
- ".popsection" \
- : \
- : "i" (type), "i" (ptr), "i" (msg), \
- "i" ((line & ((1 << BUG_LINE_LO_WIDTH) - 1)) \
- << BUG_DISP_WIDTH), \
- "i" (((line) >> BUG_LINE_LO_WIDTH) << BUG_DISP_WIDTH)); \
+ asm volatile ( _ASM_BUGFRAME_TEXT(second_frame) \
+ :: _ASM_BUGFRAME_INFO(type, line, ptr, msg) ); \
} while (0)