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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
; Copyright 1996 Acorn Computers Ltd
;
; Licensed under the Apache License, Version 2.0 (the "License");
; you may not use this file except in compliance with the License.
; You may obtain a copy of the License at
;
; http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
; > s.mapslot
; handle mapping of entire slot in or out (bit 8 of R0 clear)
; or mapping of some of slot (bit 8 of R0 set)
; entry:
; R0 = bits 0..7 = 3 (reason code 3); bit 8 set for mapsome
; R1 = start (logical) address; 0 means application start; -1 means map out
; R2 = handle
; R3,R4 used if bit 8 set - see mapsome
;
; Note that if bit 8 is clear, the use is restricted to mapping in or out of
; whole slots only. Hence if bit 8 is clear, behaviour is undefined unless
; R1 is one of: 0, &8000 or -1.
;
mapslot ROUT
TST R0,#&100 ;if bit 8 set, then mapsome
BNE mapsome
Push "R0-R6,LR"
[ AMB_Debug
DebugReg r1, "mapslot "
DebugReg r2
]
MOVS R5,R1 ;save entry R1
MOVEQ R5,#ApplicationStart ;0 means application start
[ ValidateAMBHandles
;validate handle
LDR R0,AMBNhandles
CMP R2,R0
BGT badmapslot
CMP R2,#1
BLT badmapslot
]
LDR R0,AMBNodeHandles ; R0 -> handle array
LDR R1,[R0,R2,LSL #2] ; R1 -> node
[ ValidateAMBHandles
;check we have a proper id for node handle
LDR R3,=AMBMagicNodeID
LDR LR,[R1,#AMBNode_id]
CMP LR,R3
BNE badmapslot
]
LDR R3,[R1,#AMBNode_DANode+DANode_PMPSize]
LDR R2,AMBMappedInNode
CMP R1,R2
CMPEQ R5,#-1
BEQ ms_domapout ;do map if already mapped in, and asked to map out
CMP R1,R2
CMPNE R5,#-1
BEQ ms_done ;else do map only if not already mapped in, and asked to map in
Push "r1,r7,r10"
ADD r10,r1,#AMBNode_DANode
MOV r1,#0
MOV r5,r3
MOV r7,#0
BL AMB_SetMemMapEntries_MapIn_Lazy
Pull "r1,r7,r10"
B ms_donemap
ms_domapout
Push "r1,r5,r7,r10"
ADD r10,r1,#AMBNode_DANode
MOV r1,#0
MOVS r5,r3
MOV r7,#0
BLNE AMB_SetMemMapEntries_MapOut_Lazy
Pull "r1,r5,r7,r10"
ms_donemap
;update AplWorkSize, MemLimit
LDR R2,[R1,#AMBNode_DANode+DANode_PMPSize]
LDR R3,=ZeroPage
MOV R0,#ApplicationStart
CMP R5,#-1
ADDNE R0,R0,R2,LSL #Log2PageSize
STR R0,[R3,#AplWorkSize]
STR R0,[R3,#MemLimit]
CMP R5,#-1
MOVEQ R3,#0
MOVNE R3,R1
STR R3,AMBMappedInNode
ms_done
;;; STRVS R0,[SP]
CLRV
Pull "R0-R6,LR"
B SLVK_TestV
LTORG
[ ValidateAMBHandles
badmapslot
Pull "R0-R6,LR"
B badhandle
]
END