Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 80259
b: refs/heads/master
c: bc850d6
h: refs/heads/master
i:
  80257: 12d8f06
  80255: 6e7548f
v: v3
  • Loading branch information
Arjan van de Ven authored and Ingo Molnar committed Jan 30, 2008
1 parent 20928e4 commit 56fb7d3
Show file tree
Hide file tree
Showing 10 changed files with 41 additions and 30 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: 3d1f7cae883ce4aac99c661562111a25d52effe0
refs/heads/master: bc850d6b374fffd08336996f4b4d3bbd6bf427f6
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/pci-gart_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ static void dump_leak(void)
iommu_leak_pages);
for (i = 0; i < iommu_leak_pages; i += 2) {
printk(KERN_DEBUG "%lu: ", iommu_pages-i);
printk_address((unsigned long) iommu_leak_tab[iommu_pages-i]);
printk_address((unsigned long) iommu_leak_tab[iommu_pages-i], 0);
printk(KERN_CONT "%c", (i+1)%2 == 0 ? '\n' : ' ');
}
printk(KERN_DEBUG "\n");
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/x86/kernel/process_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ void __show_regs(struct pt_regs * regs)
(int)strcspn(init_utsname()->version, " "),
init_utsname()->version);
printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip);
printk_address(regs->ip);
printk_address(regs->ip, regs->bp);
printk("RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->sp,
regs->flags);
printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
Expand Down Expand Up @@ -377,7 +377,7 @@ void show_regs(struct pt_regs *regs)
{
printk("CPU %d:", smp_processor_id());
__show_regs(regs);
show_trace(NULL, regs, (void *)(regs + 1));
show_trace(NULL, regs, (void *)(regs + 1), regs->bp);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/stacktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ static int save_stack_stack(void *data, char *name)
return -1;
}

static void save_stack_address(void *data, unsigned long addr)
static void save_stack_address(void *data, unsigned long addr, int reliable)
{
struct stack_trace *trace = (struct stack_trace *)data;
if (trace->skip > 0) {
Expand Down
8 changes: 5 additions & 3 deletions trunk/arch/x86/kernel/traps_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,

addr = frame->return_address;
if (__kernel_text_address(addr))
ops->address(data, addr);
ops->address(data, addr, 1);
/*
* break out of recursive entries (such as
* end_of_stack_stop_unwind_function). Also,
Expand All @@ -145,7 +145,7 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,

addr = *stack++;
if (__kernel_text_address(addr))
ops->address(data, addr);
ops->address(data, addr, 1);
}
#endif
return bp;
Expand Down Expand Up @@ -220,9 +220,11 @@ static int print_trace_stack(void *data, char *name)
/*
* Print one address/symbol entries per line.
*/
static void print_trace_address(void *data, unsigned long addr)
static void print_trace_address(void *data, unsigned long addr, int reliable)
{
printk("%s [<%08lx>] ", (char *)data, addr);
if (!reliable)
printk("? ");
print_symbol("%s\n", addr);
touch_nmi_watchdog();
}
Expand Down
39 changes: 23 additions & 16 deletions trunk/arch/x86/kernel/traps_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,27 +99,31 @@ static inline void preempt_conditional_cli(struct pt_regs *regs)
int kstack_depth_to_print = 12;

#ifdef CONFIG_KALLSYMS
void printk_address(unsigned long address)
void printk_address(unsigned long address, int reliable)
{
unsigned long offset = 0, symsize;
const char *symname;
char *modname;
char *delim = ":";
char namebuf[128];
char reliab[4] = "";;

symname = kallsyms_lookup(address, &symsize, &offset,
&modname, namebuf);
if (!symname) {
printk(" [<%016lx>]\n", address);
return;
}
if (!reliable)
strcpy(reliab, "? ");

if (!modname)
modname = delim = "";
printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
address, delim, modname, delim, symname, offset, symsize);
printk(" [<%016lx>] %s%s%s%s%s+0x%lx/0x%lx\n",
address, reliab, delim, modname, delim, symname, offset, symsize);
}
#else
void printk_address(unsigned long address)
void printk_address(unsigned long address, int reliable)
{
printk(" [<%016lx>]\n", address);
}
Expand Down Expand Up @@ -215,7 +219,7 @@ static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
}

void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
unsigned long *stack,
unsigned long *stack, unsigned long bp,
const struct stacktrace_ops *ops, void *data)
{
const unsigned cpu = get_cpu();
Expand Down Expand Up @@ -252,7 +256,7 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
* down the cause of the crash will be able to figure \
* out the call path that was taken. \
*/ \
ops->address(data, addr); \
ops->address(data, addr, 1); \
} \
} while (0)

Expand Down Expand Up @@ -331,10 +335,10 @@ static int print_trace_stack(void *data, char *name)
return 0;
}

static void print_trace_address(void *data, unsigned long addr)
static void print_trace_address(void *data, unsigned long addr, int reliable)
{
touch_nmi_watchdog();
printk_address(addr);
printk_address(addr, reliable);
}

static const struct stacktrace_ops print_trace_ops = {
Expand All @@ -345,15 +349,17 @@ static const struct stacktrace_ops print_trace_ops = {
};

void
show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long *stack)
show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long *stack,
unsigned long bp)
{
printk("\nCall Trace:\n");
dump_trace(tsk, regs, stack, &print_trace_ops, NULL);
dump_trace(tsk, regs, stack, bp, &print_trace_ops, NULL);
printk("\n");
}

static void
_show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned long *sp)
_show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned long *sp,
unsigned long bp)
{
unsigned long *stack;
int i;
Expand Down Expand Up @@ -387,12 +393,12 @@ _show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned long *sp)
printk(" %016lx", *stack++);
touch_nmi_watchdog();
}
show_trace(tsk, regs, sp);
show_trace(tsk, regs, sp, bp);
}

void show_stack(struct task_struct *tsk, unsigned long * sp)
{
_show_stack(tsk, NULL, sp);
_show_stack(tsk, NULL, sp, 0);
}

/*
Expand All @@ -401,13 +407,14 @@ void show_stack(struct task_struct *tsk, unsigned long * sp)
void dump_stack(void)
{
unsigned long dummy;
unsigned long bp = 0;

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(NULL, NULL, &dummy);
show_trace(NULL, NULL, &dummy, bp);
}

EXPORT_SYMBOL(dump_stack);
Expand All @@ -432,7 +439,7 @@ void show_registers(struct pt_regs *regs)
*/
if (in_kernel) {
printk("Stack: ");
_show_stack(NULL, regs, (unsigned long*)sp);
_show_stack(NULL, regs, (unsigned long *)sp, regs->bp);

printk("\nCode: ");
if (regs->ip < PAGE_OFFSET)
Expand Down Expand Up @@ -527,7 +534,7 @@ int __kprobes __die(const char * str, struct pt_regs * regs, long err)
add_taint(TAINT_DIE);
/* Executive summary in case the oops scrolled away */
printk(KERN_ALERT "RIP ");
printk_address(regs->ip);
printk_address(regs->ip, regs->bp);
printk(" RSP <%016lx>\n", regs->sp);
if (kexec_should_crash(current))
crash_kexec(regs);
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/x86/mm/fault_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
else
printk(KERN_ALERT "Unable to handle kernel paging request");
printk(" at %016lx RIP: \n" KERN_ALERT, address);
printk_address(regs->ip);
printk_address(regs->ip, regs->bp);
dump_pagetable(address);
tsk->thread.cr2 = address;
tsk->thread.trap_no = 14;
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 @@ -32,7 +32,7 @@ static int backtrace_stack(void *data, char *name)
return 0;
}

static void backtrace_address(void *data, unsigned long addr)
static void backtrace_address(void *data, unsigned long addr, int reliable)
{
unsigned int *depth = data;

Expand Down
5 changes: 3 additions & 2 deletions trunk/include/asm-x86/kdebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ enum die_val {
DIE_PAGE_FAULT,
};

extern void printk_address(unsigned long address);
extern void printk_address(unsigned long address, int reliable);
extern void die(const char *,struct pt_regs *,long);
extern int __must_check __die(const char *, struct pt_regs *, long);
extern void show_registers(struct pt_regs *regs);
extern void __show_registers(struct pt_regs *, int all);
extern void show_trace(struct task_struct *, struct pt_regs *, unsigned long *);
extern void show_trace(struct task_struct *t, struct pt_regs *regs,
unsigned long *sp, unsigned long bp);
extern void __show_regs(struct pt_regs *regs);
extern void show_regs(struct pt_regs *regs);
extern void dump_pagetable(unsigned long);
Expand Down
5 changes: 3 additions & 2 deletions trunk/include/asm-x86/stacktrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ struct stacktrace_ops {
void (*warning)(void *data, char *msg);
/* msg must contain %s for the symbol */
void (*warning_symbol)(void *data, char *msg, unsigned long symbol);
void (*address)(void *data, unsigned long address);
void (*address)(void *data, unsigned long address, int reliable);
/* On negative return stop dumping */
int (*stack)(void *data, char *name);
};

void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long *stack,
void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
unsigned long *stack, unsigned long bp,
const struct stacktrace_ops *ops, void *data);

#endif

0 comments on commit 56fb7d3

Please sign in to comment.