diff options
Diffstat (limited to 'arch/x86/include/asm/stacktrace.h')
| -rw-r--r-- | arch/x86/include/asm/stacktrace.h | 34 | 
1 files changed, 29 insertions, 5 deletions
diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h index 2b16a2ad23d..70bbe39043a 100644 --- a/arch/x86/include/asm/stacktrace.h +++ b/arch/x86/include/asm/stacktrace.h @@ -7,6 +7,7 @@  #define _ASM_X86_STACKTRACE_H  #include <linux/uaccess.h> +#include <linux/ptrace.h>  extern int kstack_depth_to_print; @@ -36,9 +37,6 @@ print_context_stack_bp(struct thread_info *tinfo,  /* Generic stack tracer with callbacks */  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, int reliable);  	/* On negative return stop dumping */  	int (*stack)(void *data, char *name); @@ -57,13 +55,39 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,  #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)  #endif +#ifdef CONFIG_FRAME_POINTER +static inline unsigned long +stack_frame(struct task_struct *task, struct pt_regs *regs) +{ +	unsigned long bp; + +	if (regs) +		return regs->bp; + +	if (task == current) { +		/* Grab bp right from our regs */ +		get_bp(bp); +		return bp; +	} + +	/* bp is the last reg pushed by switch_to */ +	return *(unsigned long *)task->thread.sp; +} +#else +static inline unsigned long +stack_frame(struct task_struct *task, struct pt_regs *regs) +{ +	return 0; +} +#endif +  extern void  show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, -		unsigned long *stack, unsigned long bp, char *log_lvl); +		   unsigned long *stack, unsigned long bp, char *log_lvl);  extern void  show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, -		unsigned long *sp, unsigned long bp, char *log_lvl); +		   unsigned long *sp, unsigned long bp, char *log_lvl);  extern unsigned int code_bytes;  | 
