summaryrefslogtreecommitdiffstats
path: root/sys/sparc64
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2005-11-03 21:08:20 +0000
committerjhb <jhb@FreeBSD.org>2005-11-03 21:08:20 +0000
commitb2c57e8bc8e4b4f7424f7b7cfdfa5db7279a248f (patch)
tree8dca468fca38c4de1d112029ae7cb94ecf77592a /sys/sparc64
parent935ba49b57c25a08e0773785ead144bdb08a5368 (diff)
downloadFreeBSD-src-b2c57e8bc8e4b4f7424f7b7cfdfa5db7279a248f.zip
FreeBSD-src-b2c57e8bc8e4b4f7424f7b7cfdfa5db7279a248f.tar.gz
Add stoppcbs[] arrays on Alpha and sparc64 and have each CPU save its
current context in the IPI_STOP handler so that we can get accurate stack traces of threads on other CPUs on these two archs like we do now on i386 and amd64. Tested on: alpha, sparc64
Diffstat (limited to 'sys/sparc64')
-rw-r--r--sys/sparc64/include/smp.h2
-rw-r--r--sys/sparc64/sparc64/mp_machdep.c3
2 files changed, 5 insertions, 0 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index b51425d..09b93d3 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -72,6 +72,8 @@ struct ipi_tlb_args {
struct pcpu;
+extern struct pcb stoppcbs[];
+
void cpu_mp_bootstrap(struct pcpu *pc);
void cpu_mp_shutdown(void);
diff --git a/sys/sparc64/sparc64/mp_machdep.c b/sys/sparc64/sparc64/mp_machdep.c
index 140f944..ff2a0d4 100644
--- a/sys/sparc64/sparc64/mp_machdep.c
+++ b/sys/sparc64/sparc64/mp_machdep.c
@@ -82,6 +82,7 @@ __FBSDID("$FreeBSD$");
#include <machine/md_var.h>
#include <machine/metadata.h>
#include <machine/ofw_machdep.h>
+#include <machine/pcb.h>
#include <machine/smp.h>
#include <machine/tick.h>
#include <machine/tlb.h>
@@ -99,6 +100,7 @@ static ih_func_t cpu_ipi_stop;
struct cpu_start_args cpu_start_args = { 0, -1, -1, 0, 0 };
struct ipi_cache_args ipi_cache_args;
struct ipi_tlb_args ipi_tlb_args;
+struct pcb stoppcbs[MAXCPU];
struct mtx ipi_mtx;
@@ -395,6 +397,7 @@ cpu_ipi_stop(struct trapframe *tf)
{
CTR1(KTR_SMP, "cpu_ipi_stop: stopped %d", PCPU_GET(cpuid));
+ savectx(&stoppcbs[PCPU_GET(cpuid)]);
atomic_set_acq_int(&stopped_cpus, PCPU_GET(cpumask));
while ((started_cpus & PCPU_GET(cpumask)) == 0) {
if ((shutdown_cpus & PCPU_GET(cpumask)) != 0) {
OpenPOWER on IntegriCloud