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 |