Subversion Repositories Kolibri OS

Rev

Rev 168 | Rev 172 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 168 Rev 170
1
tmp_page_tab      equ 0x01000000
1
tmp_page_tab      equ 0x01000000
2
 
2
 
3
align 4
3
align 4
4
proc mem_test
4
proc mem_test
5
           mov eax, cr0
5
           mov eax, cr0
6
           or eax, (CR0_CD+CR0_NW);disable caching
6
           or eax, (CR0_CD+CR0_NW);disable caching
7
           mov cr0, eax
7
           mov cr0, eax
8
           wbinvd                 ;invalidate cache
8
           wbinvd                 ;invalidate cache
9
 
9
 
10
           xor     edi, edi
10
           xor     edi, edi
11
           mov ebx, 'TEST'
11
           mov ebx, 'TEST'
12
@@:
12
@@:
13
           add edi, 0x400000
13
           add edi, 0x400000
14
           xchg ebx, dword [edi]
14
           xchg ebx, dword [edi]
15
           cmp dword [edi], 'TEST'
15
           cmp dword [edi], 'TEST'
16
           xchg ebx, dword [edi]
16
           xchg ebx, dword [edi]
17
           je @b
17
           je @b
18
 
18
 
19
           and eax, not (CR0_CD+CR0_NW)
19
           and eax, not (CR0_CD+CR0_NW)
20
           mov cr0, eax
20
           mov cr0, eax
21
           mov eax, edi
21
           mov eax, edi
22
           ret
22
           ret
23
endp
23
endp
24
 
24
 
25
align 4
25
align 4
26
proc init_memEx
26
proc init_memEx
27
           xor eax, eax
27
           xor eax, eax
28
           mov edi, sys_pgdir
28
           mov edi, sys_pgdir
29
           mov ecx, 2048
29
           mov ecx, 2048
30
           rep stosd
30
           rep stosd
31
 
31
 
32
           bt [cpu_caps], CAPS_PSE
32
           bt [cpu_caps], CAPS_PSE
33
           jnc .no_PSE
33
           jnc .no_PSE
34
 
34
 
35
           mov ebx, cr4
35
           mov ebx, cr4
36
           or ebx, CR4_PSE
36
           or ebx, CR4_PSE
37
           mov eax, PG_LARGE+PG_SW
37
           mov eax, PG_LARGE+PG_SW
38
           bt [cpu_caps], CAPS_PGE
38
           bt [cpu_caps], CAPS_PGE
39
           jnc @F
39
           jnc @F
40
           or eax, PG_GLOBAL
40
           or eax, PG_GLOBAL
41
           or ebx, CR4_PGE
41
           or ebx, CR4_PGE
42
 
42
 
43
@@:
43
@@:
44
           mov cr4, ebx
44
           mov cr4, ebx
45
 
45
 
46
           mov dword [sys_pgdir], eax
46
           mov dword [sys_pgdir], eax
47
           add eax, 0x00400000
47
           add eax, 0x00400000
48
           mov dword [sys_pgdir+4], eax
48
           mov dword [sys_pgdir+4], eax
49
           add eax, 0x00400000
49
           add eax, 0x00400000
50
           mov dword [sys_pgdir+8], eax
50
           mov dword [sys_pgdir+8], eax
51
           add eax, 0x00400000
51
           add eax, 0x00400000
52
           mov dword [sys_pgdir+12], eax
52
           mov dword [sys_pgdir+12], eax
53
 
53
 
54
           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
54
           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
55
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
55
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
56
 
56
 
57
           mov ecx, [pg_data.kernel_tables]
57
           mov ecx, [pg_data.kernel_tables]
58
           sub ecx, 4
58
           sub ecx, 4
59
           mov eax, tmp_page_tab+PG_SW
59
           mov eax, tmp_page_tab+PG_SW
60
           mov edi, sys_pgdir+16
60
           mov edi, sys_pgdir+16
61
           mov esi, sys_master_tab+16
61
           mov esi, sys_master_tab+16
62
 
62
 
63
           jmp .map_kernel_tabs
63
           jmp .map_kernel_tabs
64
.no_PSE:
64
.no_PSE:
65
           mov eax, PG_SW
65
           mov eax, PG_SW
66
           mov esi, tmp_page_tab
66
           mov esi, tmp_page_tab
67
           mov ecx, 4096/4      ;0x0 - 0x00FFFFFF
67
           mov ecx, 4096/4      ;0x0 - 0x00FFFFFF
68
.map_low:
68
.map_low:
69
           mov [esi], eax
69
           mov [esi], eax
70
           add eax, 0x1000
70
           add eax, 0x1000
71
           mov [esi+4], eax
71
           mov [esi+4], eax
72
           add eax, 0x1000
72
           add eax, 0x1000
73
           mov [esi+8], eax
73
           mov [esi+8], eax
74
           add eax, 0x1000
74
           add eax, 0x1000
75
           mov [esi+12], eax
75
           mov [esi+12], eax
76
           add eax, 0x1000
76
           add eax, 0x1000
77
           add esi, 16
77
           add esi, 16
78
           dec ecx
78
           dec ecx
79
           jnz .map_low            ;ÿäðî
79
           jnz .map_low            ;ÿäðî
80
 
80
 
81
           mov ecx, [pg_data.kernel_tables]
81
           mov ecx, [pg_data.kernel_tables]
82
           mov eax, tmp_page_tab+PG_SW
82
           mov eax, tmp_page_tab+PG_SW
83
           mov edi, sys_pgdir
83
           mov edi, sys_pgdir
84
           mov esi, sys_master_tab
84
           mov esi, sys_master_tab
85
 
85
 
86
.map_kernel_tabs:
86
.map_kernel_tabs:
87
 
87
 
88
           mov [edi], eax
88
           mov [edi], eax
89
           mov [esi], eax
89
           mov [esi], eax
90
           add eax, 0x1000
90
           add eax, 0x1000
91
           add edi, 4
91
           add edi, 4
92
           add esi, 4
92
           add esi, 4
93
           dec ecx
93
           dec ecx
94
           jnz .map_kernel_tabs
94
           jnz .map_kernel_tabs
95
 
95
 
96
           mov edi, tmp_page_tab
96
           mov edi, tmp_page_tab
97
           bt [cpu_caps], CAPS_PSE
97
           bt [cpu_caps], CAPS_PSE
98
           jc @F
98
           jc @F
99
           add edi, 4096*4      ;skip low kernel memory
99
           add edi, 4096*4      ;skip low kernel memory
100
@@:
100
@@:
101
           mov ecx, [pg_data.kernel_tables]
101
           mov ecx, [pg_data.kernel_tables]
102
           sub ecx, 4
102
           sub ecx, 4
103
           shl ecx, 10
103
           shl ecx, 10
104
           xor eax, eax
104
           xor eax, eax
105
           cld
105
           cld
106
           rep stosd
106
           rep stosd
107
 
107
 
108
           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
108
           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
109
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
109
           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
110
           ret
110
           ret
111
endp
111
endp
112
 
112
 
113
;align 4
-
 
114
;proc init_mem
-
 
115
;
-
 
116
;           xor eax, eax
-
 
117
;           mov edi, sys_pgdir
-
 
118
;           mov ecx, 2048
-
 
119
;           rep stosd
-
 
120
;
-
 
121
;           bt [cpu_caps], CAPS_PSE
-
 
122
;           jc .use_PSE
-
 
123
;
-
 
124
;           mov eax, PG_SW
-
 
125
;           mov esi, tmp_page_tab
-
 
126
;           mov ecx, 4096/4      ;0x0 - 0x00FFFFFF
-
 
127
;
-
 
128
;.map_low:
-
 
129
;           mov [esi], eax
-
 
130
;           add eax, 0x1000
-
 
131
;           mov [esi+4], eax
-
 
132
;           add eax, 0x1000
-
 
133
;           mov [esi+8], eax
-
 
134
;           add eax, 0x1000
-
 
135
;           mov [esi+12], eax
-
 
136
;           add eax, 0x1000
-
 
137
;           add esi, 16
-
 
138
;           dec ecx
-
 
139
;           jnz .map_low            ;ÿäðî
-
 
140
 
-
 
141
;           mov eax, tmp_page_tab+PG_SW
-
 
142
;           mov ecx, 4
-
 
143
;           xor ebx, ebx
-
 
144
 
-
 
145
;.map_page_tables:
-
 
146
;           mov [sys_pgdir+ebx], eax
-
 
147
;           mov [sys_master_tab+ebx], eax
-
 
148
;           add eax, 0x1000
-
 
149
;           add ebx, 4
-
 
150
;           dec ecx
-
 
151
;           jnz .map_page_tables
-
 
152
 
-
 
153
;           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
-
 
154
;           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
-
 
155
 
-
 
156
;           ret
-
 
157
 
-
 
158
;.use_PSE:
-
 
159
;           mov ebx, cr4
-
 
160
;           or ebx, CR4_PSE
-
 
161
;           mov eax, PG_LARGE+PG_SW
-
 
162
;           bt [cpu_caps], CAPS_PGE
-
 
163
;           jnc @F
-
 
164
;           or eax, PG_GLOBAL
-
 
165
;           or ebx, CR4_PGE
-
 
166
;@@:
-
 
167
;           mov dword [sys_pgdir], eax
-
 
168
;           add eax, 0x00400000
-
 
169
;           mov dword [sys_pgdir+4], eax
-
 
170
;           add eax, 0x00400000
-
 
171
;           mov dword [sys_pgdir+8], eax
-
 
172
;           add eax, 0x00400000
-
 
173
;           mov dword [sys_pgdir+12], eax
-
 
174
;
-
 
175
;           mov dword [sys_pgdir+0x600], sys_master_tab+PG_SW
-
 
176
;           mov dword [sys_master_tab+0x600], sys_master_tab+PG_SW
-
 
177
 
-
 
178
;           mov cr4, ebx
-
 
179
;           ret
-
 
180
;endp
-
 
181
 
-
 
182
align 4
113
align 4
183
proc init_page_map
114
proc init_page_map
184
           mov edi, sys_pgmap
115
           mov edi, sys_pgmap
185
           mov ecx, 512/4
116
           mov ecx, 512/4
186
           xor eax,eax
117
           xor eax,eax
187
           cld
118
           cld
188
           rep stosd
119
           rep stosd
189
 
120
 
190
           not eax
121
           not eax
191
           mov ecx, [pg_data.pagemap_size]
122
           mov ecx, [pg_data.pagemap_size]
192
           sub ecx, 512
123
           sub ecx, 512
193
           shr ecx, 2
124
           shr ecx, 2
194
           rep stosd
125
           rep stosd
195
 
126
 
196
           mov edi, sys_pgmap+512
127
           mov edi, sys_pgmap+512
197
           mov edx, [pg_data.pages_count]
128
           mov edx, [pg_data.pages_count]
198
           mov ecx, [pg_data.kernel_tables]
129
           mov ecx, [pg_data.kernel_tables]
199
           bt [cpu_caps], CAPS_PSE
130
           bt [cpu_caps], CAPS_PSE
200
           jnc @f
131
           jnc @f
201
           sub ecx, 4
132
           sub ecx, 4
202
@@:
133
@@:
203
           sub edx, 4096
134
           sub edx, 4096
204
           sub edx, ecx
135
           sub edx, ecx
205
           mov [pg_data.pages_free], edx
136
           mov [pg_data.pages_free], edx
206
 
137
 
207
           xor eax, eax
138
           xor eax, eax
208
           mov ebx, ecx
139
           mov ebx, ecx
209
           shr ecx, 5
140
           shr ecx, 5
210
           rep stosd
141
           rep stosd
211
 
142
 
212
           not eax
143
           not eax
213
           mov ecx, ebx
144
           mov ecx, ebx
214
           and ecx, 31
145
           and ecx, 31
215
           shl eax, cl
146
           shl eax, cl
216
           stosd
147
           stosd
217
 
148
 
218
           mov [page_start], sys_pgmap+512
149
           mov [page_start], sys_pgmap+512
219
           mov ebx, sys_pgmap
150
           mov ebx, sys_pgmap
220
           add ebx, [pg_data.pagemap_size]
151
           add ebx, [pg_data.pagemap_size]
221
           mov [page_end], ebx
152
           mov [page_end], ebx
222
 
153
 
223
           mov [pg_data.pg_mutex], 0
154
           mov [pg_data.pg_mutex], 0
224
 
155
 
225
           ret
156
           ret
226
endp
157
endp
227
 
158
 
228
;align 4
-
 
229
;proc init_pg_mem
-
 
230
;
-
 
231
;           mov edi, sys_pgmap
-
 
232
;           mov ecx, 512/4
-
 
233
;           xor eax,eax
-
 
234
;           cld
-
 
235
;           rep stosd
-
 
236
;
-
 
237
;           not eax
-
 
238
;           mov ecx, [pg_data.pagemap_size]
-
 
239
;           sub ecx, 512
-
 
240
;           shr ecx, 2
-
 
241
;           rep stosd
-
 
242
;
-
 
243
;           shl eax, PAGES_USED
-
 
244
;           mov [sys_pgmap+512], eax
-
 
245
;
-
 
246
;           mov [page_start], sys_pgmap+512
-
 
247
;           mov ebx, sys_pgmap
-
 
248
;           add ebx, [pg_data.pagemap_size]
-
 
249
;           mov [page_end], ebx
-
 
250
;           mov eax, [pg_data.pages_count]
-
 
251
;           sub eax, 4096+PAGES_USED
-
 
252
;           mov [pg_data.pages_free], eax
-
 
253
;
-
 
254
;           mov [pg_data.pages_faults], 0
-
 
255
;
-
 
256
;           mov edi, OS_BASE+0x01000000
-
 
257
;           mov esi, [pg_data.kernel_tables]
-
 
258
;           sub esi, 4
-
 
259
;           ja @f
-
 
260
;           mov esi, 1
-
 
261
;@@:
-
 
262
;           call alloc_page
-
 
263
;           stdcall map_page_table, sys_pgdir, edi, eax
-
 
264
;           add edi, 0x00400000
-
 
265
;           dec esi
-
 
266
;           jnz @B
-
 
267
;
-
 
268
;           mov ecx, [pg_data.kernel_tables]
-
 
269
;           sub ecx, 4
-
 
270
;           shl ecx, 10
-
 
271
;           mov edi, OS_BASE+0x01000000
-
 
272
;           shr edi, 10
-
 
273
;           add edi, pages_tab
-
 
274
;           xor eax, eax
-
 
275
;           cld
-
 
276
;           rep stosd
-
 
277
;
-
 
278
;           mov eax, cr3
-
 
279
;           mov cr3, eax
-
 
280
;
-
 
281
;           mov [pg_data.pg_mutex], 0
-
 
282
;           ret
-
 
283
;endp
-
 
284
 
-
 
285
align 4
159
align 4
286
proc alloc_page
160
proc alloc_page
287
 
161
 
288
           pushfd
162
           pushfd
289
           cli
163
           cli
290
           mov ebx, [page_start]
164
           mov ebx, [page_start]
291
           mov ecx, [page_end]
165
           mov ecx, [page_end]
292
.l1:
166
.l1:
293
           bsf eax,[ebx];
167
           bsf eax,[ebx];
294
           jnz .found
168
           jnz .found
295
           add ebx,4
169
           add ebx,4
296
           cmp ebx, ecx
170
           cmp ebx, ecx
297
           jb .l1
171
           jb .l1
298
           popfd
172
           popfd
299
           xor eax,eax
173
           xor eax,eax
300
           ret
174
           ret
301
.found:
175
.found:
302
           btr [ebx], eax
176
           btr [ebx], eax
303
           mov [page_start],ebx
177
           mov [page_start],ebx
304
           sub ebx, sys_pgmap
178
           sub ebx, sys_pgmap
305
           shl ebx, 3
179
           shl ebx, 3
306
           add eax,ebx
180
           add eax,ebx
307
           shl eax, 12
181
           shl eax, 12
308
           dec [pg_data.pages_free]
182
           dec [pg_data.pages_free]
309
           popfd
183
           popfd
310
           ret
184
           ret
311
endp
185
endp
312
 
186
 
313
align 4
187
align 4
314
proc alloc_pages stdcall, count:dword
188
proc alloc_pages stdcall, count:dword
315
           pushfd
189
           pushfd
316
           cli
190
           cli
317
           mov eax, [count]
191
           mov eax, [count]
318
           add eax, 7
192
           add eax, 7
319
           shr eax, 3
193
           shr eax, 3
320
           mov [count], eax
194
           mov [count], eax
321
           cmp eax, [pg_data.pages_free]
195
           cmp eax, [pg_data.pages_free]
322
           ja .fail
196
           ja .fail
323
 
197
 
324
           mov ecx, [page_start]
198
           mov ecx, [page_start]
325
           mov ebx, [page_end]
199
           mov ebx, [page_end]
326
.find:
200
.find:
327
           mov edx, [count]
201
           mov edx, [count]
328
           mov edi, ecx
202
           mov edi, ecx
329
 
203
 
330
.match:
204
.match:
331
           cmp byte [ecx], 0xFF
205
           cmp byte [ecx], 0xFF
332
           jne .next
206
           jne .next
333
           dec edx
207
           dec edx
334
           jz .ok
208
           jz .ok
335
           inc ecx
209
           inc ecx
336
           cmp ecx,ebx
210
           cmp ecx,ebx
337
           jb .match
211
           jb .match
338
.fail:     xor eax, eax
212
.fail:     xor eax, eax
339
           popfd
213
           popfd
340
           ret
214
           ret
341
.next:
215
.next:
342
           inc ecx
216
           inc ecx
343
           cmp ecx, ebx
217
           cmp ecx, ebx
344
           jb .find
218
           jb .find
345
           popfd
219
           popfd
346
           xor eax, eax
220
           xor eax, eax
347
           ret
221
           ret
348
.ok:
222
.ok:
349
           sub ecx, edi
223
           sub ecx, edi
350
           inc ecx
224
           inc ecx
351
           mov esi, edi
225
           mov esi, edi
352
           xor eax, eax
226
           xor eax, eax
353
           rep stosb
227
           rep stosb
354
           sub esi, sys_pgmap
228
           sub esi, sys_pgmap
355
           shl esi, 3+12
229
           shl esi, 3+12
356
           mov eax, esi
230
           mov eax, esi
357
           mov ebx, [count]
231
           mov ebx, [count]
358
           shl ebx, 3
232
           shl ebx, 3
359
           sub [pg_data.pages_free], ebx
233
           sub [pg_data.pages_free], ebx
360
           popfd
234
           popfd
361
           ret
235
           ret
362
endp
236
endp
363
 
237
 
364
align 4
238
align 4
365
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
239
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
366
           mov eax, [phis_addr]
240
           mov eax, [phis_addr]
367
           and eax, not 0xFFF
241
           and eax, not 0xFFF
368
           or eax, [flags]
242
           or eax, [flags]
369
           mov ebx, [lin_addr]
243
           mov ebx, [lin_addr]
370
           shr ebx, 12
244
           shr ebx, 12
371
           mov [pages_tab+ebx*4], eax
245
           mov [pages_tab+ebx*4], eax
372
           mov eax, [lin_addr]
246
           mov eax, [lin_addr]
373
           invlpg [eax]
247
           invlpg [eax]
374
           ret
248
           ret
375
endp
249
endp
376
 
250
 
377
align 4
251
align 4
378
proc free_page
252
proc free_page
379
;arg:  eax  page address
253
;arg:  eax  page address
380
           pushfd
254
           pushfd
381
           cli
255
           cli
382
           inc [pg_data.pages_free]
256
           inc [pg_data.pages_free]
383
           shr eax, 12              ;page index
257
           shr eax, 12              ;page index
384
           mov ebx, sys_pgmap
258
           mov ebx, sys_pgmap
385
           bts [ebx], eax           ;that's all!
259
           bts [ebx], eax           ;that's all!
386
           shr eax, 3
260
           shr eax, 3
387
           and eax, not 3           ;dword offset from page_map
261
           and eax, not 3           ;dword offset from page_map
388
           add eax, ebx
262
           add eax, ebx
389
           cmp [page_start], eax
263
           cmp [page_start], eax
390
           ja @f
264
           ja @f
391
           popfd
265
           popfd
392
           ret
266
           ret
393
@@:
267
@@:
394
           mov [page_start], eax
268
           mov [page_start], eax
395
           popfd
269
           popfd
396
           ret
270
           ret
397
endp
271
endp
398
 
272
 
399
align 4
273
align 4
400
proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword
274
proc map_page_table stdcall,page_dir:dword, lin_addr:dword, phis_addr:dword
401
           mov ebx, [lin_addr]
275
           mov ebx, [lin_addr]
402
           shr ebx, 22
276
           shr ebx, 22
403
           mov eax, [phis_addr]
277
           mov eax, [phis_addr]
404
           and eax, not 0xFFF
278
           and eax, not 0xFFF
405
           or eax, PG_UW          ;+PG_NOCACHE
279
           or eax, PG_UW          ;+PG_NOCACHE
406
           mov ecx, [page_dir]
280
           mov ecx, [page_dir]
407
           mov dword [ecx+ebx*4], eax
281
           mov dword [ecx+ebx*4], eax
408
           mov dword [master_tab+ebx*4], eax
282
           mov dword [master_tab+ebx*4], eax
409
           mov eax, [lin_addr]
283
           mov eax, [lin_addr]
410
           shr eax, 10
284
           shr eax, 10
411
           add eax, pages_tab
285
           add eax, pages_tab
412
           invlpg [eax]
286
           invlpg [eax]
413
           ret
287
           ret
414
endp
288
endp
415
 
289
 
416
align 4
290
align 4
417
proc init_LFB
291
proc init_LFB
418
 
292
 
419
           cmp dword [LFBAddress], -1
293
           cmp dword [LFBAddress], -1
420
           jne @f
294
           jne @f
421
 
295
 
422
           stdcall kernel_alloc, 0x280000
296
           stdcall kernel_alloc, 0x280000
423
           mov [LFBAddress], eax
297
           mov [LFBAddress], eax
424
           ret
298
           ret
425
@@:
299
@@:
426
           test [SCR_MODE],word 0100000000000000b
300
           test [SCR_MODE],word 0100000000000000b
427
           jz @f
301
           jz @f
428
           call map_LFB
302
           call map_LFB
429
@@:
303
@@:
430
           ret
304
           ret
431
endp
305
endp
432
 
306
 
433
align 4
307
align 4
434
proc map_LFB
308
proc map_LFB
435
           locals
309
           locals
436
             pg_count dd ?
310
             pg_count dd ?
437
           endl
311
           endl
438
 
312
 
439
           mov edi, [LFBSize]
313
           mov edi, [LFBSize]
440
           mov esi, [LFBAddress]
314
           mov esi, [LFBAddress]
441
           shr edi, 12
315
           shr edi, 12
442
           mov [pg_count], edi
316
           mov [pg_count], edi
443
           shr edi, 10
317
           shr edi, 10
444
 
318
 
445
           bt [cpu_caps], CAPS_PSE
319
           bt [cpu_caps], CAPS_PSE
446
           jnc .map_page_tables
320
           jnc .map_page_tables
447
           mov ebx, esi
321
           mov ebx, esi
448
           or esi, PG_LARGE+PG_UW
322
           or esi, PG_LARGE+PG_UW
449
           shr ebx, 20
323
           shr ebx, 20
450
           mov ecx, ebx
324
           mov ecx, ebx
451
@@:
325
@@:
452
           mov [sys_pgdir+ebx], esi
326
           mov [sys_pgdir+ebx], esi
453
           add ebx, 4
327
           add ebx, 4
454
           add esi, 0x00400000
328
           add esi, 0x00400000
455
           dec edi
329
           dec edi
456
           jnz @B
330
           jnz @B
457
 
331
 
458
           or dword [sys_pgdir+ecx], PG_GLOBAL
332
           or dword [sys_pgdir+ecx], PG_GLOBAL
459
           mov eax, cr3       ;flush TLB
333
           mov eax, cr3       ;flush TLB
460
           mov cr3, eax
334
           mov cr3, eax
461
           ret
335
           ret
462
 
336
 
463
.map_page_tables:
337
.map_page_tables:
464
 
338
 
465
@@:
339
@@:
466
           call alloc_page
340
           call alloc_page
467
           stdcall map_page_table,sys_pgdir, esi, eax
341
           stdcall map_page_table,sys_pgdir, esi, eax
468
           add esi, 0x00400000
342
           add esi, 0x00400000
469
           dec edi
343
           dec edi
470
           jnz @B
344
           jnz @B
471
 
345
 
472
           mov eax, [LFBAddress]
346
           mov eax, [LFBAddress]
473
           mov esi, eax
347
           mov esi, eax
474
           shr esi, 10
348
           shr esi, 10
475
           add esi, pages_tab
349
           add esi, pages_tab
476
           or eax, PG_UW
350
           or eax, PG_UW
477
           mov ecx, [pg_count]
351
           mov ecx, [pg_count]
478
           shr ecx, 2
352
           shr ecx, 2
479
.map:
353
.map:
480
           mov [esi], eax
354
           mov [esi], eax
481
           add eax, 0x1000
355
           add eax, 0x1000
482
           mov [esi+4], eax
356
           mov [esi+4], eax
483
           add eax, 0x1000
357
           add eax, 0x1000
484
           mov [esi+8], eax
358
           mov [esi+8], eax
485
           add eax, 0x1000
359
           add eax, 0x1000
486
           mov [esi+12], eax
360
           mov [esi+12], eax
487
           add eax, 0x1000
361
           add eax, 0x1000
488
           add esi, 16
362
           add esi, 16
489
           sub ecx, 1
363
           sub ecx, 1
490
           jnz .map
364
           jnz .map
491
 
365
 
492
           mov eax, cr3       ;flush TLB
366
           mov eax, cr3       ;flush TLB
493
           mov cr3, eax
367
           mov cr3, eax
494
 
368
 
495
           ret
369
           ret
496
endp
370
endp
497
 
371
 
498
align 4
372
align 4
499
proc new_mem_resize stdcall, new_size:dword
373
proc new_mem_resize stdcall, new_size:dword
500
 
374
 
501
           stdcall wait_mutex, pg_data.pg_mutex
375
           stdcall wait_mutex, pg_data.pg_mutex
502
 
376
 
503
           mov edi, [new_size]
377
           mov edi, [new_size]
504
           add edi,4095
378
           add edi,4095
505
           and edi,not 4095
379
           and edi,not 4095
506
           mov [new_size], edi
380
           mov [new_size], edi
507
 
381
 
508
           mov edx,[CURRENT_TASK]
382
           mov edx,[CURRENT_TASK]
509
           shl edx,8
383
           shl edx,8
510
           mov esi, [PROC_BASE+0x8c+edx]
384
           mov esi, [PROC_BASE+0x8c+edx]
511
           add esi, 4095
385
           add esi, 4095
512
           and esi, not 4095
386
           and esi, not 4095
513
 
387
 
514
           cmp edi, esi
388
           cmp edi, esi
515
           jae .expand
389
           jae .expand
516
 
390
 
517
           shr edi, 12
391
           shr edi, 12
518
           shr esi, 12
392
           shr esi, 12
519
@@:
393
@@:
520
           mov eax, [pages_tab+0x00181000+edi*4]
394
           mov eax, [pages_tab+0x00181000+edi*4]
521
           test eax, 1
395
           test eax, 1
522
           jz .next
396
           jz .next
523
           mov dword [pages_tab+0x00181000+edi*4], 2
397
           mov dword [pages_tab+0x00181000+edi*4], 2
524
           mov ebx, edi
398
           mov ebx, edi
525
           shl ebx, 12
399
           shl ebx, 12
526
           invlpg [ebx+std_application_base_address]
400
           invlpg [ebx+std_application_base_address]
527
           call free_page
401
           call free_page
528
 
402
 
529
.next:     add edi, 1
403
.next:     add edi, 1
530
           cmp edi, esi
404
           cmp edi, esi
531
           jb @B
405
           jb @B
532
 
406
 
533
.update_size:
407
.update_size:
534
 
408
 
535
           mov ebx, [new_size]
409
           mov ebx, [new_size]
536
           mov    [PROC_BASE+0x8c+edx],ebx
410
           mov    [PROC_BASE+0x8c+edx],ebx
537
 
411
 
538
;search threads and update
412
;search threads and update
539
;application memory size infomation
413
;application memory size infomation
540
           mov    ecx,[PROC_BASE+0xb8+edx]
414
           mov    ecx,[PROC_BASE+0xb8+edx]
541
           mov    eax,2
415
           mov    eax,2
542
 
416
 
543
.search_threads:
417
.search_threads:
544
;eax = current slot
418
;eax = current slot
545
;ebx = new memory size
419
;ebx = new memory size
546
;ecx = page directory
420
;ecx = page directory
547
           cmp    eax,[TASK_COUNT]
421
           cmp    eax,[TASK_COUNT]
548
           jg     .search_threads_end
422
           jg     .search_threads_end
549
           mov    edx,eax
423
           mov    edx,eax
550
           shl    edx,5
424
           shl    edx,5
551
           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
425
           cmp    word [CURRENT_TASK+edx+0xa],9 ;if slot empty?
552
           jz     .search_threads_next
426
           jz     .search_threads_next
553
           shl    edx,3
427
           shl    edx,3
554
           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
428
           cmp    [PROC_BASE+edx+0xb8],ecx     ;if it is our thread?
555
           jnz    .search_threads_next
429
           jnz    .search_threads_next
556
           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
430
           mov    [PROC_BASE+edx+0x8c],ebx     ;update memory size
557
.search_threads_next:
431
.search_threads_next:
558
           inc    eax
432
           inc    eax
559
           jmp    .search_threads
433
           jmp    .search_threads
560
.search_threads_end:
434
.search_threads_end:
561
           xor eax, eax
435
           xor eax, eax
562
           dec [pg_data.pg_mutex]
436
           dec [pg_data.pg_mutex]
563
           ret
437
           ret
564
 
438
 
565
.expand:
439
.expand:
566
           add edi, new_app_base
440
           add edi, new_app_base
567
           add esi, new_app_base
441
           add esi, new_app_base
568
 
442
 
569
           push esi
443
           push esi
570
           push edi
444
           push edi
571
 
445
 
572
           add edi, 0x3FFFFF
446
           add edi, 0x3FFFFF
573
           and edi, not(0x3FFFFF)
447
           and edi, not(0x3FFFFF)
574
           add esi, 0x3FFFFF
448
           add esi, 0x3FFFFF
575
           and esi, not(0x3FFFFF)
449
           and esi, not(0x3FFFFF)
576
 
450
 
577
           cmp esi, edi
451
           cmp esi, edi
578
           jae .grow
452
           jae .grow
579
 
453
 
580
           xchg esi, edi
454
           xchg esi, edi
581
 
455
 
582
           mov eax, cr3
456
           mov eax, cr3
583
           stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE
457
           stdcall map_page,[tmp_task_pdir],eax,dword PG_SW+PG_NOCACHE
584
 
458
 
585
@@:
459
@@:
586
           call alloc_page
460
           call alloc_page
587
           test eax, eax
461
           test eax, eax
588
           jz .exit
462
           jz .exit
589
 
463
 
590
           stdcall map_page_table,[tmp_task_pdir], edi, eax
464
           stdcall map_page_table,[tmp_task_pdir], edi, eax
591
 
465
 
592
           push edi
466
           push edi
593
           shr edi, 10
467
           shr edi, 10
594
           add edi, pages_tab
468
           add edi, pages_tab
595
           mov ecx, 1024
469
           mov ecx, 1024
596
           xor eax, eax
470
           xor eax, eax
597
           cld
471
           cld
598
           rep stosd
472
           rep stosd
599
           pop edi
473
           pop edi
600
 
474
 
601
           add edi, 0x00400000
475
           add edi, 0x00400000
602
           cmp edi, esi
476
           cmp edi, esi
603
           jb @B
477
           jb @B
604
 
478
 
605
           stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
479
           stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP
606
.grow:
480
.grow:
607
           pop edi
481
           pop edi
608
           pop esi
482
           pop esi
609
@@:
483
@@:
610
           call alloc_page
484
           call alloc_page
611
           test eax, eax
485
           test eax, eax
612
           jz .exit
486
           jz .exit
613
           stdcall map_page,esi,eax,dword PG_UW
487
           stdcall map_page,esi,eax,dword PG_UW
614
 
488
 
615
           push edi
489
           push edi
616
           mov edi, esi
490
           mov edi, esi
617
           xor eax, eax
491
           xor eax, eax
618
           mov ecx, 1024
492
           mov ecx, 1024
619
           cld
493
           cld
620
           rep stosd
494
           rep stosd
621
           pop edi
495
           pop edi
622
 
496
 
623
           add esi, 0x1000
497
           add esi, 0x1000
624
           cmp esi, edi
498
           cmp esi, edi
625
           jna @B
499
           jna @B
626
 
500
 
627
           jmp .update_size
501
           jmp .update_size
628
.exit:
502
.exit:
629
           xor eax, eax
503
           xor eax, eax
630
           inc eax
504
           inc eax
631
           dec [pg_data.pg_mutex]
505
           dec [pg_data.pg_mutex]
632
           ret
506
           ret
633
endp
507
endp
634
 
508
 
635
align 4
509
align 4
636
proc get_pg_addr stdcall, lin_addr:dword
510
proc get_pg_addr stdcall, lin_addr:dword
637
           mov ebx, [lin_addr]
511
           mov ebx, [lin_addr]
638
           shr ebx, 12
512
           shr ebx, 12
639
           mov eax, [pages_tab+ebx*4]
513
           mov eax, [pages_tab+ebx*4]
640
           and eax, 0xFFFFF000
514
           and eax, 0xFFFFF000
641
           ret
515
           ret
642
endp
516
endp
643
 
517
 
644
align 16
518
align 16
645
proc page_fault_handler
519
proc page_fault_handler
646
           pushad
520
           pushad
647
 
521
 
648
           mov ebp, esp
522
           mov ebp, esp
649
           mov eax, cr2
523
           mov eax, cr2
650
           sub esp, 4
524
           sub esp, 4
651
           mov [esp], eax
525
           mov [esp], eax
652
           push ds
526
           push ds
653
 
527
 
654
           mov ax, 0x10
528
           mov ax, 0x10
655
           mov ds, ax
529
           mov ds, ax
656
 
530
 
657
;     mov edx, 0x400   ;bocsh
531
;     mov edx, 0x400   ;bocsh
658
;     mov al,0xff      ;bocsh
532
;     mov al,0xff      ;bocsh
659
;     out dx, al       ;bocsh
533
;     out dx, al       ;bocsh
660
;     nop              ;bocsh fix
534
;     nop              ;bocsh fix
661
 
535
 
662
 
536
 
663
           mov ebx, [ebp-4]
537
           mov ebx, [ebp-4]
664
 
538
 
665
           cmp ebx, 0xe0000000
539
           cmp ebx, 0xe0000000
666
           jae .lfb_addr
540
           jae .lfb_addr
667
 
541
 
668
           cmp ebx, 0x60400000
542
           cmp ebx, 0x60400000
669
           jae .user_space
543
           jae .user_space
670
 
544
 
671
           cmp ebx, 0x60000000
545
           cmp ebx, 0x60000000
672
           jae .tab_space
546
           jae .tab_space
673
 
547
 
674
           jmp .kernel_space
548
           jmp .kernel_space
675
 
549
 
676
.user_space:
550
.user_space:
677
           inc [pg_data.pages_faults]
551
           inc [pg_data.pages_faults]
678
 
552
 
679
           shr ebx, 12
553
           shr ebx, 12
680
           mov eax, [pages_tab+ebx*4]
554
           mov eax, [pages_tab+ebx*4]
681
 
555
 
682
           shr ebx, 10
556
           shr ebx, 10
683
           mov edx, [master_tab+ebx*4]
557
           mov edx, [master_tab+ebx*4]
684
 
558
 
685
           test eax, 2
559
           test eax, 2
686
           jz .exit
560
           jz .exit
687
 
561
 
688
           call alloc_page
562
           call alloc_page
689
           and eax, eax
563
           and eax, eax
690
           jz .exit
564
           jz .exit
691
 
565
 
692
           stdcall map_page,[ebp-4],eax,dword PG_UW
566
           stdcall map_page,[ebp-4],eax,dword PG_UW
693
 
567
 
694
           mov esi, [ebp-4]
568
           mov esi, [ebp-4]
695
           and esi, 0xFFFFF000
569
           and esi, 0xFFFFF000
696
           mov ecx, 1024
570
           mov ecx, 1024
697
           xor eax, eax
571
           xor eax, eax
698
@@:
572
@@:
699
           mov [esi], eax
573
           mov [esi], eax
700
           add esi, 4
574
           add esi, 4
701
           dec ecx
575
           dec ecx
702
           jnz @B
576
           jnz @B
703
.exit:
577
.exit:
704
           pop ds
578
           pop ds
705
           mov esp, ebp
579
           mov esp, ebp
706
           popad
580
           popad
707
           add esp, 4
581
           add esp, 4
708
           iretd
582
           iretd
709
 
583
 
710
.kernel_space:
584
.kernel_space:
711
           shr ebx, 12
585
           shr ebx, 12
712
           mov eax, [pages_tab+ebx*4]
586
           mov eax, [pages_tab+ebx*4]
713
           shr ebx, 10
587
           shr ebx, 10
714
           mov eax, [master_tab+ebx*4]
588
           mov eax, [master_tab+ebx*4]
715
 
589
 
716
           pop ds
590
           pop ds
717
           mov esp, ebp
591
           mov esp, ebp
718
           popad
592
           popad
719
           add esp, 4
593
           add esp, 4
720
           iretd
594
           iretd
721
 
595
 
722
.old_addr:
596
.old_addr:
723
           shr ebx, 12
597
           shr ebx, 12
724
;           mov eax, [pages_tab+ebx*4]
598
;           mov eax, [pages_tab+ebx*4]
725
           shr ebx, 10
599
           shr ebx, 10
726
           mov eax, [master_tab+ebx*4]
600
           mov eax, [master_tab+ebx*4]
727
 
601
 
728
           pop ds
602
           pop ds
729
           mov esp, ebp
603
           mov esp, ebp
730
           popad
604
           popad
731
           add esp, 4
605
           add esp, 4
732
           iretd
606
           iretd
733
 
607
 
734
.lfb_addr:
608
.lfb_addr:
735
           shr ebx, 22
609
           shr ebx, 22
736
           ;mov ecx, [sys_page_dir]
610
           ;mov ecx, [sys_page_dir]
737
           mov eax, [master_tab+ebx*4]
611
           mov eax, [master_tab+ebx*4]
738
 
612
 
739
           pop ds
613
           pop ds
740
           mov esp, ebp
614
           mov esp, ebp
741
           popad
615
           popad
742
           add esp, 4
616
           add esp, 4
743
           iretd
617
           iretd
744
 
618
 
745
.tab_space:
619
.tab_space:
746
           shr ebx, 12
620
           shr ebx, 12
747
;           mov eax, [pages_tab+ebx*4]
621
;           mov eax, [pages_tab+ebx*4]
748
           shr ebx, 10
622
           shr ebx, 10
749
           ;mov ecx, [sys_page_dir]
623
           ;mov ecx, [sys_page_dir]
750
           mov eax, [master_tab+ebx*4]
624
           mov eax, [master_tab+ebx*4]
751
 
625
 
752
           pop ds
626
           pop ds
753
           mov esp, ebp
627
           mov esp, ebp
754
           popad
628
           popad
755
           add esp, 4
629
           add esp, 4
756
           iretd
630
           iretd
757
endp
631
endp
758
 
632
 
759
align 4
633
align 4
760
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
634
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
761
                      ofs:dword,buf_size:dword
635
                      ofs:dword,buf_size:dword
762
           mov eax, [buf_size]
636
           mov eax, [buf_size]
763
           test eax, eax
637
           test eax, eax
764
           jz .exit
638
           jz .exit
765
 
639
 
766
           mov eax, [pdir]
640
           mov eax, [pdir]
767
           and eax, 0xFFFFF000
641
           and eax, 0xFFFFF000
768
 
642
 
769
           stdcall map_page,[ipc_pdir],eax,dword PG_UW
643
           stdcall map_page,[ipc_pdir],eax,dword PG_UW
770
           mov ebx, [ofs]
644
           mov ebx, [ofs]
771
           shr ebx, 22
645
           shr ebx, 22
772
           mov esi, [ipc_pdir]
646
           mov esi, [ipc_pdir]
773
           mov edi, [ipc_ptab]
647
           mov edi, [ipc_ptab]
774
           mov eax, [esi+ebx*4]
648
           mov eax, [esi+ebx*4]
775
           and eax, 0xFFFFF000
649
           and eax, 0xFFFFF000
776
           test eax, eax
650
           test eax, eax
777
           jz .exit
651
           jz .exit
778
           stdcall map_page,edi,eax,dword PG_UW
652
           stdcall map_page,edi,eax,dword PG_UW
779
;           inc ebx
653
;           inc ebx
780
;           add edi, 0x1000
654
;           add edi, 0x1000
781
;           mov eax, [esi+ebx*4]
655
;           mov eax, [esi+ebx*4]
782
;           test eax, eax
656
;           test eax, eax
783
;           jz @f
657
;           jz @f
784
;          and eax, 0xFFFFF000
658
;          and eax, 0xFFFFF000
785
;           stdcall map_page, edi, eax
659
;           stdcall map_page, edi, eax
786
 
660
 
787
@@:        mov edi, [lin_addr]
661
@@:        mov edi, [lin_addr]
788
           and edi, 0xFFFFF000
662
           and edi, 0xFFFFF000
789
           mov ecx, [buf_size]
663
           mov ecx, [buf_size]
790
           add ecx, 4095
664
           add ecx, 4095
791
           shr ecx, 12
665
           shr ecx, 12
792
           inc ecx
666
           inc ecx
793
 
667
 
794
           mov edx, [ofs]
668
           mov edx, [ofs]
795
           shr edx, 12
669
           shr edx, 12
796
           and edx, 0x3FF
670
           and edx, 0x3FF
797
           mov esi, [ipc_ptab]
671
           mov esi, [ipc_ptab]
798
 
672
 
799
.map:      mov eax, [esi+edx*4]
673
.map:      mov eax, [esi+edx*4]
800
           and eax, 0xFFFFF000
674
           and eax, 0xFFFFF000
801
           test eax, eax
675
           test eax, eax
802
           jz .exit
676
           jz .exit
803
           stdcall map_page,edi,eax,dword PG_UW
677
           stdcall map_page,edi,eax,dword PG_UW
804
           add edi, 0x1000
678
           add edi, 0x1000
805
           inc edx
679
           inc edx
806
           dec ecx
680
           dec ecx
807
           jnz .map
681
           jnz .map
808
 
682
 
809
.exit:
683
.exit:
810
           ret
684
           ret
811
endp
685
endp
812
 
686
 
813
align 4
687
align 4
814
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
688
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
815
                        ofs:dword,buf_size:dword
689
                        ofs:dword,buf_size:dword
816
           mov eax, [buf_size]
690
           mov eax, [buf_size]
817
           test eax, eax
691
           test eax, eax
818
           jz .exit
692
           jz .exit
819
 
693
 
820
           mov eax, [pdir]
694
           mov eax, [pdir]
821
           and eax, 0xFFFFF000
695
           and eax, 0xFFFFF000
822
 
696
 
823
           stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
697
           stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
824
           mov ebx, [ofs]
698
           mov ebx, [ofs]
825
           shr ebx, 22
699
           shr ebx, 22
826
           mov esi, [proc_mem_pdir]
700
           mov esi, [proc_mem_pdir]
827
           mov edi, [proc_mem_tab]
701
           mov edi, [proc_mem_tab]
828
           mov eax, [esi+ebx*4]
702
           mov eax, [esi+ebx*4]
829
           and eax, 0xFFFFF000
703
           and eax, 0xFFFFF000
830
           test eax, eax
704
           test eax, eax
831
           jz .exit
705
           jz .exit
832
           stdcall map_page,edi,eax,dword PG_UW
706
           stdcall map_page,edi,eax,dword PG_UW
833
 
707
 
834
@@:        mov edi, [lin_addr]
708
@@:        mov edi, [lin_addr]
835
           and edi, 0xFFFFF000
709
           and edi, 0xFFFFF000
836
           mov ecx, [buf_size]
710
           mov ecx, [buf_size]
837
           add ecx, 4095
711
           add ecx, 4095
838
           shr ecx, 12
712
           shr ecx, 12
839
           inc ecx
713
           inc ecx
840
 
714
 
841
           mov edx, [ofs]
715
           mov edx, [ofs]
842
           shr edx, 12
716
           shr edx, 12
843
           and edx, 0x3FF
717
           and edx, 0x3FF
844
           mov esi, [proc_mem_tab]
718
           mov esi, [proc_mem_tab]
845
 
719
 
846
.map:      mov eax, [esi+edx*4]
720
.map:      mov eax, [esi+edx*4]
847
;           and eax, 0xFFFFF000
721
;           and eax, 0xFFFFF000
848
;           test eax, eax
722
;           test eax, eax
849
;           jz .exit
723
;           jz .exit
850
           stdcall map_page,edi,eax,dword PG_UW
724
           stdcall map_page,edi,eax,dword PG_UW
851
           add edi, 0x1000
725
           add edi, 0x1000
852
           inc edx
726
           inc edx
853
           dec ecx
727
           dec ecx
854
           jnz .map
728
           jnz .map
855
.exit:
729
.exit:
856
           ret
730
           ret
857
endp
731
endp
858
 
732
 
859
 
733
 
860
 
734
 
861
 
735
 
862
sys_IPC:
736
sys_IPC:
863
;input:
737
;input:
864
;  eax=1 - set ipc buffer area
738
;  eax=1 - set ipc buffer area
865
;    ebx=address of buffer
739
;    ebx=address of buffer
866
;    ecx=size of buffer
740
;    ecx=size of buffer
867
;  eax=2 - send message
741
;  eax=2 - send message
868
;    ebx=PID
742
;    ebx=PID
869
;    ecx=address of message
743
;    ecx=address of message
870
;    edx=size of message
744
;    edx=size of message
871
 
745
 
872
           cmp  eax,1
746
           cmp  eax,1
873
           jne @f
747
           jne @f
874
           call set_ipc_buff
748
           call set_ipc_buff
875
           mov [esp+36], eax
749
           mov [esp+36], eax
876
           ret
750
           ret
877
 
751
 
878
@@:
752
@@:
879
           cmp eax, 2
753
           cmp eax, 2
880
           jne @f
754
           jne @f
881
           stdcall sys_ipc_send, ebx, ecx, edx
755
           stdcall sys_ipc_send, ebx, ecx, edx
882
           mov [esp+36], eax
756
           mov [esp+36], eax
883
           ret
757
           ret
884
 
758
 
885
@@:
759
@@:
886
           xor eax, eax
760
           xor eax, eax
887
           not eax
761
           not eax
888
           mov [esp+36], eax
762
           mov [esp+36], eax
889
           ret
763
           ret
890
 
764
 
891
align 4
765
align 4
892
proc set_ipc_buff
766
proc set_ipc_buff
893
 
767
 
894
           mov  eax,[CURRENT_TASK]
768
           mov  eax,[CURRENT_TASK]
895
           shl  eax,8
769
           shl  eax,8
896
           add  eax, PROC_BASE
770
           add  eax, PROC_BASE
897
           pushf
771
           pushf
898
           cli
772
           cli
899
           mov  [eax+0xA0],ebx     ;set fields in extended information area
773
           mov  [eax+0xA0],ebx     ;set fields in extended information area
900
           mov  [eax+0xA4],ecx
774
           mov  [eax+0xA4],ecx
901
 
775
 
902
           add ebx,  new_app_base
776
           add ebx,  new_app_base
903
           add ecx, ebx
777
           add ecx, ebx
904
           add ecx, 4095
778
           add ecx, 4095
905
           and ecx, not 4095
779
           and ecx, not 4095
906
 
780
 
907
.touch:    mov eax, [ebx]
781
.touch:    mov eax, [ebx]
908
           add ebx, 0x1000
782
           add ebx, 0x1000
909
           cmp ebx, ecx
783
           cmp ebx, ecx
910
           jna .touch
784
           jna .touch
911
 
785
 
912
           popf
786
           popf
913
           xor eax, eax
787
           xor eax, eax
914
           ret
788
           ret
915
endp
789
endp
916
 
790
 
917
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
791
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
918
           locals
792
           locals
919
             dst_slot   dd ?
793
             dst_slot   dd ?
920
             dst_offset dd ?
794
             dst_offset dd ?
921
             buf_size   dd ?
795
             buf_size   dd ?
922
           endl
796
           endl
923
 
797
 
924
           pushf
798
           pushf
925
           cli
799
           cli
926
 
800
 
927
           mov  eax, [PID]
801
           mov  eax, [PID]
928
           call pid_to_slot
802
           call pid_to_slot
929
           test eax,eax
803
           test eax,eax
930
           jz   .no_pid
804
           jz   .no_pid
931
 
805
 
932
           mov [dst_slot], eax
806
           mov [dst_slot], eax
933
           shl  eax,8
807
           shl  eax,8
934
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
808
           mov  edi,[eax+PROC_BASE+0xa0]  ;is ipc area defined?
935
           test edi,edi
809
           test edi,edi
936
           jz   .no_ipc_area
810
           jz   .no_ipc_area
937
 
811
 
938
           mov ebx, edi
812
           mov ebx, edi
939
           add edi, new_app_base
813
           add edi, new_app_base
940
           and ebx, 0xFFF
814
           and ebx, 0xFFF
941
           mov [dst_offset], ebx
815
           mov [dst_offset], ebx
942
 
816
 
943
           mov esi, [eax+PROC_BASE+0xa4]
817
           mov esi, [eax+PROC_BASE+0xa4]
944
           mov [buf_size], esi
818
           mov [buf_size], esi
945
 
819
 
946
           stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\
820
           stdcall map_mem, [ipc_tmp], [PROC_BASE+eax+0xB8],\
947
                             edi, esi
821
                             edi, esi
948
 
822
 
949
           mov edi, [dst_offset]
823
           mov edi, [dst_offset]
950
           add edi, [ipc_tmp]
824
           add edi, [ipc_tmp]
951
           cmp dword [edi], 0
825
           cmp dword [edi], 0
952
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
826
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
953
           mov ebx, dword [edi+4]
827
           mov ebx, dword [edi+4]
954
           mov edx, ebx
828
           mov edx, ebx
955
           add ebx, 8
829
           add ebx, 8
956
           add ebx, [msg_size]
830
           add ebx, [msg_size]
957
           cmp ebx, [buf_size]
831
           cmp ebx, [buf_size]
958
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
832
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
959
           mov dword [edi+4], ebx
833
           mov dword [edi+4], ebx
960
           mov eax,[TASK_BASE]
834
           mov eax,[TASK_BASE]
961
           mov eax, [eax+0x04]         ;eax - our PID
835
           mov eax, [eax+0x04]         ;eax - our PID
962
           mov edi, [dst_offset]
836
           mov edi, [dst_offset]
963
           add edi, [ipc_tmp]
837
           add edi, [ipc_tmp]
964
           add edi, edx
838
           add edi, edx
965
           mov [edi], eax
839
           mov [edi], eax
966
           mov ecx, [msg_size]
840
           mov ecx, [msg_size]
967
 
841
 
968
           mov [edi+4], ecx
842
           mov [edi+4], ecx
969
           add edi, 8
843
           add edi, 8
970
           mov esi, [msg_addr]
844
           mov esi, [msg_addr]
971
           add esi, new_app_base
845
           add esi, new_app_base
972
           cld
846
           cld
973
           rep movsb
847
           rep movsb
974
 
848
 
975
           mov ebx, [ipc_tmp]
849
           mov ebx, [ipc_tmp]
976
           mov edx, ebx
850
           mov edx, ebx
977
           shr ebx, 12
851
           shr ebx, 12
978
           xor eax, eax
852
           xor eax, eax
979
           mov [pages_tab+ebx*4], eax
853
           mov [pages_tab+ebx*4], eax
980
           invlpg [edx]
854
           invlpg [edx]
981
 
855
 
982
           mov ebx, [ipc_pdir]
856
           mov ebx, [ipc_pdir]
983
           mov edx, ebx
857
           mov edx, ebx
984
           shr ebx, 12
858
           shr ebx, 12
985
           xor eax, eax
859
           xor eax, eax
986
           mov [pages_tab+ebx*4], eax
860
           mov [pages_tab+ebx*4], eax
987
           invlpg [edx]
861
           invlpg [edx]
988
 
862
 
989
           mov ebx, [ipc_ptab]
863
           mov ebx, [ipc_ptab]
990
           mov edx, ebx
864
           mov edx, ebx
991
           shr ebx, 12
865
           shr ebx, 12
992
           xor eax, eax
866
           xor eax, eax
993
           mov [pages_tab+ebx*4], eax
867
           mov [pages_tab+ebx*4], eax
994
           invlpg [edx]
868
           invlpg [edx]
995
 
869
 
996
           mov  eax, [dst_slot]
870
           mov  eax, [dst_slot]
997
           shl eax, 8
871
           shl eax, 8
998
           or   [eax+PROC_BASE+0xA8],dword 0x40
872
           or   [eax+PROC_BASE+0xA8],dword 0x40
999
           cmp  dword [check_idle_semaphore],20
873
           cmp  dword [check_idle_semaphore],20
1000
           jge  .ipc_no_cis
874
           jge  .ipc_no_cis
1001
 
875
 
1002
           mov  dword [check_idle_semaphore],5
876
           mov  dword [check_idle_semaphore],5
1003
.ipc_no_cis:
877
.ipc_no_cis:
1004
           popf
878
           popf
1005
           xor eax, eax
879
           xor eax, eax
1006
           ret
880
           ret
1007
.no_pid:
881
.no_pid:
1008
           popf
882
           popf
1009
           mov  eax, 4
883
           mov  eax, 4
1010
           ret
884
           ret
1011
.no_ipc_area:
885
.no_ipc_area:
1012
           popf
886
           popf
1013
           xor eax, eax
887
           xor eax, eax
1014
           inc eax
888
           inc eax
1015
           ret
889
           ret
1016
.ipc_blocked:
890
.ipc_blocked:
1017
           popf
891
           popf
1018
           mov  eax, 2
892
           mov  eax, 2
1019
           ret
893
           ret
1020
.buffer_overflow:
894
.buffer_overflow:
1021
           popf
895
           popf
1022
           mov  eax, 3
896
           mov  eax, 3
1023
           ret
897
           ret
1024
endp
898
endp
1025
 
899
 
1026
align 4
900
align 4
1027
proc get_mem_info stdcall, val:dword
901
sysfn_meminfo:
1028
 
902
 
1029
           mov esi, [val]
-
 
1030
 
-
 
-
 
903
           add ebx, new_app_base
1031
           mov eax, [pg_data.pages_count]
904
           mov eax, [pg_data.pages_count]
1032
           mov [esi], eax
905
           mov [ebx], eax
1033
           mov ebx, [pg_data.pages_free]
906
           mov ecx, [pg_data.pages_free]
1034
           mov [esi+4], ebx
907
           mov [ebx+4], ecx
1035
           mov ecx, [pg_data.pages_faults]
908
           mov edx, [pg_data.pages_faults]
1036
           mov [esi+8], ecx
909
           mov [ebx+8], edx
-
 
910
           mov esi, [heap_size]
-
 
911
           mov [ebx+12], esi
-
 
912
           mov edi, [heap_free]
-
 
913
           mov [ebx+16], edi
-
 
914
           mov eax, [heap_blocks]
-
 
915
           mov [ebx+20], eax
-
 
916
           mov ecx, [free_blocks]
-
 
917
           mov [ebx+24], ecx
1037
 
918
 
1038
           ret
-
 
1039
endp
919
           ret
1040
 
920
 
1041
align 4
921
align 4
1042
new_services:
922
new_services:
1043
 
923
 
1044
           cmp  eax,4
924
           cmp  eax,4
1045
           jle  sys_sheduler
925
           jle  sys_sheduler
1046
 
926
 
1047
           cmp eax, 10
927
           cmp eax, 11
1048
           jb .fail
928
           jb .fail
1049
           ja @f
929
           ja @f
1050
 
930
 
1051
           add ebx, new_app_base
931
;           add ebx, new_app_base
1052
           stdcall get_mem_info, ebx
932
;           stdcall get_mem_info, ebx
1053
           mov [esp+36], eax
933
;           mov [esp+36], eax
1054
           ret
934
;           ret
1055
@@:
935
;@@:
1056
           cmp eax, 11
936
;           cmp eax, 11
1057
           ja @f
937
;           ja @f
1058
 
938
 
1059
           stdcall init_heap, ebx
939
           stdcall init_heap, ebx
1060
           mov [esp+36], eax
940
           mov [esp+36], eax
1061
           ret
941
           ret
1062
@@:
942
@@:
1063
           cmp eax, 12
943
           cmp eax, 12
1064
           ja @f
944
           ja @f
1065
 
945
 
1066
           stdcall user_alloc, ebx
946
           stdcall user_alloc, ebx
1067
           mov [esp+36], eax
947
           mov [esp+36], eax
1068
           ret
948
           ret
1069
@@:
949
@@:
1070
           cmp eax, 13
950
           cmp eax, 13
1071
           ja @f
951
           ja @f
1072
 
952
 
1073
           stdcall user_free, ebx
953
           stdcall user_free, ebx
1074
           mov [esp+36], eax
954
           mov [esp+36], eax
1075
           ret
955
           ret
1076
@@:
956
@@:
1077
           cmp eax, 14
957
           cmp eax, 14
1078
           ja @f
958
           ja @f
1079
           add ebx,new_app_base
959
           add ebx,new_app_base
1080
           stdcall get_notify, ebx
960
           stdcall get_notify, ebx
1081
           ret
961
           ret
1082
@@:
962
@@:
1083
           cmp eax, 15
963
           cmp eax, 15
1084
           ja @f
964
           ja @f
1085
           mov ecx, [CURRENT_TASK]
965
           mov ecx, [CURRENT_TASK]
1086
           shl ecx, 8
966
           shl ecx, 8
1087
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
967
           mov eax, [ecx+PROC_BASE+APPDATA.fpu_handler]
1088
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
968
           mov [ecx+PROC_BASE+APPDATA.fpu_handler], ebx
1089
           mov [esp+36], eax
969
           mov [esp+36], eax
1090
           ret
970
           ret
1091
@@:
971
@@:
1092
           cmp eax, 16
972
           cmp eax, 16
1093
           ja @f
973
           ja @f
1094
 
974
 
1095
           add ebx, new_app_base
975
           add ebx, new_app_base
1096
           stdcall get_service, ebx
976
           stdcall get_service, ebx
1097
           mov [esp+36], eax
977
           mov [esp+36], eax
1098
           ret
978
           ret
1099
@@:
979
@@:
1100
           cmp eax, 17
980
           cmp eax, 17
1101
           ja @f
981
           ja @f
1102
           stdcall srv_handlerEx, ebx
982
           stdcall srv_handlerEx, ebx
1103
           mov [esp+36], eax
983
           mov [esp+36], eax
1104
           ret
984
           ret
1105
@@:
985
@@:
1106
           cmp eax, 18
986
           cmp eax, 18
1107
           ja @f
987
           ja @f
1108
           mov ecx, [CURRENT_TASK]
988
           mov ecx, [CURRENT_TASK]
1109
           shl ecx, 8
989
           shl ecx, 8
1110
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
990
           mov eax, [ecx+PROC_BASE+APPDATA.sse_handler]
1111
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
991
           mov [ecx+PROC_BASE+APPDATA.sse_handler], ebx
1112
           mov [esp+36], eax
992
           mov [esp+36], eax
1113
           ret
993
           ret
1114
 
994
 
1115
@@:
995
@@:
1116
.fail:
996
.fail:
1117
           xor eax, eax
997
           xor eax, eax
1118
           mov [esp+36], eax
998
           mov [esp+36], eax
1119
           ret
999
           ret
1120
 
1000
 
1121
 
1001
 
1122
align 4
1002
align 4
1123
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1003
proc strncmp stdcall, str1:dword, str2:dword, count:dword
1124
 
1004
 
1125
          mov ecx,[count]
1005
          mov ecx,[count]
1126
          jecxz .end
1006
          jecxz .end
1127
 
1007
 
1128
          mov ebx,ecx
1008
          mov ebx,ecx
1129
 
1009
 
1130
          mov edi,[str1]
1010
          mov edi,[str1]
1131
          mov esi,edi
1011
          mov esi,edi
1132
          xor eax,eax
1012
          xor eax,eax
1133
          repne scasb
1013
          repne scasb
1134
          neg ecx             ; cx = count - strlen
1014
          neg ecx             ; cx = count - strlen
1135
          add ecx,ebx         ; strlen + count - strlen
1015
          add ecx,ebx         ; strlen + count - strlen
1136
 
1016
 
1137
.okay:
1017
.okay:
1138
          mov edi,esi
1018
          mov edi,esi
1139
          mov esi,[str2]
1019
          mov esi,[str2]
1140
          repe cmpsb
1020
          repe cmpsb
1141
          mov al,[esi-1]
1021
          mov al,[esi-1]
1142
          xor ecx,ecx
1022
          xor ecx,ecx
1143
 
1023
 
1144
          cmp al,[edi-1]
1024
          cmp al,[edi-1]
1145
          ja .str2_big
1025
          ja .str2_big
1146
          je .end
1026
          je .end
1147
 
1027
 
1148
.str1_big:
1028
.str1_big:
1149
          sub ecx,2
1029
          sub ecx,2
1150
 
1030
 
1151
.str2_big:
1031
.str2_big:
1152
          not ecx
1032
          not ecx
1153
.end:
1033
.end:
1154
          mov eax,ecx
1034
          mov eax,ecx
1155
          ret
1035
          ret
1156
endp
1036
endp
1157
 
1037
 
1158
align 4
1038
align 4
1159
proc fpu_save
1039
proc fpu_save
1160
           clts
1040
           clts
1161
           mov ebx, [fpu_owner]
1041
           mov ebx, [fpu_owner]
1162
           shl ebx, 8
1042
           shl ebx, 8
1163
           mov eax, [ebx+PROC_BASE+0x10]
1043
           mov eax, [ebx+PROC_BASE+0x10]
1164
           mov ebx, [CURRENT_TASK]
1044
           mov ebx, [CURRENT_TASK]
1165
           mov [fpu_owner], ebx
1045
           mov [fpu_owner], ebx
1166
 
1046
 
1167
           bt [cpu_caps], CAPS_FXSR
1047
           bt [cpu_caps], CAPS_FXSR
1168
           jnc .no_SSE
1048
           jnc .no_SSE
1169
 
1049
 
1170
           fxsave [eax]
1050
           fxsave [eax]
1171
           ret
1051
           ret
1172
.no_SSE:
1052
.no_SSE:
1173
           fnsave [eax]
1053
           fnsave [eax]
1174
           ret
1054
           ret
1175
endp
1055
endp
1176
 
1056
 
1177
align 4
1057
align 4
1178
proc fpu_restore
1058
proc fpu_restore
1179
           mov ebx, [CURRENT_TASK]
1059
           mov ebx, [CURRENT_TASK]
1180
           shl ebx, 8
1060
           shl ebx, 8
1181
           mov eax, [ebx+PROC_BASE+0x10]
1061
           mov eax, [ebx+PROC_BASE+0x10]
1182
           bt [cpu_caps], CAPS_FXSR
1062
           bt [cpu_caps], CAPS_FXSR
1183
           jnc .no_SSE
1063
           jnc .no_SSE
1184
 
1064
 
1185
           fxrstor [eax]
1065
           fxrstor [eax]
1186
           ret
1066
           ret
1187
.no_SSE:
1067
.no_SSE:
1188
           frstor [eax]
1068
           frstor [eax]
1189
           ret
1069
           ret
1190
endp
1070
endp
1191
 
1071
 
1192
align 4
1072
align 4
1193
proc test_cpu
1073
proc test_cpu
1194
           locals
1074
           locals
1195
              cpu_type   dd ?
1075
              cpu_type   dd ?
1196
              cpu_id     dd ?
1076
              cpu_id     dd ?
1197
              cpu_Intel  dd ?
1077
              cpu_Intel  dd ?
1198
              cpu_AMD    dd ?
1078
              cpu_AMD    dd ?
1199
           endl
1079
           endl
1200
 
1080
 
1201
           mov [cpu_type], 0
1081
           mov [cpu_type], 0
1202
 
1082
 
1203
           pushfd
1083
           pushfd
1204
           pop eax
1084
           pop eax
1205
           mov ecx, eax
1085
           mov ecx, eax
1206
           xor eax, 0x40000
1086
           xor eax, 0x40000
1207
           push eax
1087
           push eax
1208
           popfd
1088
           popfd
1209
           pushfd
1089
           pushfd
1210
           pop eax
1090
           pop eax
1211
           xor eax, ecx
1091
           xor eax, ecx
1212
           mov [cpu_type], CPU_386
1092
           mov [cpu_type], CPU_386
1213
           jz .end_cpu
1093
           jz .end_cpu
1214
           push ecx
1094
           push ecx
1215
           popfd
1095
           popfd
1216
 
1096
 
1217
           mov [cpu_type], CPU_486
1097
           mov [cpu_type], CPU_486
1218
           mov eax, ecx
1098
           mov eax, ecx
1219
           xor eax, 0x200000
1099
           xor eax, 0x200000
1220
           push eax
1100
           push eax
1221
           popfd
1101
           popfd
1222
           pushfd
1102
           pushfd
1223
           pop eax
1103
           pop eax
1224
           xor eax, ecx
1104
           xor eax, ecx
1225
           je .end_cpu
1105
           je .end_cpu
1226
           mov [cpu_id], 1
1106
           mov [cpu_id], 1
1227
 
1107
 
1228
           xor eax, eax
1108
           xor eax, eax
1229
           cpuid
1109
           cpuid
1230
           mov [cpu_vendor], ebx
1110
           mov [cpu_vendor], ebx
1231
           mov [cpu_vendor+4], edx
1111
           mov [cpu_vendor+4], edx
1232
           mov [cpu_vendor+8], ecx
1112
           mov [cpu_vendor+8], ecx
1233
           cmp ebx, dword [intel_str]
1113
           cmp ebx, dword [intel_str]
1234
           jne .check_AMD
1114
           jne .check_AMD
1235
           cmp edx, dword [intel_str+4]
1115
           cmp edx, dword [intel_str+4]
1236
           jne .check_AMD
1116
           jne .check_AMD
1237
           cmp ecx, dword [intel_str+8]
1117
           cmp ecx, dword [intel_str+8]
1238
           jne .check_AMD
1118
           jne .check_AMD
1239
           mov [cpu_Intel], 1
1119
           mov [cpu_Intel], 1
1240
           cmp eax, 1
1120
           cmp eax, 1
1241
           jl .end_cpuid
1121
           jl .end_cpuid
1242
           mov eax, 1
1122
           mov eax, 1
1243
           cpuid
1123
           cpuid
1244
           mov [cpu_sign], eax
1124
           mov [cpu_sign], eax
1245
           mov [cpu_info],  ebx
1125
           mov [cpu_info],  ebx
1246
           mov [cpu_caps],  edx
1126
           mov [cpu_caps],  edx
1247
           mov [cpu_caps+4],ecx
1127
           mov [cpu_caps+4],ecx
1248
 
1128
 
1249
           shr eax, 8
1129
           shr eax, 8
1250
           and eax, 0x0f
1130
           and eax, 0x0f
1251
           mov [cpu_type], eax
1131
           mov [cpu_type], eax
1252
           ret
1132
           ret
1253
 
1133
 
1254
.end_cpuid:
1134
.end_cpuid:
1255
           mov eax, [cpu_type]
1135
           mov eax, [cpu_type]
1256
           ret
1136
           ret
1257
 
1137
 
1258
.check_AMD:
1138
.check_AMD:
1259
           cmp ebx, dword [AMD_str]
1139
           cmp ebx, dword [AMD_str]
1260
           jne .end_cpu
1140
           jne .end_cpu
1261
           cmp edx, dword [AMD_str+4]
1141
           cmp edx, dword [AMD_str+4]
1262
           jne .end_cpu
1142
           jne .end_cpu
1263
           cmp ecx, dword [AMD_str+8]
1143
           cmp ecx, dword [AMD_str+8]
1264
           jne .end_cpu
1144
           jne .end_cpu
1265
           mov [cpu_AMD], 1
1145
           mov [cpu_AMD], 1
1266
           cmp eax, 1
1146
           cmp eax, 1
1267
           jl .end_cpuid
1147
           jl .end_cpuid
1268
           mov eax, 1
1148
           mov eax, 1
1269
           cpuid
1149
           cpuid
1270
           mov [cpu_sign], eax
1150
           mov [cpu_sign], eax
1271
           mov [cpu_info],  ebx
1151
           mov [cpu_info],  ebx
1272
           mov [cpu_caps],  edx
1152
           mov [cpu_caps],  edx
1273
           mov [cpu_caps+4],ecx
1153
           mov [cpu_caps+4],ecx
1274
           shr eax, 8
1154
           shr eax, 8
1275
           and eax, 0x0f
1155
           and eax, 0x0f
1276
           mov [cpu_type], eax
1156
           mov [cpu_type], eax
1277
.end_cpu:
1157
.end_cpu:
1278
           mov eax, [cpu_type]
1158
           mov eax, [cpu_type]
1279
           ret
1159
           ret
1280
endp
1160
endp
1281
 
1161
 
1282
MEM_WB     equ 6               ;write-back memory
1162
MEM_WB     equ 6               ;write-back memory
1283
MEM_WC     equ 1               ;write combined memory
1163
MEM_WC     equ 1               ;write combined memory
1284
MEM_UC     equ 0               ;uncached memory
1164
MEM_UC     equ 0               ;uncached memory
1285
 
1165
 
1286
align 4
1166
align 4
1287
proc init_mtrr
1167
proc init_mtrr
1288
 
1168
 
1289
           cmp [0x2f0000+0x901c],byte 2
1169
           cmp [0x2f0000+0x901c],byte 2
1290
           je  .exit
1170
           je  .exit
1291
 
1171
 
1292
           mov eax, cr0
1172
           mov eax, cr0
1293
           or eax, 0x60000000   ;disable caching
1173
           or eax, 0x60000000   ;disable caching
1294
           mov cr0, eax
1174
           mov cr0, eax
1295
           wbinvd               ;invalidate cache
1175
           wbinvd               ;invalidate cache
1296
 
1176
 
1297
           mov ecx, 0x2FF
1177
           mov ecx, 0x2FF
1298
           rdmsr                ;
1178
           rdmsr                ;
1299
           push eax
1179
           push eax
1300
 
1180
 
1301
           xor edx, edx
1181
           xor edx, edx
1302
           xor eax, eax
1182
           xor eax, eax
1303
           mov ecx, 0x2FF
1183
           mov ecx, 0x2FF
1304
           wrmsr                ;disable all MTRR
1184
           wrmsr                ;disable all MTRR
1305
 
1185
 
1306
           stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
1186
           stdcall set_mtrr, dword 0,dword 0,[MEM_AMOUNT],MEM_WB
1307
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1187
           stdcall set_mtrr, dword 1,[LFBAddress],[LFBSize],MEM_WC
1308
           xor edx, edx
1188
           xor edx, edx
1309
           xor eax, eax
1189
           xor eax, eax
1310
           mov ecx, 0x204
1190
           mov ecx, 0x204
1311
           mov ebx, 6
1191
           mov ebx, 6
1312
@@:
1192
@@:
1313
           wrmsr                ;disable unused MTRR
1193
           wrmsr                ;disable unused MTRR
1314
           inc ecx
1194
           inc ecx
1315
           wrmsr
1195
           wrmsr
1316
           inc ecx
1196
           inc ecx
1317
           dec ebx
1197
           dec ebx
1318
           jnz @b
1198
           jnz @b
1319
 
1199
 
1320
           wbinvd               ;again invalidate
1200
           wbinvd               ;again invalidate
1321
 
1201
 
1322
           pop eax
1202
           pop eax
1323
           or eax, 0x800        ;set default memtype to UC
1203
           or eax, 0x800        ;set default memtype to UC
1324
           and al, 0xF0
1204
           and al, 0xF0
1325
           mov ecx, 0x2FF
1205
           mov ecx, 0x2FF
1326
           wrmsr                ;and enable MTRR
1206
           wrmsr                ;and enable MTRR
1327
 
1207
 
1328
           mov eax, cr0
1208
           mov eax, cr0
1329
           and eax, not 0x60000000
1209
           and eax, not 0x60000000
1330
           mov cr0, eax         ; enable caching
1210
           mov cr0, eax         ; enable caching
1331
.exit:
1211
.exit:
1332
           ret
1212
           ret
1333
endp
1213
endp
1334
 
1214
 
1335
align 4
1215
align 4
1336
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1216
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1337
 
1217
 
1338
           xor edx, edx
1218
           xor edx, edx
1339
           mov eax, [base]
1219
           mov eax, [base]
1340
           or eax, [mem_type]
1220
           or eax, [mem_type]
1341
           mov ecx, [reg]
1221
           mov ecx, [reg]
1342
           lea ecx, [0x200+ecx*2]
1222
           lea ecx, [0x200+ecx*2]
1343
           wrmsr
1223
           wrmsr
1344
 
1224
 
1345
           mov ebx, [size]
1225
           mov ebx, [size]
1346
           dec ebx
1226
           dec ebx
1347
           mov eax, 0xFFFFFFFF
1227
           mov eax, 0xFFFFFFFF
1348
           mov edx, 0x0000000F
1228
           mov edx, 0x0000000F
1349
           sub eax, ebx
1229
           sub eax, ebx
1350
           sbb edx, 0
1230
           sbb edx, 0
1351
           or eax, 0x800
1231
           or eax, 0x800
1352
           inc ecx
1232
           inc ecx
1353
           wrmsr
1233
           wrmsr
1354
           ret
1234
           ret
1355
endp
1235
endp
1356
 
1236
 
1357
 
-
 
1358
iglobal
1237
iglobal
1359
align 4
1238
align 4
1360
  intel_str    db "GenuineIntel",0
1239
  intel_str    db "GenuineIntel",0
1361
  AMD_str      db "AuthenticAMD",0
1240
  AMD_str      db "AuthenticAMD",0
1362
endg
1241
endg
1363
 
1242
 
1364
uglobal
1243
uglobal
1365
align 16
1244
align 16
1366
  irq_tab           rd 16
1245
  irq_tab           rd 16
1367
 
1246
 
1368
 
1247
 
1369
  MEM_FreeSpace     rd 1
1248
  MEM_FreeSpace     rd 1
1370
 
1249
 
1371
  ipc_tmp           rd 1
1250
  ipc_tmp           rd 1
1372
  ipc_pdir          rd 1
1251
  ipc_pdir          rd 1
1373
  ipc_ptab          rd 1
1252
  ipc_ptab          rd 1
1374
 
1253
 
1375
  proc_mem_map      rd 1
1254
  proc_mem_map      rd 1
1376
  proc_mem_pdir     rd 1
1255
  proc_mem_pdir     rd 1
1377
  proc_mem_tab      rd 1
1256
  proc_mem_tab      rd 1
1378
 
1257
 
1379
  tmp_task_pdir     rd 1
1258
  tmp_task_pdir     rd 1
1380
  tmp_task_ptab     rd 1
1259
  tmp_task_ptab     rd 1
1381
  tmp_task_data     rd 1
1260
  tmp_task_data     rd 1
1382
 
1261
 
1383
  current_pdir      rd 1
1262
  current_pdir      rd 1
1384
 
1263
 
1385
  fpu_data          rd 1
1264
  fpu_data          rd 1
1386
  fdd_buff          rd 1
1265
  fdd_buff          rd 1
1387
 
1266
 
1388
;;CPUID information
1267
;;CPUID information
1389
 
1268
 
1390
  cpu_vendor        rd 3
1269
  cpu_vendor        rd 3
1391
  cpu_sign          rd 1
1270
  cpu_sign          rd 1
1392
  cpu_info          rd 1
1271
  cpu_info          rd 1
1393
 
1272
 
1394
endg
1273
endg
1395
 
1274
 
1396
uglobal
1275
uglobal
1397
align 16
1276
align 16
1398
   dll_tab         rb 32*32
1277
   dll_tab         rb 32*32
1399
   srv_tab         rb 32*32
1278
   srv_tab         rb 32*32
1400
   dll_map         rd 1
1279
   dll_map         rd 1
1401
   srv_map         rd 1
1280
   srv_map         rd 1
1402
 
1281
 
1403
   mem_used_list   rd 1
1282
   mem_used_list   rd 1
1404
   mem_block_list  rd 64
1283
   mem_block_list  rd 64
1405
   mem_block_map   rb 512
1284
   mem_block_map   rb 512
1406
   mem_block_arr   rd 1
1285
   mem_block_arr   rd 1
1407
   mem_block_start rd 1
1286
   mem_block_start rd 1
1408
   mem_block_end   rd 1
1287
   mem_block_end   rd 1
1409
   mem_block_mask  rd 2
1288
   mem_block_mask  rd 2
1410
 
1289
   heap_size       rd 1
-
 
1290
   heap_free       rd 1
-
 
1291
   heap_blocks     rd 1
-
 
1292
   free_blocks     rd 1
-
 
1293
 
1411
   page_start      rd 1
1294
   page_start      rd 1
1412
   page_end        rd 1
1295
   page_end        rd 1
1413
   sys_page_map    rd 1
1296
   sys_page_map    rd 1
1414
   app_load        rd 1
1297
;   app_load        rd 1
1415
endg
1298
endg
1416
 
1299
 
1417
 
1300
 
1418
;     push eax
1301
;     push eax
1419
;     push edx
1302
;     push edx
1420
;     mov edx, 0x400   ;bocsh
1303
;     mov edx, 0x400   ;bocsh
1421
;     mov al,0xff      ;bocsh
1304
;     mov al,0xff      ;bocsh
1422
;     out dx, al       ;bocsh
1305
;     out dx, al       ;bocsh
1423
;     nop              ;bocsh fix
1306
;     pop edx
1424
;     pop edx
-
 
1425
;     pop eax
1307
;     pop eax