diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2006-12-08 06:30:41 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-12-11 00:35:07 -0500 |
commit | 73c9ceab40b1269d6195e556773167c078ac8311 (patch) | |
tree | d1de1c286b58a8b1e8dcd0e690ac6e8724e990f5 /arch/powerpc/kernel/module_64.c | |
parent | 973c1fabc70deb10f12a0eaab2f50c2263784257 (diff) |
[POWERPC] Generic BUG for powerpc
This makes powerpc use the generic BUG machinery. The biggest reports the
function name, since it is redundant with kallsyms, and not needed in general.
There is an overall reduction of code, since module_32/64 duplicated several
functions.
Unfortunately there's no way to tell gcc that BUG won't return, so the BUG
macro includes a goto loop. This will generate a real jmp instruction, which
is never used.
[akpm@osdl.org: build fix]
[paulus@samba.org: remove infinite loop in BUG_ON]
Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Andi Kleen <ak@muc.de>
Cc: Hugh Dickens <hugh@veritas.com>
Cc: Michael Ellerman <michael@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kernel/module_64.c')
-rw-r--r-- | arch/powerpc/kernel/module_64.c | 23 |
1 files changed, 6 insertions, 17 deletions
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 8dd1f0aae5d6..75c7c4f19280 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/moduleloader.h> | 20 | #include <linux/moduleloader.h> |
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
23 | #include <linux/bug.h> | ||
23 | #include <asm/module.h> | 24 | #include <asm/module.h> |
24 | #include <asm/uaccess.h> | 25 | #include <asm/uaccess.h> |
25 | #include <asm/firmware.h> | 26 | #include <asm/firmware.h> |
@@ -439,23 +440,11 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
439 | const Elf_Shdr *sechdrs, struct module *me) | 440 | const Elf_Shdr *sechdrs, struct module *me) |
440 | { | 441 | { |
441 | const Elf_Shdr *sect; | 442 | const Elf_Shdr *sect; |
443 | int err; | ||
442 | 444 | ||
443 | me->arch.bug_table = NULL; | 445 | err = module_bug_finalize(hdr, sechdrs, me); |
444 | me->arch.num_bugs = 0; | 446 | if (err) |
445 | 447 | return err; | |
446 | /* Find the __bug_table section, if present */ | ||
447 | sect = find_section(hdr, sechdrs, "__bug_table"); | ||
448 | if (sect != NULL) { | ||
449 | me->arch.bug_table = (void *) sect->sh_addr; | ||
450 | me->arch.num_bugs = sect->sh_size / sizeof(struct bug_entry); | ||
451 | } | ||
452 | |||
453 | /* | ||
454 | * Strictly speaking this should have a spinlock to protect against | ||
455 | * traversals, but since we only traverse on BUG()s, a spinlock | ||
456 | * could potentially lead to deadlock and thus be counter-productive. | ||
457 | */ | ||
458 | list_add(&me->arch.bug_list, &module_bug_list); | ||
459 | 448 | ||
460 | /* Apply feature fixups */ | 449 | /* Apply feature fixups */ |
461 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); | 450 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); |
@@ -475,7 +464,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
475 | 464 | ||
476 | void module_arch_cleanup(struct module *mod) | 465 | void module_arch_cleanup(struct module *mod) |
477 | { | 466 | { |
478 | list_del(&mod->arch.bug_list); | 467 | module_bug_cleanup(mod); |
479 | } | 468 | } |
480 | 469 | ||
481 | struct bug_entry *module_find_bug(unsigned long bugaddr) | 470 | struct bug_entry *module_find_bug(unsigned long bugaddr) |