diff options
| -rw-r--r-- | kernel/debug/debug_core.c | 4 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_bt.c | 11 | ||||
| -rw-r--r-- | kernel/debug/kdb/kdb_debugger.c | 7 |
3 files changed, 14 insertions, 8 deletions
diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 1fb8b239e567..5cc608de6883 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c | |||
| @@ -592,6 +592,8 @@ return_normal: | |||
| 592 | arch_kgdb_ops.correct_hw_break(); | 592 | arch_kgdb_ops.correct_hw_break(); |
| 593 | if (trace_on) | 593 | if (trace_on) |
| 594 | tracing_on(); | 594 | tracing_on(); |
| 595 | kgdb_info[cpu].debuggerinfo = NULL; | ||
| 596 | kgdb_info[cpu].task = NULL; | ||
| 595 | kgdb_info[cpu].exception_state &= | 597 | kgdb_info[cpu].exception_state &= |
| 596 | ~(DCPU_WANT_MASTER | DCPU_IS_SLAVE); | 598 | ~(DCPU_WANT_MASTER | DCPU_IS_SLAVE); |
| 597 | kgdb_info[cpu].enter_kgdb--; | 599 | kgdb_info[cpu].enter_kgdb--; |
| @@ -724,6 +726,8 @@ kgdb_restore: | |||
| 724 | if (trace_on) | 726 | if (trace_on) |
| 725 | tracing_on(); | 727 | tracing_on(); |
| 726 | 728 | ||
| 729 | kgdb_info[cpu].debuggerinfo = NULL; | ||
| 730 | kgdb_info[cpu].task = NULL; | ||
| 727 | kgdb_info[cpu].exception_state &= | 731 | kgdb_info[cpu].exception_state &= |
| 728 | ~(DCPU_WANT_MASTER | DCPU_IS_SLAVE); | 732 | ~(DCPU_WANT_MASTER | DCPU_IS_SLAVE); |
| 729 | kgdb_info[cpu].enter_kgdb--; | 733 | kgdb_info[cpu].enter_kgdb--; |
diff --git a/kernel/debug/kdb/kdb_bt.c b/kernel/debug/kdb/kdb_bt.c index 7921ae4fca8d..7e2379aa0a1e 100644 --- a/kernel/debug/kdb/kdb_bt.c +++ b/kernel/debug/kdb/kdb_bt.c | |||
| @@ -186,7 +186,16 @@ kdb_bt(int argc, const char **argv) | |||
| 186 | kdb_printf("btc: cpu status: "); | 186 | kdb_printf("btc: cpu status: "); |
| 187 | kdb_parse("cpu\n"); | 187 | kdb_parse("cpu\n"); |
| 188 | for_each_online_cpu(cpu) { | 188 | for_each_online_cpu(cpu) { |
| 189 | sprintf(buf, "btt 0x%px\n", KDB_TSK(cpu)); | 189 | void *kdb_tsk = KDB_TSK(cpu); |
| 190 | |||
| 191 | /* If a CPU failed to round up we could be here */ | ||
| 192 | if (!kdb_tsk) { | ||
| 193 | kdb_printf("WARNING: no task for cpu %ld\n", | ||
| 194 | cpu); | ||
| 195 | continue; | ||
| 196 | } | ||
| 197 | |||
| 198 | sprintf(buf, "btt 0x%px\n", kdb_tsk); | ||
| 190 | kdb_parse(buf); | 199 | kdb_parse(buf); |
| 191 | touch_nmi_watchdog(); | 200 | touch_nmi_watchdog(); |
| 192 | } | 201 | } |
diff --git a/kernel/debug/kdb/kdb_debugger.c b/kernel/debug/kdb/kdb_debugger.c index 15e1a7af5dd0..53a0df6e4d92 100644 --- a/kernel/debug/kdb/kdb_debugger.c +++ b/kernel/debug/kdb/kdb_debugger.c | |||
| @@ -118,13 +118,6 @@ int kdb_stub(struct kgdb_state *ks) | |||
| 118 | kdb_bp_remove(); | 118 | kdb_bp_remove(); |
| 119 | KDB_STATE_CLEAR(DOING_SS); | 119 | KDB_STATE_CLEAR(DOING_SS); |
| 120 | KDB_STATE_SET(PAGER); | 120 | KDB_STATE_SET(PAGER); |
| 121 | /* zero out any offline cpu data */ | ||
| 122 | for_each_present_cpu(i) { | ||
| 123 | if (!cpu_online(i)) { | ||
| 124 | kgdb_info[i].debuggerinfo = NULL; | ||
| 125 | kgdb_info[i].task = NULL; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | if (ks->err_code == DIE_OOPS || reason == KDB_REASON_OOPS) { | 121 | if (ks->err_code == DIE_OOPS || reason == KDB_REASON_OOPS) { |
| 129 | ks->pass_exception = 1; | 122 | ks->pass_exception = 1; |
| 130 | KDB_FLAG_SET(CATASTROPHIC); | 123 | KDB_FLAG_SET(CATASTROPHIC); |
