Separate user and kernel address spaces and move the kernel down to

0x0000000001000000 -- 0x00000000f0000000, below the PROM where the
PROM thinks we should be.
This commit is contained in:
eeh 2000-09-28 19:56:13 +00:00
parent d21456569e
commit 5c98160d2b
7 changed files with 90 additions and 54 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile.sparc64,v 1.30 2000/08/02 22:24:38 eeh Exp $
# $NetBSD: Makefile.sparc64,v 1.31 2000/09/28 19:56:15 eeh Exp $
# Makefile for NetBSD
#
@ -72,8 +72,14 @@ CFLAGS= ${DEBUG} ${COPTS} ${CWARNFLAGS} -Wa,-Av9a -mno-fpu
CFLAGS += -mcmodel=medlow
.endif
AFLAGS= -x assembler-with-cpp -traditional-cpp -D_LOCORE -Wa,-Av9a
LINKFLAGS= -Ttext f1000000 -Tdata f1400000 -e start
#LINKFLAGS= -N -Ttext f1000000 -e start
#
# Gotta find a way to make kernel base tuneable.
#
LINKFLAGS= -Ttext 01000000 -Tdata 01400000 -e start
#LINKFLAGS= -Ttext f1000000 -Tdata f1400000 -e start
STRIPFLAGS= -g
%INCLUDES

View File

@ -1,4 +1,4 @@
/* $NetBSD: param.h,v 1.22 2000/06/30 17:55:18 itojun Exp $ */
/* $NetBSD: param.h,v 1.23 2000/09/28 19:56:14 eeh Exp $ */
/*
* Copyright (c) 1992, 1993
@ -171,8 +171,8 @@ extern int nbpg, pgofset, pgshift;
* 0x00000000fe000000: IODEV_END -- end of device mapping space.
*
*/
#define KERNBASE 0x0f1000000 /* start of kernel virtual space */
#define KERNEND 0x0fe000000 /* end of kernel virtual space */
#define KERNBASE 0x001000000 /* start of kernel virtual space */
#define KERNEND 0x0e0000000 /* end of kernel virtual space */
#define VM_MAX_KERNEL_BUF ((KERNEND-KERNBASE)/4)
#define _MAXNBPG 8192 /* fixed VAs, independent of actual NBPG */
@ -184,10 +184,10 @@ extern int nbpg, pgofset, pgshift;
* Here's the location of the interrupt stack and CPU structure.
*/
#define INTSTACK ( KERNEND + 8*_MAXNBPG)/* 64K after kernel end */
#define EINTSTACK ( INTSTACK + 2*USPACE)
#define EINTSTACK ( INTSTACK + 2*USPACE) /* 32KB */
#define CPUINFO_VA ( EINTSTACK)
#define IODEV_BASE ( CPUINFO_VA + 8*_MAXNBPG)/* 64K long */
#define IODEV_END 0x0ff000000UL /* 16 MB of iospace */
#define IODEV_END 0x0f0000000UL /* 16 MB of iospace */
/*
* Constants related to network buffer management.
@ -228,7 +228,7 @@ extern int nbpg, pgofset, pgshift;
/* pages to bytes */
#define ctob(x) ((x) << PGSHIFT)
#define btoc(x) (((x) + PGOFSET) >> PGSHIFT)
#define btoc(x) (((vsize_t)(x) + PGOFSET) >> PGSHIFT)
/* bytes to disk blocks */
#define btodb(x) ((x) >> DEV_BSHIFT)

View File

@ -1,4 +1,4 @@
/* $NetBSD: vmparam.h,v 1.12 2000/08/31 19:12:45 eeh Exp $ */
/* $NetBSD: vmparam.h,v 1.13 2000/09/28 19:56:14 eeh Exp $ */
/*
* Copyright (c) 1992, 1993
@ -56,10 +56,16 @@
* is the top (end) of the user stack.
*/
#define USRTEXT 0x2000 /* Start of user text */
#define USRSTACK KERNBASE /* Start of user stack */
#ifdef __arch64__
#define USRSTACK 0xffffffffffffe000L
#else
#define USRSTACK 0xffffe000L
#endif
/*
* Virtual memory related constants, all in bytes
*
* XXXX -- These need to be updated to 64-bits.
*/
#ifndef MAXTSIZ
#define MAXTSIZ (64*1024*1024) /* max text size */
@ -103,8 +109,9 @@
* User/kernel map constants.
*/
#define VM_MIN_ADDRESS ((vaddr_t)0)
#define VM_MAX_ADDRESS ((vaddr_t)KERNBASE)
#define VM_MAXUSER_ADDRESS ((vaddr_t)KERNBASE)
#define VM_MAX_ADDRESS ((vaddr_t)-1)
#define VM_MAXUSER_ADDRESS ((vaddr_t)-1)
#define VM_MIN_KERNEL_ADDRESS ((vaddr_t)KERNBASE)
#define VM_MAX_KERNEL_ADDRESS ((vaddr_t)KERNEND)

View File

@ -1,4 +1,4 @@
/* $NetBSD: db_trace.c,v 1.18 2000/09/28 15:34:38 eeh Exp $ */
/* $NetBSD: db_trace.c,v 1.19 2000/09/28 19:56:14 eeh Exp $ */
/*
* Mach Operating System
@ -29,7 +29,9 @@
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/user.h>
#include <machine/db_machdep.h>
#include <machine/ctlreg.h>
#include <ddb/db_access.h>
#include <ddb/db_sym.h>
@ -48,6 +50,8 @@ void db_print_window __P((u_int64_t));
#define INKERNEL(va) 1 /* Everything's in the kernel now. 8^) */
#endif
#define KLOAD(x) probeget((paddr_t)(long)&(x), ASI_PRIMARY, sizeof(x))
#define ULOAD(x) probeget((paddr_t)(long)&(x), ASI_AIUS, sizeof(x))
void
db_stack_trace_print(addr, have_addr, count, modif, pr)
db_expr_t addr;
@ -58,19 +62,39 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
{
vaddr_t frame;
boolean_t kernel_only = TRUE;
boolean_t trace_thread = FALSE;
char c, *cp = modif;
{
register char c, *cp = modif;
while ((c = *cp++) != 0)
if (c == 'u')
kernel_only = FALSE;
while ((c = *cp++) != 0) {
if (c == 't')
trace_thread = TRUE;
if (c == 'u')
kernel_only = FALSE;
}
if (!have_addr)
frame = (vaddr_t)DDB_TF->tf_out[6];
else
frame = (vaddr_t)addr;
else {
if (trace_thread) {
struct proc *p;
struct user *u;
(*pr)("trace: pid %d ", (int)addr);
p = pfind(addr);
if (p == NULL) {
(*pr)("not found\n");
return;
}
if ((p->p_flag & P_INMEM) == 0) {
(*pr)("swapped out\n");
return;
}
u = p->p_addr;
frame = (vaddr_t)u->u_pcb.pcb_sp;
(*pr)("at %p\n", frame);
} else {
frame = (vaddr_t)addr;
}
}
while (count--) {
int i;
db_expr_t offset;
@ -81,24 +105,22 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
if (frame & 1) {
f64 = (struct frame64 *)(frame + BIAS);
pc = f64->fr_pc;
if (!INKERNEL(pc))
pc = KLOAD(f64->fr_pc);
if (pc == -1)
break;
/*
* Switch to frame that contains arguments
*/
frame = f64->fr_fp;
frame = KLOAD(f64->fr_fp);
} else {
f32 = (struct frame32 *)(frame);
pc = f32->fr_pc;
if (!INKERNEL(pc))
break;
pc = KLOAD(f32->fr_pc);
/*
* Switch to frame that contains arguments
*/
frame = (long)f32->fr_fp;
frame = (long)KLOAD(f32->fr_fp);
}
if (!INKERNEL(frame))
break;
@ -116,8 +138,9 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
* actual arguments somewhat...
*/
for (i=0; i < 5; i++)
(*pr)("%lx, ", (long)f64->fr_arg[i]);
(*pr)("%lx) at ", (long)f64->fr_arg[i]);
(*pr)("%lx, ",
(long)KLOAD(f64->fr_arg[i]));
(*pr)("%lx) at ", (long)KLOAD(f64->fr_arg[i]));
} else {
f32 = (struct frame32 *)(frame);
/*
@ -125,8 +148,8 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
* actual arguments somewhat...
*/
for (i=0; i < 5; i++)
(*pr)("%x, ", f32->fr_arg[i]);
(*pr)("%x) at ", f32->fr_arg[i]);
(*pr)("%x, ", KLOAD(f32->fr_arg[i]));
(*pr)("%x) at ", KLOAD(f32->fr_arg[i]));
}
db_printsym(pc, DB_STGY_PROC, pr);
(*pr)("\n");
@ -236,13 +259,11 @@ db_dump_stack(addr, have_addr, count, modif)
int i;
u_int64_t frame, oldframe;
boolean_t kernel_only = TRUE;
char c, *cp = modif;
{
register char c, *cp = modif;
while ((c = *cp++) != 0)
if (c == 'u')
kernel_only = FALSE;
}
while ((c = *cp++) != 0)
if (c == 'u')
kernel_only = FALSE;
if (count == -1)
count = 65535;

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.89 2000/09/16 14:07:59 eeh Exp $ */
/* $NetBSD: machdep.c,v 1.90 2000/09/28 19:56:14 eeh Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@ -131,7 +131,7 @@
/* #include "fb.h" */
int bus_space_debug = 0; /* This may be used by macros elsewhere. */
int bus_space_debug = 1; /* This may be used by macros elsewhere. */
#ifdef DEBUG
#define DPRINTF(l, s) do { if (bus_space_debug & l) printf s; } while (0)
#else
@ -407,7 +407,7 @@ setregs(p, pack, stack)
}
bzero((caddr_t)tf, sizeof *tf);
tf->tf_tstate = tstate;
tf->tf_global[1] = (vaddr_t)PS_STRINGS;
tf->tf_global[1] = (vaddr_t)p->p_psstr;
/* %g4 needs to point to the start of the data segment */
tf->tf_global[4] = 0;
tf->tf_pc = pack->ep_entry & ~3;
@ -1552,6 +1552,8 @@ static void sparc_bus_barrier __P(( bus_space_tag_t, bus_space_handle_t,
bus_size_t, bus_size_t, int));
vaddr_t iobase = IODEV_BASE;
int
sparc_bus_map(t, iospace, addr, size, flags, vaddr, hp)
bus_space_tag_t t;
@ -1565,7 +1567,6 @@ sparc_bus_map(t, iospace, addr, size, flags, vaddr, hp)
u_int64_t pa;
paddr_t pm_flags = 0;
vm_prot_t pm_prot = VM_PROT_READ;
static vaddr_t iobase = IODEV_BASE;
t->type = iospace;
if (iobase == NULL)

View File

@ -1,4 +1,4 @@
/* $NetBSD: netbsd32_machdep.c,v 1.9 2000/08/01 00:34:13 eeh Exp $ */
/* $NetBSD: netbsd32_machdep.c,v 1.10 2000/09/28 19:56:14 eeh Exp $ */
/*
* Copyright (c) 1998 Matthew R. Green
@ -97,7 +97,7 @@ netbsd32_setregs(p, pack, stack)
}
bzero((caddr_t)tf, sizeof *tf);
tf->tf_tstate = tstate;
tf->tf_global[1] = (int)PS_STRINGS;
tf->tf_global[1] = (int)(long)p->p_psstr;
tf->tf_pc = pack->ep_entry & ~3;
tf->tf_npc = tf->tf_pc + 4;
@ -231,7 +231,7 @@ netbsd32_sendsig(catcher, sig, mask, code)
* Arrange to continue execution at the code copied out in exec().
* It needs the function to call in %g1, and a new stack pointer.
*/
addr = (long)PS_STRINGS - szsigcode;
addr = (long)p->p_psstr - szsigcode;
tf->tf_global[1] = (long)catcher;
tf->tf_pc = addr;
tf->tf_npc = addr + 4;

View File

@ -1,4 +1,4 @@
/* $NetBSD: trap.c,v 1.53 2000/08/08 19:59:41 tv Exp $ */
/* $NetBSD: trap.c,v 1.54 2000/09/28 19:56:13 eeh Exp $ */
/*
* Copyright (c) 1996
@ -716,8 +716,12 @@ badtrap:
* We may have more FPEs stored up and/or ops queued.
* If they exist, handle them and get out. Otherwise,
* resolve the FPU state, turn it on, and try again.
*
* Ultras should never have a FPU queue.
*/
if (fs->fs_qsize) {
printf("trap: Warning fs_qsize is %d\n",fs->fs_qsize);
fpu_cleanup(p, fs);
break;
}
@ -881,9 +885,6 @@ rwindow_save(p)
register struct trapframe64 *tf = p->p_md.md_tf;
#endif
/* Make sure our D$ is not polluted w/bad data */
blast_vcache();
i = pcb->pcb_nsaved;
#ifdef DEBUG
if (rwindow_debug&RW_FOLLOW)
@ -1126,7 +1127,7 @@ data_access_fault(type, addr, pc, tf)
*/
if ((caddr_t)va >= vm->vm_maxsaddr) {
if (rv == KERN_SUCCESS) {
unsigned nss = btoc(USRSTACK - va);
segsz_t nss = btoc(p->p_vmspace->vm_minsaddr - va);
if (nss > vm->vm_ssize)
vm->vm_ssize = nss;
} else if (rv == KERN_PROTECTION_FAILURE)
@ -1383,7 +1384,7 @@ data_access_error(type, sfva, sfsr, afva, afsr, tf)
*/
if ((caddr_t)va >= vm->vm_maxsaddr) {
if (rv == KERN_SUCCESS) {
unsigned nss = btoc(USRSTACK - va);
segsz_t nss = btoc(p->p_vmspace->vm_minsaddr - va);
if (nss > vm->vm_ssize)
vm->vm_ssize = nss;
} else if (rv == KERN_PROTECTION_FAILURE)
@ -1530,7 +1531,7 @@ text_access_fault(type, pc, tf)
*/
if ((caddr_t)va >= vm->vm_maxsaddr) {
if (rv == KERN_SUCCESS) {
unsigned nss = btoc(USRSTACK - va);
segsz_t nss = btoc(p->p_vmspace->vm_minsaddr - va);
if (nss > vm->vm_ssize)
vm->vm_ssize = nss;
} else if (rv == KERN_PROTECTION_FAILURE)
@ -1697,7 +1698,7 @@ text_access_error(type, pc, sfsr, afva, afsr, tf)
*/
if ((caddr_t)va >= vm->vm_maxsaddr) {
if (rv == KERN_SUCCESS) {
unsigned nss = btoc(USRSTACK - va);
segsz_t nss = btoc(p->p_vmspace->vm_minsaddr - va);
if (nss > vm->vm_ssize)
vm->vm_ssize = nss;
} else if (rv == KERN_PROTECTION_FAILURE)