Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
164 serge 1
 
357 serge 2
164 serge 3
 
4
proc mem_test
5
214 serge 6
 
164 serge 7
           and eax, not (CR0_CD+CR0_NW)
212 serge 8
           or eax, CR0_CD         ;disable caching
214 serge 9
           mov cr0, eax
164 serge 10
           wbinvd                 ;invalidate cache
214 serge 11
164 serge 12
 
214 serge 13
           mov ebx, 'TEST'
164 serge 14
@@:
15
           add edi, 0x400000
16
           xchg ebx, dword [edi]
17
           cmp dword [edi], 'TEST'
18
           xchg ebx, dword [edi]
19
           je @b
20
           mov [MEM_AMOUNT], edi
357 serge 21
164 serge 22
 
212 serge 23
           mov cr0, eax
164 serge 24
           mov eax, edi
25
           mov [LFBSize], 0x00800000
214 serge 26
           ret
164 serge 27
endp
28
29
 
30
proc init_mem
357 serge 31
32
 
33
34
 
35
           mov [pg_data.kernel_max], eax
36
37
 
38
           mov edx, eax
39
           mov [pg_data.pages_count], eax
40
           mov [pg_data.kernel_pages], eax
41
42
 
43
           mov [pg_data.pagemap_size], eax
44
45
 
46
           cmp edx, 3
47
           ja @f
48
           inc edx       ;at least 4Mb for kernel heap
49
@@:
50
           mov [pg_data.kernel_tables], edx
51
52
 
164 serge 53
           mov edi, sys_pgdir
54
           mov ecx, 2048
55
           cld
357 serge 56
           rep stosd
164 serge 57
58
 
357 serge 59
           bt [cpu_caps], CAPS_PSE
164 serge 60
           jnc .no_PSE
61
62
 
63
           or ebx, CR4_PSE
64
           mov eax, PG_LARGE+PG_SW
65
           bt [cpu_caps], CAPS_PGE
66
           jnc @F
67
           or eax, PG_GLOBAL
68
           or ebx, CR4_PGE
69
@@:
70
           mov cr4, ebx
168 serge 71
           sub [pg_data.kernel_tables], 2
357 serge 72
168 serge 73
 
357 serge 74
           add eax, 0x00400000
164 serge 75
           mov [edx+4], eax
357 serge 76
           add edx, 8
77
164 serge 78
 
357 serge 79
           mov ecx, (HEAP_BASE-0x800000)/4096
80
           jmp .map_low
81
.no_PSE:
164 serge 82
           mov eax, PG_SW
83
           mov ecx, HEAP_BASE/4096
357 serge 84
.map_low:
164 serge 85
           mov edi, tmp_page_tab
357 serge 86
@@:                                   ;
87
           stosd
88
           add eax, 0x1000
164 serge 89
           dec ecx
90
           jnz @B
357 serge 91
164 serge 92
 
93
           shl ecx, 10
357 serge 94
           xor eax, eax
95
           rep stosd
96
97
 
98
           mov eax, tmp_page_tab+PG_SW
164 serge 99
           mov edi, edx
357 serge 100
164 serge 101
 
102
103
 
357 serge 104
           add eax, 0x1000
164 serge 105
           dec ecx
106
           jnz .map_kernel_tabs
107
108
 
378 serge 109
           ret
164 serge 110
endp
111
112
 
113
proc init_page_map
114
357 serge 115
 
164 serge 116
           mov ecx, (HEAP_BASE/4096)/32      ;384/4
357 serge 117
           mov ebx, ecx
118
           xor eax,eax
164 serge 119
           cld
120
           rep stosd
121
122
 
123
           mov ecx, [pg_data.pagemap_size]
124
           sub ecx, ebx
357 serge 125
           shr ecx, 2
164 serge 126
           rep stosd
127
128
 
357 serge 129
           mov edx, [pg_data.pages_count]
164 serge 130
           mov ecx, [pg_data.kernel_tables]
131
           add ecx, (HEAP_BASE/4096) and 31
357 serge 132
           sub edx, HEAP_BASE/4096
133
           sub edx, ecx
164 serge 134
           mov [pg_data.pages_free], edx
135
136
 
137
           mov ebx, ecx
138
           shr ecx, 5
139
           rep stosd
140
141
 
142
           mov ecx, ebx
143
           and ecx, 31
144
           shl eax, cl
145
           mov [page_start], edi;           sys_pgmap+384
357 serge 146
           stosd
164 serge 147
148
 
149
           add ebx, [pg_data.pagemap_size]
150
           mov [page_end], ebx
151
152
 
153
154
 
155
endp
156
157
 
158
proc alloc_page
159
160
 
161
           cli
162
           mov ebx, [page_start]
163
           mov ecx, [page_end]
164
.l1:
165
           bsf eax,[ebx];
166
           jnz .found
167
           add ebx,4
168
           cmp ebx, ecx
169
           jb .l1
170
           popfd
171
           xor eax,eax
172
           ret
173
.found:
174
           btr [ebx], eax
175
           mov [page_start],ebx
176
           sub ebx, sys_pgmap
177
           lea eax, [eax+ebx*8]
254 serge 178
           shl eax, 12
164 serge 179
           dec [pg_data.pages_free]
180
           popfd
181
           ret
182
endp
183
184
 
185
proc alloc_pages stdcall, count:dword
186
           pushfd
187
           cli
188
           mov eax, [count]
189
           add eax, 7
190
           shr eax, 3
191
           mov [count], eax
192
           cmp eax, [pg_data.pages_free]
193
           ja .fail
194
195
 
196
           mov ebx, [page_end]
197
.find:
198
           mov edx, [count]
199
           mov edi, ecx
200
.match:
201
           cmp byte [ecx], 0xFF
202
           jne .next
203
           dec edx
204
           jz .ok
205
           inc ecx
206
           cmp ecx,ebx
207
           jb .match
208
.fail:     xor eax, eax
209
           popfd
210
           ret
211
.next:
212
           inc ecx
213
           cmp ecx, ebx
214
           jb .find
215
           popfd
216
           xor eax, eax
217
           ret
218
.ok:
219
           sub ecx, edi
220
           inc ecx
221
           mov esi, edi
222
           xor eax, eax
223
           rep stosb
224
           sub esi, sys_pgmap
225
           shl esi, 3+12
226
           mov eax, esi
227
           mov ebx, [count]
228
           shl ebx, 3
229
           sub [pg_data.pages_free], ebx
230
           popfd
231
           ret
232
endp
233
234
 
</