Skip to content

Instantly share code, notes, and snippets.

@nonakap
Created September 5, 2017 00:59
Show Gist options
  • Select an option

  • Save nonakap/a76cefe4391f16e43f024ba745b83f5f to your computer and use it in GitHub Desktop.

Select an option

Save nonakap/a76cefe4391f16e43f024ba745b83f5f to your computer and use it in GitHub Desktop.
NetBSD/x86: avoid panic when UP
diff --git a/sys/arch/amd64/amd64/db_interface.c b/sys/arch/amd64/amd64/db_interface.c
index 5b07bf197f3..df64670046f 100644
--- a/sys/arch/amd64/amd64/db_interface.c
+++ b/sys/arch/amd64/amd64/db_interface.c
@@ -131,11 +131,25 @@ db_suspend_others(void)
win = (ddb_cpu == cpu_me);
__cpu_simple_unlock(&db_lock);
if (win) {
+ CPU_INFO_ITERATOR cii;
+ struct cpu_info *ci, *self = curcpu();
+ bool do_ipi = false;
+
+ for (CPU_INFO_FOREACH(cii, ci)) {
+ if (ci == self)
+ continue;
+ if ((ci->ci_flags & CPUF_RUNNING) == 0)
+ continue;
+ do_ipi = true;
+ break;
+ }
+ if (do_ipi) {
#ifdef XEN
- xen_broadcast_ipi(XEN_IPI_DDB);
+ xen_broadcast_ipi(XEN_IPI_DDB);
#else
- x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
+ x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
#endif /* XEN */
+ }
}
ddb_mp_online = x86_mp_online;
diff --git a/sys/arch/i386/i386/db_interface.c b/sys/arch/i386/i386/db_interface.c
index 5b51554eefa..c8580801de7 100644
--- a/sys/arch/i386/i386/db_interface.c
+++ b/sys/arch/i386/i386/db_interface.c
@@ -142,11 +142,25 @@ db_suspend_others(void)
win = (ddb_cpu == cpu_me);
__cpu_simple_unlock(&db_lock);
if (win) {
+ CPU_INFO_ITERATOR cii;
+ struct cpu_info *ci, *self = curcpu();
+ bool do_ipi = false;
+
+ for (CPU_INFO_FOREACH(cii, ci)) {
+ if (ci == self)
+ continue;
+ if ((ci->ci_flags & CPUF_RUNNING) == 0)
+ continue;
+ do_ipi = true;
+ break;
+ }
+ if (do_ipi) {
#ifdef XEN
- xen_broadcast_ipi(XEN_IPI_DDB);
+ xen_broadcast_ipi(XEN_IPI_DDB);
#else
- x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
+ x86_ipi(ddb_vec, LAPIC_DEST_ALLEXCL, LAPIC_DLMODE_FIXED);
#endif /* XEN */
+ }
}
ddb_mp_online = x86_mp_online;
x86_mp_online = false;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment