.. | .. |
---|
57 | 57 | /* Unwind stack frame */ |
---|
58 | 58 | frame = (struct stackframe *)fp - 1; |
---|
59 | 59 | sp = fp; |
---|
60 | | - fp = frame->fp; |
---|
61 | | - pc = ftrace_graph_ret_addr(current, NULL, frame->ra, |
---|
62 | | - (unsigned long *)(fp - 8)); |
---|
| 60 | + if (regs && (regs->epc == pc) && (frame->fp & 0x7)) { |
---|
| 61 | + fp = frame->ra; |
---|
| 62 | + pc = regs->ra; |
---|
| 63 | + } else { |
---|
| 64 | + fp = frame->fp; |
---|
| 65 | + pc = ftrace_graph_ret_addr(current, NULL, frame->ra, |
---|
| 66 | + &frame->ra); |
---|
| 67 | + } |
---|
| 68 | + |
---|
63 | 69 | } |
---|
64 | 70 | } |
---|
65 | 71 | |
---|
.. | .. |
---|
90 | 96 | while (!kstack_end(ksp)) { |
---|
91 | 97 | if (__kernel_text_address(pc) && unlikely(fn(pc, arg))) |
---|
92 | 98 | break; |
---|
93 | | - pc = (*ksp++) - 0x4; |
---|
| 99 | + pc = READ_ONCE_NOCHECK(*ksp++) - 0x4; |
---|
94 | 100 | } |
---|
95 | 101 | } |
---|
96 | 102 | |
---|