Files
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

121 lines
3.9 KiB
ArmAsm

.data
.asciz "@(#)map.s 1.1 92/07/30 SMI"
.even
.text
/*
* Copyright (c) 1987 by Sun Microsystems, Inc.
*/
/*
* Additional memory mapping routines for use by standalone debugger,
* setpgmap(), getpgmap(), and setsegmap() are taken from the boot code.
*/
#include <sys/param.h>
#include <debug/debug.h>
#include <sun3/asm_linkage.h>
#include <sun3/mmu.h>
#include <sun3/pte.h>
/*
* Getpgmap() and Setpgmap() use software pte's as opposed
* to hardware pme's. On sun3, they are basically the same
* except that Setpgmap() will automatically turn on the
* ``no cache'' bit for all mappings between _start and
* _start + DEBUGSIZE.
*/
ENTRY(Getpgmap)
movl sp@(4),d0 | get virtual address
andl #CONTROL_MASK,d0 | clear extraneous bits
orl #PAGE_MAP,d0 | set to page map base offset
movl d0,a0
movc sfc,d1 | save source function code
lea FC_MAP,a1 | get function code in a reg
movc a1,sfc | set source function code
movsl a0@,d0 | read page map entry
movc d1,sfc | restore source function code
rts | done
ENTRY(Setpgmap)
movl sp@(4),d0 | get virtual address
movl sp@(8),d1 | get page map entry
cmpl #_start,d0
bmi 0f | skip ahead if before debugger
cmpl #_start + DEBUGSIZE,d0
bhi 0f | skip ahead if after debugger
orl #PG_NC,d1 | turn on the ``no cache'' bit
0:
andl #CONTROL_MASK,d0 | clear extraneous bits
orl #PAGE_MAP,d0 | set to page map base offset
movl d0,a0
movc dfc,d0 | save dest function code
lea FC_MAP,a1 | get function code in a reg
movc a1,dfc | set dest function code
movsl d1,a0@ | write page map entry
movc d0,dfc | restore dest function code
rts | done
ENTRY(getsegmap)
movl sp@(4),d0 | get segment number
andl #CONTROL_MASK,d0 | clear extraneous bits
orl #SEGMENT_MAP,d0 | set to segment map offset
movl d0,a0
movc sfc,d1 | save source function code
lea FC_MAP,a1 | get function code in a reg
movc a1,sfc | set source function code
moveq #0,d0 | clear upper part of register
movsb a0@,d0 | read segment map entry
movc d1,sfc | restore source function code
rts | done
ENTRY(setkcontext)
moveq #KCONTEXT,d0 | get context value to set
movc dfc,d1 | save dest function code
lea FC_MAP,a1 | get function code in a reg
movc a1,dfc | set destination function code
movsb d0,CONTEXT_REG | move value into context register
movc d1,dfc | restore dest function code
rts | done
ENTRY(getmachinetype)
movc sfc,d1 | save source function code
lea FC_MAP,a1 | get function code in a reg
movc a1,sfc | set source function code
lea ID_PROM+1,a0 | address for machine type
moveq #0,d0 | clear upper part of register
movsb a0@,d0 | read idprom entry
movc d1,sfc | restore source function code
rts | done
ENTRY(cache_pageflush)
movc dfc,a1 | save dest function code
moveq #FC_MAP,d1 | get function code in a reg
movc d1,dfc | set destination function code
movl sp@(4),d0 | get vaddr of this page
andl #VAC_PAGEMASK,d0 | clear extraneous bits
orl #VAC_FLUSH_BASE,d0 | set to page flush base address
movl d0,a0 | a0 gets page flush base address
moveq #VAC_PAGEFLUSH_COUNT-1,d0| loop this many of times
movb #VAC_PAGEFLUSH,d1 | page flush "command"
0:
movsb d1,a0@ | do a unit of page flush
addl #VAC_FLUSH_INCRMNT,a0 | address of next page flush
dbra d0,0b | do next flush cycle until done
movc a1,dfc | restore dest function code
rts | done
ENTRY(cache_init)
movc dfc,a1 | save dest function code
moveq #FC_MAP,d1 | get function code in a reg
movc d1,dfc | set destination function code
movl #VAC_RWTAG_BASE,a0 | set base address to R/W VAC tags
movl #VAC_RWTAG_COUNT-1,d0 | loop through all lines
clrl d1 | reset "valid" bit of tags
0:
movsl d1,a0@ | invalid the tag of this line
addl #VAC_RWTAG_INCRMNT,a0 | address to write to next line
dbra d0,0b | invalid next tag until done
movc a1,dfc | restore dest function code
rts | done