at v4.10 112 lines 2.5 kB view raw
1/* 2 * Copyright (C) 1991, 1992 Linus Torvalds 3 * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs 4 */ 5 6#ifndef _ASM_X86_STACKTRACE_H 7#define _ASM_X86_STACKTRACE_H 8 9#include <linux/uaccess.h> 10#include <linux/ptrace.h> 11#include <asm/switch_to.h> 12 13enum stack_type { 14 STACK_TYPE_UNKNOWN, 15 STACK_TYPE_TASK, 16 STACK_TYPE_IRQ, 17 STACK_TYPE_SOFTIRQ, 18 STACK_TYPE_EXCEPTION, 19 STACK_TYPE_EXCEPTION_LAST = STACK_TYPE_EXCEPTION + N_EXCEPTION_STACKS-1, 20}; 21 22struct stack_info { 23 enum stack_type type; 24 unsigned long *begin, *end, *next_sp; 25}; 26 27bool in_task_stack(unsigned long *stack, struct task_struct *task, 28 struct stack_info *info); 29 30int get_stack_info(unsigned long *stack, struct task_struct *task, 31 struct stack_info *info, unsigned long *visit_mask); 32 33const char *stack_type_name(enum stack_type type); 34 35static inline bool on_stack(struct stack_info *info, void *addr, size_t len) 36{ 37 void *begin = info->begin; 38 void *end = info->end; 39 40 return (info->type != STACK_TYPE_UNKNOWN && 41 addr >= begin && addr < end && 42 addr + len > begin && addr + len <= end); 43} 44 45#ifdef CONFIG_X86_32 46#define STACKSLOTS_PER_LINE 8 47#else 48#define STACKSLOTS_PER_LINE 4 49#endif 50 51#ifdef CONFIG_FRAME_POINTER 52static inline unsigned long * 53get_frame_pointer(struct task_struct *task, struct pt_regs *regs) 54{ 55 if (regs) 56 return (unsigned long *)regs->bp; 57 58 if (task == current) 59 return __builtin_frame_address(0); 60 61 return &((struct inactive_task_frame *)task->thread.sp)->bp; 62} 63#else 64static inline unsigned long * 65get_frame_pointer(struct task_struct *task, struct pt_regs *regs) 66{ 67 return NULL; 68} 69#endif /* CONFIG_FRAME_POINTER */ 70 71static inline unsigned long * 72get_stack_pointer(struct task_struct *task, struct pt_regs *regs) 73{ 74 if (regs) 75 return (unsigned long *)kernel_stack_pointer(regs); 76 77 if (task == current) 78 return __builtin_frame_address(0); 79 80 return (unsigned long *)task->thread.sp; 81} 82 83void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, 84 unsigned long *stack, char *log_lvl); 85 86extern unsigned int code_bytes; 87 88/* The form of the top of the frame on the stack */ 89struct stack_frame { 90 struct stack_frame *next_frame; 91 unsigned long return_address; 92}; 93 94struct stack_frame_ia32 { 95 u32 next_frame; 96 u32 return_address; 97}; 98 99static inline unsigned long caller_frame_pointer(void) 100{ 101 struct stack_frame *frame; 102 103 frame = __builtin_frame_address(0); 104 105#ifdef CONFIG_FRAME_POINTER 106 frame = frame->next_frame; 107#endif 108 109 return (unsigned long)frame; 110} 111 112#endif /* _ASM_X86_STACKTRACE_H */