maptlb.s
2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**************************************************************************
* *
* Copyright (C) 1994, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#include <asm.h>
#include <regdef.h>
#include <R4300.h>
#include <ultraerror.h>
/*
* void osMapTLB(int index, OSPageMask pm, void *vaddr,
* u32 evenpaddr, u32 oddpaddr, s32 asid);
*/
LEAF(osMapTLB)
#ifdef _DEBUG
.set reorder
bgez a0,1f # check if index >= 0
b 2f
1:
li t0,NTLBENTRIES # check if index < NTLBENTRIES
blt a0,t0,3f
2:
move a2,a0 # invoke error handler if not
li a0,ERR_OSMAPTLB_INDEX
li a1,1
j __osError
3:
lw t0,20(sp) # get asid argument
li t1,-1
bge t0,t1,4f # check if asid >= -1
b 5f
4:
li t1,TLBHI_NPID # check if asid <= TLBHI_NPID
ble t0,t1,6f
5:
move a2,t0 # invoke error handler if not
li a0,ERR_OSMAPTLB_ASID
li a1,1
j __osError
6:
#endif /* _DEBUG */
.set noreorder
mfc0 t0,C0_ENTRYHI # save TLBPID
mtc0 a0,C0_INX # set index
mtc0 a1,C0_PAGEMASK # set page mask
lw t1,20(sp) # get asid argument
beq t1,-1,7f # is asid == -1?
li t4,TLBLO_G # BDELAY: set invalid entrylo bits
li t2,TLBLO_NONCOHRNT|TLBLO_D|TLBLO_V # set non-global entrylo bits
b 8f # go to set entryhi
or a2,t1 # BDELAY: create final entryhi
7:
li t2,TLBLO_NONCOHRNT|TLBLO_D|TLBLO_V|TLBLO_G # set global bits
8:
mtc0 a2,C0_ENTRYHI # set virtual address
beq a3,-1,9f # is evenpaddr == -1?
nop
srl t3,a3,12-TLBLO_PFNSHIFT # line up physical page frame number
or t3,t2 # or in flag bits
mtc0 t3,C0_ENTRYLO0 # set even physical address & flags
b 10f
nop
9:
mtc0 t4,C0_ENTRYLO0 # invalidate even page mapping
10:
lw t3,16(sp) # get oddpaddr argument
beq t3,-1,11f # is oddpaddr == -1?
nop
srl t3,6 # line up physical page frame number
or t3,t2 # or in flag bits
mtc0 t3,C0_ENTRYLO1 # set odd physical address & flags
b 12f
nop
11:
mtc0 t4,C0_ENTRYLO1 # invalidate odd page mapping
bne a3,-1,12f # are *both* paddrs -1?
nop # if so ...
li t3,K0BASE # set virtual address to unmapped
mtc0 t3,C0_ENTRYHI # (necessary on R4300)
12:
nop # 7-5-1 = 1 nop for fall through,
# jump case already taken care of
tlbwi # set tlb entry
nop # 8-3-1 = 4 nop
nop
nop
nop
mtc0 t0,C0_ENTRYHI # restore saved TLBPID
j ra
nop
END(osMapTLB)