Subversion Repositories Kolibri OS

Rev

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

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