Subversion Repositories Kolibri OS

Rev

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

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