From c139f23d171c1a032ae57608f8dd72c47cda701e Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 16 Sep 2008 01:05:54 +0000 Subject: [PATCH] Remove the tracing from the AP startup. The AP is known to start and the tracing can interfere with AP startup. Instead, use the available space in the reset vector for the initial stack. --- sys/powerpc/aim/mmu_oea.c | 23 ++------------------ sys/powerpc/aim/mp_cpudep.c | 33 ++--------------------------- sys/powerpc/aim/trap_subr.S | 36 ++++---------------------------- sys/powerpc/include/smp.h | 6 +++--- sys/powerpc/powerpc/mp_machdep.c | 5 +---- 5 files changed, 12 insertions(+), 91 deletions(-) diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 4aae58dc8bd..9381032d39a 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -604,14 +604,11 @@ om_cmp(const void *a, const void *b) } void -pmap_cpu_bootstrap(volatile uint32_t *trcp, int ap) +pmap_cpu_bootstrap(int ap) { u_int sdr; int i; - trcp[0] = 0x1000; - trcp[1] = (uint32_t)&pmap_cpu_bootstrap; - if (ap) { __asm __volatile("mtdbatu 0,%0" :: "r"(battable[0].batu)); __asm __volatile("mtdbatl 0,%0" :: "r"(battable[0].batl)); @@ -621,14 +618,10 @@ pmap_cpu_bootstrap(volatile uint32_t *trcp, int ap) isync(); } - trcp[0] = 0x1001; - __asm __volatile("mtdbatu 1,%0" :: "r"(battable[8].batu)); __asm __volatile("mtdbatl 1,%0" :: "r"(battable[8].batl)); isync(); - trcp[0] = 0x1002; - __asm __volatile("mtibatu 1,%0" :: "r"(0)); __asm __volatile("mtdbatu 2,%0" :: "r"(0)); __asm __volatile("mtibatu 2,%0" :: "r"(0)); @@ -636,29 +629,18 @@ pmap_cpu_bootstrap(volatile uint32_t *trcp, int ap) __asm __volatile("mtibatu 3,%0" :: "r"(0)); isync(); - trcp[0] = 0x1003; - for (i = 0; i < 16; i++) mtsrin(i << ADDR_SR_SHFT, EMPTY_SEGMENT); - trcp[0] = 0x1004; - __asm __volatile("mtsr %0,%1" :: "n"(KERNEL_SR), "r"(KERNEL_SEGMENT)); __asm __volatile("mtsr %0,%1" :: "n"(KERNEL2_SR), "r"(KERNEL2_SEGMENT)); __asm __volatile("sync"); - trcp[0] = 0x1005; - sdr = (u_int)moea_pteg_table | (moea_pteg_mask >> 10); __asm __volatile("mtsdr1 %0" :: "r"(sdr)); isync(); - trcp[0] = 0x1006; - trcp[1] = sdr; - tlbia(); - - trcp[0] = 0x1007; } void @@ -669,7 +651,6 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) int sz; int i, j; int ofw_mappings; - uint32_t trace[2]; vm_size_t size, physsz, hwphyssz; vm_offset_t pa, va, off; @@ -898,7 +879,7 @@ moea_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend) kernel_pmap->pm_sr[KERNEL2_SR] = KERNEL2_SEGMENT; kernel_pmap->pm_active = ~0; - pmap_cpu_bootstrap(trace, 0); + pmap_cpu_bootstrap(0); pmap_bootstrapped++; diff --git a/sys/powerpc/aim/mp_cpudep.c b/sys/powerpc/aim/mp_cpudep.c index cd50755ac8f..585186a977b 100644 --- a/sys/powerpc/aim/mp_cpudep.c +++ b/sys/powerpc/aim/mp_cpudep.c @@ -139,57 +139,36 @@ powerpc_smp_get_bsp(struct cpuref *cpuref) } uint32_t -cpudep_ap_bootstrap(volatile uint32_t *trcp) +cpudep_ap_bootstrap(void) { uint32_t hid, msr, sp; - trcp[0] = 0x2000; - trcp[1] = (uint32_t)&cpudep_ap_bootstrap; - __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu)); __asm __volatile("sync"); - trcp[0] = 0x2001; - trcp[1] = (uint32_t)pcpup; - hid = mfspr(SPR_HID0); hid &= ~(HID0_ICE | HID0_DCE); hid &= ~(HID0_DOZE | HID0_NAP | HID0_SLEEP); mtspr(SPR_HID0, hid); isync(); - trcp[0] = 0x2002; - trcp[1] = hid; - hid |= HID0_ICFI | HID0_DCFI; hid |= HID0_ICE | HID0_DCE; mtspr(SPR_HID0, hid); isync(); - trcp[0] = 0x2003; - trcp[1] = hid; - msr = PSL_IR | PSL_DR | PSL_ME | PSL_RI; mtmsr(msr); isync(); - trcp[0] = 0x2004; - trcp[1] = msr; - hid |= HID0_NAP | HID0_DPM; mtspr(SPR_HID0, hid); isync(); - trcp[0] = 0x2005; - trcp[1] = hid; - pcpup->pc_curthread = pcpup->pc_idlethread; pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb; sp = pcpup->pc_curpcb->pcb_sp; - trcp[0] = 0x2006; - trcp[1] = sp; - return (sp); } @@ -197,9 +176,7 @@ int powerpc_smp_start_cpu(struct pcpu *pc) { phandle_t cpu; - volatile uint32_t *trcp; volatile uint8_t *rstvec; - uint32_t trace; int res, reset, timeout; cpu = pc->pc_hwref; @@ -207,9 +184,6 @@ powerpc_smp_start_cpu(struct pcpu *pc) if (res < 0) return (ENXIO); - trcp = (uint32_t *)(EXC_RST + 4); - trace = *trcp; - ap_pcpu = pc; rstvec = (uint8_t *)(0x80000000 + reset); @@ -224,8 +198,5 @@ powerpc_smp_start_cpu(struct pcpu *pc) while (!pc->pc_awake && timeout--) DELAY(100); - if (!pc->pc_awake) - printf("XXX: timeout (trace=%x; data=%x)\n", trcp[0], trcp[1]); - - return (0); + return ((pc->pc_awake) ? 0 : EBUSY); } diff --git a/sys/powerpc/aim/trap_subr.S b/sys/powerpc/aim/trap_subr.S index 2c0e78f86cb..ba72a6557e3 100644 --- a/sys/powerpc/aim/trap_subr.S +++ b/sys/powerpc/aim/trap_subr.S @@ -238,44 +238,16 @@ CNAME(rstcode): bl 1f - /* We use this space for tracing purposes. */ - .long 0 - .long 0 + .space 124 1: - mflr %r2 - mfmsr %r3 - stw %r2,0(%r2) /* trace: 0x104 - we're here. */ - stw %r3,4(%r2) /* trace data: MSR */ - sync + mflr %r1 + addi %r1,%r1,(124-16)@l - lis %r1,(tmpstk+TMPSTKSZ-16)@ha - addi %r1,%r1,(tmpstk+TMPSTKSZ-16)@l - - addi %r3,%r2,4 - stw %r3,0(%r1) - sync - stw %r3,0(%r2) /* trace: 0x108 - stack is writable */ - stw %r1,4(%r2) /* trace data: SP */ - sync - - mr %r3,%r2 - lis %r4,1@l + lis %r3,1@l bla CNAME(pmap_cpu_bootstrap) - - addi %r3,%r2,8 - stw %r3,0(%r2) /* trace 0x10c - back from 1st call */ - sync - - mr %r3,%r2 bla CNAME(cpudep_ap_bootstrap) mr %r1,%r3 - - addi %r3,%r2,12 - stw %r3,0(%r2) /* trace 0x110 - back from 2nd call */ - stw %r1,4(%r2) /* trace data: SP */ - - mr %r3,%r2 bla CNAME(machdep_ap_bootstrap) /* Should not be reached */ diff --git a/sys/powerpc/include/smp.h b/sys/powerpc/include/smp.h index 8f08dfb5ab9..4d364ab1a0a 100644 --- a/sys/powerpc/include/smp.h +++ b/sys/powerpc/include/smp.h @@ -55,9 +55,9 @@ int powerpc_smp_get_bsp(struct cpuref *); int powerpc_smp_next_cpu(struct cpuref *); int powerpc_smp_start_cpu(struct pcpu *); -void pmap_cpu_bootstrap(volatile uint32_t *, int); -uint32_t cpudep_ap_bootstrap(volatile uint32_t *); -void machdep_ap_bootstrap(volatile uint32_t *); +void pmap_cpu_bootstrap(int); +uint32_t cpudep_ap_bootstrap(void); +void machdep_ap_bootstrap(void); #endif /* !LOCORE */ #endif /* _KERNEL */ diff --git a/sys/powerpc/powerpc/mp_machdep.c b/sys/powerpc/powerpc/mp_machdep.c index f21851b56ce..3e32e43a8a1 100644 --- a/sys/powerpc/powerpc/mp_machdep.c +++ b/sys/powerpc/powerpc/mp_machdep.c @@ -52,12 +52,9 @@ volatile static uint32_t ap_decr; int mp_ipi_test = 0; void -machdep_ap_bootstrap(volatile uint32_t *trcp) +machdep_ap_bootstrap(void) { - trcp[0] = 0x3000; - trcp[1] = (uint32_t)&machdep_ap_bootstrap; - // __asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid))); __asm __volatile("mfspr %0,1023" : "=r"(pcpup->pc_pir)); pcpup->pc_awake = 1;