Subversion Repositories Kolibri OS

Rev

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

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