parisc: Reduce size of the bug_table on 64-bit kernel by half
authorHelge Deller <deller@gmx.de>
Thu, 23 Nov 2023 20:57:19 +0000 (21:57 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Dec 2023 17:39:23 +0000 (18:39 +0100)
[ Upstream commit 43266838515d30dc0c45d5c7e6e7edacee6cce92 ]

Enable GENERIC_BUG_RELATIVE_POINTERS which will store 32-bit relative
offsets to the bug address and the source file name instead of 64-bit
absolute addresses. This effectively reduces the size of the
bug_table[] array by half on 64-bit kernels.

Signed-off-by: Helge Deller <deller@gmx.de>
Stable-dep-of: 487635756198 ("parisc: Fix asm operand number out of range build error in bug table")
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/parisc/Kconfig
arch/parisc/include/asm/bug.h

index 67c26e8..345d5e0 100644 (file)
@@ -105,9 +105,12 @@ config ARCH_HAS_ILOG2_U64
        default n
 
 config GENERIC_BUG
-       bool
-       default y
+       def_bool y
        depends on BUG
+       select GENERIC_BUG_RELATIVE_POINTERS if 64BIT
+
+config GENERIC_BUG_RELATIVE_POINTERS
+       bool
 
 config GENERIC_HWEIGHT
        bool
index b9cad0b..1641ff9 100644 (file)
 #define        PARISC_BUG_BREAK_ASM    "break 0x1f, 0x1fff"
 #define        PARISC_BUG_BREAK_INSN   0x03ffe01f  /* PARISC_BUG_BREAK_ASM */
 
-#if defined(CONFIG_64BIT)
-#define ASM_WORD_INSN          ".dword\t"
+#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
+# define __BUG_REL(val) ".word " __stringify(val) " - ."
 #else
-#define ASM_WORD_INSN          ".word\t"
+# define __BUG_REL(val) ".word " __stringify(val)
 #endif
 
+
 #ifdef CONFIG_DEBUG_BUGVERBOSE
 #define BUG()                                                          \
        do {                                                            \
                asm volatile("\n"                                       \
                             "1:\t" PARISC_BUG_BREAK_ASM "\n"           \
                             "\t.pushsection __bug_table,\"a\"\n"       \
-                            "\t.align %4\n"                            \
-                            "2:\t" ASM_WORD_INSN "1b, %c0\n"           \
+                            "\t.align 4\n"                             \
+                            "2:\t" __BUG_REL(1b) "\n"                  \
+                            "\t" __BUG_REL(%c0)  "\n"                  \
                             "\t.short %1, %2\n"                        \
-                            "\t.blockz %3-2*%4-2*2\n"                  \
+                            "\t.blockz %3-2*4-2*2\n"                   \
                             "\t.popsection"                            \
                             : : "i" (__FILE__), "i" (__LINE__),        \
-                            "i" (0), "i" (sizeof(struct bug_entry)),   \
-                            "i" (sizeof(long)) );                      \
+                            "i" (0), "i" (sizeof(struct bug_entry)) ); \
                unreachable();                                          \
        } while(0)
 
                asm volatile("\n"                                       \
                             "1:\t" PARISC_BUG_BREAK_ASM "\n"           \
                             "\t.pushsection __bug_table,\"a\"\n"       \
-                            "\t.align %4\n"                            \
-                            "2:\t" ASM_WORD_INSN "1b, %c0\n"           \
+                            "\t.align 4\n"                             \
+                            "2:\t" __BUG_REL(1b) "\n"                  \
+                            "\t" __BUG_REL(%c0)  "\n"                  \
                             "\t.short %1, %2\n"                        \
-                            "\t.blockz %3-2*%4-2*2\n"                  \
+                            "\t.blockz %3-2*4-2*2\n"                   \
                             "\t.popsection"                            \
                             : : "i" (__FILE__), "i" (__LINE__),        \
                             "i" (BUGFLAG_WARNING|(flags)),             \
-                            "i" (sizeof(struct bug_entry)),            \
-                            "i" (sizeof(long)) );                      \
+                            "i" (sizeof(struct bug_entry)) );          \
        } while(0)
 #else
 #define __WARN_FLAGS(flags)                                            \
                             "1:\t" PARISC_BUG_BREAK_ASM "\n"           \
                             "\t.pushsection __bug_table,\"a\"\n"       \
                             "\t.align %2\n"                            \
-                            "2:\t" ASM_WORD_INSN "1b\n"                \
+                            "2:\t" __BUG_REL(1b) "\n"                  \
                             "\t.short %0\n"                            \
-                            "\t.blockz %1-%2-2\n"                      \
+                            "\t.blockz %1-4-2\n"                       \
                             "\t.popsection"                            \
                             : : "i" (BUGFLAG_WARNING|(flags)),         \
-                            "i" (sizeof(struct bug_entry)),            \
-                            "i" (sizeof(long)) );                      \
+                            "i" (sizeof(struct bug_entry)) );          \
        } while(0)
 #endif