Re: [S390] Use generic bug.
From: Heiko Carstens <[EMAIL PROTECTED]> Date: Tue, 6 Mar 2007 12:59:17 +0100 > On Mon, Mar 05, 2007 at 02:56:29PM -0800, David Miller wrote: > > From: Martin Schwidefsky <[EMAIL PROTECTED]> > > Date: Mon, 5 Mar 2007 23:43:54 +0100 > > > > > + if (__builtin_constant_p(__ret_warn_on)) { \ > > > + if (__ret_warn_on) \ > > > + __EMIT_BUG(BUGFLAG_WARNING);\ > > > > I see we'll have this construct on powerpc, parisc and now s390. > > > > But if it's going to trigger essentially at compile time, I > > think it's much better to BUILD_BUG_ON() in this case instead > > of counting on the code path to actually run and the user to > > notice and report the kernel log message. > > So something like WARN_ON(1) won't compile, but BUG_ON(1) still > would? Seems odd to me. > Also since there is nothing like WARN(), you have to use WARN_ON(1). > Btw.: sparc64 has plenty of these ;) I see. It's for case where we can't put the test into the WARN_ON() call. Thanks for the explanation, I hadn't considered such cases. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [S390] Use generic bug.
On Mon, Mar 05, 2007 at 02:56:29PM -0800, David Miller wrote: > From: Martin Schwidefsky <[EMAIL PROTECTED]> > Date: Mon, 5 Mar 2007 23:43:54 +0100 > > > + if (__builtin_constant_p(__ret_warn_on)) { \ > > + if (__ret_warn_on) \ > > + __EMIT_BUG(BUGFLAG_WARNING);\ > > I see we'll have this construct on powerpc, parisc and now s390. > > But if it's going to trigger essentially at compile time, I > think it's much better to BUILD_BUG_ON() in this case instead > of counting on the code path to actually run and the user to > notice and report the kernel log message. So something like WARN_ON(1) won't compile, but BUG_ON(1) still would? Seems odd to me. Also since there is nothing like WARN(), you have to use WARN_ON(1). Btw.: sparc64 has plenty of these ;) I would prefer to have something like a per arch defined WARN() and a common code WARN_ON() like we have it already for BUG_ON(). Then I would agree: if WARN_ON() is used with a constant the build should fail. Just to tell the author that he did something wrong or simply should use WARN(). And of course the existing BUG_ON() could be converted as well. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [S390] Use generic bug.
On Mon, Mar 05, 2007 at 02:56:29PM -0800, David Miller wrote: From: Martin Schwidefsky [EMAIL PROTECTED] Date: Mon, 5 Mar 2007 23:43:54 +0100 + if (__builtin_constant_p(__ret_warn_on)) { \ + if (__ret_warn_on) \ + __EMIT_BUG(BUGFLAG_WARNING);\ I see we'll have this construct on powerpc, parisc and now s390. But if it's going to trigger essentially at compile time, I think it's much better to BUILD_BUG_ON() in this case instead of counting on the code path to actually run and the user to notice and report the kernel log message. So something like WARN_ON(1) won't compile, but BUG_ON(1) still would? Seems odd to me. Also since there is nothing like WARN(), you have to use WARN_ON(1). Btw.: sparc64 has plenty of these ;) I would prefer to have something like a per arch defined WARN() and a common code WARN_ON() like we have it already for BUG_ON(). Then I would agree: if WARN_ON() is used with a constant the build should fail. Just to tell the author that he did something wrong or simply should use WARN(). And of course the existing BUG_ON() could be converted as well. - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [S390] Use generic bug.
From: Heiko Carstens [EMAIL PROTECTED] Date: Tue, 6 Mar 2007 12:59:17 +0100 On Mon, Mar 05, 2007 at 02:56:29PM -0800, David Miller wrote: From: Martin Schwidefsky [EMAIL PROTECTED] Date: Mon, 5 Mar 2007 23:43:54 +0100 + if (__builtin_constant_p(__ret_warn_on)) { \ + if (__ret_warn_on) \ + __EMIT_BUG(BUGFLAG_WARNING);\ I see we'll have this construct on powerpc, parisc and now s390. But if it's going to trigger essentially at compile time, I think it's much better to BUILD_BUG_ON() in this case instead of counting on the code path to actually run and the user to notice and report the kernel log message. So something like WARN_ON(1) won't compile, but BUG_ON(1) still would? Seems odd to me. Also since there is nothing like WARN(), you have to use WARN_ON(1). Btw.: sparc64 has plenty of these ;) I see. It's for case where we can't put the test into the WARN_ON() call. Thanks for the explanation, I hadn't considered such cases. - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [S390] Use generic bug.
From: Martin Schwidefsky <[EMAIL PROTECTED]> Date: Mon, 5 Mar 2007 23:43:54 +0100 > + if (__builtin_constant_p(__ret_warn_on)) { \ > + if (__ret_warn_on) \ > + __EMIT_BUG(BUGFLAG_WARNING);\ I see we'll have this construct on powerpc, parisc and now s390. But if it's going to trigger essentially at compile time, I think it's much better to BUILD_BUG_ON() in this case instead of counting on the code path to actually run and the user to notice and report the kernel log message. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[S390] Use generic bug.
From: Heiko Carstens <[EMAIL PROTECTED]> [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: Heiko Carstens <[EMAIL PROTECTED]> Signed-off-by: Martin Schwidefsky <[EMAIL PROTECTED]> --- arch/s390/Kconfig |5 ++ arch/s390/defconfig|2 + arch/s390/kernel/module.c |4 +- arch/s390/kernel/traps.c | 17 -- arch/s390/kernel/vmlinux.lds.S | 10 + include/asm-s390/bug.h | 69 + 6 files changed, 89 insertions(+), 18 deletions(-) diff -urpN linux-2.6/arch/s390/defconfig linux-2.6-patched/arch/s390/defconfig --- linux-2.6/arch/s390/defconfig 2007-03-05 22:51:47.0 +0100 +++ linux-2.6-patched/arch/s390/defconfig 2007-03-05 22:52:02.0 +0100 @@ -12,6 +12,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_BUG=y CONFIG_NO_IOMEM=y CONFIG_S390=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" @@ -705,6 +706,7 @@ CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_LIST is not set diff -urpN linux-2.6/arch/s390/Kconfig linux-2.6-patched/arch/s390/Kconfig --- linux-2.6/arch/s390/Kconfig 2007-03-05 22:51:51.0 +0100 +++ linux-2.6-patched/arch/s390/Kconfig 2007-03-05 22:52:02.0 +0100 @@ -41,6 +41,11 @@ config GENERIC_HWEIGHT config GENERIC_TIME def_bool y +config GENERIC_BUG + bool + depends on BUG + default y + config NO_IOMEM def_bool y diff -urpN linux-2.6/arch/s390/kernel/module.c linux-2.6-patched/arch/s390/kernel/module.c --- linux-2.6/arch/s390/kernel/module.c 2007-03-05 22:51:29.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/module.c 2007-03-05 22:52:02.0 +0100 @@ -31,6 +31,7 @@ #include #include #include +#include #if 0 #define DEBUGP printk @@ -398,9 +399,10 @@ int module_finalize(const Elf_Ehdr *hdr, struct module *me) { vfree(me->arch.syminfo); - return 0; + return module_bug_finalize(hdr, sechdrs, me); } void module_arch_cleanup(struct module *mod) { + module_bug_cleanup(mod); } diff -urpN linux-2.6/arch/s390/kernel/traps.c linux-2.6-patched/arch/s390/kernel/traps.c --- linux-2.6/arch/s390/kernel/traps.c 2007-03-05 22:52:02.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/traps.c 2007-03-05 22:52:02.0 +0100 @@ -30,7 +30,7 @@ #include #include #include - +#include #include #include #include @@ -297,6 +297,11 @@ report_user_fault(long interruption_code #endif } +int is_valid_bugaddr(unsigned long addr) +{ + return 1; +} + static void __kprobes inline do_trap(long interruption_code, int signr, char *str, struct pt_regs *regs, siginfo_t *info) @@ -323,8 +328,14 @@ static void __kprobes inline do_trap(lon fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN); if (fixup) regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE; -else -die(str, regs, interruption_code); + else { + enum bug_trap_type btt; + + btt = report_bug(regs->psw.addr & PSW_ADDR_INSN); + if (btt == BUG_TRAP_TYPE_WARN) + return; + die(str, regs, interruption_code); + } } } diff -urpN linux-2.6/arch/s390/kernel/vmlinux.lds.S linux-2.6-patched/arch/s390/kernel/vmlinux.lds.S --- linux-2.6/arch/s390/kernel/vmlinux.lds.S2007-03-05 22:51:29.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/vmlinux.lds.S2007-03-05 22:52:02.0 +0100 @@ -45,6 +45,8 @@ SECTIONS __ex_table : { *(__ex_table) } __stop___ex_table = .; + BUG_TABLE + .data : {/* Data */ *(.data) CONSTRUCTORS @@ -77,6 +79,12 @@ SECTIONS *(.init.text) _einittext = .; } + /* + * .exit.text is discarded at runtime, not link time, + * to deal with references from __bug_table + */ + .exit.text : { *(.exit.text) } + .init.data : { *(.init.data) } . = ALIGN(256); __setup_start = .; @@ -116,7 +124,7 @@ SECTIONS /* Sections to be discarded */ /DISCARD/ : { -
[S390] Use generic bug.
From: Heiko Carstens [EMAIL PROTECTED] [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: Heiko Carstens [EMAIL PROTECTED] Signed-off-by: Martin Schwidefsky [EMAIL PROTECTED] --- arch/s390/Kconfig |5 ++ arch/s390/defconfig|2 + arch/s390/kernel/module.c |4 +- arch/s390/kernel/traps.c | 17 -- arch/s390/kernel/vmlinux.lds.S | 10 + include/asm-s390/bug.h | 69 + 6 files changed, 89 insertions(+), 18 deletions(-) diff -urpN linux-2.6/arch/s390/defconfig linux-2.6-patched/arch/s390/defconfig --- linux-2.6/arch/s390/defconfig 2007-03-05 22:51:47.0 +0100 +++ linux-2.6-patched/arch/s390/defconfig 2007-03-05 22:52:02.0 +0100 @@ -12,6 +12,7 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_BUG=y CONFIG_NO_IOMEM=y CONFIG_S390=y CONFIG_DEFCONFIG_LIST=/lib/modules/$UNAME_RELEASE/.config @@ -705,6 +706,7 @@ CONFIG_DEBUG_MUTEXES=y CONFIG_DEBUG_SPINLOCK_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y # CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_LIST is not set diff -urpN linux-2.6/arch/s390/Kconfig linux-2.6-patched/arch/s390/Kconfig --- linux-2.6/arch/s390/Kconfig 2007-03-05 22:51:51.0 +0100 +++ linux-2.6-patched/arch/s390/Kconfig 2007-03-05 22:52:02.0 +0100 @@ -41,6 +41,11 @@ config GENERIC_HWEIGHT config GENERIC_TIME def_bool y +config GENERIC_BUG + bool + depends on BUG + default y + config NO_IOMEM def_bool y diff -urpN linux-2.6/arch/s390/kernel/module.c linux-2.6-patched/arch/s390/kernel/module.c --- linux-2.6/arch/s390/kernel/module.c 2007-03-05 22:51:29.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/module.c 2007-03-05 22:52:02.0 +0100 @@ -31,6 +31,7 @@ #include linux/string.h #include linux/kernel.h #include linux/moduleloader.h +#include linux/bug.h #if 0 #define DEBUGP printk @@ -398,9 +399,10 @@ int module_finalize(const Elf_Ehdr *hdr, struct module *me) { vfree(me-arch.syminfo); - return 0; + return module_bug_finalize(hdr, sechdrs, me); } void module_arch_cleanup(struct module *mod) { + module_bug_cleanup(mod); } diff -urpN linux-2.6/arch/s390/kernel/traps.c linux-2.6-patched/arch/s390/kernel/traps.c --- linux-2.6/arch/s390/kernel/traps.c 2007-03-05 22:52:02.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/traps.c 2007-03-05 22:52:02.0 +0100 @@ -30,7 +30,7 @@ #include linux/kallsyms.h #include linux/reboot.h #include linux/kprobes.h - +#include linux/bug.h #include asm/system.h #include asm/uaccess.h #include asm/io.h @@ -297,6 +297,11 @@ report_user_fault(long interruption_code #endif } +int is_valid_bugaddr(unsigned long addr) +{ + return 1; +} + static void __kprobes inline do_trap(long interruption_code, int signr, char *str, struct pt_regs *regs, siginfo_t *info) @@ -323,8 +328,14 @@ static void __kprobes inline do_trap(lon fixup = search_exception_tables(regs-psw.addr PSW_ADDR_INSN); if (fixup) regs-psw.addr = fixup-fixup | PSW_ADDR_AMODE; -else -die(str, regs, interruption_code); + else { + enum bug_trap_type btt; + + btt = report_bug(regs-psw.addr PSW_ADDR_INSN); + if (btt == BUG_TRAP_TYPE_WARN) + return; + die(str, regs, interruption_code); + } } } diff -urpN linux-2.6/arch/s390/kernel/vmlinux.lds.S linux-2.6-patched/arch/s390/kernel/vmlinux.lds.S --- linux-2.6/arch/s390/kernel/vmlinux.lds.S2007-03-05 22:51:29.0 +0100 +++ linux-2.6-patched/arch/s390/kernel/vmlinux.lds.S2007-03-05 22:52:02.0 +0100 @@ -45,6 +45,8 @@ SECTIONS __ex_table : { *(__ex_table) } __stop___ex_table = .; + BUG_TABLE + .data : {/* Data */ *(.data) CONSTRUCTORS @@ -77,6 +79,12 @@ SECTIONS *(.init.text) _einittext = .; } + /* + * .exit.text is discarded at runtime, not link time, + * to deal with references from __bug_table + */ + .exit.text : { *(.exit.text) } + .init.data : { *(.init.data) } . = ALIGN(256); __setup_start
Re: [S390] Use generic bug.
From: Martin Schwidefsky [EMAIL PROTECTED] Date: Mon, 5 Mar 2007 23:43:54 +0100 + if (__builtin_constant_p(__ret_warn_on)) { \ + if (__ret_warn_on) \ + __EMIT_BUG(BUGFLAG_WARNING);\ I see we'll have this construct on powerpc, parisc and now s390. But if it's going to trigger essentially at compile time, I think it's much better to BUILD_BUG_ON() in this case instead of counting on the code path to actually run and the user to notice and report the kernel log message. - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/