ARM: 6340/1: module - additional unwind tables for exit/devexit sections
authorPhil Carmody <ext-phil.2.carmody@nokia.com>
Thu, 19 Aug 2010 14:19:04 +0000 (15:19 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 2 Sep 2010 14:31:35 +0000 (15:31 +0100)
Without these, exit functions cannot be stack-traced, so to speak.
This implies that module unloads that perform allocations (don't
laugh) will cause noisy warnings on the console when kmemleak is
enabled, as it presumes that all code's call chains are traceable.
Similarly, BUGs and WARN_ONs will give additional console spam.

Signed-off-by: Phil Carmody <ext-phil.2.carmody@nokia.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/module.h
arch/arm/kernel/module.c

index 6dcff0f7f8d7883cc9c1c5f713a7754729503b19..cbb0bc295d2b184d380e63920dcb55930c7b76b7 100644 (file)
@@ -17,6 +17,8 @@ enum {
        ARM_SEC_INIT,
        ARM_SEC_DEVINIT,
        ARM_SEC_CORE,
+       ARM_SEC_EXIT,
+       ARM_SEC_DEVEXIT,
        ARM_SEC_MAX,
 };
 struct mod_arch_specific {
index 0aa622e84b244b2a8e9fc3b64d3d010280751ec3..d9bd786ce23dc1228ac7937ad442292f08c74cca 100644 (file)
@@ -80,12 +80,20 @@ int module_frob_arch_sections(Elf_Ehdr *hdr,
                        maps[ARM_SEC_DEVINIT].unw_sec = s;
                else if (strcmp(".ARM.exidx", secname) == 0)
                        maps[ARM_SEC_CORE].unw_sec = s;
+               else if (strcmp(".ARM.exidx.exit.text", secname) == 0)
+                       maps[ARM_SEC_EXIT].unw_sec = s;
+               else if (strcmp(".ARM.exidx.devexit.text", secname) == 0)
+                       maps[ARM_SEC_DEVEXIT].unw_sec = s;
                else if (strcmp(".init.text", secname) == 0)
                        maps[ARM_SEC_INIT].sec_text = s;
                else if (strcmp(".devinit.text", secname) == 0)
                        maps[ARM_SEC_DEVINIT].sec_text = s;
                else if (strcmp(".text", secname) == 0)
                        maps[ARM_SEC_CORE].sec_text = s;
+               else if (strcmp(".exit.text", secname) == 0)
+                       maps[ARM_SEC_EXIT].sec_text = s;
+               else if (strcmp(".devexit.text", secname) == 0)
+                       maps[ARM_SEC_DEVEXIT].sec_text = s;
        }
 #endif
        return 0;