Lines Matching full:frame

16  * Unwind the current stack frame and store the new register values in the
47 static int frame_pointer_check(struct stackframe *frame) in frame_pointer_check() argument
50 unsigned long fp = frame->fp; in frame_pointer_check()
51 unsigned long pc = frame->pc; in frame_pointer_check()
63 low = frame->sp; in frame_pointer_check()
66 /* check current frame pointer is within bounds */ in frame_pointer_check()
78 int notrace unwind_frame(struct stackframe *frame) in unwind_frame() argument
80 unsigned long fp = frame->fp; in unwind_frame()
82 if (frame_pointer_check(frame)) in unwind_frame()
89 if (frame->ex_frame) { in unwind_frame()
90 struct pt_regs *regs = (struct pt_regs *)frame->sp; in unwind_frame()
96 * when frame->ex_frame is a false positive. in unwind_frame()
98 if ((unsigned long)&regs[1] > ALIGN(frame->sp, THREAD_SIZE)) in unwind_frame()
101 frame->pc = regs->ARM_pc; in unwind_frame()
102 frame->ex_frame = false; in unwind_frame()
106 /* restore the registers from the stack frame */ in unwind_frame()
108 frame->sp = frame->fp; in unwind_frame()
109 frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp)); in unwind_frame()
110 frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 4)); in unwind_frame()
112 frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 12)); in unwind_frame()
113 frame->sp = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 8)); in unwind_frame()
114 frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp - 4)); in unwind_frame()
117 if (is_kretprobe_trampoline(frame->pc)) in unwind_frame()
118 frame->pc = kretprobe_find_ret_addr(frame->tsk, in unwind_frame()
119 (void *)frame->fp, &frame->kr_cur); in unwind_frame()
122 if (in_entry_text(frame->pc)) in unwind_frame()
123 frame->ex_frame = true; in unwind_frame()
129 void notrace walk_stackframe(struct stackframe *frame, in walk_stackframe() argument
135 if (fn(frame, data)) in walk_stackframe()
137 ret = unwind_frame(frame); in walk_stackframe()
151 static int save_trace(struct stackframe *frame, void *d) in save_trace() argument
155 unsigned long addr = frame->pc; in save_trace()
173 struct stackframe frame; in __save_stack_trace() local
188 frame.fp = thread_saved_fp(tsk); in __save_stack_trace()
189 frame.sp = thread_saved_sp(tsk); in __save_stack_trace()
190 frame.lr = 0; /* recovered from the stack */ in __save_stack_trace()
191 frame.pc = thread_saved_pc(tsk); in __save_stack_trace()
196 frame.fp = (unsigned long)__builtin_frame_address(0); in __save_stack_trace()
197 frame.sp = current_stack_pointer; in __save_stack_trace()
198 frame.lr = (unsigned long)__builtin_return_address(0); in __save_stack_trace()
200 frame.pc = (unsigned long)&&here; in __save_stack_trace()
203 frame.kr_cur = NULL; in __save_stack_trace()
204 frame.tsk = tsk; in __save_stack_trace()
207 frame.ex_frame = false; in __save_stack_trace()
210 walk_stackframe(&frame, save_trace, &data); in __save_stack_trace()
216 struct stackframe frame; in save_stack_trace_regs() local
222 frame.fp = regs->ARM_fp; in save_stack_trace_regs()
223 frame.sp = regs->ARM_sp; in save_stack_trace_regs()
224 frame.lr = regs->ARM_lr; in save_stack_trace_regs()
225 frame.pc = regs->ARM_pc; in save_stack_trace_regs()
227 frame.kr_cur = NULL; in save_stack_trace_regs()
228 frame.tsk = current; in save_stack_trace_regs()
231 frame.ex_frame = in_entry_text(frame.pc); in save_stack_trace_regs()
234 walk_stackframe(&frame, save_trace, &data); in save_stack_trace_regs()