svn commit: r204997 - in head/sys/mips: include mips
Neel Natu
neel at FreeBSD.org
Thu Mar 11 07:17:15 UTC 2010
Author: neel
Date: Thu Mar 11 07:17:14 2010
New Revision: 204997
URL: http://svn.freebsd.org/changeset/base/204997
Log:
Stash the context of the running thread at the time an IPI_STOP is received
in 'stoppcbs[]'. We use the 'stoppcbs[]' context to generate the backtrace
of such stopped threads.
Modified:
head/sys/mips/include/kdb.h
head/sys/mips/include/smp.h
head/sys/mips/mips/db_trace.c
head/sys/mips/mips/mp_machdep.c
head/sys/mips/mips/swtch.S
Modified: head/sys/mips/include/kdb.h
==============================================================================
--- head/sys/mips/include/kdb.h Thu Mar 11 03:18:16 2010 (r204996)
+++ head/sys/mips/include/kdb.h Thu Mar 11 07:17:14 2010 (r204997)
@@ -32,6 +32,8 @@
#include <machine/frame.h>
+#define KDB_STOPPEDPCB(pc) &stoppcbs[pc->pc_cpuid]
+
static __inline void
kdb_cpu_clear_singlestep(void)
{
Modified: head/sys/mips/include/smp.h
==============================================================================
--- head/sys/mips/include/smp.h Thu Mar 11 03:18:16 2010 (r204996)
+++ head/sys/mips/include/smp.h Thu Mar 11 07:17:14 2010 (r204997)
@@ -17,6 +17,8 @@
#ifdef _KERNEL
+#include <machine/pcb.h>
+
/*
* Interprocessor interrupts for SMP.
*/
@@ -31,6 +33,8 @@ void ipi_selected(cpumask_t cpus, int ip
void smp_init_secondary(u_int32_t cpuid);
void mpentry(void);
+extern struct pcb stoppcbs[];
+
#endif /* !LOCORE */
#endif /* _KERNEL */
Modified: head/sys/mips/mips/db_trace.c
==============================================================================
--- head/sys/mips/mips/db_trace.c Thu Mar 11 03:18:16 2010 (r204996)
+++ head/sys/mips/mips/db_trace.c Thu Mar 11 07:17:14 2010 (r204997)
@@ -169,6 +169,12 @@ loop:
subr = (uintptr_t)MipsKernTLBInvalidException;
else if (pcBetween(MipsUserTLBInvalidException, MipsTLBMissException))
subr = (uintptr_t)MipsUserTLBInvalidException;
+ else if (pcBetween(fork_trampoline, savectx))
+ subr = (uintptr_t)fork_trampoline;
+ else if (pcBetween(savectx, mips_cpu_throw))
+ subr = (uintptr_t)savectx;
+ else if (pcBetween(mips_cpu_throw, cpu_switch))
+ subr = (uintptr_t)cpu_throw;
else if (pcBetween(cpu_switch, MipsSwitchFPState))
subr = (uintptr_t)cpu_switch;
else if (pcBetween(_locore, _locoreEnd)) {
@@ -412,10 +418,8 @@ db_trace_thread(struct thread *thr, int
: "=r" (pc)
: "r" (ra));
- }
-
- else {
- ctx = thr->td_pcb;
+ } else {
+ ctx = kdb_thr_ctx(thr);
sp = (register_t)ctx->pcb_context[PREG_SP];
pc = (register_t)ctx->pcb_context[PREG_PC];
ra = (register_t)ctx->pcb_context[PREG_RA];
Modified: head/sys/mips/mips/mp_machdep.c
==============================================================================
--- head/sys/mips/mips/mp_machdep.c Thu Mar 11 03:18:16 2010 (r204996)
+++ head/sys/mips/mips/mp_machdep.c Thu Mar 11 07:17:14 2010 (r204997)
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
#include <machine/intr_machdep.h>
#include <machine/cache.h>
+struct pcb stoppcbs[MAXCPU];
+
static void *dpcpu;
static struct mtx ap_boot_mtx;
@@ -88,10 +90,14 @@ ipi_selected(cpumask_t cpus, int ipi)
static int
mips_ipi_handler(void *arg)
{
+ int cpu;
cpumask_t cpumask;
u_int ipi, ipi_bitmap;
int bit;
+ cpu = PCPU_GET(cpuid);
+ cpumask = PCPU_GET(cpumask);
+
platform_ipi_clear(); /* quiesce the pending ipi interrupt */
ipi_bitmap = atomic_readandclear_int(PCPU_PTR(pending_ipis));
@@ -120,10 +126,16 @@ mips_ipi_handler(void *arg)
* necessary to add it in the switch.
*/
CTR0(KTR_SMP, "IPI_STOP or IPI_STOP_HARD");
- cpumask = PCPU_GET(cpumask);
+
+ savectx(&stoppcbs[cpu]);
+
+ /* Indicate we are stopped */
atomic_set_int(&stopped_cpus, cpumask);
+
+ /* Wait for restart */
while ((started_cpus & cpumask) == 0)
cpu_spinwait();
+
atomic_clear_int(&started_cpus, cpumask);
atomic_clear_int(&stopped_cpus, cpumask);
CTR0(KTR_SMP, "IPI_STOP (restart)");
Modified: head/sys/mips/mips/swtch.S
==============================================================================
--- head/sys/mips/mips/swtch.S Thu Mar 11 03:18:16 2010 (r204996)
+++ head/sys/mips/mips/swtch.S Thu Mar 11 07:17:14 2010 (r204997)
@@ -245,6 +245,14 @@ LEAF(savectx)
SAVE_U_PCB_CONTEXT(ra, PREG_RA, a0)
SAVE_U_PCB_CONTEXT(v0, PREG_SR, a0)
SAVE_U_PCB_CONTEXT(gp, PREG_GP, a0)
+
+ move v0, ra /* save 'ra' before we trash it */
+ jal 1f
+ nop
+1:
+ SAVE_U_PCB_CONTEXT(ra, PREG_PC, a0)
+ move ra, v0 /* restore 'ra' before returning */
+
/*
* FREEBSD_DEVELOPERS_FIXME:
* In case there are CPU-specific registers that need
More information about the svn-src-head
mailing list