PERFORCE change 117140 for review
Marcel Moolenaar
marcel at FreeBSD.org
Sun Apr 1 21:52:18 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=117140
Change 117140 by marcel at marcel_xcllnt on 2007/04/01 21:52:12
Create PCPU structures for all CPUs. Reduce dependency
on MAXCPU by allocating PCPU structures on demand.
Affected files ...
.. //depot/projects/powerpc/sys/powerpc/include/pcpu.h#6 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/machdep.c#8 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#9 edit
.. //depot/projects/powerpc/sys/powerpc/powerpc/ofw_machdep.c#7 edit
Differences ...
==== //depot/projects/powerpc/sys/powerpc/include/pcpu.h#6 (text+ko) ====
@@ -40,6 +40,7 @@
int pc_inside_intr; \
struct pmap *pc_curpmap; /* current pmap */ \
struct thread *pc_fputhread; /* current fpu user */ \
+ int pc_bsp:1; \
int pc_awake:1; \
register_t pc_tempsave[CPUSAVE_LEN]; \
register_t pc_disisave[CPUSAVE_LEN]; \
==== //depot/projects/powerpc/sys/powerpc/powerpc/machdep.c#8 (text+ko) ====
@@ -127,8 +127,8 @@
int cold = 1;
-struct pcpu __pcpu[MAXCPU];
-struct trapframe frame0;
+static struct pcpu pcpu0;
+static struct trapframe frame0;
vm_offset_t kstack0;
vm_offset_t kstack0_phys;
@@ -290,7 +290,7 @@
/*
* Set up per-cpu data.
*/
- pc = &__pcpu[0];
+ pc = &pcpu0;
pcpu_init(pc, 0, sizeof(struct pcpu));
pc->pc_curthread = &thread0;
pc->pc_curpcb = thread0.td_pcb;
==== //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#9 (text+ko) ====
@@ -37,6 +37,8 @@
#include <dev/ofw/openfirm.h>
+MALLOC_DEFINE(M_SMP, "smp", "SMP specific datastructures");
+
volatile static int ap_awake;
volatile static int ap_spin;
@@ -45,9 +47,9 @@
void
cpu_mp_setmaxid(void)
{
+ char buf[8];
phandle_t dev, root;
int res;
- char buf[8];
mp_ncpus = 0;
@@ -93,6 +95,57 @@
void
cpu_mp_start(void)
{
+ char buf[8];
+ struct pcpu *pc;
+ ihandle_t inst;
+ phandle_t bsp, chosen, dev, root;
+ int cpuid, res;
+
+ /* Get the p-handle of the BSP. */
+ chosen = OF_finddevice("/chosen");
+ if (chosen != -1) {
+ res = OF_getprop(chosen, "cpu", &inst, sizeof(inst));
+ bsp = (res > 0) ? OF_instance_to_package(inst) : -1;
+ } else
+ bsp = -1;
+
+ root = OF_peer(0);
+ dev = OF_child(root);
+ while (dev != 0) {
+ res = OF_getprop(dev, "name", buf, sizeof(buf));
+ if (res > 0 && !strcmp(buf, "cpus"))
+ break;
+ dev = OF_peer(dev);
+ }
+ KASSERT(dev != 0, ("%s: dev == 0", __func__));
+ for (dev = OF_child(dev); dev != 0; dev = OF_peer(dev)) {
+ res = OF_getprop(dev, "device_type", buf, sizeof(buf));
+ if (res < 0 || strcmp(buf, "cpu") != 0)
+ continue;
+ res = OF_getprop(dev, "reg", &cpuid, sizeof(cpuid));
+ if (res < 0)
+ continue;
+ cpuid &= 0xff;
+ if (cpuid >= MAXCPU) {
+ printf("SMP: cpu%d: skipped -- ID out of range\n",
+ cpuid);
+ continue;
+ }
+ if (all_cpus & (1 << cpuid)) {
+ printf("SMP: cpu%d: skipped - duplicate ID\n", cpuid);
+ continue;
+ }
+ if (dev != bsp) {
+ pc = (struct pcpu *)malloc(sizeof(*pc), M_SMP,
+ M_WAITOK);
+ pcpu_init(pc, cpuid, sizeof(*pc));
+ } else {
+ KASSERT(cpuid == 0, ("%s: cpuid != 0", __func__));
+ pc = pcpup;
+ pc->pc_bsp = 1;
+ }
+ all_cpus |= 1 << cpuid;
+ }
}
void
@@ -106,7 +159,7 @@
if (pc == NULL)
continue;
printf("cpu%d", i);
- if (i == 0)
+ if (pc->pc_bsp)
printf(" (BSP)");
printf("\n");
}
@@ -152,6 +205,9 @@
static void
ipi_send(struct pcpu *pc, int ipi)
{
+ /*
+ *
+ */
}
/* Send an IPI to a set of cpus. */
==== //depot/projects/powerpc/sys/powerpc/powerpc/ofw_machdep.c#7 (text+ko) ====
@@ -63,7 +63,6 @@
static struct mem_region OFfree[OFMEM_REGIONS + 3];
extern register_t ofmsr[5];
-extern struct pcpu __pcpu[MAXCPU];
extern struct pmap ofw_pmap;
static int (*ofwcall)(void *);
More information about the p4-projects
mailing list