Merge branch 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 asm updates from Ingo Molnar: "The main changes in this cycle were: - unwinder fixes and enhancements - improve ftrace interaction with the unwinder - optimize the code footprint of WARN() and related debugging constructs - ... plus misc updates, cleanups and fixes" * 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits) x86/unwind: Dump all stacks in unwind_dump() x86/unwind: Silence more entry-code related warnings x86/ftrace: Fix ebp in ftrace_regs_caller that screws up unwinder x86/unwind: Remove unused 'sp' parameter in unwind_dump() x86/unwind: Prepend hex mask value with '0x' in unwind_dump() x86/unwind: Properly zero-pad 32-bit values in unwind_dump() x86/unwind: Ensure stack pointer is aligned debug: Avoid setting BUGFLAG_WARNING twice x86/unwind: Silence entry-related warnings x86/unwind: Read stack return address in update_stack_state() x86/unwind: Move common code into update_stack_state() debug: Fix __bug_table[] in arch linker scripts debug: Add _ONCE() logic to report_bug() x86/debug: Define BUG() again for !CONFIG_BUG x86/debug: Implement __WARN() using UD0 x86/ftrace: Use Makefile logic instead of #ifdef for compiling ftrace_*.o x86/ftrace: Add -mfentry support to x86_32 with DYNAMIC_FTRACE set x86/ftrace: Clean up ftrace_regs_caller x86/ftrace: Add stack frame pointer to ftrace_caller x86/ftrace: Move the ftrace specific code out of entry_32.S ...
This commit is contained in:
28
lib/bug.c
28
lib/bug.c
@@ -47,7 +47,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/rculist.h>
|
||||
|
||||
extern const struct bug_entry __start___bug_table[], __stop___bug_table[];
|
||||
extern struct bug_entry __start___bug_table[], __stop___bug_table[];
|
||||
|
||||
static inline unsigned long bug_addr(const struct bug_entry *bug)
|
||||
{
|
||||
@@ -62,10 +62,10 @@ static inline unsigned long bug_addr(const struct bug_entry *bug)
|
||||
/* Updates are protected by module mutex */
|
||||
static LIST_HEAD(module_bug_list);
|
||||
|
||||
static const struct bug_entry *module_find_bug(unsigned long bugaddr)
|
||||
static struct bug_entry *module_find_bug(unsigned long bugaddr)
|
||||
{
|
||||
struct module *mod;
|
||||
const struct bug_entry *bug = NULL;
|
||||
struct bug_entry *bug = NULL;
|
||||
|
||||
rcu_read_lock_sched();
|
||||
list_for_each_entry_rcu(mod, &module_bug_list, bug_list) {
|
||||
@@ -122,15 +122,15 @@ void module_bug_cleanup(struct module *mod)
|
||||
|
||||
#else
|
||||
|
||||
static inline const struct bug_entry *module_find_bug(unsigned long bugaddr)
|
||||
static inline struct bug_entry *module_find_bug(unsigned long bugaddr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct bug_entry *find_bug(unsigned long bugaddr)
|
||||
struct bug_entry *find_bug(unsigned long bugaddr)
|
||||
{
|
||||
const struct bug_entry *bug;
|
||||
struct bug_entry *bug;
|
||||
|
||||
for (bug = __start___bug_table; bug < __stop___bug_table; ++bug)
|
||||
if (bugaddr == bug_addr(bug))
|
||||
@@ -141,9 +141,9 @@ const struct bug_entry *find_bug(unsigned long bugaddr)
|
||||
|
||||
enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
{
|
||||
const struct bug_entry *bug;
|
||||
struct bug_entry *bug;
|
||||
const char *file;
|
||||
unsigned line, warning;
|
||||
unsigned line, warning, once, done;
|
||||
|
||||
if (!is_valid_bugaddr(bugaddr))
|
||||
return BUG_TRAP_TYPE_NONE;
|
||||
@@ -164,6 +164,18 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
|
||||
line = bug->line;
|
||||
#endif
|
||||
warning = (bug->flags & BUGFLAG_WARNING) != 0;
|
||||
once = (bug->flags & BUGFLAG_ONCE) != 0;
|
||||
done = (bug->flags & BUGFLAG_DONE) != 0;
|
||||
|
||||
if (warning && once) {
|
||||
if (done)
|
||||
return BUG_TRAP_TYPE_WARN;
|
||||
|
||||
/*
|
||||
* Since this is the only store, concurrency is not an issue.
|
||||
*/
|
||||
bug->flags |= BUGFLAG_DONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (warning) {
|
||||
|
Reference in New Issue
Block a user