| .. | .. |
|---|
| 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 | |
|---|