Make MP kernels build again. Heck, if I'm lucky, maybe these changes will

even make one boot.
This commit is contained in:
matt 2007-07-21 19:12:15 +00:00
parent 744a92f0f8
commit ae0a442af3
2 changed files with 21 additions and 27 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu.c,v 1.44 2007/05/29 13:26:39 macallan Exp $ */
/* $NetBSD: cpu.c,v 1.45 2007/07/21 19:12:15 matt Exp $ */
/*-
* Copyright (c) 2001 Tsubai Masanari.
@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.44 2007/05/29 13:26:39 macallan Exp $");
__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.45 2007/07/21 19:12:15 matt Exp $");
#include "opt_ppcparam.h"
#include "opt_multiprocessor.h"
@ -42,6 +42,8 @@ __KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.44 2007/05/29 13:26:39 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/lwp.h>
#include <sys/user.h>
#include <uvm/uvm_extern.h>
#include <dev/ofw/openfirm.h>
@ -222,51 +224,44 @@ cpu_spinup(self, ci)
{
volatile struct cpu_hatch_data hatch_data, *h = &hatch_data;
int i;
struct pcb *pcb;
struct pglist mlist;
int pvr, vers;
int error;
int size = 0;
char *cp;
pvr = mfpvr();
vers = pvr >> 16;
/*
* Allocate some contiguous pages for the idle PCB and stack
* Allocate some contiguous pages for the intteup PCB and stack
* from the lowest 256MB (because bat0 always maps it va == pa).
*/
size += USPACE;
size += 8192; /* INTSTK */
size += 4096; /* SPILLSTK */
error = uvm_pglistalloc(size, 0x0, 0x10000000, 0, 0, &mlist, 1, 1);
error = uvm_pglistalloc(INTSTK, 0x0, 0x10000000, 0, 0, &mlist, 1, 1);
if (error) {
printf(": unable to allocate idle stack\n");
return -1;
}
KASSERT(ci == &cpu_info[1]);
cp = (void *)VM_PAGE_TO_PHYS(TAILQ_FIRST(&mlist));
memset(cp, 0, size);
memset(cp, 0, INTSTK);
pcb = (struct pcb *)cp;
cp += USPACE;
cpu_info[1].ci_intstk = cp + INTSTK;
cp += INTSTK;
cpu_info[1].ci_intstk = cp;
/*
* Initialize the idle stack pointer, reserving space for an
* (empty) trapframe (XXX is the trapframe really necessary?)
* Initialize secondary cpu's initial lwp to it's idlelwp.
*/
pcb->pcb_sp = (paddr_t)pcb + USPACE - sizeof(struct trapframe);
ci->ci_curlwp = ci->ci_data.cpu_idlelwp;
ci->ci_curpcb = &ci->ci_curlwp->l_addr->u_pcb;
ci->ci_curpm = ci->ci_curpcb->pcb_pm;
cpu_hatch_data = h;
h->running = 0;
h->self = self;
h->ci = ci;
h->pir = 1;
cpu_hatch_stack = pcb->pcb_sp;
cpu_hatch_stack = ci->ci_curpcb->pcb_sp;
cpu_info[1].ci_lasttb = cpu_info[0].ci_lasttb;
/* copy special registers */
@ -364,6 +359,7 @@ void
cpu_hatch()
{
volatile struct cpu_hatch_data *h = cpu_hatch_data;
struct cpu_info * const ci = h->ci;
u_int msr;
int i;
@ -372,7 +368,7 @@ cpu_hatch()
/* Set PIR (Processor Identification Register). i.e. whoami */
__asm volatile ("mtspr 1023,%0" :: "r"(h->pir));
__asm volatile ("mtsprg 0,%0" :: "r"(h->ci));
__asm volatile ("mtsprg 0,%0" :: "r"(ci));
/* Initialize MMU. */
__asm ("mtibatu 0,%0" :: "r"(0));
@ -443,8 +439,8 @@ cpu_hatch()
else
out32(HH_INTR_SECONDARY, ~0); /* Reset interrupt. */
curcpu()->ci_ipending = 0;
curcpu()->ci_cpl = 0;
ci->ci_ipending = 0;
ci->ci_cpl = 0;
}
void

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.S,v 1.57 2006/08/23 05:58:39 sanjayl Exp $ */
/* $NetBSD: locore.S,v 1.58 2007/07/21 19:12:15 matt Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@ -148,9 +148,7 @@ ENTRY(cpu_spinup_trampoline)
lwz 1,_C_LABEL(cpu_hatch_stack)@l(3)
bl _C_LABEL(cpu_hatch)
bl _C_LABEL(sched_lock_idle)
li 30,0
b _ASM_LABEL(Idle)
b _C_LABEL(idle_loop)
#endif
#if defined (PPC_OEA64_BRIDGE)