Subversion Repositories Kolibri OS

Rev

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

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