Subversion Repositories Kolibri OS

Rev

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

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