Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Apr 2008 00:48:44 GMT
From:      Marcel Moolenaar <marcel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 140142 for review
Message-ID:  <200804170048.m3H0miGF002623@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=140142

Change 140142 by marcel@marcel_xcllnt on 2008/04/17 00:48:08

	Make SMP go all the way into the scheduler.

Affected files ...

.. //depot/projects/powerpc/sys/powerpc/aim/machdep.c#9 edit
.. //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#6 edit
.. //depot/projects/powerpc/sys/powerpc/aim/swtch.S#4 edit
.. //depot/projects/powerpc/sys/powerpc/aim/vm_machdep.c#5 edit
.. //depot/projects/powerpc/sys/powerpc/conf/XSERVE#8 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#21 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/openpic.c#10 edit

Differences ...

==== //depot/projects/powerpc/sys/powerpc/aim/machdep.c#9 (text+ko) ====

@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/powerpc/aim/machdep.c,v 1.111 2008/03/16 10:58:08 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/powerpc/aim/machdep.c,v 1.112 2008/04/16 23:28:12 marcel Exp $");
 
 #include "opt_compat.h"
 #include "opt_ddb.h"
@@ -130,12 +130,10 @@
 
 int cold = 1;
 
-static struct pcpu pcpu0;
+struct pcpu __pcpu[MAXCPU];
+
 static struct trapframe frame0;
 
-vm_offset_t	kstack0;
-vm_offset_t	kstack0_phys;
-
 char		machine[] = "powerpc";
 SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, "");
 
@@ -146,7 +144,7 @@
 static void	cpu_startup(void *);
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
-void		powerpc_init(u_int, u_int, u_int, void *);
+u_int		powerpc_init(u_int, u_int, u_int, void *);
 
 int		save_ofw_mapping(void);
 int		restore_ofw_mapping(void);
@@ -250,11 +248,11 @@
 extern void	*dblow, *dbsize;
 extern void	*vectrap, *vectrapsize;
 
-void
+u_int
 powerpc_init(u_int startkernel, u_int endkernel, u_int basekernel, void *mdp)
 {
 	struct		pcpu *pc;
-	vm_offset_t	end, off;
+	vm_offset_t	end;
 	void		*kmdp;
         char		*env;
 
@@ -294,10 +292,9 @@
 	/*
 	 * Set up per-cpu data.
 	 */
-	pc = &pcpu0;
+	pc = __pcpu;
 	pcpu_init(pc, 0, sizeof(struct pcpu));
 	pc->pc_curthread = &thread0;
-	pc->pc_curpcb = thread0.td_pcb;
 	pc->pc_cpuid = 0;
 
 	__asm __volatile("mtsprg 0, %0" :: "r"(pc));
@@ -380,15 +377,12 @@
 	/*
 	 * Finish setting up thread0.
 	 */
-	thread0.td_kstack = kstack0;
 	thread0.td_pcb = (struct pcb *)
-	    (thread0.td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1;
+	    ((thread0.td_kstack + thread0.td_kstack_pages * PAGE_SIZE -
+	    sizeof(struct pcb)) & ~15);
+	pc->pc_curpcb = thread0.td_pcb;
 
-	/*
-	 * Map and initialise the message buffer.
-	 */
-	for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE)
-		pmap_kenter((vm_offset_t)msgbufp + off, msgbuf_phys + off);
+	/* Initialise the message buffer. */
 	msgbufinit(msgbufp, MSGBUF_SIZE);
 
 #ifdef KDB
@@ -396,6 +390,8 @@
 		kdb_enter(KDB_WHY_BOOTFLAGS,
 		    "Boot flags requested debugger");
 #endif
+
+	return (((uintptr_t)thread0.td_pcb - 16) & ~15);
 }
 
 void

==== //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#6 (text+ko) ====

@@ -38,9 +38,12 @@
 #include <machine/bat.h>
 #include <machine/bus.h>
 #include <machine/cpu.h>
+#include <machine/hid.h>
 #include <machine/intr_machdep.h>
 #include <machine/pcb.h>
+#include <machine/psl.h>
 #include <machine/smp.h>
+#include <machine/spr.h>
 #include <machine/trap_aim.h>
 
 #include <dev/ofw/openfirm.h>
@@ -138,7 +141,7 @@
 uint32_t
 cpudep_ap_bootstrap(volatile uint32_t *trcp)
 {
-	uint32_t sp;
+	uint32_t hid, msr, sp;
 
 	trcp[0] = 0x2000;
 	trcp[1] = (uint32_t)&cpudep_ap_bootstrap;
@@ -149,17 +152,48 @@
 	trcp[0] = 0x2001;
 	trcp[1] = (uint32_t)pcpup;
 
-	mtmsr(PSL_IR | PSL_DR | PSL_ME);
+	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] = 0;
+	trcp[1] = hid;
+
+	mtspr(SPR_HID0, hid | HID0_ICFI | HID0_DCFI);
+	mtspr(SPR_HID0, hid);
+	isync();
+
+	trcp[0] = 0x2003;
+	trcp[1] = hid;
+
+	hid |= HID0_ICE | HID0_DCE;
+	mtspr(SPR_HID0, hid);
+	isync();
+
+	trcp[0] = 0x2004;
+	trcp[1] = hid;
+
+	msr = PSL_IR | PSL_DR | PSL_ME;
+	mtmsr(msr);
+	isync();
+
+	trcp[0] = 0x2005;
+	trcp[1] = msr;
+
+	hid |= HID0_NAP | HID0_DPM;
+	mtspr(SPR_HID0, hid);
+	isync();
+
+	trcp[0] = 0x2006;
+	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] = 0x2003;
+	trcp[0] = 0x2007;
 	trcp[1] = sp;
 
 	return (sp);

==== //depot/projects/powerpc/sys/powerpc/aim/swtch.S#4 (text+ko) ====

@@ -67,6 +67,13 @@
 #include <machine/asm.h>
 
 /*
+ * void cpu_throw(struct thread *old, struct thread *new)
+ */
+ENTRY(cpu_throw)
+	mr	%r15, %r4
+	b	cpu_switchin
+
+/*
  * void cpu_switch(struct thread *old,
  *		   struct thread *new,
  *		   struct mutex *mtx); 
@@ -111,6 +118,7 @@
 .L1:
 	bl	pmap_deactivate		/* Deactivate the current pmap */
 
+cpu_switchin:
 	mr	%r3,%r15		/* Get new thread ptr */
 	bl	pmap_activate		/* Activate the new address space */
 

==== //depot/projects/powerpc/sys/powerpc/aim/vm_machdep.c#5 (text+ko) ====

@@ -193,15 +193,6 @@
 {
 }
 
-/* Temporary helper */
-void
-cpu_throw(struct thread *old, struct thread *new)
-{
-
-	cpu_switch(old, new, old->td_lock);
-	panic("cpu_throw() didn't");
-}
-
 /*
  * Reset back to firmware.
  */

==== //depot/projects/powerpc/sys/powerpc/conf/XSERVE#8 (text+ko) ====

@@ -5,6 +5,7 @@
 makeoptions	NO_MODULES=yes
 
 options 	ALT_BREAK_TO_DEBUGGER
+options 	BREAK_TO_DEBUGGER
 options 	CD9660
 options 	DDB
 options 	FFS

==== //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#21 (text+ko) ====

@@ -31,7 +31,6 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
-#include <sys/malloc.h>
 #include <sys/pcpu.h>
 #include <sys/proc.h>
 #include <sys/sched.h>
@@ -44,7 +43,7 @@
 
 #include "pic_if.h"
 
-MALLOC_DEFINE(M_SMP, "smp", "SMP specific datastructures");
+extern struct pcpu __pcpu[MAXCPU];
 
 volatile static int ap_awake;
 volatile static u_int ap_state;
@@ -59,7 +58,7 @@
 	trcp[0] = 0x3000;
 	trcp[1] = (uint32_t)&machdep_ap_bootstrap;
 
-	__asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid)));
+	// __asm __volatile("mtspr 1023,%0" :: "r"(PCPU_GET(cpuid)));
 	__asm __volatile("mfspr %0,1023" : "=r"(pcpup->pc_pir));
 	pcpup->pc_awake = 1;
 
@@ -70,6 +69,9 @@
 
 	ap_awake++;
 
+	/* Initialize curthread. */
+	PCPU_SET(curthread, PCPU_GET(idlethread));
+
 	mtmsr(mfmsr() | PSL_EE | PSL_RI);
 	sched_throw(NULL);
 }
@@ -138,8 +140,7 @@
 			goto next;
 		}
 		if (cpu.cr_cpuid != bsp.cr_cpuid) {
-			pc = (struct pcpu *)malloc(sizeof(*pc), M_SMP,
-			    M_WAITOK);
+			pc = &__pcpu[cpu.cr_cpuid];
 			pcpu_init(pc, cpu.cr_cpuid, sizeof(*pc));
 		} else {
 			pc = pcpup;

==== //depot/projects/powerpc/sys/powerpc/powerpc/openpic.c#10 (text+ko) ====

@@ -132,10 +132,8 @@
 		    "Version %s, supports %d CPUs and %d irqs\n",
 		    sc->sc_version, sc->sc_ncpu, sc->sc_nirq);
 
-	for (cpu = 0; cpu < sc->sc_ncpu; cpu++) {
-		openpic_write(sc, OPENPIC_PCPU_TPR(cpu), 0);
-		openpic_write(sc, OPENPIC_PCPU_WHOAMI(cpu), cpu);
-	}
+	for (cpu = 0; cpu < sc->sc_ncpu; cpu++)
+		openpic_write(sc, OPENPIC_PCPU_TPR(cpu), 15);
 
 	/* Reset and disable all interrupts. */
 	for (irq = 0; irq < sc->sc_nirq; irq++) {
@@ -164,10 +162,8 @@
 	for (irq = 0; irq < sc->sc_nirq; irq++)
 		openpic_write(sc, OPENPIC_IDEST(irq), 1 << 0);
 
-	for (cpu = 0; cpu < sc->sc_ncpu; cpu++) {
+	for (cpu = 0; cpu < sc->sc_ncpu; cpu++)
 		openpic_write(sc, OPENPIC_PCPU_TPR(cpu), 0);
-		openpic_write(sc, OPENPIC_PCPU_WHOAMI(cpu), cpu);
-	}
 
 	/* clear all pending interrupts */
 	for (irq = 0; irq < sc->sc_nirq; irq++) {
@@ -207,15 +203,25 @@
 void
 openpic_dispatch(device_t dev, struct trapframe *tf)
 {
+	static int once = 0;
 	struct openpic_softc *sc;
 	u_int vector;
 
+	if (once == 0 && PCPU_GET(cpuid) != 0) {
+		printf("XXX: got interrupt!\n");
+		once++;
+	}
+
 	sc = device_get_softc(dev);
 	while (1) {
 		vector = openpic_read(sc, OPENPIC_PCPU_IACK(PCPU_GET(cpuid)));
 		vector &= OPENPIC_VECTOR_MASK;
 		if (vector == 255)
 			break;
+		if (once == 1 && PCPU_GET(cpuid) != 0) {
+			printf("XXX: got vector %u\n", vector);
+			once++;
+		}
 		powerpc_dispatch_intr(vector, tf);
 	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804170048.m3H0miGF002623>