Subversion Repositories Kolibri OS

Rev

Rev 566 | Rev 659 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 serge 7
 
593 mikedld 8
$Revision: 593 $
9
 
10
 
164 serge 11
align 4
12
proc alloc_page
13
 
14
           pushfd
15
           cli
16
           mov ebx, [page_start]
17
           mov ecx, [page_end]
18
.l1:
19
           bsf eax,[ebx];
20
           jnz .found
21
           add ebx,4
22
           cmp ebx, ecx
23
           jb .l1
24
           popfd
25
           xor eax,eax
26
           ret
27
.found:
28
           btr [ebx], eax
29
           mov [page_start],ebx
30
           sub ebx, sys_pgmap
254 serge 31
           lea eax, [eax+ebx*8]
164 serge 32
           shl eax, 12
33
           dec [pg_data.pages_free]
34
           popfd
35
           ret
36
endp
37
 
38
align 4
39
proc alloc_pages stdcall, count:dword
40
           pushfd
41
           cli
42
           mov eax, [count]
43
           add eax, 7
44
           shr eax, 3
45
           mov [count], eax
46
           cmp eax, [pg_data.pages_free]
47
           ja .fail
48
 
49
           mov ecx, [page_start]
50
           mov ebx, [page_end]
51
.find:
52
           mov edx, [count]
53
           mov edi, ecx
54
.match:
55
           cmp byte [ecx], 0xFF
56
           jne .next
57
           dec edx
58
           jz .ok
59
           inc ecx
60
           cmp ecx,ebx
61
           jb .match
62
.fail:     xor eax, eax
63
           popfd
64
           ret
65
.next:
66
           inc ecx
67
           cmp ecx, ebx
68
           jb .find
69
           popfd
70
           xor eax, eax
71
           ret
72
.ok:
73
           sub ecx, edi
74
           inc ecx
75
           mov esi, edi
76
           xor eax, eax
77
           rep stosb
78
           sub esi, sys_pgmap
79
           shl esi, 3+12
80
           mov eax, esi
81
           mov ebx, [count]
82
           shl ebx, 3
83
           sub [pg_data.pages_free], ebx
84
           popfd
85
           ret
86
endp
87
 
88
align 4
89
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
321 diamond 90
           push ebx
164 serge 91
           mov eax, [phis_addr]
92
           and eax, not 0xFFF
93
           or eax, [flags]
94
           mov ebx, [lin_addr]
95
           shr ebx, 12
365 serge 96
           mov [page_tabs+ebx*4], eax
164 serge 97
           mov eax, [lin_addr]
98
           invlpg [eax]
321 diamond 99
           pop ebx
164 serge 100
           ret
101
endp
102
 
103
align 4
281 serge 104
map_space:    ;not implemented
105
 
106
 
107
           ret
108
 
109
 
110
align 4
164 serge 111
proc free_page
112
;arg:  eax  page address
113
           pushfd
114
           cli
115
           shr eax, 12              ;page index
448 diamond 116
           bts dword [sys_pgmap], eax           ;that's all!
291 serge 117
           cmc
328 serge 118
           adc [pg_data.pages_free], 0
164 serge 119
           shr eax, 3
120
           and eax, not 3           ;dword offset from page_map
448 diamond 121
           add eax, sys_pgmap
164 serge 122
           cmp [page_start], eax
123
           ja @f
124
           popfd
125
           ret
126
@@:
127
           mov [page_start], eax
128
           popfd
129
           ret
130
endp
131
 
279 serge 132
; param
328 serge 133
;  eax= page base + page flags
281 serge 134
;  ebx= liear address
135
;  ecx= count
136
 
137
align 4
328 serge 138
commit_pages:
281 serge 139
 
328 serge 140
           test ecx, ecx
141
           jz .fail
281 serge 142
 
328 serge 143
           mov edi, ebx
144
           mov ebx, pg_data.pg_mutex
145
           call wait_mutex      ;ebx
146
 
147
           mov edx, 0x1000
148
           mov ebx, edi
149
           shr ebx, 12
150
@@:
365 serge 151
           mov [page_tabs+ebx*4], eax
328 serge 152
           invlpg [edi]
153
           add edi, edx
154
           add eax, edx
155
           inc ebx
156
           dec ecx
157
           jnz @B
158
           mov [pg_data.pg_mutex],ecx
159
.fail:
281 serge 160
           ret
161
 
328 serge 162
 
281 serge 163
; param
279 serge 164
;  eax= base
281 serge 165
;  ecx= count
279 serge 166
 
164 serge 167
align 4
279 serge 168
release_pages:
321 diamond 169
 
170
           pushad
279 serge 171
           mov ebx, pg_data.pg_mutex
172
           call wait_mutex      ;ebx
173
 
174
           mov esi, eax
175
           mov edi, eax
176
 
177
           shr esi, 10
365 serge 178
           add esi, page_tabs
328 serge 179
 
180
           mov ebp, [pg_data.pages_free]
279 serge 181
           mov ebx, [page_start]
182
           mov edx, sys_pgmap
183
@@:
184
           xor eax, eax
185
           xchg eax, [esi]
186
           invlpg [edi]
187
 
188
           test eax, 1
189
           jz .next
190
 
191
           shr eax, 12
192
           bts [edx], eax
291 serge 193
           cmc
328 serge 194
           adc ebp, 0
279 serge 195
           shr eax, 3
196
           and eax, -4
197
           add eax, edx
198
           cmp eax, ebx
199
           jae .next
200
 
201
           mov ebx, eax
202
.next:
203
           add edi, 0x1000
204
           add esi, 4
205
           dec ecx
206
           jnz @B
328 serge 207
           mov [pg_data.pages_free], ebp
279 serge 208
           and [pg_data.pg_mutex],0
321 diamond 209
           popad
279 serge 210
           ret
211
 
212
align 4
188 serge 213
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
321 diamond 214
           push ebx
164 serge 215
           mov ebx, [lin_addr]
216
           shr ebx, 22
217
           mov eax, [phis_addr]
218
           and eax, not 0xFFF
219
           or eax, PG_UW          ;+PG_NOCACHE
378 serge 220
           mov dword [master_tab+ebx*4], eax
164 serge 221
           mov eax, [lin_addr]
222
           shr eax, 10
365 serge 223
           add eax, page_tabs
164 serge 224
           invlpg [eax]
321 diamond 225
           pop ebx
164 serge 226
           ret
227
endp
228
 
229
align 4
230
proc init_LFB
378 serge 231
           locals