Subversion Repositories Kolibri OS

Rev

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

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