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 |