From: Andrew Cooper Date: Tue, 3 Nov 2015 17:14:49 +0000 (+0100) Subject: x86/bug: break out the internals of BUG_FRAME() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=d90b8f8c9fa7ebc07aa0e5f3e553411434ae8ac5;p=people%2Fliuw%2Flibxenctrl-split%2Fxen.git x86/bug: break out the internals of BUG_FRAME() To allow bug frames can be created inside existing asm() statements. In order to do so, the current bugframe positional parameters are altered to be named parameters, to avoid interactions with the parameters of the existing asm() statement. No functional change. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/include/asm-x86/bug.h b/xen/include/asm-x86/bug.h index cec6bce133..e868e85330 100644 --- a/xen/include/asm-x86/bug.h +++ b/xen/include/asm-x86/bug.h @@ -29,23 +29,30 @@ struct bug_frame { ((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)