Subversion Repositories Kolibri OS

Rev

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

Rev 897 Rev 928
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 897 $
8
$Revision: 928 $
9
 
9
 
10
 
10
 
11
align 4
11
align 4
12
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
12
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
13
           push ebx
13
           push ebx
14
           mov eax, [phis_addr]
14
           mov eax, [phis_addr]
15
           and eax, not 0xFFF
15
           and eax, not 0xFFF
16
           or eax, [flags]
16
           or eax, [flags]
17
           mov ebx, [lin_addr]
17
           mov ebx, [lin_addr]
18
           shr ebx, 12
18
           shr ebx, 12
19
           mov [page_tabs+ebx*4], eax
19
           mov [page_tabs+ebx*4], eax
20
           mov eax, [lin_addr]
20
           mov eax, [lin_addr]
21
           invlpg [eax]
21
           invlpg [eax]
22
           pop ebx
22
           pop ebx
23
           ret
23
           ret
24
endp
24
endp
25
 
25
 
26
align 4
26
align 4
27
map_space:    ;not implemented
27
map_space:    ;not implemented
28
 
28
 
29
 
29
 
30
           ret
30
           ret
31
 
31
 
32
align 4
32
align 4
33
_MapIoMem:
33
_MapIoMem:
34
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
34
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
35
 
35
 
36
           push edi
36
           push edi
37
 
37
 
38
           mov ecx, [size]
38
           mov ecx, [size]
39
           add ecx, 4095
39
           add ecx, 4095
40
           and ecx, -4096
40
           and ecx, -4096
41
           mov [size], ecx
41
           mov [size], ecx
42
           xor edx, edx
42
           xor edx, edx
43
           call @mem_alloc@8
43
           call @mem_alloc@8
44
           test eax, eax
44
           test eax, eax
45
           jz .fail
45
           jz .fail
46
 
46
 
47
           mov edx, eax
47
           mov edx, eax
48
           mov edi, eax
48
           mov edi, eax
49
           shr edi, 10
49
           shr edi, 10
50
           add edi, page_tabs
50
           add edi, page_tabs
51
 
51
 
52
           mov ecx, [size]
52
           mov ecx, [size]
53
           shr ecx, 12
53
           shr ecx, 12
54
           mov eax, [base]
54
           mov eax, [base]
55
           and eax, -4096
55
           and eax, -4096
56
           or eax, [flags]
56
           or eax, [flags]
57
@@:
57
@@:
58
           stosd
58
           stosd
59
           add eax, 0x1000
59
           add eax, 0x1000
60
           loop @B
60
           loop @B
61
 
61
 
62
           mov eax, [base]
62
           mov eax, [base]
63
           and eax, 4095
63
           and eax, 4095
64
           add eax, edx
64
           add eax, edx
65
.fail:
65
.fail:
66
           pop edi
66
           pop edi
67
           ret
67
           ret
68
endp
68
endp
69
 
69
 
70
; param
70
; param
71
;  eax= page base + page flags
71
;  eax= page base + page flags
72
;  ebx= linear address
72
;  ebx= linear address
73
;  ecx= count
73
;  ecx= count
74
 
74
 
75
align 4
75
align 4
76
_CommitPages:
76
_CommitPages:
77
commit_pages:
77
commit_pages:
78
           push edi
78
           push edi
79
           test ecx, ecx
79
           test ecx, ecx
80
           jz .fail
80
           jz .fail
81
 
81
 
82
           mov edi, ebx
82
           mov edi, ebx
83
           mov ebx, pg_data.pg_mutex
83
           mov ebx, pg_data.pg_mutex
84
           call wait_mutex      ;ebx
84
           call wait_mutex      ;ebx
85
 
85
 
86
           mov edx, 0x1000
86
           mov edx, 0x1000
87
           mov ebx, edi
87
           mov ebx, edi
88
           shr ebx, 12
88
           shr ebx, 12
89
@@:
89
@@:
90
           mov [page_tabs+ebx*4], eax
90
           mov [page_tabs+ebx*4], eax
91
          ; push eax
91
          ; push eax
92
          ; invlpg [edi]
92
          ; invlpg [edi]
93
          ; pop eax
93
          ; pop eax
94
           add edi, edx
94
           add edi, edx
95
           add eax, edx
95
           add eax, edx
96
           inc ebx
96
           inc ebx
97
           dec ecx
97
           dec ecx
98
           jnz @B
98
           jnz @B
99
           mov [pg_data.pg_mutex],ecx
99
           mov [pg_data.pg_mutex],ecx
100
.fail:
100
.fail:
101
           pop edi
101
           pop edi
102
           ret
102
           ret
103
 
103
 
104
 
104
 
105
; param
105
; param
106
;  eax= base
106
;  eax= base
107
;  ecx= count
107
;  ecx= count
108
 
108
 
109
align 4
109
align 4
110
release_pages:
110
release_pages:
111
 
111
 
112
           pushad
112
           pushad
113
           mov ebx, pg_data.pg_mutex
113
           mov ebx, pg_data.pg_mutex
114
           call wait_mutex      ;ebx
114
           call wait_mutex      ;ebx
115
 
115
 
116
           mov esi, eax
116
           mov esi, eax
117
           mov edi, eax
117
           mov edi, eax
118
 
118
 
119
           shr esi, 10
119
           shr esi, 10
120
           add esi, page_tabs
120
           add esi, page_tabs
121
 
121
 
122
@@:
122
@@:
123
           xor eax, eax
123
           xor eax, eax
124
           xchg eax, [esi]
124
           xchg eax, [esi]
125
           push eax
125
           push eax
126
           invlpg [edi]
126
           invlpg [edi]
127
           pop eax
127
           pop eax
128
.next:
128
.next:
129
           add edi, 0x1000
129
           add edi, 0x1000
130
           add esi, 4
130
           add esi, 4
131
           dec ecx
131
           dec ecx
132
           jnz @B
132
           jnz @B
133
           and [pg_data.pg_mutex],0
133
           and [pg_data.pg_mutex],0
134
           popad
134
           popad
135
           ret
135
           ret
136
 
136
 
137
; param
137
; param
138
;  eax= base
138
;  eax= base
139
;  ecx= count
139
;  ecx= count
140
 
140
 
141
align 4
141
align 4
142
_UnmapPages:
142
_UnmapPages:
143
unmap_pages:
143
unmap_pages:
144
 
144
 
145
           push edi
145
           push edi
146
 
146
 
147
           mov edi, eax
147
           mov edi, eax
148
           mov edx, eax
148
           mov edx, eax
149
 
149
 
150
           shr edi, 10
150
           shr edi, 10
151
           add edi, page_tabs
151
           add edi, page_tabs
152
 
152
 
153
           xor eax, eax
153
           xor eax, eax
154
@@:
154
@@:
155
           stosd
155
           stosd
156
           invlpg [edx]
156
           invlpg [edx]
157
           add edx, 0x1000
157
           add edx, 0x1000
158
           loop @b
158
           loop @b
159
 
159
 
160
           pop edi
160
           pop edi
161
           ret
161
           ret
162
 
162
 
163
 
163
 
164
align 4
164
align 4
165
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
165
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
166
           push ebx
166
           push ebx
167
           mov ebx, [lin_addr]
167
           mov ebx, [lin_addr]
168
           shr ebx, 22
168
           shr ebx, 22
169
           mov eax, [phis_addr]
169
           mov eax, [phis_addr]
170
           and eax, not 0xFFF
170
           and eax, not 0xFFF
171
           or eax, PG_UW          ;+PG_NOCACHE
171
           or eax, PG_UW          ;+PG_NOCACHE
172
           mov dword [master_tab+ebx*4], eax
172
           mov dword [master_tab+ebx*4], eax
173
           mov eax, [lin_addr]
173
           mov eax, [lin_addr]
174
           shr eax, 10
174
           shr eax, 10
175
           add eax, page_tabs
175
           add eax, page_tabs
176
           invlpg [eax]
176
           invlpg [eax]
177
           pop ebx
177
           pop ebx
178
           ret
178
           ret
179
endp
179
endp
180
 
-
 
181
align 4
-
 
182
proc init_LFB
-
 
183
           locals
-
 
184
             pg_count dd ?
-
 
185
           endl
-
 
186
 
-
 
187
           cmp dword [LFBAddress], -1
-
 
188
           jne @f
-
 
189
           mov [BOOT_VAR+0x901c],byte 2
-
 
190
           mov ecx, 0x280000
-
 
191
           mov edx, PG_SW
-
 
192
           call @mem_alloc@8
-
 
193
           mov [LFBAddress], eax
-
 
194
           ret
-
 
195
@@:
-
 
196
           test [SCR_MODE],word 0100000000000000b
-
 
197
           jnz @f
-
 
198
           mov [BOOT_VAR+0x901c],byte 2
-
 
199
           ret
-
 
200
@@:
-
 
201
           call init_mtrr
-
 
202
 
-
 
203
           mov eax, [LFBAddress]
-
 
204
           or eax, PG_LARGE+PG_UW
-
 
205
           mov [_sys_pdbr+(LFB_BASE shr 20)], eax
-
 
206
           add eax, 0x00400000
-
 
207
           mov [_sys_pdbr+4+(LFB_BASE shr 20)], eax
-
 
208
 
-
 
209
           mov dword [exp_lfb+4], LFB_BASE
-
 
210
 
-
 
211
           bt [cpu_caps], CAPS_PGE
-
 
212
           jnc @F
-
 
213
           or dword [_sys_pdbr+(LFB_BASE shr 20)], PG_GLOBAL
-
 
214
@@:
-
 
215
           mov dword [LFBAddress], LFB_BASE
-
 
216
           mov eax, cr3       ;flush TLB
-
 
217
           mov cr3, eax
-
 
218
 
-
 
219
           ret
-
 
220
endp
180
 
221
 
181
 
222
align 4
182
align 4
223
proc new_mem_resize stdcall, new_size:dword
183
proc new_mem_resize stdcall, new_size:dword
224
 
184
 
225
           mov ebx, pg_data.pg_mutex
185
           mov ebx, pg_data.pg_mutex
226
           call wait_mutex    ;ebx
186
           call wait_mutex    ;ebx
227
 
187
 
228
           mov edi, [new_size]
188
           mov edi, [new_size]
229
           add edi,4095
189
           add edi,4095
230
           and edi,not 4095
190
           and edi,not 4095
231
           mov [new_size], edi
191
           mov [new_size], edi
232
 
192
 
233
           mov edx,[current_slot]
193
           mov edx,[current_slot]
234
           cmp [edx+APPDATA.heap_base],0
194
           cmp [edx+APPDATA.heap_base],0
235
           jne .exit
195
           jne .exit
236
 
196
 
237
           mov esi, [edx+APPDATA.mem_size]
197
           mov esi, [edx+APPDATA.mem_size]
238
           add esi, 4095
198
           add esi, 4095
239
           and esi, not 4095
199
           and esi, not 4095
240
 
200
 
241
           cmp edi, esi
201
           cmp edi, esi
242
           jae .expand
202
           jae .expand
243
 
203
 
244
           shr edi, 12
204
           shr edi, 12
245
           shr esi, 12
205
           shr esi, 12
246
@@:
206
@@:
247
           mov ecx, [app_page_tabs+edi*4]
207
           mov ecx, [app_page_tabs+edi*4]
248
           test ecx, 1
208
           test ecx, 1
249
           jz .next
209
           jz .next
250
 
210
 
251
           mov dword [app_page_tabs+edi*4], 2
211
           mov dword [app_page_tabs+edi*4], 2
252
           mov ebx, edi
212
           mov ebx, edi
253
           shl ebx, 12
213
           shl ebx, 12
254
           invlpg [ebx]
214
           invlpg [ebx]
255
           call @core_free@4
215
           call @core_free@4
256
.next:
216
.next:
257
           add edi, 1
217
           add edi, 1
258
           cmp edi, esi
218
           cmp edi, esi
259
           jb @B
219
           jb @B
260
 
220
 
261
.update_size:
221
.update_size:
262
           mov     ebx, [new_size]
222
           mov     ebx, [new_size]
263
           call    update_mem_size
223
           call    update_mem_size
264
 
224
 
265
           xor eax, eax
225
           xor eax, eax
266
           dec [pg_data.pg_mutex]
226
           dec [pg_data.pg_mutex]
267
           ret
227
           ret
268
.expand:
228
.expand:
269
 
229
 
270
           push esi
230
           push esi
271
           push edi
231
           push edi
272
 
232
 
273
           add edi, 0x3FFFFF
233
           add edi, 0x3FFFFF
274
           and edi, not(0x3FFFFF)
234
           and edi, not(0x3FFFFF)
275
           add esi, 0x3FFFFF
235
           add esi, 0x3FFFFF
276
           and esi, not(0x3FFFFF)
236
           and esi, not(0x3FFFFF)
277
 
237
 
278
           cmp esi, edi
238
           cmp esi, edi
279
           jae .grow
239
           jae .grow
280
 
240
 
281
           xchg esi, edi
241
           xchg esi, edi
282
 
242
 
283
@@:
243
@@:
284
           call _alloc_page
244
           call _alloc_page
285
           test eax, eax
245
           test eax, eax
286
           jz .exit
246
           jz .exit
287
 
247
 
288
           stdcall map_page_table, edi, eax
248
           stdcall map_page_table, edi, eax
289
 
249
 
290
           push edi
250
           push edi
291
           shr edi, 10
251
           shr edi, 10
292
           add edi, page_tabs
252
           add edi, page_tabs
293
           mov ecx, 1024
253
           mov ecx, 1024
294
           xor eax, eax
254
           xor eax, eax
295
           cld
255
           cld
296
           rep stosd
256
           rep stosd
297
           pop edi
257
           pop edi
298
 
258
 
299
           add edi, 0x00400000
259
           add edi, 0x00400000
300
           cmp edi, esi
260
           cmp edi, esi
301
           jb @B
261
           jb @B
302
.grow:
262
.grow:
303
           pop edi
263
           pop edi
304
           pop esi
264
           pop esi
305
@@:
265
@@:
306
           call _alloc_page
266
           call _alloc_page
307
           test eax, eax
267
           test eax, eax
308
           jz .exit
268
           jz .exit
309
           stdcall map_page,esi,eax,dword PG_UW
269
           stdcall map_page,esi,eax,dword PG_UW
310
 
270
 
311
           push edi
271
           push edi
312
           mov edi, esi
272
           mov edi, esi
313
           xor eax, eax
273
           xor eax, eax
314
           mov ecx, 1024
274
           mov ecx, 1024
315
           cld
275
           cld
316
           rep stosd
276
           rep stosd
317
           pop edi
277
           pop edi
318
 
278
 
319
           add esi, 0x1000
279
           add esi, 0x1000
320
           cmp esi, edi
280
           cmp esi, edi
321
           jb  @B
281
           jb  @B
322
 
282
 
323
           jmp .update_size
283
           jmp .update_size
324
.exit:
284
.exit:
325
           xor eax, eax
285
           xor eax, eax
326
           inc eax
286
           inc eax
327
           dec [pg_data.pg_mutex]
287
           dec [pg_data.pg_mutex]
328
           ret
288
           ret
329
endp
289
endp
330
 
290
 
331
update_mem_size:
291
update_mem_size:
332
; in: edx = slot base
292
; in: edx = slot base
333
;     ebx = new memory size
293
;     ebx = new memory size
334
; destroys eax,ecx,edx
294
; destroys eax,ecx,edx
335
 
295
 
336
           mov    [APPDATA.mem_size+edx],ebx
296
           mov    [APPDATA.mem_size+edx],ebx
337
;search threads and update
297
;search threads and update
338
;application memory size infomation
298
;application memory size infomation
339
           mov    ecx,[APPDATA.dir_table+edx]
299
           mov    ecx,[APPDATA.dir_table+edx]
340
           mov    eax,2
300
           mov    eax,2
341
 
301
 
342
.search_threads:
302
.search_threads:
343
;eax = current slot
303
;eax = current slot
344
;ebx = new memory size
304
;ebx = new memory size
345
;ecx = page directory
305
;ecx = page directory
346
           cmp    eax,[TASK_COUNT]
306
           cmp    eax,[TASK_COUNT]
347
           jg     .search_threads_end
307
           jg     .search_threads_end
348
           mov    edx,eax
308
           mov    edx,eax
349
           shl    edx,5
309
           shl    edx,5
350
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
310
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
351
           jz     .search_threads_next
311
           jz     .search_threads_next
352
           shl    edx,3
312
           shl    edx,3
353
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
313
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
354
           jnz    .search_threads_next
314
           jnz    .search_threads_next
355
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
315
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
356
.search_threads_next:
316
.search_threads_next:
357
           inc    eax
317
           inc    eax
358
           jmp    .search_threads
318
           jmp    .search_threads
359
.search_threads_end:
319
.search_threads_end:
360
           ret
320
           ret
361
 
321
 
362
; param
322
; param
363
;  eax= linear address
323
;  eax= linear address
364
;
324
;
365
; retval
325
; retval
366
;  eax= phisical page address
326
;  eax= phisical page address
367
 
327
 
368
align 4
328
align 4
369
_GetPgAddr:
329
_GetPgAddr:
370
get_pg_addr:
330
get_pg_addr:
371
 
331
 
372
           cmp eax, OS_BASE
332
           cmp eax, OS_BASE
373
           jae @F
333
           jae @F
374
 
334
 
375
           shr eax, 12
335
           shr eax, 12
376
           mov eax, [page_tabs+eax*4]
336
           mov eax, [page_tabs+eax*4]
377
           and eax, 0xFFFFF000
337
           and eax, 0xFFFFF000
378
           ret
338
           ret
379
@@:
339
@@:
380
           sub eax, OS_BASE
340
           sub eax, OS_BASE
381
           and eax, 0xFFFFF000
341
           and eax, 0xFFFFF000
382
           ret
342
           ret
383
 
343
 
384
align 4
344
align 4
385
proc page_fault_handler
345
proc page_fault_handler
386
 
346
 
387
        test    byte [esp+12+2], 2
347
        test    byte [esp+12+2], 2
388
        jnz     v86_page_fault
348
        jnz     v86_page_fault
389
 
349
 
390
        .err_code equ ebp+32
350
        .err_code equ ebp+32
391
        .err_addr equ ebp-4
351
        .err_addr equ ebp-4
392
 
352
 
393
           pushad
353
           pushad
394
           mov ebp, esp
354
           mov ebp, esp
395
           mov eax, cr2
355
           mov eax, cr2
396
           push eax
356
           push eax
397
 
357
 
398
           mov ax, app_data
358
           mov ax, sel_app_data
399
           mov ds, ax
359
           mov ds, ax
400
           mov es, ax
360
           mov es, ax
401
 
361
 
402
           inc [pg_data.pages_faults]
362
           inc [pg_data.pages_faults]
403
 
363
 
404
           mov ebx, [.err_addr]
364
           mov ebx, [.err_addr]
405
           mov eax, [.err_code]
365
           mov eax, [.err_code]
406
 
366
 
407
           cmp ebx, HEAP_BASE
367
           cmp ebx, HEAP_BASE
408
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
368
           jb .user_space      ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
409
 
-
 
410
           cmp ebx, LFB_BASE
-
 
411
           jb  .kernel_heap
-
 
412
 
369
 
413
           cmp ebx, page_tabs
370
           cmp ebx, page_tabs
414
           jb .lfb
371
           jb  .kernel_heap
415
 
372
 
416
           cmp ebx, heap_tabs
373
           cmp ebx, heap_tabs
417
           jb .user_tabs
374
           jb .user_tabs
418
 
375
 
419
           cmp ebx, OS_BASE
376
           cmp ebx, LFB_BASE
-
 
377
           jb .heap_tab
-
 
378
 
420
           jb .heap_tab
379
           cmp ebx, OS_BASE
421
 
380
           jb .lfb
422
 
381
 
423
         ;  cmp ebx, kernel_tabs
382
         ;  cmp ebx, kernel_tabs
424
         ;  jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
383
         ;  jb .alloc;.app_tabs ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
425
                               ;ïðîñòî ñîçäàäèì îäíó
384
                               ;ïðîñòî ñîçäàäèì îäíó
426
 
-
 
427
 
-
 
428
 
385
 
429
.lfb:
386
.lfb:
430
           shr ebx, 22
387
           shr ebx, 22
431
           mov edx, [_sys_pdbr + ebx*4]
388
           mov edx, [_sys_pdbr + ebx*4]
432
           mov [master_tab + ebx*4], edx
389
           mov [master_tab + ebx*4], edx
433
           jmp .exit
390
           jmp .exit
434
 
391
 
435
.user_tabs:
392
.user_tabs:
436
           shr ebx, 12
393
           shr ebx, 12
437
           and ebx, 0x3FF
394
           and ebx, 0x3FF
438
           mov edx, [master_tab + ebx*4]
395
           mov edx, [master_tab + ebx*4]
439
           test edx, PG_MAP
396
           test edx, PG_MAP
440
           jnz .fail
397
           jnz .fail
441
 
398
 
442
           call _alloc_page
399
           call _alloc_page
443
           test eax, eax
400
           test eax, eax
444
           jz .fail
401
           jz .fail
445
 
402
 
446
           lea edx, [eax + PG_UW]
403
           lea edx, [eax + PG_UW]
447
           lea edi, [eax + OS_BASE]
404
           lea edi, [eax + OS_BASE]
448
           mov ecx, 1024
405
           mov ecx, 1024
449
           xor eax, eax
406
           xor eax, eax
450
           cld
407
           cld
451
           rep stosd
408
           rep stosd
452
 
409
 
453
           mov [master_tab + ebx*4], edx
410
           mov [master_tab + ebx*4], edx
454
           jmp .exit
411
           jmp .exit
455
 
412
 
456
.heap_tab:
413
.heap_tab:
457
           shr ebx, 12
414
           shr ebx, 12
458
           and ebx, 0x3FF
415
           and ebx, 0x3FF
459
           mov edx, [master_tab + ebx*4]
416
           mov edx, [master_tab + ebx*4]
460
           test edx, PG_MAP
417
           test edx, PG_MAP
461
           jz .check_ptab      ;òàáëèöà ñòðàíèö íå ñîçäàíà
418
           jz .check_ptab      ;òàáëèöà ñòðàíèö íå ñîçäàíà
462
 
419
 
463
           jmp .fail
420
           jmp .fail
464
 
421
 
465
align 4
422
align 4
466
.kernel_heap:
423
.kernel_heap:
467
 
424
 
468
           shr ebx, 22
425
           shr ebx, 22
469
           mov edx, [master_tab + ebx*4]
426
           mov edx, [master_tab + ebx*4]
470
 
427
 
471
           test edx, PG_MAP
428
           test edx, PG_MAP
472
           jz .check_ptab      ;òàáëèöà ñòðàíèö íå ñîçäàíà
429
           jz .check_ptab      ;òàáëèöà ñòðàíèö íå ñîçäàíà
473
 
430
 
474
           jmp .exit
431
           jmp .exit
475
 
432
 
476
.check_ptab:
433
.check_ptab:
477
           mov edx, [_sys_pdbr + ebx*4]
434
           mov edx, [_sys_pdbr + ebx*4]
478
           test edx, PG_MAP
435
           test edx, PG_MAP
479
           jnz @F
436
           jnz @F
480
 
437
 
481
           xor ecx, ecx
438
           xor ecx, ecx
482
           call @core_alloc@4
439
           call @core_alloc@4
483
           test eax, eax
440
           test eax, eax
484
           jz .fail
441
           jz .fail
485
 
442
 
486
           lea edx, [eax + PG_UW]
443
           lea edx, [eax + PG_UW]
487
           lea edi, [eax + OS_BASE]
444
           lea edi, [eax + OS_BASE]
488
           mov ecx, 1024
445
           mov ecx, 1024
489
           xor eax, eax
446
           xor eax, eax
490
           cld
447
           cld
491
           rep stosd
448
           rep stosd
492
 
449
 
493
           mov [_sys_pdbr + ebx*4], edx
450
           mov [_sys_pdbr + ebx*4], edx
494
@@:
451
@@:
495
           mov [master_tab + ebx*4], edx
452
           mov [master_tab + ebx*4], edx
496
           jmp .exit
453
           jmp .exit
497
 
454
 
498
align 4
455
align 4
499
.user_space:
456
.user_space:
500
           test eax, PG_MAP
457
           test eax, PG_MAP
501
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
458
           jnz .err_access     ;Ñòðàíèöà ïðèñóòñòâóåò
502
                               ;Îøèáêà äîñòóïà ?
459
                               ;Îøèáêà äîñòóïà ?
503
 
460
 
504
           shr ebx, 12
461
           shr ebx, 12
505
           mov ecx, ebx
462
           mov ecx, ebx
506
           shr ecx, 10
463
           shr ecx, 10
507
           mov edx, [master_tab + ecx*4]
464
           mov edx, [master_tab + ecx*4]
508
           test edx, PG_MAP
465
           test edx, PG_MAP
509
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
466
           jz .fail            ;òàáëèöà ñòðàíèö íå ñîçäàíà
510
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
467
                               ;íåâåðíûé àäðåñ â ïðîãðàììå
511
 
468
 
512
           mov eax, [page_tabs+ebx*4]
469
           mov eax, [page_tabs+ebx*4]
513
           test eax, 2
470
           test eax, 2
514
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
471
           jz .fail            ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
515
                               ;èñïîëüçîâàíèÿ. Îøèáêà
472
                               ;èñïîëüçîâàíèÿ. Îøèáêà
516
.alloc:
473
.alloc:
517
           call _alloc_page
474
           call _alloc_page
518
           test eax, eax
475
           test eax, eax
519
           jz .fail
476
           jz .fail
520
 
477
 
521
           stdcall map_page,[ebp-4],eax,dword PG_UW
478
           stdcall map_page,[ebp-4],eax,dword PG_UW
522
 
479
 
523
           mov edi, [ebp-4]
480
           mov edi, [ebp-4]
524
           and edi, 0xFFFFF000
481
           and edi, 0xFFFFF000
525
           mov ecx, 1024
482
           mov ecx, 1024
526
           xor eax, eax
483
           xor eax, eax
527
           cld
484
           cld
528
           rep stosd
485
           rep stosd
529
.exit:
486
.exit:
530
           mov esp, ebp
487
           mov esp, ebp
531
           popad
488
           popad
532
           add esp, 4
489
           add esp, 4
533
           iretd
490
           iretd
534
 
491
 
535
.err_access:
492
.err_access:
536
;íèêîãäà íå ïðîèñõîäèò
493
;íèêîãäà íå ïðîèñõîäèò
537
           jmp .fail
494
           jmp .fail
538
 
495
 
539
.kernel_space:
496
.kernel_space:
540
           test eax, PG_MAP
497
           test eax, PG_MAP
541
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
498
           jz .fail        ;ñòðàíèöà íå ïðèñóòñòâóåò
542
 
499
 
543
           test eax, 4     ;U/S
500
           test eax, 4     ;U/S
544
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
501
           jnz .fail       ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
545
                           ;ÿäðà
502
                           ;ÿäðà
546
           test eax, 8
503
           test eax, 8
547
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
504
           jnz .fail       ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
548
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
505
                           ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
549
 
506
 
550
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
507
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
551
 
508
 
552
           cmp ebx, tss._io_map_0
509
           cmp ebx, tss._io_map_0
553
           jb .fail
510
           jb .fail
554
 
511
 
555
           cmp ebx, tss._io_map_0+8192
512
           cmp ebx, tss._io_map_0+8192
556
           jae .fail
513
           jae .fail
557
 
514
 
558
; io permission map
515
; io permission map
559
; copy-on-write protection
516
; copy-on-write protection
560
 
517
 
561
           call _alloc_page
518
           call _alloc_page
562
           test eax, eax
519
           test eax, eax
563
           jz .fail
520
           jz .fail
564
 
521
 
565
           push eax
522
           push eax
566
           stdcall map_page,[ebp-4],eax,dword PG_SW
523
           stdcall map_page,[ebp-4],eax,dword PG_SW
567
           pop eax
524
           pop eax
568
           mov edi, [.err_addr]
525
           mov edi, [.err_addr]
569
           and edi, -4096
526
           and edi, -4096
570
           lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
527
           lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
571
 
528
 
572
           mov ebx, esi
529
           mov ebx, esi
573
           shr ebx, 12
530
           shr ebx, 12
574
           mov edx, [current_slot]
531
           mov edx, [current_slot]
575
           or eax, PG_SW
532
           or eax, PG_SW
576
           mov [edx+APPDATA.io_map+ebx*4], eax
533
           mov [edx+APPDATA.io_map+ebx*4], eax
577
 
534
 
578
           add esi, [default_io_map]
535
           add esi, [default_io_map]
579
           mov ecx, 4096/4
536
           mov ecx, 4096/4
580
           cld
537
           cld
581
           rep movsd
538
           rep movsd
582
           jmp .exit
539
           jmp .exit
583
 
540
 
584
 
541
 
585
;íå îáðàáàòûâàåì. Îøèáêà
542
;íå îáðàáàòûâàåì. Îøèáêà
586
 
543
 
587
.fail:
544
.fail:
588
           mov esp, ebp
545
           mov esp, ebp
589
           popad
546
           popad
590
           add esp, 4
547
           add esp, 4
591
 
548
 
592
;           iretd
549
;           iretd
593
 
550
 
594
           save_ring3_context     ;debugger support
551
           save_ring3_context     ;debugger support
595
 
552
 
596
           mov bl, 14
553
           mov bl, 14
597
           jmp exc_c
554
           jmp exc_c
598
           iretd
555
           iretd
599
endp
556
endp
600
 
557
 
601
align 4
558
align 4
602
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
559
proc map_mem stdcall, lin_addr:dword,pdir:dword,\
603
                      ofs:dword,buf_size:dword
560
                      ofs:dword,buf_size:dword
604
           mov eax, [buf_size]
561
           mov eax, [buf_size]
605
           test eax, eax
562
           test eax, eax
606
           jz .exit
563
           jz .exit
607
 
564
 
608
           mov eax, [pdir]
565
           mov eax, [pdir]
609
           and eax, 0xFFFFF000
566
           and eax, 0xFFFFF000
610
 
567
 
611
           stdcall map_page,[ipc_pdir],eax,PG_UW
568
           stdcall map_page,[ipc_pdir],eax,PG_UW
612
           mov ebx, [ofs]
569
           mov ebx, [ofs]
613
           shr ebx, 22
570
           shr ebx, 22
614
           mov esi, [ipc_pdir]
571
           mov esi, [ipc_pdir]
615
           mov edi, [ipc_ptab]
572
           mov edi, [ipc_ptab]
616
           mov eax, [esi+ebx*4]
573
           mov eax, [esi+ebx*4]
617
           and eax, 0xFFFFF000
574
           and eax, 0xFFFFF000
618
           jz .exit
575
           jz .exit
619
           stdcall map_page,edi,eax,PG_UW
576
           stdcall map_page,edi,eax,PG_UW
620
;           inc ebx
577
;           inc ebx
621
;           add edi, 0x1000
578
;           add edi, 0x1000
622
;           mov eax, [esi+ebx*4]
579
;           mov eax, [esi+ebx*4]
623
;           test eax, eax
580
;           test eax, eax
624
;           jz @f
581
;           jz @f
625
;          and eax, 0xFFFFF000
582
;          and eax, 0xFFFFF000
626
;           stdcall map_page, edi, eax
583
;           stdcall map_page, edi, eax
627
 
584
 
628
@@:        mov edi, [lin_addr]
585
@@:        mov edi, [lin_addr]
629
           and edi, 0xFFFFF000
586
           and edi, 0xFFFFF000
630
           mov ecx, [buf_size]
587
           mov ecx, [buf_size]
631
           add ecx, 4095
588
           add ecx, 4095
632
           shr ecx, 12
589
           shr ecx, 12
633
           inc ecx
590
           inc ecx
634
 
591
 
635
           mov edx, [ofs]
592
           mov edx, [ofs]
636
           shr edx, 12
593
           shr edx, 12
637
           and edx, 0x3FF
594
           and edx, 0x3FF
638
           mov esi, [ipc_ptab]
595
           mov esi, [ipc_ptab]
639
 
596
 
640
.map:      mov eax, [esi+edx*4]
597
.map:      mov eax, [esi+edx*4]
641
           and eax, 0xFFFFF000
598
           and eax, 0xFFFFF000
642
           jz  .exit
599
           jz  .exit
643
           stdcall map_page,edi,eax,PG_UW
600
           stdcall map_page,edi,eax,PG_UW
644
           dec ecx
601
           dec ecx
645
           jz  .exit
602
           jz  .exit
646
           add edi, 0x1000
603
           add edi, 0x1000
647
           inc edx
604
           inc edx
648
           cmp edx, 0x400
605
           cmp edx, 0x400
649
           jnz .map
606
           jnz .map
650
           inc ebx
607
           inc ebx
651
           mov eax, [ipc_pdir]
608
           mov eax, [ipc_pdir]
652
           mov eax, [eax+ebx*4]
609
           mov eax, [eax+ebx*4]
653
           and eax, 0xFFFFF000
610
           and eax, 0xFFFFF000
654
           jz  .exit
611
           jz  .exit
655
           stdcall map_page,esi,eax,PG_UW
612
           stdcall map_page,esi,eax,PG_UW
656
           xor edx, edx
613
           xor edx, edx
657
           jmp .map
614
           jmp .map
658
 
615
 
659
.exit:
616
.exit:
660
           ret
617
           ret
661
endp
618
endp
662
 
619
 
663
align 4
620
align 4
664
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
621
proc map_memEx stdcall, lin_addr:dword,pdir:dword,\
665
                        ofs:dword,buf_size:dword
622
                        ofs:dword,buf_size:dword
666
           mov eax, [buf_size]
623
           mov eax, [buf_size]
667
           test eax, eax
624
           test eax, eax
668
           jz .exit
625
           jz .exit
669
 
626
 
670
           mov eax, [pdir]
627
           mov eax, [pdir]
671
           and eax, 0xFFFFF000
628
           and eax, 0xFFFFF000
672
 
629
 
673
           stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
630
           stdcall map_page,[proc_mem_pdir],eax,dword PG_UW
674
           mov ebx, [ofs]
631
           mov ebx, [ofs]
675
           shr ebx, 22
632
           shr ebx, 22
676
           mov esi, [proc_mem_pdir]
633
           mov esi, [proc_mem_pdir]
677
           mov edi, [proc_mem_tab]
634
           mov edi, [proc_mem_tab]
678
           mov eax, [esi+ebx*4]
635
           mov eax, [esi+ebx*4]
679
           and eax, 0xFFFFF000
636
           and eax, 0xFFFFF000
680
           test eax, eax
637
           test eax, eax
681
           jz .exit
638
           jz .exit
682
           stdcall map_page,edi,eax,dword PG_UW
639
           stdcall map_page,edi,eax,dword PG_UW
683
 
640
 
684
@@:        mov edi, [lin_addr]
641
@@:        mov edi, [lin_addr]
685
           and edi, 0xFFFFF000
642
           and edi, 0xFFFFF000
686
           mov ecx, [buf_size]
643
           mov ecx, [buf_size]
687
           add ecx, 4095
644
           add ecx, 4095
688
           shr ecx, 12
645
           shr ecx, 12
689
           inc ecx
646
           inc ecx
690
 
647
 
691
           mov edx, [ofs]
648
           mov edx, [ofs]
692
           shr edx, 12
649
           shr edx, 12
693
           and edx, 0x3FF
650
           and edx, 0x3FF
694
           mov esi, [proc_mem_tab]
651
           mov esi, [proc_mem_tab]
695
 
652
 
696
.map:      mov eax, [esi+edx*4]
653
.map:      mov eax, [esi+edx*4]
697
;           and eax, 0xFFFFF000
654
;           and eax, 0xFFFFF000
698
;           test eax, eax
655
;           test eax, eax
699
;           jz .exit
656
;           jz .exit
700
           stdcall map_page,edi,eax,dword PG_UW
657
           stdcall map_page,edi,eax,dword PG_UW
701
           add edi, 0x1000
658
           add edi, 0x1000
702
           inc edx
659
           inc edx
703
           dec ecx
660
           dec ecx
704
           jnz .map
661
           jnz .map
705
.exit:
662
.exit:
706
           ret
663
           ret
707
endp
664
endp
708
 
665
 
709
 
666
 
710
 
667
 
711
 
668
 
712
sys_IPC:
669
sys_IPC:
713
;input:
670
;input:
714
;  eax=1 - set ipc buffer area
671
;  eax=1 - set ipc buffer area
715
;    ebx=address of buffer
672
;    ebx=address of buffer
716
;    ecx=size of buffer
673
;    ecx=size of buffer
717
;  eax=2 - send message
674
;  eax=2 - send message
718
;    ebx=PID
675
;    ebx=PID
719
;    ecx=address of message
676
;    ecx=address of message
720
;    edx=size of message
677
;    edx=size of message
721
 
678
 
722
           cmp  eax,1
679
           cmp  eax,1
723
           jne @f
680
           jne @f
724
           call set_ipc_buff
681
           call set_ipc_buff
725
           mov [esp+36], eax
682
           mov [esp+36], eax
726
           ret
683
           ret
727
@@:
684
@@:
728
           cmp eax, 2
685
           cmp eax, 2
729
           jne @f
686
           jne @f
730
           stdcall sys_ipc_send, ebx, ecx, edx
687
           stdcall sys_ipc_send, ebx, ecx, edx
731
           mov [esp+36], eax
688
           mov [esp+36], eax
732
           ret
689
           ret
733
@@:
690
@@:
734
           xor eax, eax
691
           xor eax, eax
735
           not eax
692
           not eax
736
           mov [esp+36], eax
693
           mov [esp+36], eax
737
           ret
694
           ret
738
 
695
 
739
align 4
696
align 4
740
proc set_ipc_buff
697
proc set_ipc_buff
741
 
698
 
742
           mov  eax,[current_slot]
699
           mov  eax,[current_slot]
743
           pushf
700
           pushf
744
           cli
701
           cli
745
           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
702
           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
746
           mov  [eax+APPDATA.ipc_size],ecx
703
           mov  [eax+APPDATA.ipc_size],ecx
747
 
704
 
748
           add ecx, ebx
705
           add ecx, ebx
749
           add ecx, 4095
706
           add ecx, 4095
750
           and ecx, not 4095
707
           and ecx, not 4095
751
 
708
 
752
.touch:    mov eax, [ebx]
709
.touch:    mov eax, [ebx]
753
           add ebx, 0x1000
710
           add ebx, 0x1000
754
           cmp ebx, ecx
711
           cmp ebx, ecx
755
           jb  .touch
712
           jb  .touch
756
 
713
 
757
           popf
714
           popf
758
           xor eax, eax
715
           xor eax, eax
759
           ret
716
           ret
760
endp
717
endp
761
 
718
 
762
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
719
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
763
           locals
720
           locals
764
             dst_slot   dd ?
721
             dst_slot   dd ?
765
             dst_offset dd ?
722
             dst_offset dd ?
766
             buf_size   dd ?
723
             buf_size   dd ?
767
             used_buf   dd ?
724
             used_buf   dd ?
768
           endl
725
           endl
769
 
726
 
770
           pushf
727
           pushf
771
           cli
728
           cli
772
 
729
 
773
           mov  eax, [PID]
730
           mov  eax, [PID]
774
           call pid_to_slot
731
           call pid_to_slot
775
           test eax,eax
732
           test eax,eax
776
           jz   .no_pid
733
           jz   .no_pid
777
 
734
 
778
           mov [dst_slot], eax
735
           mov [dst_slot], eax
779
           shl  eax,8
736
           shl  eax,8
780
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
737
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
781
           test edi,edi
738
           test edi,edi
782
           jz   .no_ipc_area
739
           jz   .no_ipc_area
783
 
740
 
784
           mov ebx, edi
741
           mov ebx, edi
785
           and ebx, 0xFFF
742
           and ebx, 0xFFF
786
           mov [dst_offset], ebx
743
           mov [dst_offset], ebx
787
 
744
 
788
           mov esi, [eax+SLOT_BASE+0xa4]
745
           mov esi, [eax+SLOT_BASE+0xa4]
789
           mov [buf_size], esi
746
           mov [buf_size], esi
790
 
747
 
791
           mov ecx, [ipc_tmp]
748
           mov ecx, [ipc_tmp]
792
           cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page
749
           cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page
793
           jbe @f
750
           jbe @f
794
           push eax
751
           push eax
795
           lea ecx, [esi+0x1000]
752
           lea ecx, [esi+0x1000]
796
           xor edx, edx
753
           xor edx, edx
797
           call @mem_alloc@8
754
           call @mem_alloc@8
798
           mov ecx, eax
755
           mov ecx, eax
799
           pop eax
756
           pop eax
800
@@:
757
@@:
801
           mov [used_buf], ecx
758
           mov [used_buf], ecx
802
           stdcall map_mem, ecx, [SLOT_BASE+eax+0xB8],\
759
           stdcall map_mem, ecx, [SLOT_BASE+eax+0xB8],\
803
                             edi, esi
760
                             edi, esi
804
 
761
 
805
           mov edi, [dst_offset]
762
           mov edi, [dst_offset]
806
           add edi, [used_buf]
763
           add edi, [used_buf]
807
           cmp dword [edi], 0
764
           cmp dword [edi], 0
808
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
765
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
809
 
766
 
810
           mov edx, dword [edi+4]
767
           mov edx, dword [edi+4]
811
           lea ebx, [edx+8]
768
           lea ebx, [edx+8]
812
           add ebx, [msg_size]
769
           add ebx, [msg_size]
813
           cmp ebx, [buf_size]
770
           cmp ebx, [buf_size]
814
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
771
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
815
 
772
 
816
           mov dword [edi+4], ebx
773
           mov dword [edi+4], ebx
817
           mov eax,[TASK_BASE]
774
           mov eax,[TASK_BASE]
818
           mov eax, [eax+0x04]         ;eax - our PID
775
           mov eax, [eax+0x04]         ;eax - our PID
819
           add edi, edx
776
           add edi, edx
820
           mov [edi], eax
777
           mov [edi], eax
821
           mov ecx, [msg_size]
778
           mov ecx, [msg_size]
822
 
779
 
823
           mov [edi+4], ecx
780
           mov [edi+4], ecx
824
           add edi, 8
781
           add edi, 8
825
           mov esi, [msg_addr]
782
           mov esi, [msg_addr]
826
           cld
783
           cld
827
           rep movsb
784
           rep movsb
828
 
785
 
829
           mov ebx, [ipc_tmp]
786
           mov ebx, [ipc_tmp]
830
           mov edx, ebx
787
           mov edx, ebx
831
           shr ebx, 12
788
           shr ebx, 12
832
           xor eax, eax
789
           xor eax, eax
833
           mov [page_tabs+ebx*4], eax
790
           mov [page_tabs+ebx*4], eax
834
           invlpg [edx]
791
           invlpg [edx]
835
 
792
 
836
           mov ebx, [ipc_pdir]
793
           mov ebx, [ipc_pdir]
837
           mov edx, ebx
794
           mov edx, ebx
838
           shr ebx, 12
795
           shr ebx, 12
839
           xor eax, eax
796
           xor eax, eax
840
           mov [page_tabs+ebx*4], eax
797
           mov [page_tabs+ebx*4], eax
841
           invlpg [edx]
798
           invlpg [edx]
842
 
799
 
843
           mov ebx, [ipc_ptab]
800
           mov ebx, [ipc_ptab]
844
           mov edx, ebx
801
           mov edx, ebx
845
           shr ebx, 12
802
           shr ebx, 12
846
           xor eax, eax
803
           xor eax, eax
847
           mov [page_tabs+ebx*4], eax
804
           mov [page_tabs+ebx*4], eax
848
           invlpg [edx]
805
           invlpg [edx]
849
 
806
 
850
           mov  eax, [dst_slot]
807
           mov  eax, [dst_slot]
851
           shl eax, 8
808
           shl eax, 8
852
           or   [eax+SLOT_BASE+0xA8],dword 0x40
809
           or   [eax+SLOT_BASE+0xA8],dword 0x40
853
           cmp  dword [check_idle_semaphore],20
810
           cmp  dword [check_idle_semaphore],20
854
           jge  .ipc_no_cis
811
           jge  .ipc_no_cis
855
 
812
 
856
           mov  dword [check_idle_semaphore],5
813
           mov  dword [check_idle_semaphore],5
857
.ipc_no_cis:
814
.ipc_no_cis:
858
           push 0
815
           push 0
859
           jmp .ret
816
           jmp .ret
860
.no_pid:
817
.no_pid:
861
           popf
818
           popf
862
           mov eax, 4
819
           mov eax, 4
863
           ret
820
           ret
864
.no_ipc_area:
821
.no_ipc_area:
865
           popf
822
           popf
866
           xor eax, eax
823
           xor eax, eax
867
           inc eax
824
           inc eax
868
           ret
825
           ret
869
.ipc_blocked:
826
.ipc_blocked:
870
           push 2
827
           push 2
871
           jmp .ret
828
           jmp .ret
872
.buffer_overflow:
829
.buffer_overflow:
873
           push 3
830
           push 3
874
.ret:
831
.ret:
875
           mov ecx, [used_buf]
832
           mov ecx, [used_buf]
876
           cmp ecx, [ipc_tmp]
833
           cmp ecx, [ipc_tmp]
877
           jz @f
834
           jz @f
878
 
835
 
879
           call @mem_free@4
836
           call @mem_free@4
880
@@:
837
@@:
881
           pop eax
838
           pop eax
882
           popf
839
           popf
883
           ret
840
           ret
884
endp
841
endp
885
 
842
 
886
align 4
843
align 4
887
sysfn_meminfo:
844
sysfn_meminfo:
888
 
845
 
889
        ;   add ebx, new_app_base
846
        ;   add ebx, new_app_base
890
           cmp ebx, OS_BASE
847
           cmp ebx, OS_BASE
891
           jae .fail
848
           jae .fail
892
 
849
 
893
           mov eax, [_mem_amount]
850
           mov eax, [_mem_amount]
894
           shr eax, 12
851
           shr eax, 12
895
           mov [ebx], eax
852
           mov [ebx], eax
896
           shl eax, 12
853
           shl eax, 12
897
           mov [esp+36], eax
854
           mov [esp+36], eax
898
           call _get_free_mem
855
           call _get_free_mem
899
           mov [ebx+4], eax
856
           mov [ebx+4], eax
900
           mov edx, [pg_data.pages_faults]
857
           mov edx, [pg_data.pages_faults]
901
           mov [ebx+8], edx
858
           mov [ebx+8], edx
902
           mov esi, [heap_size]
859
           mov esi, [heap_size]
903
           mov [ebx+12], esi
860
           mov [ebx+12], esi
904
           mov edi, [heap_free]
861
           mov edi, [heap_free]
905
           mov [ebx+16], edi
862
           mov [ebx+16], edi
906
           mov eax, [heap_blocks]
863
           mov eax, [heap_blocks]
907
           mov [ebx+20], eax
864
           mov [ebx+20], eax
908
           mov ecx, [free_blocks]
865
           mov ecx, [free_blocks]
909
           mov [ebx+24], ecx
866
           mov [ebx+24], ecx
910
           ret
867
           ret
911
.fail:
868
.fail:
912
           mov dword [esp+36], -1
869
           mov dword [esp+36], -1
913
           ret
870
           ret
914
 
871
 
915
align 4
872
align 4
916
new_services:
873
new_services:
917
 
874
 
918
           cmp  eax,4
875
           cmp  eax,4
919
           jle  sys_sheduler
876
           jle  sys_sheduler
920
 
877
 
921
           cmp eax, 11
878
           cmp eax, 11
922
           jb .fail
879
           jb .fail
923
           ja @f
880
           ja @f
924
 
881
 
925
           call init_heap
882
           call init_heap
926
           mov [esp+36], eax
883
           mov [esp+36], eax
927
           ret
884
           ret
928
@@:
885
@@:
929
           cmp eax, 12
886
           cmp eax, 12
930
           ja @f
887
           ja @f
931
 
888
 
932
           stdcall user_alloc, ebx
889
           stdcall user_alloc, ebx
933
           mov [esp+36], eax
890
           mov [esp+36], eax
934
           ret
891
           ret
935
@@:
892
@@:
936
           cmp eax, 13
893
           cmp eax, 13
937
           ja @f
894
           ja @f
938
           stdcall user_free, ebx
895
           stdcall user_free, ebx
939
           mov [esp+36], eax
896
           mov [esp+36], eax
940
           ret
897
           ret
941
@@:
898
@@:
942
           cmp eax, 14
899
           cmp eax, 14
943
           ja @f
900
           ja @f
944
           cmp ebx, OS_BASE
901
           cmp ebx, OS_BASE
945
           jae .fail
902
           jae .fail
946
           stdcall get_event_ex, ebx, ecx
903
           stdcall get_event_ex, ebx, ecx
947
           mov [esp+36], eax
904
           mov [esp+36], eax
948
           ret
905
           ret
949
@@:
906
@@:
950
           cmp eax, 15
907
           cmp eax, 15
951
           ja @f
908
           ja @f
952
           mov ecx, [current_slot]
909
           mov ecx, [current_slot]
953
           mov eax, [ecx+APPDATA.fpu_handler]
910
           mov eax, [ecx+APPDATA.fpu_handler]
954
           mov [ecx+APPDATA.fpu_handler], ebx
911
           mov [ecx+APPDATA.fpu_handler], ebx
955
           mov [esp+36], eax
912
           mov [esp+36], eax
956
           ret
913
           ret
957
@@:
914
@@:
958
           cmp eax, 16
915
           cmp eax, 16
959
           ja @f
916
           ja @f
960
 
917
 
961
           test ebx, ebx
918
           test ebx, ebx
962
           jz .fail
919
           jz .fail
963
           cmp ebx, OS_BASE
920
           cmp ebx, OS_BASE
964
           jae .fail
921
           jae .fail
965
           stdcall get_service, ebx
922
           stdcall get_service, ebx
966
           mov [esp+36], eax
923
           mov [esp+36], eax
967
           ret
924
           ret
968
@@:
925
@@:
969
           cmp eax, 17
926
           cmp eax, 17
970
           ja @f
927
           ja @f
971
           call srv_handlerEx   ;ebx
928
           call srv_handlerEx   ;ebx
972
           mov [esp+36], eax
929
           mov [esp+36], eax
973
           ret
930
           ret
974
@@:
931
@@:
975
           cmp eax, 18
932
           cmp eax, 18
976
           ja @f
933
           ja @f
977
           mov ecx, [current_slot]
934
           mov ecx, [current_slot]
978
           mov eax, [ecx+APPDATA.sse_handler]
935
           mov eax, [ecx+APPDATA.sse_handler]
979
           mov [ecx+APPDATA.sse_handler], ebx
936
           mov [ecx+APPDATA.sse_handler], ebx
980
           mov [esp+36], eax
937
           mov [esp+36], eax
981
           ret
938
           ret
982
@@:
939
@@:
983
           cmp eax, 19
940
           cmp eax, 19
984
           ja @f
941
           ja @f
985
           cmp ebx, OS_BASE
942
           cmp ebx, OS_BASE
986
           jae .fail
943
           jae .fail
987
           stdcall load_library, ebx
944
           stdcall load_library, ebx
988
           mov [esp+36], eax
945
           mov [esp+36], eax
989
           ret
946
           ret
990
@@:
947
@@:
991
           cmp     eax, 20
948
           cmp     eax, 20
992
           ja      @F
949
           ja      @F
993
           mov     eax, ecx
950
           mov     eax, ecx
994
           call    user_realloc
951
           call    user_realloc
995
           mov     [esp+36], eax
952
           mov     [esp+36], eax
996
           ret
953
           ret
997
@@:
954
@@:
998
           cmp eax, 21                     ;for test purposes only
955
           cmp eax, 21                     ;for test purposes only
999
           ja @f                           ;will be removed soon
956
           ja .fail                        ;will be removed soon
1000
           cmp ebx, OS_BASE
957
           cmp ebx, OS_BASE
1001
           jae .fail
958
           jae .fail
1002
 
959
 
1003
           mov ecx, ebx
960
           mov ecx, ebx
1004
           call @load_pe_driver@4
961
           call @load_pe_driver@4
1005
           mov [esp+36], eax
962
           mov [esp+36], eax
1006
           ret
963
           ret
1007
 
964
 
1008
.fail:
965
.fail:
1009
           xor eax, eax
966
           xor eax, eax
1010
           mov [esp+36], eax
967
           mov [esp+36], eax
1011
           ret
968
           ret
1012
 
969
 
1013
align 4
970
align 4
1014
proc init_mtrr
971
proc init_mtrr
1015
 
972
 
1016
           cmp [BOOT_VAR+0x901c],byte 2
973
           cmp [BOOT_VAR+0x901c],byte 2
1017
           je  .exit
974
           je  .exit
1018
 
975
 
1019
           bt [cpu_caps], CAPS_MTRR
976
           bt [cpu_caps], CAPS_MTRR
1020
           jnc .exit
977
           jnc .exit
1021
 
978
 
1022
           mov eax, cr0
979
           mov eax, cr0
1023
           or eax, 0x60000000   ;disable caching
980
           or eax, 0x60000000   ;disable caching
1024
           mov cr0, eax
981
           mov cr0, eax
1025
           wbinvd               ;invalidate cache
982
           wbinvd               ;invalidate cache
1026
 
983
 
1027
           mov ecx, 0x2FF
984
           mov ecx, 0x2FF
1028
           rdmsr                ;
985
           rdmsr                ;
1029
           push eax
986
           push eax
1030
 
987
 
1031
           xor edx, edx
988
           xor edx, edx
1032
           xor eax, eax
989
           xor eax, eax
1033
           mov ecx, 0x2FF
990
           mov ecx, 0x2FF
1034
           wrmsr                ;disable all MTRR
991
           wrmsr                ;disable all MTRR
1035
 
992
 
1036
           mov eax, [_mem_amount]
993
           mov eax, [_mem_amount]
1037
; round eax up to next power of 2
994
; round eax up to next power of 2
1038
           dec eax
995
           dec eax
1039
           bsr ecx, eax
996
           bsr ecx, eax
1040
           mov eax, 2
997
           mov eax, 2
1041
           shl eax, cl
998
           shl eax, cl
1042
           stdcall set_mtrr, edx,edx,eax,MEM_WB
999
           stdcall set_mtrr, edx,edx,eax,MEM_WB
1043
           stdcall set_mtrr, 1,[LFBAddress],[LFBSize],MEM_WC
1000
           stdcall set_mtrr, 1,[LFBAddress],[LFBSize],MEM_WC
1044
           xor edx, edx
1001
           xor edx, edx
1045
           xor eax, eax
1002
           xor eax, eax
1046
           mov ecx, 0x204
1003
           mov ecx, 0x204
1047
           mov ebx, 6
1004
           mov ebx, 6
1048
@@:
1005
@@:
1049
           wrmsr                ;disable unused MTRR
1006
           wrmsr                ;disable unused MTRR
1050
           inc ecx
1007
           inc ecx
1051
           wrmsr
1008
           wrmsr
1052
           inc ecx
1009
           inc ecx
1053
           dec ebx
1010
           dec ebx
1054
           jnz @b
1011
           jnz @b
1055
 
1012
 
1056
           wbinvd               ;again invalidate
1013
           wbinvd               ;again invalidate
1057
 
1014
 
1058
           pop eax
1015
           pop eax
1059
           or eax, 0x800        ;set default memtype to UC
1016
           or eax, 0x800        ;set default memtype to UC
1060
           and al, 0xF0
1017
           and al, 0xF0
1061
           mov ecx, 0x2FF
1018
           mov ecx, 0x2FF
1062
           wrmsr                ;and enable MTRR
1019
           wrmsr                ;and enable MTRR
1063
 
1020
 
1064
           mov eax, cr0
1021
           mov eax, cr0
1065
           and eax, not 0x60000000
1022
           and eax, not 0x60000000
1066
           mov cr0, eax         ; enable caching
1023
           mov cr0, eax         ; enable caching
1067
.exit:
1024
.exit:
1068
           ret
1025
           ret
1069
endp
1026
endp
1070
 
1027
 
1071
align 4
1028
align 4
1072
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1029
proc set_mtrr stdcall, reg:dword,base:dword,size:dword,mem_type:dword
1073
 
1030
 
1074
           xor edx, edx
1031
           xor edx, edx
1075
           mov eax, [base]
1032
           mov eax, [base]
1076
           or eax, [mem_type]
1033
           or eax, [mem_type]
1077
           mov ecx, [reg]
1034
           mov ecx, [reg]
1078
           lea ecx, [0x200+ecx*2]
1035
           lea ecx, [0x200+ecx*2]
1079
           wrmsr
1036
           wrmsr
1080
 
1037
 
1081
           mov ebx, [size]
1038
           mov ebx, [size]
1082
           dec ebx
1039
           dec ebx
1083
           mov eax, 0xFFFFFFFF
1040
           mov eax, 0xFFFFFFFF
1084
           mov edx, 0x0000000F
1041
           mov edx, 0x0000000F
1085
           sub eax, ebx
1042
           sub eax, ebx
1086
           sbb edx, 0
1043
           sbb edx, 0
1087
           or eax, 0x800
1044
           or eax, 0x800
1088
           inc ecx
1045
           inc ecx
1089
           wrmsr
1046
           wrmsr
1090
           ret
1047
           ret
1091
endp
1048
endp
1092
 
1049
 
1093
align 4
1050
align 4
1094
proc stall stdcall, delay:dword
1051
proc stall stdcall, delay:dword
1095
           push ecx
1052
           push ecx
1096
           push edx
1053
           push edx
1097
           push ebx
1054
           push ebx
1098
           push eax
1055
           push eax
1099
 
1056
 
1100
           mov eax, [delay]
1057
           mov eax, [delay]
1101
           mul [stall_mcs]
1058
           mul [stall_mcs]
1102
           mov ebx, eax       ;low
1059
           mov ebx, eax       ;low
1103
           mov ecx, edx       ;high
1060
           mov ecx, edx       ;high
1104
           rdtsc
1061
           rdtsc
1105
           add ebx, eax
1062
           add ebx, eax
1106
           adc ecx,edx
1063
           adc ecx,edx
1107
@@:
1064
@@:
1108
           rdtsc
1065
           rdtsc
1109
           sub eax, ebx
1066
           sub eax, ebx
1110
           sbb edx, ecx
1067
           sbb edx, ecx
1111
           jb @B
1068
           jb @B
1112
 
1069
 
1113
           pop eax
1070
           pop eax
1114
           pop ebx
1071
           pop ebx
1115
           pop edx
1072
           pop edx
1116
           pop ecx
1073
           pop ecx
1117
           ret
1074
           ret
1118
endp
1075
endp
1119
 
1076
 
1120
align 4
1077
align 4
1121
_CreateRingBuffer:
1078
_CreateRingBuffer:
1122
proc create_ring_buffer stdcall, size:dword, flags:dword
1079
proc create_ring_buffer stdcall, size:dword, flags:dword
1123
           locals
1080
           locals
1124
             buf_ptr  dd ?
1081
             buf_ptr  dd ?
1125
           endl
1082
           endl
1126
 
1083
 
1127
           mov ecx, [size]
1084
           mov ecx, [size]
1128
           test ecx, 4095
1085
           test ecx, 4095
1129
           jnz .fail
1086
           jnz .fail
1130
 
1087
 
1131
           add ecx, ecx
1088
           add ecx, ecx
1132
           xor edx, edx
1089
           xor edx, edx
1133
           call @mem_alloc@8
1090
           call @mem_alloc@8
1134
           test eax, eax
1091
           test eax, eax
1135
           mov [buf_ptr], eax
1092
           mov [buf_ptr], eax
1136
           jz .fail
1093
           jz .fail
1137
 
1094
 
1138
           push ebx
1095
           push ebx
1139
 
1096
 
1140
           xor ecx, ecx
1097
           xor ecx, ecx
1141
           mov edx, [size]
1098
           mov edx, [size]
1142
           shr edx, 12
1099
           shr edx, 12
1143
           mov ebx, edx
1100
           mov ebx, edx
1144
           dec edx
1101
           dec edx
1145
           bsr ecx, edx
1102
           bsr ecx, edx
1146
           inc ecx
1103
           inc ecx
1147
 
1104
 
1148
           call @core_alloc@4
1105
           call @core_alloc@4
1149
           test eax, eax
1106
           test eax, eax
1150
           jz .mm_fail
1107
           jz .mm_fail
1151
 
1108
 
1152
           or eax,  [flags]
1109
           or eax,  [flags]
1153
           mov edx, [buf_ptr]
1110
           mov edx, [buf_ptr]
1154
           lea ecx, [ebx*4]
1111
           lea ecx, [ebx*4]
1155
           shr edx, 10
1112
           shr edx, 10
1156
@@:
1113
@@:
1157
           mov [page_tabs+edx], eax
1114
           mov [page_tabs+edx], eax
1158
           mov [page_tabs+edx+ecx], eax
1115
           mov [page_tabs+edx+ecx], eax
1159
           add eax, 0x1000
1116
           add eax, 0x1000
1160
           add edx, 4
1117
           add edx, 4
1161
           dec ebx
1118
           dec ebx
1162
           jnz @B
1119
           jnz @B
1163
 
1120
 
1164
           mov eax, [buf_ptr]
1121
           mov eax, [buf_ptr]
1165
           pop ebx
1122
           pop ebx
1166
           ret
1123
           ret
1167
.mm_fail:
1124
.mm_fail:
1168
           mov ecx, [buf_ptr]
1125
           mov ecx, [buf_ptr]
1169
           call @mem_free@4
1126
           call @mem_free@4
1170
           pop ebx
1127
           pop ebx
1171
           xor eax, eax
1128
           xor eax, eax
1172
.fail:
1129
.fail:
1173
           ret
1130
           ret
1174
endp
1131
endp
1175
 
1132
 
1176
 
1133
 
1177
align 4
1134
align 4
1178
_balloc:   ; gcc fastcall
1135
_balloc:   ; gcc fastcall
1179
@balloc@4:
1136
@balloc@4:
1180
 
-
 
1181
 
1137
 
1182
           mov eax, [_pg_balloc]
1138
           mov eax, [_pg_balloc]
1183
           add ecx, 4095
1139
           add ecx, 4095
1184
           and ecx, -4096
1140
           and ecx, -4096
1185
           add ecx, eax
1141
           add ecx, eax
1186
           mov [_pg_balloc], ecx
1142
           mov [_pg_balloc], ecx
1187
           add eax, OS_BASE
1143
           add eax, OS_BASE
1188
           ret
1144
           ret