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