Locore changes for VS and VAX8200.
This commit is contained in:
parent
1abb214901
commit
7707223bc4
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: intvec.s,v 1.19 1996/03/09 23:36:40 ragge Exp $ */
|
||||
/* $NetBSD: intvec.s,v 1.20 1996/07/20 18:20:44 ragge Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
|
||||
@ -38,31 +38,31 @@
|
||||
#include <machine/pte.h>
|
||||
#include <machine/trap.h>
|
||||
|
||||
#define ENTRY(name) \
|
||||
#define ENTRY(name) \
|
||||
.text ; \
|
||||
.align 2 ; \
|
||||
.globl name ; \
|
||||
name /**/:
|
||||
|
||||
#define TRAPCALL(namn, typ) \
|
||||
#define TRAPCALL(namn, typ) \
|
||||
ENTRY(namn) ; \
|
||||
pushl $0 ; \
|
||||
pushl $typ ; \
|
||||
jbr trap
|
||||
|
||||
#define TRAPARGC(namn, typ) \
|
||||
#define TRAPARGC(namn, typ) \
|
||||
ENTRY(namn) ; \
|
||||
pushl $typ ; \
|
||||
jbr trap
|
||||
|
||||
#define FASTINTR(namn, rutin) \
|
||||
#define FASTINTR(namn, rutin) \
|
||||
ENTRY(namn) ; \
|
||||
pushr $0x3f ; \
|
||||
calls $0,_/**/rutin ; \
|
||||
popr $0x3f ; \
|
||||
rei
|
||||
|
||||
#define STRAY(scbnr, vecnr) \
|
||||
#define STRAY(scbnr, vecnr) \
|
||||
ENTRY(stray/**/vecnr) ; \
|
||||
pushr $0x3f ; \
|
||||
pushl $/**/0x/**/vecnr ; \
|
||||
@ -71,7 +71,7 @@ ENTRY(stray/**/vecnr) ; \
|
||||
popr $0x3f ; \
|
||||
rei
|
||||
|
||||
#define KSTACK 0
|
||||
#define KSTACK 0
|
||||
#define ISTACK 1
|
||||
#define INTVEC(label,stack) \
|
||||
.long label+stack;
|
||||
@ -87,66 +87,66 @@ _rpb:
|
||||
* and move the SCB later to somewhere else.
|
||||
*/
|
||||
|
||||
INTVEC(stray00, ISTACK) # Unused., 0
|
||||
INTVEC(stray00, ISTACK) # Unused., 0
|
||||
INTVEC(mcheck, ISTACK) # Machine Check., 4
|
||||
INTVEC(invkstk, ISTACK) # Kernel Stack Invalid., 8
|
||||
INTVEC(stray0C, ISTACK) # Power Failed., C
|
||||
INTVEC(invkstk, ISTACK) # Kernel Stack Invalid., 8
|
||||
INTVEC(stray0C, ISTACK) # Power Failed., C
|
||||
INTVEC(privinflt, KSTACK) # Privileged/Reserved Instruction.
|
||||
INTVEC(stray14, ISTACK) # Customer Reserved Instruction, 14
|
||||
INTVEC(stray14, ISTACK) # Customer Reserved Instruction, 14
|
||||
INTVEC(resopflt, KSTACK) # Reserved Operand/Boot Vector(?), 18
|
||||
INTVEC(resadflt, KSTACK) # # Reserved Address Mode., 1C
|
||||
INTVEC(access_v, KSTACK) # Access Control Violation, 20
|
||||
INTVEC(transl_v, KSTACK) # Translation Invalid, 24
|
||||
INTVEC(tracep, KSTACK) # Trace Pending, 28
|
||||
INTVEC(breakp, KSTACK) # Breakpoint Instruction, 2C
|
||||
INTVEC(stray30, ISTACK) # Compatibility Exception, 30
|
||||
INTVEC(stray30, ISTACK) # Compatibility Exception, 30
|
||||
INTVEC(arithflt, KSTACK) # Arithmetic Fault, 34
|
||||
INTVEC(stray38, ISTACK) # Unused, 38
|
||||
INTVEC(stray3C, ISTACK) # Unused, 3C
|
||||
INTVEC(stray38, ISTACK) # Unused, 38
|
||||
INTVEC(stray3C, ISTACK) # Unused, 3C
|
||||
INTVEC(syscall, KSTACK) # main syscall trap, chmk, 40
|
||||
INTVEC(resopflt, KSTACK) # chme, 44
|
||||
INTVEC(resopflt, KSTACK) # chms, 48
|
||||
INTVEC(resopflt, KSTACK) # chmu, 4C
|
||||
INTVEC(stray50, ISTACK) # System Backplane Exception, 50
|
||||
INTVEC(sbiexc, ISTACK) # System Backplane Exception/BIerror, 50
|
||||
INTVEC(cmrerr, ISTACK) # Corrected Memory Read, 54
|
||||
INTVEC(stray58, ISTACK) # System Backplane Alert, 58
|
||||
INTVEC(rxcs, ISTACK) # System Backplane Alert/RXCD, 58
|
||||
INTVEC(sbiflt, ISTACK) # System Backplane Fault, 5C
|
||||
INTVEC(stray60, ISTACK) # Memory Write Timeout, 60
|
||||
INTVEC(stray64, ISTACK) # Unused, 64
|
||||
INTVEC(stray68, ISTACK) # Unused, 68
|
||||
INTVEC(stray6C, ISTACK) # Unused, 6C
|
||||
INTVEC(stray70, ISTACK) # Unused, 70
|
||||
INTVEC(stray74, ISTACK) # Unused, 74
|
||||
INTVEC(stray78, ISTACK) # Unused, 78
|
||||
INTVEC(stray7C, ISTACK) # Unused, 7C
|
||||
INTVEC(stray80, ISTACK) # Unused, 80
|
||||
INTVEC(stray84, ISTACK) # Unused, 84
|
||||
INTVEC(stray60, ISTACK) # Memory Write Timeout, 60
|
||||
INTVEC(stray64, ISTACK) # Unused, 64
|
||||
INTVEC(stray68, ISTACK) # Unused, 68
|
||||
INTVEC(stray6C, ISTACK) # Unused, 6C
|
||||
INTVEC(stray70, ISTACK) # Unused, 70
|
||||
INTVEC(stray74, ISTACK) # Unused, 74
|
||||
INTVEC(stray78, ISTACK) # Unused, 78
|
||||
INTVEC(stray7C, ISTACK) # Unused, 7C
|
||||
INTVEC(stray80, ISTACK) # Unused, 80
|
||||
INTVEC(stray84, ISTACK) # Unused, 84
|
||||
INTVEC(astintr, KSTACK) # Asynchronous Sustem Trap, AST
|
||||
INTVEC(stray8C, ISTACK) # Unused, 8C
|
||||
INTVEC(stray90, ISTACK) # Unused, 90
|
||||
INTVEC(stray94, ISTACK) # Unused, 94
|
||||
INTVEC(stray98, ISTACK) # Unused, 98
|
||||
INTVEC(stray9C, ISTACK) # Unused, 9C
|
||||
INTVEC(stray8C, ISTACK) # Unused, 8C
|
||||
INTVEC(stray90, ISTACK) # Unused, 90
|
||||
INTVEC(stray94, ISTACK) # Unused, 94
|
||||
INTVEC(stray98, ISTACK) # Unused, 98
|
||||
INTVEC(stray9C, ISTACK) # Unused, 9C
|
||||
INTVEC(softclock,ISTACK) # Software clock interrupt
|
||||
INTVEC(strayA4, ISTACK) # Unused, A4
|
||||
INTVEC(strayA8, ISTACK) # Unused, A8
|
||||
INTVEC(strayAC, ISTACK) # Unused, AC
|
||||
INTVEC(netint, ISTACK) # Network interrupt
|
||||
INTVEC(strayB4, ISTACK) # Unused, B4
|
||||
INTVEC(strayB8, ISTACK) # Unused, B8
|
||||
INTVEC(ddbtrap, ISTACK) # Kernel debugger trap, BC
|
||||
INTVEC(strayA4, ISTACK) # Unused, A4
|
||||
INTVEC(strayA8, ISTACK) # Unused, A8
|
||||
INTVEC(strayAC, ISTACK) # Unused, AC
|
||||
INTVEC(netint, ISTACK) # Network interrupt
|
||||
INTVEC(strayB4, ISTACK) # Unused, B4
|
||||
INTVEC(strayB8, ISTACK) # Unused, B8
|
||||
INTVEC(ddbtrap, ISTACK) # Kernel debugger trap, BC
|
||||
INTVEC(hardclock,ISTACK) # Interval Timer
|
||||
INTVEC(strayC4, ISTACK) # Unused, C4
|
||||
INTVEC(strayC4, ISTACK) # Unused, C4
|
||||
INTVEC(emulate, KSTACK) # Subset instruction emulation
|
||||
INTVEC(strayCC, ISTACK) # Unused, CC
|
||||
INTVEC(strayD0, ISTACK) # Unused, D0
|
||||
INTVEC(strayD4, ISTACK) # Unused, D4
|
||||
INTVEC(strayD8, ISTACK) # Unused, D8
|
||||
INTVEC(strayDC, ISTACK) # Unused, DC
|
||||
INTVEC(strayE0, ISTACK) # Unused, E0
|
||||
INTVEC(strayE4, ISTACK) # Unused, E4
|
||||
INTVEC(strayE8, ISTACK) # Unused, E8
|
||||
INTVEC(strayEC, ISTACK) # Unused, EC
|
||||
INTVEC(strayCC, ISTACK) # Unused, CC
|
||||
INTVEC(strayD0, ISTACK) # Unused, D0
|
||||
INTVEC(strayD4, ISTACK) # Unused, D4
|
||||
INTVEC(strayD8, ISTACK) # Unused, D8
|
||||
INTVEC(strayDC, ISTACK) # Unused, DC
|
||||
INTVEC(strayE0, ISTACK) # Unused, E0
|
||||
INTVEC(strayE4, ISTACK) # Unused, E4
|
||||
INTVEC(strayE8, ISTACK) # Unused, E8
|
||||
INTVEC(strayEC, ISTACK) # Unused, EC
|
||||
INTVEC(strayF0, ISTACK)
|
||||
INTVEC(strayF4, ISTACK)
|
||||
INTVEC(consrint, ISTACK) # Console Terminal Recieve Interrupt
|
||||
@ -164,7 +164,7 @@ _rpb:
|
||||
# _memtest (memtest in C) holds the address to continue execution
|
||||
# at when returning from a intentional test.
|
||||
#
|
||||
mcheck: .globl mcheck
|
||||
mcheck: .globl mcheck
|
||||
tstl _cold # Ar we still in coldstart?
|
||||
bneq L4 # Yes.
|
||||
|
||||
@ -174,16 +174,16 @@ mcheck: .globl mcheck
|
||||
popr $0x3f
|
||||
addl2 (sp)+,sp
|
||||
|
||||
rei
|
||||
rei
|
||||
|
||||
L4: addl2 (sp)+,sp # remove info pushed on stack
|
||||
cmpl _cpunumber, $1 # Is it a 11/780?
|
||||
cmpl _vax_cputype,$1 # Is it a 11/780?
|
||||
bneq 1f # No...
|
||||
|
||||
mtpr $0, $PR_SBIFS # Clear SBI fault register
|
||||
brb 2f
|
||||
|
||||
1: cmpl _cpunumber, $4 # Is it a 8600?
|
||||
1: cmpl _vax_cputype,$4 # Is it a 8600?
|
||||
bneq 3f
|
||||
|
||||
mtpr $0, $PR_EHSR # Clear Error status register
|
||||
@ -213,13 +213,13 @@ L2: movl (sp), 4(sp)
|
||||
jbr trap
|
||||
|
||||
|
||||
.align 2
|
||||
access_v:.globl access_v # Access cntrl viol fault, 24
|
||||
.align 2
|
||||
access_v:.globl access_v # Access cntrl viol fault, 24
|
||||
blbs (sp), ptelen
|
||||
pushl $T_ACCFLT
|
||||
jbr L3
|
||||
|
||||
ptelen: movl $T_PTELEN, (sp) # PTE must expand (or send segv)
|
||||
ptelen: movl $T_PTELEN, (sp) # PTE must expand (or send segv)
|
||||
jbr trap;
|
||||
|
||||
TRAPCALL(tracep, T_TRCTRAP)
|
||||
@ -256,9 +256,33 @@ syscall:
|
||||
STRAY(0,44)
|
||||
STRAY(0,48)
|
||||
STRAY(0,4C)
|
||||
STRAY(0,50)
|
||||
|
||||
ENTRY(sbiexc)
|
||||
tstl _cold /* Is it ok to get errs during boot??? */
|
||||
bneq 1f
|
||||
pushr $0x3f
|
||||
pushl $0x50
|
||||
pushl $0
|
||||
calls $2,_stray
|
||||
popr $0x3f
|
||||
1: rei
|
||||
|
||||
FASTINTR(cmrerr,cmrerr)
|
||||
STRAY(0,58)
|
||||
|
||||
ENTRY(rxcs); /* console interrupt from some other processor */
|
||||
pushr $0x3f
|
||||
#if VAX8200
|
||||
cmpl $5,_vax_cputype
|
||||
bneq 1f
|
||||
calls $0,_rxcdintr
|
||||
brb 2f
|
||||
#endif
|
||||
1: pushl $0x58
|
||||
pushl $0
|
||||
calls $2,_stray
|
||||
2: popr $0x3f
|
||||
rei
|
||||
|
||||
ENTRY(sbiflt);
|
||||
moval sbifltmsg, -(sp)
|
||||
calls $1, _panic
|
||||
@ -373,35 +397,35 @@ _emtable:
|
||||
/*
|
||||
* The following is called with the stack set up as follows:
|
||||
*
|
||||
* (sp): Opcode
|
||||
* 4(sp): Instruction PC
|
||||
* 8(sp): Operand 1
|
||||
* 12(sp): Operand 2
|
||||
* 16(sp): Operand 3
|
||||
* 20(sp): Operand 4
|
||||
* 24(sp): Operand 5
|
||||
* 28(sp): Operand 6
|
||||
* 32(sp): Operand 7 (unused)
|
||||
* 36(sp): Operand 8 (unused)
|
||||
* 40(sp): Return PC
|
||||
* 44(sp): Return PSL
|
||||
* (sp): Opcode
|
||||
* 4(sp): Instruction PC
|
||||
* 8(sp): Operand 1
|
||||
* 12(sp): Operand 2
|
||||
* 16(sp): Operand 3
|
||||
* 20(sp): Operand 4
|
||||
* 24(sp): Operand 5
|
||||
* 28(sp): Operand 6
|
||||
* 32(sp): Operand 7 (unused)
|
||||
* 36(sp): Operand 8 (unused)
|
||||
* 40(sp): Return PC
|
||||
* 44(sp): Return PSL
|
||||
* 48(sp): TOS before instruction
|
||||
*
|
||||
* Each individual routine is called with the stack set up as follows:
|
||||
*
|
||||
* (sp): Return address of trap handler
|
||||
* 4(sp): Opcode (will get return PSL)
|
||||
* 8(sp): Instruction PC
|
||||
* 12(sp): Operand 1
|
||||
* 16(sp): Operand 2
|
||||
* 20(sp): Operand 3
|
||||
* 24(sp): Operand 4
|
||||
* 28(sp): Operand 5
|
||||
* 32(sp): Operand 6
|
||||
* 36(sp): saved register 11
|
||||
* 40(sp): saved register 10
|
||||
* 44(sp): Return PC
|
||||
* 48(sp): Return PSL
|
||||
* (sp): Return address of trap handler
|
||||
* 4(sp): Opcode (will get return PSL)
|
||||
* 8(sp): Instruction PC
|
||||
* 12(sp): Operand 1
|
||||
* 16(sp): Operand 2
|
||||
* 20(sp): Operand 3
|
||||
* 24(sp): Operand 4
|
||||
* 28(sp): Operand 5
|
||||
* 32(sp): Operand 6
|
||||
* 36(sp): saved register 11
|
||||
* 40(sp): saved register 10
|
||||
* 44(sp): Return PC
|
||||
* 48(sp): Return PSL
|
||||
* 52(sp): TOS before instruction
|
||||
* See the VAX Architecture Reference Manual, Section B-5 for more
|
||||
* information.
|
||||
@ -429,12 +453,12 @@ noemulate:
|
||||
#endif
|
||||
.word 0xffff # "reserved instruction fault"
|
||||
|
||||
.globl _intrnames, _eintrnames, _intrcnt, _eintrcnt
|
||||
.globl _intrnames, _eintrnames, _intrcnt, _eintrcnt
|
||||
_intrnames:
|
||||
.long 0
|
||||
.long 0
|
||||
_eintrnames:
|
||||
_intrcnt:
|
||||
.long 0
|
||||
.long 0
|
||||
_eintrcnt:
|
||||
|
||||
.data
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: pmap.c,v 1.27 1996/05/19 16:44:20 ragge Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.28 1996/07/20 18:20:42 ragge Exp $ */
|
||||
/*
|
||||
* Copyright (c) 1994 Ludd, University of Lule}, Sweden.
|
||||
* All rights reserved.
|
||||
@ -58,8 +58,8 @@ static void free_pv_entry __P((pv_entry_t));
|
||||
static int remove_pmap_from_mapping __P((pv_entry_t, pmap_t));
|
||||
|
||||
|
||||
#define ISTACK_SIZE (4 * NBPG)
|
||||
#define PTE_TO_PV(pte) (PHYS_TO_PV((pte&PG_FRAME)<<PGSHIFT))
|
||||
#define ISTACK_SIZE (4 * NBPG)
|
||||
#define PTE_TO_PV(pte) (PHYS_TO_PV((pte&PG_FRAME)<<PGSHIFT))
|
||||
|
||||
struct pmap kernel_pmap_store;
|
||||
|
||||
@ -71,21 +71,55 @@ static int kernel_prot[]={ PG_NONE, PG_KR, PG_KW, PG_KW,
|
||||
|
||||
static pv_entry_t pv_head = NULL;
|
||||
static unsigned int pv_count = 0;
|
||||
pv_entry_t pv_table; /* array of entries,
|
||||
one per LOGICAL page */
|
||||
pv_entry_t pv_table; /* array of entries,
|
||||
one per LOGICAL page */
|
||||
unsigned *pte_cmap;
|
||||
void *scratch;
|
||||
void *scratch;
|
||||
|
||||
#ifdef PMAPDEBUG
|
||||
int startpmapdebug = 0;
|
||||
extern int startsysc, faultdebug;
|
||||
/* extern int startsysc, faultdebug; */
|
||||
#endif
|
||||
|
||||
unsigned int vmmap;
|
||||
vm_map_t pte_map;
|
||||
|
||||
vm_offset_t avail_start, avail_end;
|
||||
vm_offset_t virtual_avail, virtual_end; /* Available virtual memory */
|
||||
vm_offset_t virtual_avail, virtual_end; /* Available virtual memory */
|
||||
|
||||
/*
|
||||
* badaddr() doesn't work on some VAXstations
|
||||
* (I've checked KA410 and KA43, don't know about others yet).
|
||||
*
|
||||
* Checking all pages of physical memory starting from address 0x0 and
|
||||
* waiting for being trapped by badaddr() is not enough on these machines:
|
||||
*
|
||||
* on VS2000/KA410 physical memory appears more than once.
|
||||
* eg. on a machine with 10MB memory (2MB base + 8MB extension)
|
||||
* the extension memory is mapped to 0x200000, 0xA00000, and so on.
|
||||
*
|
||||
* On VS3100/KA43 writing to addresses above the available memory
|
||||
* is implemented as a nop.
|
||||
*
|
||||
* On both of these machines the old check/count routine resulted in an
|
||||
* endless loop. Thus while checking/counting the memory, we write a
|
||||
* pattern to all the pages we are visiting. (leaving a hole for kernel).
|
||||
* If we access a page which already holds a valid pattern, then we've
|
||||
* seen this page already and thus reached the highest memory-address.
|
||||
* If the page doesn't hold the pattern directly after having written
|
||||
* it, then the page is bad or not available and we've reached the end.
|
||||
*
|
||||
* VAXen can't have more than 512(?) MB of physical memory, so we also
|
||||
* have an upper limit for how much pages to check. If we're not trapped
|
||||
* within this address-range, something went wrong and we're assuming
|
||||
* some save amount of physical memory. This might be paranoid, but...
|
||||
*/
|
||||
#ifndef MAX_PHYSMEM_AVAIL
|
||||
#define MAX_PHYSMEM_AVAIL 512*1024*1024
|
||||
#endif
|
||||
#ifndef MIN_PHYSMEM_AVAIL
|
||||
#define MIN_PHYSMEM_AVAIL 8*1024*1024
|
||||
#endif
|
||||
|
||||
/*
|
||||
* pmap_bootstrap().
|
||||
@ -104,6 +138,31 @@ pmap_bootstrap()
|
||||
p0pmap = &vmspace0.vm_pmap;
|
||||
|
||||
sysptsize = SYSPTSIZE;
|
||||
|
||||
/*
|
||||
* Because of the badaddr() problem with some VAXstations we
|
||||
* compare the first page of memory (the SCB) with the new
|
||||
* counted up pages for equality. It's very unlikely that
|
||||
* another page will hold the same info as the SCB.
|
||||
* This is neccessary only if badaddr() doesn't work, but on other
|
||||
* machines checking the pattern doesn't hurt anyway...
|
||||
*/
|
||||
|
||||
/* Kickoff for memory checking */
|
||||
avail_end = 0x200000; /* 2 MB */
|
||||
|
||||
while (badaddr((caddr_t)avail_end, 4) == 0) {
|
||||
#if VAX410 || VAX420 || VAX43 || VAX46 || VAX49 || VAX50
|
||||
if (bcmp(0, (caddr_t)avail_end, NBPG) == 0)
|
||||
break;
|
||||
#endif
|
||||
avail_end += NBPG * 128;/* Memory is checked in 64K hunks */
|
||||
}
|
||||
|
||||
#if VAX410 || VAX420 || VAX43 || VAX46 || VAX49 || VAX50
|
||||
sysptsize += (16 * 1024) >> PGSHIFT; /* guc->uc_sysptSpace ?? */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Virtual_* and avail_* is used for mapping of system page table.
|
||||
* First set them to their max values and then decrement them.
|
||||
@ -112,8 +171,6 @@ pmap_bootstrap()
|
||||
* a variable here that is changed dependent of the physical
|
||||
* memory size.
|
||||
*/
|
||||
while (!badaddr((caddr_t)avail_end, 4)) /* Memory is in 64K hunks */
|
||||
avail_end += NBPG * 128;
|
||||
sysptsize += avail_end >> PGSHIFT;
|
||||
virtual_avail = KERNBASE;
|
||||
virtual_end = KERNBASE + sysptsize * NBPG;
|
||||
@ -137,7 +194,7 @@ pmap_bootstrap()
|
||||
VM_PROT_READ|VM_PROT_WRITE);
|
||||
|
||||
/* Map System Page Table and zero it, Sysmap already set. */
|
||||
mtpr(avail_start, PR_SBR);
|
||||
mtpr(avail_start, PR_SBR);
|
||||
MAPPHYS(junk, (ROUND_PAGE(sysptsize * 4) >> PGSHIFT),
|
||||
VM_PROT_READ|VM_PROT_WRITE);
|
||||
|
||||
@ -176,40 +233,42 @@ pmap_bootstrap()
|
||||
bcopy(0, (void *)avail_start, NBPG >> 1);
|
||||
mtpr(avail_start, PR_SCBB);
|
||||
bzero(0, NBPG >> 1);
|
||||
(cpu_calls[cpunumber].cpu_steal_pages)();
|
||||
(cpu_calls[vax_cputype].cpu_steal_pages)();
|
||||
avail_start = ROUND_PAGE(avail_start);
|
||||
virtual_avail = ROUND_PAGE(virtual_avail);
|
||||
|
||||
#ifdef PMAPDEBUG
|
||||
printf("Sysmap %x, istack %x, scratch %x\n",Sysmap,istack,scratch);
|
||||
printf("etext %x\n", &etext);
|
||||
printf("SYSPTSIZE %x, USRPTSIZE %x\n",sysptsize,USRPTSIZE);
|
||||
printf("pv_table %x, vmmap %x, pte_cmap %x\n",
|
||||
pv_table,vmmap,pte_cmap);
|
||||
printf("avail_start %x, avail_end %x\n",avail_start,avail_end);
|
||||
printf("virtual_avail %x,virtual_end %x\n",virtual_avail,virtual_end);
|
||||
printf("clearomr: %x \n",(uint)vmmap-(uint)Sysmap);
|
||||
printf("faultdebug %x, startsysc %x\n",&faultdebug, &startsysc);
|
||||
printf("startpmapdebug %x\n",&startpmapdebug);
|
||||
printf("Sysmap %x, istack %x, scratch %x\n",Sysmap,istack,scratch);
|
||||
printf("etext %x\n", &etext);
|
||||
printf("SYSPTSIZE %x, USRPTSIZE %x\n",sysptsize,USRPTSIZE);
|
||||
printf("pv_table %x, vmmap %x, pte_cmap %x\n",
|
||||
pv_table,vmmap,pte_cmap);
|
||||
printf("avail_start %x, avail_end %x\n",avail_start,avail_end);
|
||||
printf("virtual_avail %x,virtual_end %x\n",virtual_avail,virtual_end);
|
||||
printf("clearomr: %x \n",(uint)vmmap-(uint)Sysmap);
|
||||
/* printf("faultdebug %x, startsysc %x\n",&faultdebug, &startsysc);*/
|
||||
printf("startpmapdebug %x\n",&startpmapdebug);
|
||||
#endif
|
||||
|
||||
|
||||
/* Init kernel pmap */
|
||||
pmap_kernel()->ref_count = 1;
|
||||
simple_lock_init(&pmap_kernel()->pm_lock);
|
||||
p0pmap->pm_pcb = (struct pcb *)proc0paddr;
|
||||
/* Init kernel pmap */
|
||||
pmap_kernel()->ref_count = 1;
|
||||
simple_lock_init(&pmap_kernel()->pm_lock);
|
||||
p0pmap->pm_pcb = (struct pcb *)proc0paddr;
|
||||
|
||||
p0pmap->pm_pcb->P1BR = (void *)0x80000000;
|
||||
p0pmap->pm_pcb->P0BR = (void *)0x80000000;
|
||||
p0pmap->pm_pcb->P1LR = 0x200000;
|
||||
p0pmap->pm_pcb->P0LR = AST_PCB;
|
||||
mtpr(0x80000000, PR_P1BR);
|
||||
mtpr(0x80000000, PR_P0BR);
|
||||
mtpr(0x200000, PR_P1LR);
|
||||
mtpr(AST_PCB, PR_P0LR);
|
||||
p0pmap->pm_pcb->P1BR = (void *)0x80000000;
|
||||
p0pmap->pm_pcb->P0BR = (void *)0x80000000;
|
||||
p0pmap->pm_pcb->P1LR = 0x200000;
|
||||
p0pmap->pm_pcb->P0LR = AST_PCB;
|
||||
mtpr(0x80000000, PR_P1BR);
|
||||
mtpr(0x80000000, PR_P0BR);
|
||||
mtpr(0x200000, PR_P1LR);
|
||||
mtpr(AST_PCB, PR_P0LR);
|
||||
/*
|
||||
* Now everything should be complete, start virtual memory.
|
||||
*/
|
||||
mtpr(sysptsize, PR_SLR);
|
||||
mtpr(1, PR_MAPEN);
|
||||
mtpr(sysptsize, PR_SLR);
|
||||
mtpr(1, PR_MAPEN);
|
||||
}
|
||||
|
||||
|
||||
@ -238,7 +297,7 @@ pmap_t
|
||||
pmap_create(phys_size)
|
||||
vm_size_t phys_size;
|
||||
{
|
||||
pmap_t pmap;
|
||||
pmap_t pmap;
|
||||
|
||||
#ifdef PMAPDEBUG
|
||||
if(startpmapdebug)printf("pmap_create: phys_size %x\n",phys_size);
|
||||
@ -310,10 +369,10 @@ if(startpmapdebug)printf("pmap_destroy: pmap %x\n",pmap);
|
||||
void
|
||||
pmap_enter(pmap, v, p, prot, wired)
|
||||
register pmap_t pmap;
|
||||
vm_offset_t v;
|
||||
vm_offset_t p;
|
||||
vm_prot_t prot;
|
||||
boolean_t wired;
|
||||
vm_offset_t v;
|
||||
vm_offset_t p;
|
||||
vm_prot_t prot;
|
||||
boolean_t wired;
|
||||
{
|
||||
u_int i, pte, s, *patch;
|
||||
pv_entry_t pv, tmp;
|
||||
@ -398,6 +457,10 @@ pmap_bootstrap_alloc(size)
|
||||
{
|
||||
void *mem;
|
||||
|
||||
#ifdef PMAPDEBUG
|
||||
if(startpmapdebug)
|
||||
printf("pmap_bootstrap_alloc: size 0x %x\n",size);
|
||||
#endif
|
||||
size = round_page(size);
|
||||
mem = (void *)virtual_avail;
|
||||
virtual_avail = pmap_map(virtual_avail, avail_start,
|
||||
@ -455,8 +518,8 @@ void
|
||||
pmap_protect(pmap, start, end, prot)
|
||||
pmap_t pmap;
|
||||
vm_offset_t start;
|
||||
vm_offset_t end;
|
||||
vm_prot_t prot;
|
||||
vm_offset_t end;
|
||||
vm_prot_t prot;
|
||||
{
|
||||
int pte, *patch, s;
|
||||
|
||||
@ -690,7 +753,7 @@ free_pv_entry(entry)
|
||||
|
||||
boolean_t
|
||||
pmap_is_referenced(pa)
|
||||
vm_offset_t pa;
|
||||
vm_offset_t pa;
|
||||
{
|
||||
struct pv_entry *pv;
|
||||
u_int *pte,spte=0;
|
||||
@ -717,9 +780,9 @@ pmap_is_modified(pa)
|
||||
pv=PHYS_TO_PV(pa);
|
||||
if(!pv->pv_pmap) return 0;
|
||||
do {
|
||||
pte=(u_int *)pmap_virt2pte(pv->pv_pmap,pv->pv_va);
|
||||
spte|=*pte++;
|
||||
spte|=*pte;
|
||||
pte=(u_int *)pmap_virt2pte(pv->pv_pmap,pv->pv_va);
|
||||
spte|=*pte++;
|
||||
spte|=*pte;
|
||||
} while((pv=pv->pv_next));
|
||||
return((spte&PG_M)?1:0);
|
||||
}
|
||||
@ -731,7 +794,7 @@ pmap_is_modified(pa)
|
||||
|
||||
void
|
||||
pmap_clear_reference(pa)
|
||||
vm_offset_t pa;
|
||||
vm_offset_t pa;
|
||||
{
|
||||
struct pv_entry *pv;
|
||||
int *pte;
|
||||
@ -758,7 +821,7 @@ if(startpmapdebug) printf("pmap_clear_reference: pa %x, pv %x\n",pa,pv);
|
||||
|
||||
void
|
||||
pmap_clear_modify(pa)
|
||||
vm_offset_t pa;
|
||||
vm_offset_t pa;
|
||||
{
|
||||
struct pv_entry *pv;
|
||||
u_int *pte;
|
||||
@ -775,8 +838,8 @@ pmap_clear_modify(pa)
|
||||
void
|
||||
pmap_change_wiring(pmap, va, wired)
|
||||
register pmap_t pmap;
|
||||
vm_offset_t va;
|
||||
boolean_t wired;
|
||||
vm_offset_t va;
|
||||
boolean_t wired;
|
||||
{
|
||||
int *pte;
|
||||
#ifdef PMAPDEBUG
|
||||
@ -791,14 +854,14 @@ if(startpmapdebug) printf("pmap_change_wiring: pmap %x, va %x, wired %x\n",
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_page_protect:
|
||||
* pmap_page_protect:
|
||||
*
|
||||
* Lower the permission for all mappings to a given page.
|
||||
* Lower the permission for all mappings to a given page.
|
||||
*/
|
||||
void
|
||||
pmap_page_protect(pa, prot)
|
||||
vm_offset_t pa;
|
||||
vm_prot_t prot;
|
||||
vm_offset_t pa;
|
||||
vm_prot_t prot;
|
||||
{
|
||||
pv_entry_t pv,opv;
|
||||
u_int s,*pte,*pte1,nyprot,kprot;
|
||||
@ -859,10 +922,10 @@ if(startpmapdebug) printf("pmap_page_protect: pa %x, prot %x\n",pa, prot);
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_zero_page zeros the specified (machine independent)
|
||||
* page by mapping the page into virtual memory and using
|
||||
* bzero to clear its contents, one machine dependent page
|
||||
* at a time.
|
||||
* pmap_zero_page zeros the specified (machine independent)
|
||||
* page by mapping the page into virtual memory and using
|
||||
* bzero to clear its contents, one machine dependent page
|
||||
* at a time.
|
||||
*/
|
||||
void
|
||||
pmap_zero_page(phys)
|
||||
|
Loading…
Reference in New Issue
Block a user