diff options
author | jhb <jhb@FreeBSD.org> | 2005-11-03 21:08:20 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2005-11-03 21:08:20 +0000 |
commit | b2c57e8bc8e4b4f7424f7b7cfdfa5db7279a248f (patch) | |
tree | 8dca468fca38c4de1d112029ae7cb94ecf77592a /sys/sparc64 | |
parent | 935ba49b57c25a08e0773785ead144bdb08a5368 (diff) | |
download | FreeBSD-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.h | 2 | ||||
-rw-r--r-- | sys/sparc64/sparc64/mp_machdep.c | 3 |
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) { |