Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.14 104 lines 2.6 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _ASM_X86_UNWIND_H 3#define _ASM_X86_UNWIND_H 4 5#include <linux/sched.h> 6#include <linux/ftrace.h> 7#include <asm/ptrace.h> 8#include <asm/stacktrace.h> 9 10struct unwind_state { 11 struct stack_info stack_info; 12 unsigned long stack_mask; 13 struct task_struct *task; 14 int graph_idx; 15 bool error; 16#if defined(CONFIG_ORC_UNWINDER) 17 bool signal, full_regs; 18 unsigned long sp, bp, ip; 19 struct pt_regs *regs; 20#elif defined(CONFIG_FRAME_POINTER_UNWINDER) 21 bool got_irq; 22 unsigned long *bp, *orig_sp, ip; 23 struct pt_regs *regs; 24#else 25 unsigned long *sp; 26#endif 27}; 28 29void __unwind_start(struct unwind_state *state, struct task_struct *task, 30 struct pt_regs *regs, unsigned long *first_frame); 31bool unwind_next_frame(struct unwind_state *state); 32unsigned long unwind_get_return_address(struct unwind_state *state); 33unsigned long *unwind_get_return_address_ptr(struct unwind_state *state); 34 35static inline bool unwind_done(struct unwind_state *state) 36{ 37 return state->stack_info.type == STACK_TYPE_UNKNOWN; 38} 39 40static inline bool unwind_error(struct unwind_state *state) 41{ 42 return state->error; 43} 44 45static inline 46void unwind_start(struct unwind_state *state, struct task_struct *task, 47 struct pt_regs *regs, unsigned long *first_frame) 48{ 49 first_frame = first_frame ? : get_stack_pointer(task, regs); 50 51 __unwind_start(state, task, regs, first_frame); 52} 53 54#if defined(CONFIG_ORC_UNWINDER) || defined(CONFIG_FRAME_POINTER_UNWINDER) 55static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state) 56{ 57 if (unwind_done(state)) 58 return NULL; 59 60 return state->regs; 61} 62#else 63static inline struct pt_regs *unwind_get_entry_regs(struct unwind_state *state) 64{ 65 return NULL; 66} 67#endif 68 69#ifdef CONFIG_ORC_UNWINDER 70void unwind_init(void); 71void unwind_module_init(struct module *mod, void *orc_ip, size_t orc_ip_size, 72 void *orc, size_t orc_size); 73#else 74static inline void unwind_init(void) {} 75static inline 76void unwind_module_init(struct module *mod, void *orc_ip, size_t orc_ip_size, 77 void *orc, size_t orc_size) {} 78#endif 79 80/* 81 * This disables KASAN checking when reading a value from another task's stack, 82 * since the other task could be running on another CPU and could have poisoned 83 * the stack in the meantime. 84 */ 85#define READ_ONCE_TASK_STACK(task, x) \ 86({ \ 87 unsigned long val; \ 88 if (task == current) \ 89 val = READ_ONCE(x); \ 90 else \ 91 val = READ_ONCE_NOCHECK(x); \ 92 val; \ 93}) 94 95static inline bool task_on_another_cpu(struct task_struct *task) 96{ 97#ifdef CONFIG_SMP 98 return task != current && task->on_cpu; 99#else 100 return false; 101#endif 102} 103 104#endif /* _ASM_X86_UNWIND_H */