diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2007-04-27 10:01:42 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-04-27 10:01:42 -0400 |
commit | c0007f1a65762eaf55633d403b380130ec60adad (patch) | |
tree | 877ad01344b48a11b293c879b2161a4865b897e5 /arch/s390 | |
parent | bb11e3bdbac08f773a89f3ca287024a956ee8a12 (diff) |
[S390] Use generic bug.
Generic bug implementation for s390. Will increase the value of the
console output on BUG() statements since registers r0-r5,r14 will
not be clobbered by a printk() call that was previously done before
the illegal instruction of BUG() was hit.
Also implements an architecture specific WARN_ON(). Output of that
could be increased but requires common code change.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/Kconfig | 5 | ||||
-rw-r--r-- | arch/s390/defconfig | 2 | ||||
-rw-r--r-- | arch/s390/kernel/module.c | 4 | ||||
-rw-r--r-- | arch/s390/kernel/traps.c | 17 | ||||
-rw-r--r-- | arch/s390/kernel/vmlinux.lds.S | 10 |
5 files changed, 33 insertions, 5 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 0f293aa7b0fa..0f9517bc8e70 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -41,6 +41,11 @@ config GENERIC_HWEIGHT | |||
41 | config GENERIC_TIME | 41 | config GENERIC_TIME |
42 | def_bool y | 42 | def_bool y |
43 | 43 | ||
44 | config GENERIC_BUG | ||
45 | bool | ||
46 | depends on BUG | ||
47 | default y | ||
48 | |||
44 | config NO_IOMEM | 49 | config NO_IOMEM |
45 | def_bool y | 50 | def_bool y |
46 | 51 | ||
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 741d2bbb2b37..80046d9e2a3b 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -12,6 +12,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y | |||
12 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 12 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
13 | CONFIG_GENERIC_HWEIGHT=y | 13 | CONFIG_GENERIC_HWEIGHT=y |
14 | CONFIG_GENERIC_TIME=y | 14 | CONFIG_GENERIC_TIME=y |
15 | CONFIG_GENERIC_BUG=y | ||
15 | CONFIG_NO_IOMEM=y | 16 | CONFIG_NO_IOMEM=y |
16 | CONFIG_S390=y | 17 | CONFIG_S390=y |
17 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 18 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -705,6 +706,7 @@ CONFIG_DEBUG_MUTEXES=y | |||
705 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | 706 | CONFIG_DEBUG_SPINLOCK_SLEEP=y |
706 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | 707 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set |
707 | # CONFIG_DEBUG_KOBJECT is not set | 708 | # CONFIG_DEBUG_KOBJECT is not set |
709 | CONFIG_DEBUG_BUGVERBOSE=y | ||
708 | # CONFIG_DEBUG_INFO is not set | 710 | # CONFIG_DEBUG_INFO is not set |
709 | # CONFIG_DEBUG_VM is not set | 711 | # CONFIG_DEBUG_VM is not set |
710 | # CONFIG_DEBUG_LIST is not set | 712 | # CONFIG_DEBUG_LIST is not set |
diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c index 39d1dd752529..59b4e796680a 100644 --- a/arch/s390/kernel/module.c +++ b/arch/s390/kernel/module.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
33 | #include <linux/moduleloader.h> | 33 | #include <linux/moduleloader.h> |
34 | #include <linux/bug.h> | ||
34 | 35 | ||
35 | #if 0 | 36 | #if 0 |
36 | #define DEBUGP printk | 37 | #define DEBUGP printk |
@@ -398,9 +399,10 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
398 | struct module *me) | 399 | struct module *me) |
399 | { | 400 | { |
400 | vfree(me->arch.syminfo); | 401 | vfree(me->arch.syminfo); |
401 | return 0; | 402 | return module_bug_finalize(hdr, sechdrs, me); |
402 | } | 403 | } |
403 | 404 | ||
404 | void module_arch_cleanup(struct module *mod) | 405 | void module_arch_cleanup(struct module *mod) |
405 | { | 406 | { |
407 | module_bug_cleanup(mod); | ||
406 | } | 408 | } |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index a6540940190b..49dec830373a 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/kallsyms.h> | 30 | #include <linux/kallsyms.h> |
31 | #include <linux/reboot.h> | 31 | #include <linux/reboot.h> |
32 | #include <linux/kprobes.h> | 32 | #include <linux/kprobes.h> |
33 | 33 | #include <linux/bug.h> | |
34 | #include <asm/system.h> | 34 | #include <asm/system.h> |
35 | #include <asm/uaccess.h> | 35 | #include <asm/uaccess.h> |
36 | #include <asm/io.h> | 36 | #include <asm/io.h> |
@@ -297,6 +297,11 @@ report_user_fault(long interruption_code, struct pt_regs *regs) | |||
297 | #endif | 297 | #endif |
298 | } | 298 | } |
299 | 299 | ||
300 | int is_valid_bugaddr(unsigned long addr) | ||
301 | { | ||
302 | return 1; | ||
303 | } | ||
304 | |||
300 | static void __kprobes inline do_trap(long interruption_code, int signr, | 305 | static void __kprobes inline do_trap(long interruption_code, int signr, |
301 | char *str, struct pt_regs *regs, | 306 | char *str, struct pt_regs *regs, |
302 | siginfo_t *info) | 307 | siginfo_t *info) |
@@ -323,8 +328,14 @@ static void __kprobes inline do_trap(long interruption_code, int signr, | |||
323 | fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); | 328 | fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); |
324 | if (fixup) | 329 | if (fixup) |
325 | regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE; | 330 | regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE; |
326 | else | 331 | else { |
327 | die(str, regs, interruption_code); | 332 | enum bug_trap_type btt; |
333 | |||
334 | btt = report_bug(regs->psw.addr & PSW_ADDR_INSN); | ||
335 | if (btt == BUG_TRAP_TYPE_WARN) | ||
336 | return; | ||
337 | die(str, regs, interruption_code); | ||
338 | } | ||
328 | } | 339 | } |
329 | } | 340 | } |
330 | 341 | ||
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index c30716ae130c..418f6426a949 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -45,6 +45,8 @@ SECTIONS | |||
45 | __ex_table : { *(__ex_table) } | 45 | __ex_table : { *(__ex_table) } |
46 | __stop___ex_table = .; | 46 | __stop___ex_table = .; |
47 | 47 | ||
48 | BUG_TABLE | ||
49 | |||
48 | .data : { /* Data */ | 50 | .data : { /* Data */ |
49 | *(.data) | 51 | *(.data) |
50 | CONSTRUCTORS | 52 | CONSTRUCTORS |
@@ -77,6 +79,12 @@ SECTIONS | |||
77 | *(.init.text) | 79 | *(.init.text) |
78 | _einittext = .; | 80 | _einittext = .; |
79 | } | 81 | } |
82 | /* | ||
83 | * .exit.text is discarded at runtime, not link time, | ||
84 | * to deal with references from __bug_table | ||
85 | */ | ||
86 | .exit.text : { *(.exit.text) } | ||
87 | |||
80 | .init.data : { *(.init.data) } | 88 | .init.data : { *(.init.data) } |
81 | . = ALIGN(256); | 89 | . = ALIGN(256); |
82 | __setup_start = .; | 90 | __setup_start = .; |
@@ -116,7 +124,7 @@ SECTIONS | |||
116 | 124 | ||
117 | /* Sections to be discarded */ | 125 | /* Sections to be discarded */ |
118 | /DISCARD/ : { | 126 | /DISCARD/ : { |
119 | *(.exit.text) *(.exit.data) *(.exitcall.exit) | 127 | *(.exit.data) *(.exitcall.exit) |
120 | } | 128 | } |
121 | 129 | ||
122 | /* Stabs debugging sections. */ | 130 | /* Stabs debugging sections. */ |