diff options
Diffstat (limited to 'arch/arc/kernel/stacktrace.c')
| -rw-r--r-- | arch/arc/kernel/stacktrace.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c index 9ce47cfe2303..92320d6f737c 100644 --- a/arch/arc/kernel/stacktrace.c +++ b/arch/arc/kernel/stacktrace.c | |||
| @@ -43,6 +43,10 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 43 | struct pt_regs *regs, | 43 | struct pt_regs *regs, |
| 44 | struct unwind_frame_info *frame_info) | 44 | struct unwind_frame_info *frame_info) |
| 45 | { | 45 | { |
| 46 | /* | ||
| 47 | * synchronous unwinding (e.g. dump_stack) | ||
| 48 | * - uses current values of SP and friends | ||
| 49 | */ | ||
| 46 | if (tsk == NULL && regs == NULL) { | 50 | if (tsk == NULL && regs == NULL) { |
| 47 | unsigned long fp, sp, blink, ret; | 51 | unsigned long fp, sp, blink, ret; |
| 48 | frame_info->task = current; | 52 | frame_info->task = current; |
| @@ -61,12 +65,17 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 61 | frame_info->regs.r63 = ret; | 65 | frame_info->regs.r63 = ret; |
| 62 | frame_info->call_frame = 0; | 66 | frame_info->call_frame = 0; |
| 63 | } else if (regs == NULL) { | 67 | } else if (regs == NULL) { |
| 68 | /* | ||
| 69 | * Asynchronous unwinding of sleeping task | ||
| 70 | * - Gets SP etc from task's pt_regs (saved bottom of kernel | ||
| 71 | * mode stack of task) | ||
| 72 | */ | ||
| 64 | 73 | ||
| 65 | frame_info->task = tsk; | 74 | frame_info->task = tsk; |
| 66 | 75 | ||
| 67 | frame_info->regs.r27 = KSTK_FP(tsk); | 76 | frame_info->regs.r27 = TSK_K_FP(tsk); |
| 68 | frame_info->regs.r28 = KSTK_ESP(tsk); | 77 | frame_info->regs.r28 = TSK_K_ESP(tsk); |
| 69 | frame_info->regs.r31 = KSTK_BLINK(tsk); | 78 | frame_info->regs.r31 = TSK_K_BLINK(tsk); |
| 70 | frame_info->regs.r63 = (unsigned int)__switch_to; | 79 | frame_info->regs.r63 = (unsigned int)__switch_to; |
| 71 | 80 | ||
| 72 | /* In the prologue of __switch_to, first FP is saved on stack | 81 | /* In the prologue of __switch_to, first FP is saved on stack |
| @@ -83,6 +92,10 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 83 | frame_info->call_frame = 0; | 92 | frame_info->call_frame = 0; |
| 84 | 93 | ||
| 85 | } else { | 94 | } else { |
| 95 | /* | ||
| 96 | * Asynchronous unwinding of intr/exception | ||
| 97 | * - Just uses the pt_regs passed | ||
| 98 | */ | ||
| 86 | frame_info->task = tsk; | 99 | frame_info->task = tsk; |
| 87 | 100 | ||
| 88 | frame_info->regs.r27 = regs->fp; | 101 | frame_info->regs.r27 = regs->fp; |
| @@ -95,7 +108,7 @@ static void seed_unwind_frame_info(struct task_struct *tsk, | |||
| 95 | 108 | ||
| 96 | #endif | 109 | #endif |
| 97 | 110 | ||
| 98 | static noinline unsigned int | 111 | notrace noinline unsigned int |
| 99 | arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs, | 112 | arc_unwind_core(struct task_struct *tsk, struct pt_regs *regs, |
| 100 | int (*consumer_fn) (unsigned int, void *), void *arg) | 113 | int (*consumer_fn) (unsigned int, void *), void *arg) |
| 101 | { | 114 | { |
