Clean up kernel initialization. Use the bootinfo structure (or innate

knowledge) earlier, and gather all information needed earlier.  Mark the
init code carefully re: when it can print stuff out, when it can expect
the firmware to stop working, etc.  Be more careful about using the PROM
console and other PROM facilities, and hint that in the future all use
of firmware/boot program callbacks by the kernel should go away (since
the world may not be mapped the way the firmware/boot program wants!).
This commit is contained in:
cgd 1998-02-13 02:09:03 +00:00
parent b22ad9fe1a
commit 25d056473c
8 changed files with 230 additions and 116 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: conf.c,v 1.28 1998/01/15 07:02:21 thorpej Exp $ */
/* $NetBSD: conf.c,v 1.29 1998/02/13 02:09:03 cgd Exp $ */
/*-
* Copyright (c) 1991 The Regents of the University of California.
@ -37,7 +37,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: conf.c,v 1.28 1998/01/15 07:02:21 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: conf.c,v 1.29 1998/02/13 02:09:03 cgd Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -47,6 +47,8 @@ __KERNEL_RCSID(0, "$NetBSD: conf.c,v 1.28 1998/01/15 07:02:21 thorpej Exp $");
#include <sys/conf.h>
#include <sys/vnode.h>
#include <vm/vm.h> /* XXX for _PMAP_MAY_USE_PROM_CONSOLE */
#include "fdc.h"
bdev_decl(fd);
bdev_decl(sw);
@ -155,7 +157,9 @@ cdev_decl(wd);
#include "satlink.h"
cdev_decl(satlink);
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
cdev_decl(prom); /* XXX XXX XXX */
#endif
#include "se.h"
#include "rnd.h"
@ -185,7 +189,11 @@ struct cdevsw cdevsw[] =
cdev_lkm_dummy(), /* 20 */
cdev_lkm_dummy(), /* 21 */
cdev_lkm_dummy(), /* 22 */
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
cdev_tty_init(1,prom), /* 23: XXX prom console */
#else
cdev_notdef(), /* 23 */
#endif
cdev_audio_init(NAUDIO,audio), /* 24: generic audio I/O */
cdev_wscons_init(NWSCONS,wscons), /* 25: workstation console */
cdev_tty_init(NCOM,com), /* 26: ns16550 UART */

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.105 1998/02/13 00:27:37 thorpej Exp $ */
/* $NetBSD: machdep.c,v 1.106 1998/02/13 02:09:05 cgd Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@ -29,7 +29,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.105 1998/02/13 00:27:37 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.106 1998/02/13 02:09:05 cgd Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -216,6 +216,9 @@ alpha_init(pfn, ptb, bim, bip, biv)
char *p;
caddr_t v;
caddr_t start, w;
char *bootinfo_msg;
/* NO OUTPUT ALLOWED UNTIL FURTHER NOTICE */
/*
* Turn off interrupts (not mchecks) and floating point.
@ -227,36 +230,10 @@ alpha_init(pfn, ptb, bim, bip, biv)
alpha_pal_imb();
/*
* get address of the restart parameter block, while the
* bootstrap mapping is still around.
*/
hwrpb = (struct rpb *)ALPHA_PHYS_TO_K0SEG(
((struct rpb *)HWRPB_ADDR)->rpb_phys);
/*
* Remember how many cycles there are per microsecond,
* so that we can use delay(). Round up, for safety.
*/
cycles_per_usec = (hwrpb->rpb_cc_freq + 999999) / 1000000;
/*
* Init the PROM interface, so we can use printf
* until PROM mappings go away in consinit.
*/
init_prom_interface();
hz = hwrpb->rpb_intr_freq >> 12;
if (!(60 <= hz && hz <= 10240)) {
hz = 1024;
#ifdef DIAGNOSTIC
printf("rpb_intr_freq of %ld=>%d hz was not believed\n",
hwrpb->rpb_intr_freq, hz);
#endif
}
/*
* Check for a bootinfo from the boot program.
* Get critical system information (if possible, from the
* information provided by the boot program).
*/
bootinfo_msg = NULL;
if (bim == BOOTINFO_MAGIC) {
if (biv == 0) { /* backward compat */
biv = *(u_long *)bip;
@ -268,28 +245,42 @@ alpha_init(pfn, ptb, bim, bip, biv)
bootinfo.ssym = v1p->ssym;
bootinfo.esym = v1p->esym;
/* hwrpb may not be provided by boot block in v1 */
if (v1p->hwrpb != NULL) {
bootinfo.hwrpb_phys =
((struct rpb *)v1p->hwrpb)->rpb_phys;
bootinfo.hwrpb_size = v1p->hwrpbsize;
} else {
bootinfo.hwrpb_phys =
((struct rpb *)HWRPB_ADDR)->rpb_phys;
bootinfo.hwrpb_size =
((struct rpb *)HWRPB_ADDR)->rpb_size;
}
bcopy(v1p->boot_flags, bootinfo.boot_flags,
min(sizeof v1p->boot_flags,
sizeof bootinfo.boot_flags));
bcopy(v1p->booted_kernel, bootinfo.booted_kernel,
min(sizeof v1p->booted_kernel,
sizeof bootinfo.booted_kernel));
/* booted dev not provided by boot block */
/* booted dev not provided in bootinfo */
init_prom_interface((struct rpb *)
ALPHA_PHYS_TO_K0SEG(bootinfo.hwrpb_phys));
prom_getenv(PROM_E_BOOTED_DEV, bootinfo.booted_dev,
sizeof bootinfo.booted_dev);
break;
}
default:
printf("warning: unknown bootinfo version %d\n",
biv);
bootinfo_msg = "unknown bootinfo version";
goto nobootinfo;
}
} else {
printf("warning: boot program did not pass bootinfo\n");
bootinfo_msg = "boot program did not pass bootinfo";
nobootinfo:
bootinfo.ssym = (u_long)_end;
bootinfo.esym = (u_long)_end;
bootinfo.hwrpb_phys = ((struct rpb *)HWRPB_ADDR)->rpb_phys;
bootinfo.hwrpb_size = ((struct rpb *)HWRPB_ADDR)->rpb_size;
init_prom_interface((struct rpb *)HWRPB_ADDR);
prom_getenv(PROM_E_BOOTED_OSFLAGS, bootinfo.boot_flags,
sizeof bootinfo.boot_flags);
prom_getenv(PROM_E_BOOTED_FILE, bootinfo.booted_kernel,
@ -298,6 +289,32 @@ nobootinfo:
sizeof bootinfo.booted_dev);
}
/*
* Initialize the kernel's mapping of the RPB. It's needed for
* lots of things.
*/
hwrpb = (struct rpb *)ALPHA_PHYS_TO_K0SEG(bootinfo.hwrpb_phys);
/*
* Remember how many cycles there are per microsecond,
* so that we can use delay(). Round up, for safety.
*/
cycles_per_usec = (hwrpb->rpb_cc_freq + 999999) / 1000000;
/*
* Initalize the (temporary) bootstrap console interface, so
* we can use printf until the VM system starts being setup.
* The real console is initialized before then.
*/
init_bootstrap_console();
/* OUTPUT NOW ALLOWED */
/* delayed from above */
if (bootinfo_msg)
printf("WARNING: %s (0x%lx, 0x%lx, 0x%lx)\n",
bootinfo_msg, bim, bip, biv);
/*
* Point interrupt/exception vectors to our own.
*/
@ -316,7 +333,46 @@ nobootinfo:
~(ALPHA_MCES_DSC|ALPHA_MCES_DPC));
/*
* find out this CPU's page size
* Find out what hardware we're on, and do basic initialization.
*/
cputype = hwrpb->rpb_type;
if (cputype >= ncpuinit) {
platform_not_supported();
/* NOTREACHED */
}
(*cpuinit[cputype].init)();
strcpy(cpu_model, platform.model);
/*
* Initalize the real console, so the the bootstrap console is
* no longer necessary.
*/
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
if (!pmap_uses_prom_console())
#endif
(*platform.cons_init)();
#ifdef DIAGNOSTIC
/* Paranoid sanity checking */
/* We should always be running on the the primary. */
assert(hwrpb->rpb_primary_cpu_id == alpha_pal_whami());
/* On single-CPU systypes, the primary should always be CPU 0. */
if (cputype != ST_DEC_21000)
assert(hwrpb->rpb_primary_cpu_id == 0);
#endif
/* NO MORE FIRMWARE ACCESS ALLOWED */
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
/*
* XXX (unless _PMAP_MAY_USE_PROM_CONSOLE is defined and
* XXX pmap_uses_prom_console() evaluates to non-zero.)
*/
#endif
/*
* find out this system's page size
*/
PAGE_SIZE = hwrpb->rpb_page_size;
if (PAGE_SIZE != 8192)
@ -473,24 +529,6 @@ nobootinfo:
vm_phys_size <<= 2;
}
/*
* Find out what hardware we're on, and remember its type name.
*/
cputype = hwrpb->rpb_type;
if (cputype >= ncpuinit) {
platform_not_supported();
/* NOTREACHED */
}
(*cpuinit[cputype].init)();
strcpy(cpu_model, platform.model);
/* XXX SANITY CHECKING. SHOULD GO AWAY */
/* XXX We should always be running on the the primary. */
assert(hwrpb->rpb_primary_cpu_id == alpha_pal_whami()); /*XXX*/
/* XXX On single-CPU boxes, the primary should always be CPU 0. */
if (cputype != ST_DEC_21000) /*XXX*/
assert(hwrpb->rpb_primary_cpu_id == 0); /*XXX*/
/*
* Initialize error message buffer (at end of core).
*/
@ -618,6 +656,20 @@ nobootinfo:
}
}
/*
* Initialize debuggers, and break into them if appropriate.
*/
#ifdef DDB
db_machine_init();
ddb_init(ksym_start, ksym_end);
if (boothowto & RB_KDB)
Debugger();
#endif
#ifdef KGDB
if (boothowto & RB_KDB)
kgdb_connect(0);
#endif
/*
* Figure out the number of cpus in the box, from RPB fields.
* Really. We mean it.
@ -630,6 +682,19 @@ nobootinfo:
if ((pcsp->pcs_flags & PCS_PP) != 0)
ncpus++;
}
/*
* Figure out our clock frequency, from RPB fields.
*/
hz = hwrpb->rpb_intr_freq >> 12;
if (!(60 <= hz && hz <= 10240)) {
hz = 1024;
#ifdef DIAGNOSTIC
printf("WARNING: unbelievable rpb_intr_freq: %ld (%d hz)\n",
hwrpb->rpb_intr_freq, hz);
#endif
}
}
/*
@ -695,19 +760,14 @@ allocsys(v)
void
consinit()
{
if (platform.cons_init)
(*platform.cons_init)();
pmap_unmap_prom();
#ifdef DDB
db_machine_init();
ddb_init(ksym_start, ksym_end);
if (boothowto & RB_KDB)
Debugger();
#endif
#ifdef KGDB
if (boothowto & RB_KDB)
kgdb_connect(0);
/*
* Everything related to console initialization is done
* in alpha_init().
*/
#if defined(DIAGNOSTIC) && defined(_PMAP_MAY_USE_PROM_CONSOLE)
printf("consinit: %susing prom console\n",
pmap_uses_prom_console() ? "" : "not ");
#endif
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.old.c,v 1.30 1998/01/31 01:32:55 ross Exp $ */
/* $NetBSD: pmap.old.c,v 1.31 1998/02/13 02:09:07 cgd Exp $ */
/*
* Copyright (c) 1991, 1993
@ -98,7 +98,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: pmap.old.c,v 1.30 1998/01/31 01:32:55 ross Exp $");
__KERNEL_RCSID(0, "$NetBSD: pmap.old.c,v 1.31 1998/02/13 02:09:07 cgd Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -115,6 +115,9 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.old.c,v 1.30 1998/01/31 01:32:55 ross Exp $");
#include <vm/vm_page.h>
#include <machine/cpu.h>
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
#include <machine/rpb.h> /* XXX */
#endif
#ifdef PMAPSTATS
struct {
@ -422,11 +425,28 @@ pmap_bootstrap(firstaddr, ptaddr)
* Set up level 1 page table
*/
/* First, copy mappings for things below VM_MIN_KERNEL_ADDRESS */
bcopy((caddr_t)ptaddr, Lev1map,
kvtol1pte(VM_MIN_KERNEL_ADDRESS) * sizeof Lev1map[0]);
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
{
extern pt_entry_t *rom_ptep, rom_pte; /* XXX */
extern int prom_mapped; /* XXX */
/* Second, map all of the level 2 pte pages */
if (pmap_uses_prom_console()) {
/* XXX save old pte so that we can remap prom if necessary */
rom_ptep = &Lev1map[0]; /* XXX */
rom_pte = *(pt_entry_t *)ptaddr & ~PG_ASM; /* XXX */
}
prom_mapped = 0;
/*
* Actually, this code lies. The prom is still mapped, and will
* remain so until the context switch after alpha_init() returns.
* Printfs using the firmware before then will end up frobbing
* Lev1map unnecessarily, but that's OK.
*/
}
#endif
/* Map all of the level 2 pte pages */
for (i = 0; i < howmany(Sysptmapsize, NPTEPG); i++) {
pte = (ALPHA_K0SEG_TO_PHYS(((vm_offset_t)Sysptmap) + (i*PAGE_SIZE)) >> PGSHIFT)
<< PG_SHIFT;
@ -435,7 +455,7 @@ pmap_bootstrap(firstaddr, ptaddr)
(i*PAGE_SIZE*NPTEPG*NPTEPG))] = pte;
}
/* Finally, map the virtual page table */
/* Map the virtual page table */
pte = (ALPHA_K0SEG_TO_PHYS((vm_offset_t)Lev1map) >> PGSHIFT) << PG_SHIFT;
pte |= PG_V | PG_KRE | PG_KWE; /* NOTE NO ASM */
Lev1map[kvtol1pte(VPTBASE)] = pte;
@ -485,33 +505,16 @@ pmap_bootstrap(firstaddr, ptaddr)
curproc->p_addr->u_pcb.pcb_hw.apcb_ptbr = ALPHA_K0SEG_TO_PHYS((vm_offset_t)Lev1map) >> PGSHIFT;
}
/*
* Unmap the PROM mappings. PROM mappings are kept around
* by pmap_bootstrap, so we can still use the prom's printf.
* Basically, blow away all mappings in the level one PTE
* table below VM_MIN_KERNEL_ADDRESS. The Virtual Page Table
* Is at the end of virtual space, so it's safe.
*/
void
pmap_unmap_prom()
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
int
pmap_uses_prom_console()
{
extern int prom_mapped;
extern pt_entry_t *rom_ptep, rom_pte;
extern int cputype;
#ifdef DEBUG
if (pmapdebug & (PDB_FOLLOW|PDB_BOOTSTRAP))
printf("pmap_unmap_prom\n");
#endif
/* XXX save old pte so that we can remap prom if necessary */
rom_ptep = &Lev1map[0]; /* XXX */
rom_pte = *rom_ptep & ~PG_ASM; /* XXX */
/* Mark all mappings before VM_MIN_KERNEL_ADDRESS as invalid. */
bzero(Lev1map, kvtol1pte(VM_MIN_KERNEL_ADDRESS) * sizeof Lev1map[0]);
prom_mapped = 0;
ALPHA_TBIA();
return (cputype == ST_DEC_21000 || cputype == ST_AVALON_A12 ||
cputype == ST_DEC_3000_300 || cputype == ST_DEC_3000_500);
}
#endif _PMAP_MAY_USE_PROM_CONSOLE
/*
* Bootstrap memory allocator. This function allows for early dynamic

View File

@ -1,4 +1,4 @@
/* $NetBSD: prom.c,v 1.20 1998/01/29 21:11:58 ross Exp $ */
/* $NetBSD: prom.c,v 1.21 1998/02/13 02:09:09 cgd Exp $ */
/*
* Copyright (c) 1992, 1994, 1995, 1996 Carnegie Mellon University
@ -27,7 +27,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: prom.c,v 1.20 1998/01/29 21:11:58 ross Exp $");
__KERNEL_RCSID(0, "$NetBSD: prom.c,v 1.21 1998/02/13 02:09:09 cgd Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -49,26 +49,36 @@ struct consdev promcons = { NULL, NULL, promcngetc, promcnputc,
struct rpb *hwrpb;
int alpha_console;
int prom_mapped = 1; /* Is PROM still mapped? */
extern struct prom_vec prom_dispatch_v;
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
int prom_mapped = 1; /* Is PROM still mapped? */
pt_entry_t *rom_ptep, rom_pte, saved_pte; /* XXX */
#endif
#ifdef NEW_PMAP
#define rom_ptep (curproc ? &curproc->p_vmspace->vm_map.pmap->dir[0] : rom_ptep)
#endif
void
init_prom_interface()
init_prom_interface(rpb)
struct rpb *rpb;
{
struct crb *c;
char buf[4];
c = (struct crb*)((char*)hwrpb + hwrpb->rpb_crb_off);
c = (struct crb *)((char *)rpb + rpb->rpb_crb_off);
prom_dispatch_v.routine_arg = c->crb_v_dispatch;
prom_dispatch_v.routine = c->crb_v_dispatch->entry_va;
}
void
init_bootstrap_console()
{
char buf[4];
init_prom_interface(hwrpb);
prom_getenv(PROM_E_TTY_DEV, buf, 4);
alpha_console = buf[0] - '0';
@ -79,18 +89,24 @@ init_prom_interface()
static int enter_prom __P((void));
static void leave_prom __P((int));
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
static void prom_cache_sync __P((void));
#endif
static int
enter_prom __P((void))
{
int s = splhigh();
int s = splhigh();
if (!prom_mapped) { /* XXX */
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
if (!prom_mapped) {
if (!pmap_uses_prom_console())
panic("enter_prom");
saved_pte = *rom_ptep; /* XXX */
*rom_ptep = rom_pte; /* XXX */
prom_cache_sync(); /* XXX */
}
#endif
return s;
}
@ -98,19 +114,26 @@ static void
leave_prom __P((s))
int s;
{
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
if (!prom_mapped) {
if (!pmap_uses_prom_console())
panic("leave_prom");
*rom_ptep = saved_pte; /* XXX */
prom_cache_sync(); /* XXX */
}
#endif
splx(s);
}
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
static void
prom_cache_sync __P((void))
{
ALPHA_TBIA();
alpha_pal_imb();
}
#endif
/*
* promcnputc:

View File

@ -1,4 +1,4 @@
/* $NetBSD: promcons.c,v 1.9 1997/09/02 13:18:35 thorpej Exp $ */
/* $NetBSD: promcons.c,v 1.10 1998/02/13 02:09:10 cgd Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@ -29,7 +29,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: promcons.c,v 1.9 1997/09/02 13:18:35 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: promcons.c,v 1.10 1998/02/13 02:09:10 cgd Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -44,10 +44,13 @@ __KERNEL_RCSID(0, "$NetBSD: promcons.c,v 1.9 1997/09/02 13:18:35 thorpej Exp $")
#include <sys/syslog.h>
#include <sys/types.h>
#include <sys/device.h>
#include <vm/vm.h> /* XXX for _PMAP_MAY_USE_PROM_CONSOLE */
#include <machine/conf.h>
#include <machine/prom.h>
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
static struct tty *prom_tty[1];
cdev_decl(prom);
@ -67,7 +70,7 @@ promopen(dev, flag, mode, p)
int s;
int error = 0, setuptimeout = 0;
if (unit >= 1)
if (!pmap_uses_prom_console() || unit >= 1)
return ENXIO;
s = spltty();
@ -237,3 +240,5 @@ promtty(dev)
return prom_tty[0];
}
#endif /* _PMAP_MAY_USE_PROM_CONSOLE */

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.h,v 1.13 1998/02/13 01:29:09 thorpej Exp $ */
/* $NetBSD: autoconf.h,v 1.14 1998/02/13 02:09:12 cgd Exp $ */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
@ -124,6 +124,8 @@ struct bootinfo_v1 {
struct bootinfo_kernel {
u_long ssym; /* start of syms */
u_long esym; /* end of syms */
u_long hwrpb_phys; /* hwrpb physical address */
u_long hwrpb_size; /* size of hwrpb data */
char boot_flags[64]; /* boot flags */
char booted_kernel[64]; /* name of booted kernel */
char booted_dev[64]; /* name of booted device */

View File

@ -1,4 +1,4 @@
/* $NetBSD: cpu.h,v 1.19 1998/02/12 01:53:23 cgd Exp $ */
/* $NetBSD: cpu.h,v 1.20 1998/02/13 02:09:13 cgd Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@ -156,7 +156,8 @@ void dumpconf __P((void));
void exception_return __P((void)); /* MAGIC */
void frametoreg __P((struct trapframe *, struct reg *));
long fswintrberr __P((void)); /* MAGIC */
void init_prom_interface __P((void));
void init_bootstrap_console __P((void));
void init_prom_interface __P((struct rpb *));
void interrupt
__P((unsigned long, unsigned long, unsigned long, struct trapframe *));
void machine_check

View File

@ -1,4 +1,4 @@
/* $NetBSD: pmap.old.h,v 1.16 1998/01/09 19:13:09 thorpej Exp $ */
/* $NetBSD: pmap.old.h,v 1.17 1998/02/13 02:09:15 cgd Exp $ */
/*
* Copyright (c) 1987 Carnegie-Mellon University
@ -116,6 +116,16 @@ typedef int pmap_attr_t;
#define PMAP_ATTR_REF 0x02 /* referenced */
#ifdef _KERNEL
#include "opt_avalon_a12.h" /* XXX */
#include "opt_dec_3000_300.h" /* XXX */
#include "opt_dec_3000_500.h" /* XXX */
#include "opt_dec_kn8ae.h" /* XXX */
#if defined(AVALON_A12) || defined(DEC_3000_300) || defined(DEC_3000_500) || defined(DEC_KN8AE) /* XXX */
#define _PMAP_MAY_USE_PROM_CONSOLE
#endif
#define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
#define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
@ -130,7 +140,9 @@ extern char *vmmap; /* map for mem, dumps, etc. */
void pmap_bootstrap __P((vm_offset_t firstaddr, vm_offset_t ptaddr));
void pmap_emulate_reference __P((struct proc *p, vm_offset_t v,
int user, int write));
void pmap_unmap_prom __P((void));
#ifdef _PMAP_MAY_USE_PROM_CONSOLE
int pmap_uses_prom_console __P((void));
#endif
#endif /* _KERNEL */
#endif /* _PMAP_MACHINE_ */