Subversion Repositories Kolibri OS

Rev

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

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