[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC 03/10] xen/arm: Implement assembly version of WARN/BUG/ASSERT_FAILED...



... to produce clear error message in assembly code.

Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>

---
    TODO:
        - Implement the arm32 bits
---
 xen/arch/arm/arm64/entry.S      |  1 +
 xen/include/asm-arm/arm64/bug.h |  4 ++++
 xen/include/asm-arm/bug.h       | 37 +++++++++++++++++++++++++++++++++----
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/xen/arch/arm/arm64/entry.S b/xen/arch/arm/arm64/entry.S
index 2b9d4cd..93c80ff 100644
--- a/xen/arch/arm/arm64/entry.S
+++ b/xen/arch/arm/arm64/entry.S
@@ -1,5 +1,6 @@
 #include <xen/config.h>
 #include <asm/asm_defns.h>
+#include <asm/bug.h>
 #include <asm/regs.h>
 #include <public/xen.h>
 
diff --git a/xen/include/asm-arm/arm64/bug.h b/xen/include/asm-arm/arm64/bug.h
index 42b0e4f..9670505 100644
--- a/xen/include/asm-arm/arm64/bug.h
+++ b/xen/include/asm-arm/arm64/bug.h
@@ -5,6 +5,10 @@
 
 #define BRK_BUG_FRAME 1
 
+#ifndef __ASSEMBLY__
 #define BUG_INSTR "brk " __stringify(BRK_BUG_FRAME)
+#else
+#define BUG_INSTR brk BRK_BUG_FRAME
+#endif
 
 #endif /* __ARM_ARM64_BUG_H__ */
diff --git a/xen/include/asm-arm/bug.h b/xen/include/asm-arm/bug.h
index fd3e95e..ffd7f6c 100644
--- a/xen/include/asm-arm/bug.h
+++ b/xen/include/asm-arm/bug.h
@@ -11,6 +11,12 @@
 # error "unknown ARM variant"
 #endif
 
+#define BUGFRAME_warn   0
+#define BUGFRAME_bug    1
+#define BUGFRAME_assert 2
+
+#ifndef __ASSEMBLY__
+
 struct bug_frame {
     signed int loc_disp;    /* Relative address to the bug address */
     signed int file_disp;   /* Relative address to the filename */
@@ -24,10 +30,6 @@ struct bug_frame {
 #define bug_line(b) ((b)->line)
 #define bug_msg(b) ((const char *)(b) + (b)->msg_disp)
 
-#define BUGFRAME_warn   0
-#define BUGFRAME_bug    1
-#define BUGFRAME_assert 2
-
 /* 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
@@ -71,6 +73,33 @@ extern const struct bug_frame __start_bug_frames[],
 
 int do_bug_frame(struct cpu_user_regs *regs, vaddr_t pc);
 
+#else /* !__ASSEMBLY__ */
+
+.macro BUG_FRAME type, line , file, has_msg, msg
+.L\@bug:BUG_INSTR
+.pushsection .rodata.str, "aMS", %progbits, 1
+    .L\@s1:.asciz "\file"
+    .L\@s2:
+    .if \has_msg
+    .asciz "\msg"
+    .endif
+.popsection
+.pushsection .bug_frames.\type, "a", %progbits
+    .L\@bf:
+    .long (.L\@bug - .L\@bf)
+    .long (.L\@s1 - .L\@bf)
+    .long (.L\@s2 - .L\@bf)
+    .hword \line, 0
+.popsection
+.endm
+
+#define WARN    BUG_FRAME BUGFRAME_warn, __LINE__, __FILE__, 0, 0
+#define BUG     BUG_FRAME BUGFRAME_bug, __LINE__, __FILE__, 0, 0
+#define ASSERT_FAILED(msg)                                          \
+    BUG_FRAME BUGFRAME_assert, __LINE__, __FILE__, 1, msg
+
+#endif
+
 #endif /* __ARM_BUG_H__ */
 /*
  * Local variables:
-- 
2.1.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.