| 71 | #endif |
| 72 | |
| 73 | static void |
| 74 | stack_capture(struct thread *td, struct stack *st, register_t fp) |
| 75 | { |
| 76 | x86_frame_t frame; |
| 77 | vm_offset_t callpc; |
| 78 | |
| 79 | stack_zero(st); |
| 80 | frame = (x86_frame_t)fp; |
| 81 | while (1) { |
| 82 | if (!kstack_contains(td, (vm_offset_t)frame, sizeof(*frame))) |
| 83 | break; |
| 84 | callpc = frame->f_retaddr; |
| 85 | if (!INKERNEL(callpc)) |
| 86 | break; |
| 87 | if (stack_put(st, callpc) == -1) |
| 88 | break; |
| 89 | if (frame->f_frame <= frame) |
| 90 | break; |
| 91 | frame = frame->f_frame; |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | #ifdef SMP |
| 96 | void |
no test coverage detected