Subversion Repositories Kolibri OS

Rev

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

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