Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 80261
b: refs/heads/master
c: 5bc27dc
h: refs/heads/master
i:
  80259: 56fb7d3
v: v3
  • Loading branch information
Arjan van de Ven authored and Ingo Molnar committed Jan 30, 2008
1 parent 1c63fcb commit 7f09fb7
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e9d4efddbec3d852d435b370b9c40ff7ac24afe6
refs/heads/master: 5bc27dc2f55fd3043597b5a8de6536183f28a449
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/process_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ void __show_registers(struct pt_regs *regs, int all)
void show_regs(struct pt_regs *regs)
{
__show_registers(regs, 1);
show_trace(NULL, regs, &regs->sp);
show_trace(NULL, regs, &regs->sp, regs->bp);
}

/*
Expand Down
7 changes: 4 additions & 3 deletions trunk/arch/x86/kernel/stacktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ static void save_stack_address(void *data, unsigned long addr, int reliable)
trace->entries[trace->nr_entries++] = addr;
}

static void save_stack_address_nosched(void *data, unsigned long addr)
static void
save_stack_address_nosched(void *data, unsigned long addr, int reliable)
{
struct stack_trace *trace = (struct stack_trace *)data;
if (in_sched_functions(addr))
Expand Down Expand Up @@ -65,14 +66,14 @@ static const struct stacktrace_ops save_stack_ops_nosched = {
*/
void save_stack_trace(struct stack_trace *trace)
{
dump_trace(current, NULL, NULL, &save_stack_ops, trace);
dump_trace(current, NULL, NULL, 0, &save_stack_ops, trace);
if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}

void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
{
dump_trace(tsk, NULL, NULL, &save_stack_ops_nosched, trace);
dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace);
if (trace->nr_entries < trace->max_entries)
trace->entries[trace->nr_entries++] = ULONG_MAX;
}
39 changes: 17 additions & 22 deletions trunk/arch/x86/kernel/traps_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,6 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
{
struct stack_frame *frame = (struct stack_frame *)bp;

/*
* if EBP is "deeper" into the stack than the actual stack pointer,
* we need to rewind the stack pointer a little to start at the
* first stack frame, but only if EBP is in this stack frame.
*/
if (stack > (unsigned long *) bp
&& valid_stack_ptr(tinfo, frame, sizeof(*frame)))
stack = (unsigned long *) bp;

while (valid_stack_ptr(tinfo, stack, sizeof(*stack))) {
unsigned long addr;

Expand All @@ -139,7 +130,7 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
frame = frame->next_frame;
bp = (unsigned long) frame;
} else {
ops->address(data, addr, 0);
ops->address(data, addr, bp == 0);
}
}
stack++;
Expand All @@ -150,11 +141,9 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
#define MSG(msg) ops->warning(data, msg)

void dump_trace(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack,
unsigned long *stack, unsigned long bp,
const struct stacktrace_ops *ops, void *data)
{
unsigned long bp = 0;

if (!task)
task = current;

Expand Down Expand Up @@ -234,20 +223,20 @@ static const struct stacktrace_ops print_trace_ops = {

static void
show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long * stack, char *log_lvl)
unsigned long *stack, unsigned long bp, char *log_lvl)
{
dump_trace(task, regs, stack, &print_trace_ops, log_lvl);
dump_trace(task, regs, stack, bp, &print_trace_ops, log_lvl);
printk("%s =======================\n", log_lvl);
}

void show_trace(struct task_struct *task, struct pt_regs *regs,
unsigned long * stack)
unsigned long *stack, unsigned long bp)
{
show_trace_log_lvl(task, regs, stack, "");
show_trace_log_lvl(task, regs, stack, bp, "");
}

static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *sp, char *log_lvl)
unsigned long *sp, unsigned long bp, char *log_lvl)
{
unsigned long *stack;
int i;
Expand All @@ -268,13 +257,13 @@ static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
printk("%08lx ", *stack++);
}
printk("\n%sCall Trace:\n", log_lvl);
show_trace_log_lvl(task, regs, sp, log_lvl);
show_trace_log_lvl(task, regs, sp, bp, log_lvl);
}

void show_stack(struct task_struct *task, unsigned long *sp)
{
printk(" ");
show_stack_log_lvl(task, NULL, sp, "");
show_stack_log_lvl(task, NULL, sp, 0, "");
}

/*
Expand All @@ -283,13 +272,19 @@ void show_stack(struct task_struct *task, unsigned long *sp)
void dump_stack(void)
{
unsigned long stack;
unsigned long bp = 0;

#ifdef CONFIG_FRAME_POINTER
if (!bp)
asm("movl %%ebp, %0" : "=r" (bp):);
#endif

printk("Pid: %d, comm: %.20s %s %s %.*s\n",
current->pid, current->comm, print_tainted(),
init_utsname()->release,
(int)strcspn(init_utsname()->version, " "),
init_utsname()->version);
show_trace(current, NULL, &stack);
show_trace(current, NULL, &stack, bp);
}

EXPORT_SYMBOL(dump_stack);
Expand All @@ -314,7 +309,7 @@ void show_registers(struct pt_regs *regs)
unsigned char c;

printk("\n" KERN_EMERG "Stack: ");
show_stack_log_lvl(NULL, regs, &regs->sp, KERN_EMERG);
show_stack_log_lvl(NULL, regs, &regs->sp, 0, KERN_EMERG);

printk(KERN_EMERG "Code: ");

Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/x86/oprofile/backtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ x86_backtrace(struct pt_regs * const regs, unsigned int depth)

if (!user_mode_vm(regs)) {
if (depth)
dump_trace(NULL, regs, (unsigned long *)stack,
dump_trace(NULL, regs, (unsigned long *)stack, 0,
&backtrace_ops, &depth);
return;
}
Expand Down

0 comments on commit 7f09fb7

Please sign in to comment.