Subversion Repositories Kolibri OS

Rev

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

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