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:
Konrad Rzeszutek Wilk committed 2016-03-22 16:55:26 -04:00
1 parent a2fc8d514d
commit 4c2cddb471
2 files changed
+11

No files matched your search

+3
View File
@@ -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" \
+8
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.