Lines Matching refs:state
62 kunwind_init(struct kunwind_state *state, in kunwind_init() argument
65 unwind_init_common(&state->common); in kunwind_init()
66 state->task = task; in kunwind_init()
67 state->source = KUNWIND_SOURCE_UNKNOWN; in kunwind_init()
68 state->flags.all = 0; in kunwind_init()
69 state->regs = NULL; in kunwind_init()
80 kunwind_init_from_regs(struct kunwind_state *state, in kunwind_init_from_regs() argument
83 kunwind_init(state, current); in kunwind_init_from_regs()
85 state->regs = regs; in kunwind_init_from_regs()
86 state->common.fp = regs->regs[29]; in kunwind_init_from_regs()
87 state->common.pc = regs->pc; in kunwind_init_from_regs()
88 state->source = KUNWIND_SOURCE_REGS_PC; in kunwind_init_from_regs()
100 kunwind_init_from_caller(struct kunwind_state *state) in kunwind_init_from_caller() argument
102 kunwind_init(state, current); in kunwind_init_from_caller()
104 state->common.fp = (unsigned long)__builtin_frame_address(1); in kunwind_init_from_caller()
105 state->common.pc = (unsigned long)__builtin_return_address(0); in kunwind_init_from_caller()
106 state->source = KUNWIND_SOURCE_CALLER; in kunwind_init_from_caller()
120 kunwind_init_from_task(struct kunwind_state *state, in kunwind_init_from_task() argument
123 kunwind_init(state, task); in kunwind_init_from_task()
125 state->common.fp = thread_saved_fp(task); in kunwind_init_from_task()
126 state->common.pc = thread_saved_pc(task); in kunwind_init_from_task()
127 state->source = KUNWIND_SOURCE_TASK; in kunwind_init_from_task()
131 kunwind_recover_return_address(struct kunwind_state *state) in kunwind_recover_return_address() argument
134 if (state->task->ret_stack && in kunwind_recover_return_address()
135 (state->common.pc == (unsigned long)return_to_handler)) { in kunwind_recover_return_address()
137 orig_pc = ftrace_graph_ret_addr(state->task, &state->graph_idx, in kunwind_recover_return_address()
138 state->common.pc, in kunwind_recover_return_address()
139 (void *)state->common.fp); in kunwind_recover_return_address()
140 if (state->common.pc == orig_pc) { in kunwind_recover_return_address()
141 WARN_ON_ONCE(state->task == current); in kunwind_recover_return_address()
144 state->common.pc = orig_pc; in kunwind_recover_return_address()
145 state->flags.fgraph = 1; in kunwind_recover_return_address()
150 if (is_kretprobe_trampoline(state->common.pc)) { in kunwind_recover_return_address()
152 orig_pc = kretprobe_find_ret_addr(state->task, in kunwind_recover_return_address()
153 (void *)state->common.fp, in kunwind_recover_return_address()
154 &state->kr_cur); in kunwind_recover_return_address()
157 state->common.pc = orig_pc; in kunwind_recover_return_address()
158 state->flags.kretprobe = 1; in kunwind_recover_return_address()
166 int kunwind_next_regs_pc(struct kunwind_state *state) in kunwind_next_regs_pc() argument
169 unsigned long fp = state->common.fp; in kunwind_next_regs_pc()
174 info = unwind_find_stack(&state->common, (unsigned long)regs, sizeof(*regs)); in kunwind_next_regs_pc()
178 unwind_consume_stack(&state->common, info, (unsigned long)regs, in kunwind_next_regs_pc()
181 state->regs = regs; in kunwind_next_regs_pc()
182 state->common.pc = regs->pc; in kunwind_next_regs_pc()
183 state->common.fp = regs->regs[29]; in kunwind_next_regs_pc()
184 state->regs = NULL; in kunwind_next_regs_pc()
185 state->source = KUNWIND_SOURCE_REGS_PC; in kunwind_next_regs_pc()
190 kunwind_next_frame_record_meta(struct kunwind_state *state) in kunwind_next_frame_record_meta() argument
192 struct task_struct *tsk = state->task; in kunwind_next_frame_record_meta()
193 unsigned long fp = state->common.fp; in kunwind_next_frame_record_meta()
197 info = unwind_find_stack(&state->common, fp, sizeof(*meta)); in kunwind_next_frame_record_meta()
209 return kunwind_next_regs_pc(state); in kunwind_next_frame_record_meta()
217 kunwind_next_frame_record(struct kunwind_state *state) in kunwind_next_frame_record() argument
219 unsigned long fp = state->common.fp; in kunwind_next_frame_record()
227 info = unwind_find_stack(&state->common, fp, sizeof(*record)); in kunwind_next_frame_record()
236 return kunwind_next_frame_record_meta(state); in kunwind_next_frame_record()
238 unwind_consume_stack(&state->common, info, fp, sizeof(*record)); in kunwind_next_frame_record()
240 state->common.fp = new_fp; in kunwind_next_frame_record()
241 state->common.pc = new_pc; in kunwind_next_frame_record()
242 state->source = KUNWIND_SOURCE_FRAME; in kunwind_next_frame_record()
255 kunwind_next(struct kunwind_state *state) in kunwind_next() argument
259 state->flags.all = 0; in kunwind_next()
261 switch (state->source) { in kunwind_next()
266 err = kunwind_next_frame_record(state); in kunwind_next()
275 state->common.pc = ptrauth_strip_kernel_insn_pac(state->common.pc); in kunwind_next()
277 return kunwind_recover_return_address(state); in kunwind_next()
280 typedef bool (*kunwind_consume_fn)(const struct kunwind_state *state, void *cookie);
283 do_kunwind(struct kunwind_state *state, kunwind_consume_fn consume_state, in do_kunwind() argument
288 ret = kunwind_recover_return_address(state); in do_kunwind()
293 if (!consume_state(state, cookie)) in do_kunwind()
295 ret = kunwind_next(state); in do_kunwind()
349 struct kunwind_state state = { in kunwind_stack_walk() local
359 kunwind_init_from_regs(&state, regs); in kunwind_stack_walk()
361 kunwind_init_from_caller(&state); in kunwind_stack_walk()
363 kunwind_init_from_task(&state, task); in kunwind_stack_walk()
366 return do_kunwind(&state, consume_state, cookie); in kunwind_stack_walk()
375 arch_kunwind_consume_entry(const struct kunwind_state *state, void *cookie) in arch_kunwind_consume_entry() argument
378 return data->consume_entry(data->cookie, state->common.pc); in arch_kunwind_consume_entry()
394 arch_reliable_kunwind_consume_entry(const struct kunwind_state *state, void *cookie) in arch_reliable_kunwind_consume_entry() argument
404 if (state->source == KUNWIND_SOURCE_REGS_PC) in arch_reliable_kunwind_consume_entry()
407 return arch_kunwind_consume_entry(state, cookie); in arch_reliable_kunwind_consume_entry()
429 arch_bpf_unwind_consume_entry(const struct kunwind_state *state, void *cookie) in arch_bpf_unwind_consume_entry() argument
433 return data->consume_entry(data->cookie, state->common.pc, 0, in arch_bpf_unwind_consume_entry()
434 state->common.fp); in arch_bpf_unwind_consume_entry()
448 static const char *state_source_string(const struct kunwind_state *state) in state_source_string() argument
450 switch (state->source) { in state_source_string()
459 static bool dump_backtrace_entry(const struct kunwind_state *state, void *arg) in dump_backtrace_entry() argument
461 const char *source = state_source_string(state); in dump_backtrace_entry()
462 union unwind_flags flags = state->flags; in dump_backtrace_entry()
467 (void *)state->common.pc, in dump_backtrace_entry()