Subversion Repositories Kolibri OS

Rev

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

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