Use private (its own) segment registers in Open Firmware call,

instead of BAT register.
This commit is contained in:
tsubai 1999-02-02 16:47:08 +00:00
parent ef69721044
commit a4de4218fd
2 changed files with 105 additions and 51 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.S,v 1.10 1999/01/27 14:46:28 tsubai Exp $ */ /* $NetBSD: locore.S,v 1.11 1999/02/02 16:47:09 tsubai Exp $ */
/* /*
* Copyright (C) 1995, 1996 Wolfgang Solfrank. * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@ -86,8 +86,6 @@ GLOBAL(intrcnt)
.long 0,0,0,0 .long 0,0,0,0
GLOBAL(eintrcnt) GLOBAL(eintrcnt)
GLOBAL(ofbat)
.long 0,0 /* batu, batl */
GLOBAL(ofmsr) GLOBAL(ofmsr)
.long 0 /* msr used in Open Firmware */ .long 0 /* msr used in Open Firmware */
@ -98,6 +96,8 @@ idle_u:
.long 0 /* fake uarea during idle after exit */ .long 0 /* fake uarea during idle after exit */
openfirmware_entry: openfirmware_entry:
.long 0 /* openfirmware entry point */ .long 0 /* openfirmware entry point */
srsave:
.long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
/* /*
* This symbol is here for the benefit of kvm_mkdb, and is supposed to * This symbol is here for the benefit of kvm_mkdb, and is supposed to
@ -178,22 +178,46 @@ ENTRY(openfirmware)
lwz 4,openfirmware_entry@l(4) lwz 4,openfirmware_entry@l(4)
mtlr 4 mtlr 4
lis 4,_C_LABEL(ofbat)@ha /* map Open Firmware work area */
lwz 4,_C_LABEL(ofbat)@l(4)
mtibatu 2,4
mtdbatu 2,4
lis 4,_C_LABEL(ofbat)+4@ha
lwz 4,_C_LABEL(ofbat)+4@l(4)
mtibatl 2,4
mtdbatl 2,4
lis 4,ofmsr@ha /* Open Firmware msr */ lis 4,ofmsr@ha /* Open Firmware msr */
lwz 4,ofmsr@l(4) lwz 4,ofmsr@l(4)
mtmsr 4 mtmsr 4
isync isync
lis 4,srsave@ha /* save old SR */
addi 4,4,srsave@l
li 5,0
1: mfsrin 0,5
stw 0,0(4)
addi 4,4,4
addis 5,5,0x10000000@h
cmpwi 5,0
bne 1b
lis 4,_C_LABEL(ofw_pmap)@ha /* load OFW SR */
addi 4,4,_C_LABEL(ofw_pmap)@l
lwz 0,PM_KERNELSR(4)
cmpwi 0,0 /* pm_sr[KERNEL_SR] == 0? */
beq 2f /* then skip (not initialized yet) */
li 5,0
1: lwz 0,0(4)
mtsrin 0,5
addi 4,4,4
addis 5,5,0x10000000@h
cmpwi 5,0
bne 1b
2:
blrl /* call Open Firmware */ blrl /* call Open Firmware */
lis 4,srsave@ha /* restore saved SR */
addi 4,4,srsave@l
li 5,0
1: mfsrin 0,5
stw 0,0(4)
addi 4,4,4
addis 5,5,0x10000000@h
cmpwi 5,0
bne 1b
lwz 4,8(1) /* restore msr */ lwz 4,8(1) /* restore msr */
mtmsr 4 mtmsr 4
isync isync

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.30 1999/01/27 14:46:28 tsubai Exp $ */ /* $NetBSD: machdep.c,v 1.31 1999/02/02 16:47:08 tsubai Exp $ */
/* /*
* Copyright (C) 1995, 1996 Wolfgang Solfrank. * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@ -41,6 +41,7 @@
#include "opt_natm.h" #include "opt_natm.h"
#include "opt_uvm.h" #include "opt_uvm.h"
#include "opt_sysv.h" #include "opt_sysv.h"
#include "adb.h"
#include "ipkdb.h" #include "ipkdb.h"
#include <sys/param.h> #include <sys/param.h>
@ -92,8 +93,6 @@
#include <dev/cons.h> #include <dev/cons.h>
#include <dev/ofw/openfirm.h> #include <dev/ofw/openfirm.h>
#include "adb.h"
#if defined(UVM) #if defined(UVM)
vm_map_t exec_map = NULL; vm_map_t exec_map = NULL;
vm_map_t mb_map = NULL; vm_map_t mb_map = NULL;
@ -110,16 +109,17 @@ struct pmap *curpm;
struct proc *fpuproc; struct proc *fpuproc;
extern struct user *proc0paddr; extern struct user *proc0paddr;
extern int ofmsr;
struct bat battable[16]; struct bat battable[16];
int astpending; int astpending;
char *bootpath; char *bootpath;
paddr_t msgbuf_paddr; paddr_t msgbuf_paddr;
static int chosen;
struct pmap ofw_pmap;
int msgbufmapped = 0; int msgbufmapped = 0;
extern int ofmsr;
#ifdef NBUF #ifdef NBUF
int nbuf = NBUF; int nbuf = NBUF;
#else #else
@ -134,8 +134,6 @@ int bufpages = 0;
caddr_t allocsys __P((caddr_t)); caddr_t allocsys __P((caddr_t));
void install_extint __P((void (*)(void))); void install_extint __P((void (*)(void)));
extern struct bat ofbat;
int cold = 1; int cold = 1;
void void
@ -162,20 +160,8 @@ initppc(startkernel, endkernel, args)
extern void ext_intr __P((void)); extern void ext_intr __P((void));
int exc, scratch; int exc, scratch;
int chosen, mmu, mode, exists;
u_int32_t ofw_pa1, ofw_pa2;
/*
* Read translations for Openfirmware call.
*/
chosen = OF_finddevice("/chosen"); chosen = OF_finddevice("/chosen");
OF_getprop(chosen, "mmu", &mmu, 4); save_ofw_mapping();
OF_call_method("translate", mmu, 1, 3,
0xff800000, &ofw_pa1, &mode, &exists);
OF_call_method("translate", mmu, 1, 3,
0xff900000, &ofw_pa2, &mode, &exists);
if (exists == 0)
ofw_pa2 = -1;
proc0.p_addr = proc0paddr; proc0.p_addr = proc0paddr;
bzero(proc0.p_addr, sizeof *proc0.p_addr); bzero(proc0.p_addr, sizeof *proc0.p_addr);
@ -215,6 +201,15 @@ initppc(startkernel, endkernel, args)
battable[0].batl = BATL(0x00000000, BAT_M); battable[0].batl = BATL(0x00000000, BAT_M);
battable[0].batu = BATU(0x00000000); battable[0].batu = BATU(0x00000000);
/*
* Map PCI memory space.
*/
battable[8].batl = BATL(0x80000000, BAT_I);
battable[8].batu = BATU(0x80000000);
battable[9].batl = BATL(0x90000000, BAT_I);
battable[9].batu = BATU(0x90000000);
/* /*
* Now setup fixed bat registers * Now setup fixed bat registers
* *
@ -231,20 +226,6 @@ initppc(startkernel, endkernel, args)
asm volatile ("mtdbatl 1,%0; mtdbatu 1,%1" asm volatile ("mtdbatl 1,%0; mtdbatu 1,%1"
:: "r"(0xf0000002 | BAT_I), "r"(0xf0000ffe)); :: "r"(0xf0000002 | BAT_I), "r"(0xf0000ffe));
/* BAT3 used temporarily for mapping video ram */
/* (XXX upper half slots only...) */
asm volatile ("mtdbatl 3,%0; mtdbatu 3,%1"
:: "r"(BATL(0x80000000, BAT_I)), "r"(BATU(0x80000000)));
/* Open Firmware working area */
/* iMac ff800000 - (00200000) -> XXe00000 */
/* others ff800000 - (00100000) -> XXf00000 */
ofbat.batl = ofw_pa1 | 0x02;
if (ofw_pa2 == -1)
ofbat.batu = 0xff80001e; /* 1MB */
else
ofbat.batu = 0xff80003e; /* 2MB (iMac) */
/* /*
* Set up trap vectors * Set up trap vectors
*/ */
@ -351,6 +332,59 @@ initppc(startkernel, endkernel, args)
* Initialize pmap module. * Initialize pmap module.
*/ */
pmap_bootstrap(startkernel, endkernel); pmap_bootstrap(startkernel, endkernel);
restore_ofw_mapping();
}
static int N_mapping;
static struct {
vaddr_t va;
int len;
paddr_t pa;
int mode;
} ofw_mapping[256];
int
save_ofw_mapping()
{
int mmui, mmu;
OF_getprop(chosen, "mmu", &mmui, 4);
mmu = OF_instance_to_package(mmui);
bzero(ofw_mapping, sizeof(ofw_mapping));
N_mapping =
OF_getprop(mmu, "translations", ofw_mapping, sizeof(ofw_mapping));
N_mapping /= sizeof(ofw_mapping[0]);
return 0;
}
int
restore_ofw_mapping()
{
int i;
pmap_pinit(&ofw_pmap);
ofw_pmap.pm_sr[KERNEL_SR] = KERNEL_SEGMENT;
for (i = 0; i < N_mapping; i++) {
paddr_t pa = ofw_mapping[i].pa;
vaddr_t va = ofw_mapping[i].va;
int size = ofw_mapping[i].len;
if (va < 0xf8000000) /* XXX */
continue;
while (size > 0) {
pmap_enter(&ofw_pmap, va, pa, VM_PROT_ALL, 1);
pa += NBPG;
va += NBPG;
size -= NBPG;
}
}
return 0;
} }
/* /*
@ -1089,13 +1123,9 @@ cninit()
{ {
struct consdev *cp; struct consdev *cp;
int l, node; int l, node;
int chosen, stdout; int stdout;
char type[16]; char type[16];
chosen = OF_finddevice("/chosen");
if (chosen == -1)
goto nocons;
l = OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)); l = OF_getprop(chosen, "stdout", &stdout, sizeof(stdout));
if (l != sizeof(stdout)) if (l != sizeof(stdout))
goto nocons; goto nocons;