Commit 162bc7f5 authored by Douglas Anderson's avatar Douglas Anderson Committed by Daniel Thompson
Browse files

kdb: Don't back trace on a cpu that didn't round up



If you have a CPU that fails to round up and then run 'btc' you'll end
up crashing in kdb becaue we dereferenced NULL.  Let's add a check.
It's wise to also set the task to NULL when leaving the debugger so
that if we fail to round up on a later entry into the debugger we
won't backtrace a stale task.

Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Acked-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Signed-off-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
parent 87b09592
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -592,6 +592,8 @@ return_normal:
				arch_kgdb_ops.correct_hw_break();
			if (trace_on)
				tracing_on();
			kgdb_info[cpu].debuggerinfo = NULL;
			kgdb_info[cpu].task = NULL;
			kgdb_info[cpu].exception_state &=
				~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
			kgdb_info[cpu].enter_kgdb--;
@@ -724,6 +726,8 @@ kgdb_restore:
	if (trace_on)
		tracing_on();

	kgdb_info[cpu].debuggerinfo = NULL;
	kgdb_info[cpu].task = NULL;
	kgdb_info[cpu].exception_state &=
		~(DCPU_WANT_MASTER | DCPU_IS_SLAVE);
	kgdb_info[cpu].enter_kgdb--;
+10 −1
Original line number Diff line number Diff line
@@ -186,7 +186,16 @@ kdb_bt(int argc, const char **argv)
		kdb_printf("btc: cpu status: ");
		kdb_parse("cpu\n");
		for_each_online_cpu(cpu) {
			sprintf(buf, "btt 0x%px\n", KDB_TSK(cpu));
			void *kdb_tsk = KDB_TSK(cpu);

			/* If a CPU failed to round up we could be here */
			if (!kdb_tsk) {
				kdb_printf("WARNING: no task for cpu %ld\n",
					   cpu);
				continue;
			}

			sprintf(buf, "btt 0x%px\n", kdb_tsk);
			kdb_parse(buf);
			touch_nmi_watchdog();
		}
+0 −7
Original line number Diff line number Diff line
@@ -118,13 +118,6 @@ int kdb_stub(struct kgdb_state *ks)
	kdb_bp_remove();
	KDB_STATE_CLEAR(DOING_SS);
	KDB_STATE_SET(PAGER);
	/* zero out any offline cpu data */
	for_each_present_cpu(i) {
		if (!cpu_online(i)) {
			kgdb_info[i].debuggerinfo = NULL;
			kgdb_info[i].task = NULL;
		}
	}
	if (ks->err_code == DIE_OOPS || reason == KDB_REASON_OOPS) {
		ks->pass_exception = 1;
		KDB_FLAG_SET(CATASTROPHIC);