mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/arm: Add BUGFRAME_NR define and BUILD checks.
So that we have a nice mechansim to figure out the upper bounds of bug.frames and also catch compiler errors in case one tries to use a higher frame number. Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Acked-by: Julien Grall <julien.grall@arm.com> Acked-by: Jan Beulich <jbeulich@suse.com> --- Cc: Stefano Stabellini <stefano.stabellini@citrix.com> Cc: Julien Grall <julien.grall@arm.com> Cc: Keir Fraser <keir@xen.org> Cc: Jan Beulich <jbeulich@suse.com> Cc: Andrew Cooper <andrew.cooper3@citrix.com> v3: First time included. v4: Add BUG_FRAME check also in the assembler version of the macro. v5: Add Acks, make BUILD_BUG_ON checks look correct. Position the BUGFRAME_NR properly. Reposition the BUGFRAME_NR again. ---
This commit is contained in:
1 parent
a2fc8d514d
commit
4c2cddb471
2 files changed
+11
No files matched your search
@@ -32,6 +32,8 @@ struct bug_frame {
|
||||
#define BUGFRAME_bug 1
|
||||
#define BUGFRAME_assert 2
|
||||
|
||||
#define BUGFRAME_NR 3
|
||||
|
||||
/* Many versions of GCC doesn't support the asm %c parameter which would
|
||||
* be preferable to this unpleasantness. We use mergeable string
|
||||
* sections to avoid multiple copies of the string appearing in the
|
||||
@@ -39,6 +41,7 @@ struct bug_frame {
|
||||
*/
|
||||
#define BUG_FRAME(type, line, file, has_msg, msg) do { \
|
||||
BUILD_BUG_ON((line) >> 16); \
|
||||
BUILD_BUG_ON((type) >= BUGFRAME_NR); \
|
||||
asm ("1:"BUG_INSTR"\n" \
|
||||
".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \
|
||||
"2:\t.asciz " __stringify(file) "\n" \
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#define BUGFRAME_bug 2
|
||||
#define BUGFRAME_assert 3
|
||||
|
||||
#define BUGFRAME_NR 4
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
struct bug_frame {
|
||||
@@ -51,6 +53,7 @@ struct bug_frame {
|
||||
|
||||
#define BUG_FRAME(type, line, ptr, second_frame, msg) do { \
|
||||
BUILD_BUG_ON((line) >> (BUG_LINE_LO_WIDTH + BUG_LINE_HI_WIDTH)); \
|
||||
BUILD_BUG_ON((type) >= BUGFRAME_NR); \
|
||||
asm volatile ( _ASM_BUGFRAME_TEXT(second_frame) \
|
||||
:: _ASM_BUGFRAME_INFO(type, line, ptr, msg) ); \
|
||||
} while (0)
|
||||
@@ -83,6 +86,11 @@ extern const struct bug_frame __start_bug_frames[],
|
||||
* in .rodata
|
||||
*/
|
||||
.macro BUG_FRAME type, line, file_str, second_frame, msg
|
||||
|
||||
.if \type >= BUGFRAME_NR
|
||||
.error "Invalid BUGFRAME index"
|
||||
.endif
|
||||
|
||||
.L\@ud: ud2a
|
||||
|
||||
.pushsection .rodata.str1, "aMS", @progbits, 1
|
||||
|
||||