With CONFIG_GENERIC_BUG_RELATIVE_POINTERS, the addr/file relative
pointers are calculated weirdly: based on the beginning of the bug_entry
struct address, rather than their respective pointer addresses.
Make the relative pointers less surprising to both humans and tools by
calculating them the normal way.
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Sven Schnelle <svens@linux.ibm.com> # s390
Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com> [arm64]
Link: https://lkml.kernel.org/r/f0e05be797a16f4fc2401eeb88c8450dcbe61df6.1652362951.git.jpoimboe@kernel.org
        14472:  .string file;                                   \
                .popsection;                                    \
                                                                \
-               .long 14472b - 14470b;                          \
+               .long 14472b - .;                               \
                .short line;
 #else
 #define _BUGVERBOSE_LOCATION(file, line)
 #define __BUG_ENTRY(flags)                             \
                .pushsection __bug_table,"aw";          \
                .align 2;                               \
-       14470:  .long 14471f - 14470b;                  \
+       14470:  .long 14471f - .;                       \
 _BUGVERBOSE_LOCATION(__FILE__, __LINE__)               \
                .short flags;                           \
                .popsection;                            \
 
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 .macro __EMIT_BUG_ENTRY addr,file,line,flags
         .section __bug_table,"aw"
-5001:   .4byte \addr - 5001b, 5002f - 5001b
+5001:   .4byte \addr - .
+        .4byte 5002f - .
         .short \line, \flags
         .org 5001b+BUG_ENTRY_SIZE
         .previous
 #else
 .macro __EMIT_BUG_ENTRY addr,file,line,flags
         .section __bug_table,"aw"
-5001:   .4byte \addr - 5001b
+5001:   .4byte \addr - .
         .short \flags
         .org 5001b+BUG_ENTRY_SIZE
         .previous
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 #define _EMIT_BUG_ENTRY                                \
        ".section __bug_table,\"aw\"\n"         \
-       "2:\t.4byte 1b - 2b, %0 - 2b\n"         \
-       "\t.short %1, %2\n"                     \
+       "2:     .4byte 1b - .\n"                \
+       "       .4byte %0 - .\n"                \
+       "       .short %1, %2\n"                \
        ".org 2b+%3\n"                          \
        ".previous\n"
 #else
 #define _EMIT_BUG_ENTRY                                \
        ".section __bug_table,\"aw\"\n"         \
-       "2:\t.4byte 1b - 2b\n"                  \
-       "\t.short %2\n"                         \
+       "2:     .4byte 1b - .\n"                \
+       "       .short %2\n"                    \
        ".org 2b+%3\n"                          \
        ".previous\n"
 #endif
 
 typedef u32 bug_insn_t;
 
 #ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
-#define __BUG_ENTRY_ADDR       RISCV_INT " 1b - 2b"
-#define __BUG_ENTRY_FILE       RISCV_INT " %0 - 2b"
+#define __BUG_ENTRY_ADDR       RISCV_INT " 1b - ."
+#define __BUG_ENTRY_FILE       RISCV_INT " %0 - ."
 #else
 #define __BUG_ENTRY_ADDR       RISCV_PTR " 1b"
 #define __BUG_ENTRY_FILE       RISCV_PTR " %0"
 
                "1:     .asciz  \""__FILE__"\"\n"               \
                ".previous\n"                                   \
                ".section __bug_table,\"awM\",@progbits,%2\n"   \
-               "2:     .long   0b-2b,1b-2b\n"                  \
+               "2:     .long   0b-.\n"                         \
+               "       .long   1b-.\n"                         \
                "       .short  %0,%1\n"                        \
                "       .org    2b+%2\n"                        \
                ".previous\n"                                   \
        asm_inline volatile(                                    \
                "0:     mc      0,0\n"                          \
                ".section __bug_table,\"awM\",@progbits,%1\n"   \
-               "1:     .long   0b-1b\n"                        \
+               "1:     .long   0b-.\n"                         \
                "       .short  %0\n"                           \
                "       .org    1b+%1\n"                        \
                ".previous\n"                                   \
 
 #ifdef CONFIG_X86_32
 # define __BUG_REL(val)        ".long " __stringify(val)
 #else
-# define __BUG_REL(val)        ".long " __stringify(val) " - 2b"
+# define __BUG_REL(val)        ".long " __stringify(val) " - ."
 #endif
 
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 
 
   CONFIG_BUG - emit BUG traps.  Nothing happens without this.
   CONFIG_GENERIC_BUG - enable this code.
-  CONFIG_GENERIC_BUG_RELATIVE_POINTERS - use 32-bit pointers relative to
-       the containing struct bug_entry for bug_addr and file.
+  CONFIG_GENERIC_BUG_RELATIVE_POINTERS - use 32-bit relative pointers for bug_addr and file
   CONFIG_DEBUG_BUGVERBOSE - emit full file+line information for each BUG
 
   CONFIG_BUG and CONFIG_DEBUG_BUGVERBOSE are potentially user-settable
 
 static inline unsigned long bug_addr(const struct bug_entry *bug)
 {
-#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
-       return bug->bug_addr;
+#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
+       return (unsigned long)&bug->bug_addr_disp + bug->bug_addr_disp;
 #else
-       return (unsigned long)bug + bug->bug_addr_disp;
+       return bug->bug_addr;
 #endif
 }
 
                       unsigned int *line)
 {
 #ifdef CONFIG_DEBUG_BUGVERBOSE
-#ifndef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
-       *file = bug->file;
+#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
+       *file = (const char *)&bug->file_disp + bug->file_disp;
 #else
-       *file = (const char *)bug + bug->file_disp;
+       *file = bug->file;
 #endif
        *line = bug->line;
 #else