Subversion Repositories Kolibri OS

Rev

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

Rev 1517 Rev 1629
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 1517 $
8
$Revision: 1629 $
9
 
9
 
10
 
10
 
11
align 4
11
align 4
12
proc alloc_page
12
proc alloc_page
13
 
13
 
14
           pushfd
14
           pushfd
15
           cli
15
           cli
16
           push ebx
16
           push ebx
17
;//-
17
;//-
18
	   cmp [pg_data.pages_free], 1
18
	   cmp [pg_data.pages_free], 1
19
	   jle .out_of_memory
19
	   jle .out_of_memory
20
;//-
20
;//-
21
 
21
 
22
           mov ebx, [page_start]
22
           mov ebx, [page_start]
23
           mov ecx, [page_end]
23
           mov ecx, [page_end]
24
.l1:
24
.l1:
25
           bsf eax,[ebx];
25
           bsf eax,[ebx];
26
           jnz .found
26
           jnz .found
27
           add ebx,4
27
           add ebx,4
28
           cmp ebx, ecx
28
           cmp ebx, ecx
29
           jb .l1
29
           jb .l1
30
           pop ebx
30
           pop ebx
31
           popfd
31
           popfd
32
           xor eax,eax
32
           xor eax,eax
33
           ret
33
           ret
34
.found:
34
.found:
35
;//-              
35
;//-
36
	   dec [pg_data.pages_free]
36
	   dec [pg_data.pages_free]
37
	   jz .out_of_memory
37
	   jz .out_of_memory
38
;//-
38
;//-
39
           btr [ebx], eax
39
           btr [ebx], eax
40
           mov [page_start],ebx
40
           mov [page_start],ebx
41
           sub ebx, sys_pgmap
41
           sub ebx, sys_pgmap
42
           lea eax, [eax+ebx*8]
42
           lea eax, [eax+ebx*8]
43
           shl eax, 12
43
           shl eax, 12
44
;//-       dec [pg_data.pages_free]
44
;//-       dec [pg_data.pages_free]
45
           pop ebx
45
           pop ebx
46
           popfd
46
           popfd
47
           ret
47
           ret
48
;//-
48
;//-
49
.out_of_memory:
49
.out_of_memory:
50
 	   mov [pg_data.pages_free], 1
50
 	   mov [pg_data.pages_free], 1
51
	   xor eax, eax
51
	   xor eax, eax
52
	   pop ebx
52
	   pop ebx
53
	   popfd
53
	   popfd
54
	   ret
54
	   ret
55
;//-
55
;//-
56
endp
56
endp
57
 
57
 
58
align 4
58
align 4
59
proc alloc_pages stdcall, count:dword
59
proc alloc_pages stdcall, count:dword
60
           pushfd
60
           pushfd
61
           push ebx
61
           push ebx
62
           push edi
62
           push edi
63
           cli
63
           cli
64
           mov eax, [count]
64
           mov eax, [count]
65
           add eax, 7
65
           add eax, 7
66
           shr eax, 3
66
           shr eax, 3
67
           mov [count], eax
67
           mov [count], eax
68
;//-
68
;//-
69
           mov ebx, [pg_data.pages_free]
69
           mov ebx, [pg_data.pages_free]
70
           sub  ebx, 9
70
           sub  ebx, 9
71
           js .out_of_memory
71
           js .out_of_memory
72
           shr   ebx, 3
72
           shr   ebx, 3
73
           cmp eax, ebx
73
           cmp eax, ebx
74
           jg .out_of_memory
74
           jg .out_of_memory
75
;//-
75
;//-
76
           mov ecx, [page_start]
76
           mov ecx, [page_start]
77
           mov ebx, [page_end]
77
           mov ebx, [page_end]
78
.find:
78
.find:
79
           mov edx, [count]
79
           mov edx, [count]
80
           mov edi, ecx
80
           mov edi, ecx
81
.match:
81
.match:
82
           cmp byte [ecx], 0xFF
82
           cmp byte [ecx], 0xFF
83
           jne .next
83
           jne .next
84
           dec edx
84
           dec edx
85
           jz .ok
85
           jz .ok
86
           inc ecx
86
           inc ecx
87
           cmp ecx,ebx
87
           cmp ecx,ebx
88
           jb .match
88
           jb .match
89
.out_of_memory:
89
.out_of_memory:
90
.fail:
90
.fail:
91
           xor eax, eax
91
           xor eax, eax
92
           pop edi
92
           pop edi
93
           pop ebx
93
           pop ebx
94
           popfd
94
           popfd
95
           ret
95
           ret
96
.next:
96
.next:
97
           inc ecx
97
           inc ecx
98
           cmp ecx, ebx
98
           cmp ecx, ebx
99
           jb .find
99
           jb .find
100
           pop edi
100
           pop edi
101
           pop ebx
101
           pop ebx
102
           popfd
102
           popfd
103
           xor eax, eax
103
           xor eax, eax
104
           ret
104
           ret
105
.ok:
105
.ok:
106
           sub ecx, edi
106
           sub ecx, edi
107
           inc ecx
107
           inc ecx
108
           push esi
108
           push esi
109
           mov esi, edi
109
           mov esi, edi
110
           xor eax, eax
110
           xor eax, eax
111
           rep stosb
111
           rep stosb
112
           sub esi, sys_pgmap
112
           sub esi, sys_pgmap
113
           shl esi, 3+12
113
           shl esi, 3+12
114
           mov eax, esi
114
           mov eax, esi
115
           mov ebx, [count]
115
           mov ebx, [count]
116
           shl ebx, 3
116
           shl ebx, 3
117
           sub [pg_data.pages_free], ebx
117
           sub [pg_data.pages_free], ebx
118
           pop esi
118
           pop esi
119
           pop edi
119
           pop edi
120
           pop ebx
120
           pop ebx
121
           popfd
121
           popfd
122
           ret
122
           ret
123
endp
123
endp
124
 
124
 
125
align 4
125
align 4
126
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
126
proc map_page stdcall,lin_addr:dword,phis_addr:dword,flags:dword
127
           push ebx
127
           push ebx
128
           mov eax, [phis_addr]
128
           mov eax, [phis_addr]
129
           and eax, not 0xFFF
129
           and eax, not 0xFFF
130
           or eax, [flags]
130
           or eax, [flags]
131
           mov ebx, [lin_addr]
131
           mov ebx, [lin_addr]
132
           shr ebx, 12
132
           shr ebx, 12
133
           mov [page_tabs+ebx*4], eax
133
           mov [page_tabs+ebx*4], eax
134
           mov eax, [lin_addr]
134
           mov eax, [lin_addr]
135
           invlpg [eax]
135
           invlpg [eax]
136
           pop ebx
136
           pop ebx
137
           ret
137
           ret
138
endp
138
endp
139
 
139
 
140
align 4
140
align 4
141
map_space:    ;not implemented
141
map_space:    ;not implemented
142
 
142
 
143
 
143
 
144
           ret
144
           ret
145
 
145
 
146
 
146
 
147
align 4
147
align 4
148
proc free_page
148
proc free_page
149
;arg:  eax  page address
149
;arg:  eax  page address
150
           pushfd
150
           pushfd
151
           cli
151
           cli
152
           shr eax, 12                        ;page index
152
           shr eax, 12                        ;page index
153
           bts dword [sys_pgmap], eax         ;that's all!
153
           bts dword [sys_pgmap], eax         ;that's all!
154
           cmc
154
           cmc
155
           adc [pg_data.pages_free], 0
155
           adc [pg_data.pages_free], 0
156
           shr eax, 3
156
           shr eax, 3
157
           and eax, not 3                     ;dword offset from page_map
157
           and eax, not 3                     ;dword offset from page_map
158
           add eax, sys_pgmap
158
           add eax, sys_pgmap
159
           cmp [page_start], eax
159
           cmp [page_start], eax
160
           ja @f
160
           ja @f
161
           popfd
161
           popfd
162
           ret
162
           ret
163
@@:
163
@@:
164
           mov [page_start], eax
164
           mov [page_start], eax
165
           popfd
165
           popfd
166
           ret
166
           ret
167
endp
167
endp
168
 
168
 
169
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
169
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
170
 
170
 
171
           push ebx
171
           push ebx
172
           push edi
172
           push edi
173
           mov eax, [size]
173
           mov eax, [size]
174
           add eax, 4095
174
           add eax, 4095
175
           and eax, -4096
175
           and eax, -4096
176
           mov [size], eax
176
           mov [size], eax
177
           stdcall alloc_kernel_space, eax
177
           stdcall alloc_kernel_space, eax
178
           test eax, eax
178
           test eax, eax
179
           jz .fail
179
           jz .fail
180
           push eax
180
           push eax
181
 
181
 
182
           mov edi, 0x1000
182
           mov edi, 0x1000
183
           mov ebx, eax
183
           mov ebx, eax
184
           mov ecx,[size]
184
           mov ecx,[size]
185
           mov edx, [base]
185
           mov edx, [base]
186
           shr eax, 12
186
           shr eax, 12
187
           shr ecx, 12
187
           shr ecx, 12
188
           and edx, -4096
188
           and edx, -4096
189
           or edx, [flags]
189
           or edx, [flags]
190
@@:
190
@@:
191
           mov [page_tabs+eax*4], edx
191
           mov [page_tabs+eax*4], edx
192
          ; push eax
192
          ; push eax
193
           invlpg [ebx]
193
           invlpg [ebx]
194
          ; pop eax
194
          ; pop eax
195
           inc eax
195
           inc eax
196
           add ebx, edi
196
           add ebx, edi
197
           add edx, edi
197
           add edx, edi
198
           loop @B
198
           loop @B
199
 
199
 
200
           pop eax
200
           pop eax
201
           mov edx, [base]
201
           mov edx, [base]
202
           and edx, 4095
202
           and edx, 4095
203
           add eax, edx
203
           add eax, edx
204
.fail:
204
.fail:
205
           pop edi
205
           pop edi
206
           pop ebx
206
           pop ebx
207
           ret
207
           ret
208
endp
208
endp
209
 
209
 
210
; param
210
; param
211
;  eax= page base + page flags
211
;  eax= page base + page flags
212
;  ebx= linear address
212
;  ebx= linear address
213
;  ecx= count
213
;  ecx= count
214
 
214
 
215
align 4
215
align 4
216
commit_pages:
216
commit_pages:
217
           push edi
217
           push edi
218
           test ecx, ecx
218
           test ecx, ecx
219
           jz .fail
219
           jz .fail
220
 
220
 
221
           mov edi, ebx
221
           mov edi, ebx
222
           mov ebx, pg_data.pg_mutex
222
           mov ebx, pg_data.pg_mutex
223
           call wait_mutex      ;ebx
223
           call wait_mutex      ;ebx
224
 
224
 
225
           mov edx, 0x1000
225
           mov edx, 0x1000
226
           mov ebx, edi
226
           mov ebx, edi
227
           shr ebx, 12
227
           shr ebx, 12
228
@@:
228
@@:
229
           mov [page_tabs+ebx*4], eax
229
           mov [page_tabs+ebx*4], eax
230
          ; push eax
230
          ; push eax
231
           invlpg [edi]
231
           invlpg [edi]
232
          ; pop eax
232
          ; pop eax
233
           add edi, edx
233
           add edi, edx
234
           add eax, edx
234
           add eax, edx
235
           inc ebx
235
           inc ebx
236
           dec ecx
236
           dec ecx
237
           jnz @B
237
           jnz @B
238
           mov [pg_data.pg_mutex],ecx
238
           mov [pg_data.pg_mutex],ecx
239
.fail:
239
.fail:
240
           pop edi
240
           pop edi
241
           ret
241
           ret
242
 
242
 
243
 
243
 
244
; param
244
; param
245
;  eax= base
245
;  eax= base
246
;  ecx= count
246
;  ecx= count
247
 
247
 
248
align 4
248
align 4
249
release_pages:
249
release_pages:
250
 
250
 
251
           pushad
251
           pushad
252
           mov ebx, pg_data.pg_mutex
252
           mov ebx, pg_data.pg_mutex
253
           call wait_mutex      ;ebx
253
           call wait_mutex      ;ebx
254
 
254
 
255
           mov esi, eax
255
           mov esi, eax
256
           mov edi, eax
256
           mov edi, eax
257
 
257
 
258
           shr esi, 10
258
           shr esi, 10
259
           add esi, page_tabs
259
           add esi, page_tabs
260
 
260
 
261
           mov ebp, [pg_data.pages_free]
261
           mov ebp, [pg_data.pages_free]
262
           mov ebx, [page_start]
262
           mov ebx, [page_start]
263
           mov edx, sys_pgmap
263
           mov edx, sys_pgmap
264
@@:
264
@@:
265
           xor eax, eax
265
           xor eax, eax
266
           xchg eax, [esi]
266
           xchg eax, [esi]
267
           push eax
267
           push eax
268
           invlpg [edi]
268
           invlpg [edi]
269
           pop eax
269
           pop eax
270
 
270
 
271
           test eax, 1
271
           test eax, 1
272
           jz .next
272
           jz .next
273
 
273
 
274
           shr eax, 12
274
           shr eax, 12
275
           bts [edx], eax
275
           bts [edx], eax
276
           cmc
276
           cmc
277
           adc ebp, 0
277
           adc ebp, 0
278
           shr eax, 3
278
           shr eax, 3
279
           and eax, -4
279
           and eax, -4
280
           add eax, edx
280
           add eax, edx
281
           cmp eax, ebx
281
           cmp eax, ebx
282
           jae .next
282
           jae .next
283
 
283
 
284
           mov ebx, eax
284
           mov ebx, eax
285
.next:
285
.next:
286
           add edi, 0x1000
286
           add edi, 0x1000
287
           add esi, 4
287
           add esi, 4
288
           dec ecx
288
           dec ecx
289
           jnz @B
289
           jnz @B
290
           mov [pg_data.pages_free], ebp
290
           mov [pg_data.pages_free], ebp
291
           and [pg_data.pg_mutex],0
291
           and [pg_data.pg_mutex],0
292
           popad
292
           popad
293
           ret
293
           ret
294
 
294
 
295
; param
295
; param
296
;  eax= base
296
;  eax= base
297
;  ecx= count
297
;  ecx= count
298
 
298
 
299
align 4
299
align 4
300
unmap_pages:
300
unmap_pages:
301
 
301
 
302
           push edi
302
           push edi
303
 
303
 
304
           mov edi, eax
304
           mov edi, eax
305
           mov edx, eax
305
           mov edx, eax
306
 
306
 
307
           shr edi, 10
307
           shr edi, 10
308
           add edi, page_tabs
308
           add edi, page_tabs
309
 
309
 
310
           xor eax, eax
310
           xor eax, eax
311
@@:
311
@@:
312
           stosd
312
           stosd
313
           invlpg [edx]
313
           invlpg [edx]
314
           add edx, 0x1000
314
           add edx, 0x1000
315
           loop @b
315
           loop @b
316
 
316
 
317
           pop edi
317
           pop edi
318
           ret
318
           ret
319
 
319
 
320
 
320
 
321
align 4
321
align 4
322
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
322
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
323
           push ebx
323
           push ebx
324
           mov ebx, [lin_addr]
324
           mov ebx, [lin_addr]
325
           shr ebx, 22
325
           shr ebx, 22
326
           mov eax, [phis_addr]
326
           mov eax, [phis_addr]
327
           and eax, not 0xFFF
327
           and eax, not 0xFFF
328
           or eax, PG_UW          ;+PG_NOCACHE
328
           or eax, PG_UW          ;+PG_NOCACHE
329
           mov dword [master_tab+ebx*4], eax
329
           mov dword [master_tab+ebx*4], eax
330
           mov eax, [lin_addr]
330
           mov eax, [lin_addr]
331
           shr eax, 10
331
           shr eax, 10
332
           add eax, page_tabs
332
           add eax, page_tabs
333
           invlpg [eax]
333
           invlpg [eax]
334
           pop ebx
334
           pop ebx
335
           ret
335
           ret
336
endp
336
endp
337
 
337
 
338
align 4
338
align 4
339
proc init_LFB
339
proc init_LFB
340
           locals
340
           locals
341
             pg_count dd ?
341
             pg_count dd ?
342
           endl
342
           endl
343
 
343
 
344
           cmp dword [LFBAddress], -1
344
           cmp dword [LFBAddress], -1
345
           jne @f
345
           jne @f
346
           mov [BOOT_VAR+0x901c],byte 2
346
           mov [BOOT_VAR+0x901c],byte 2
347
           stdcall alloc_pages, (0x280000 / 4096)
347
           stdcall alloc_pages, (0x280000 / 4096)
348
 
348
 
349
           push eax
349
           push eax
350
           call alloc_page
350
           call alloc_page
351
           stdcall map_page_table, LFB_BASE, eax
351
           stdcall map_page_table, LFB_BASE, eax
352
           pop eax
352
           pop eax
353
           or eax, PG_UW
353
           or eax, PG_UW
354
           mov ebx, LFB_BASE
354
           mov ebx, LFB_BASE
355
           mov ecx, 0x280000 / 4096
355
           mov ecx, 0x280000 / 4096
356
           call commit_pages
356
           call commit_pages
357
           mov [LFBAddress], dword LFB_BASE
357
           mov [LFBAddress], dword LFB_BASE
358
           ret
358
           ret
359
@@:
359
@@:
360
           test [SCR_MODE],word 0100000000000000b
360
           test [SCR_MODE],word 0100000000000000b
361
           jnz @f
361
           jnz @f
362
           mov [BOOT_VAR+0x901c],byte 2
362
           mov [BOOT_VAR+0x901c],byte 2
363
           ret
363
           ret
364
@@:
364
@@:
365
           call init_mtrr
365
           call init_mtrr
366
 
366
 
367
           mov edx, LFB_BASE
367
           mov edx, LFB_BASE
368
           mov esi, [LFBAddress]
368
           mov esi, [LFBAddress]
369
           mov edi, 0x00C00000
369
           mov edi, 0x00C00000
370
           mov dword [exp_lfb+4], edx
370
           mov dword [exp_lfb+4], edx
371
 
371
 
372
           shr edi, 12
372
           shr edi, 12
373
           mov [pg_count], edi
373
           mov [pg_count], edi
374
           shr edi, 10
374
           shr edi, 10
375
 
375
 
376
           bt [cpu_caps], CAPS_PSE
376
           bt [cpu_caps], CAPS_PSE
377
           jnc .map_page_tables
377
           jnc .map_page_tables
378
           or esi, PG_LARGE+PG_UW
378
           or esi, PG_LARGE+PG_UW
379
           mov edx, sys_pgdir+(LFB_BASE shr 20)
379
           mov edx, sys_pgdir+(LFB_BASE shr 20)
380
@@:
380
@@:
381
           mov [edx], esi
381
           mov [edx], esi
382
           add edx, 4
382
           add edx, 4
383
           add esi, 0x00400000
383
           add esi, 0x00400000
384
           dec edi
384
           dec edi
385
           jnz @B
385
           jnz @B
386
 
386
 
387
           bt [cpu_caps], CAPS_PGE
387
           bt [cpu_caps], CAPS_PGE
388
           jnc @F
388
           jnc @F
389
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
389
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
390
@@:
390
@@:
391
           mov dword [LFBAddress], LFB_BASE
391
           mov dword [LFBAddress], LFB_BASE
392
           mov eax, cr3       ;flush TLB
392
           mov eax, cr3       ;flush TLB
393
           mov cr3, eax
393
           mov cr3, eax
394
           ret
394
           ret
395
 
395
 
396
.map_page_tables:
396
.map_page_tables:
397
 
397
 
398
@@:
398
@@:
399
           call alloc_page
399
           call alloc_page
400
           stdcall map_page_table, edx, eax
400
           stdcall map_page_table, edx, eax
401
           add edx, 0x00400000
401
           add edx, 0x00400000
402
           dec edi
402
           dec edi
403
           jnz @B
403
           jnz @B
404
 
404
 
405
           mov eax, [LFBAddress]
405
           mov eax, [LFBAddress]
406
           mov edi, page_tabs + (LFB_BASE shr 10)
406
           mov edi, page_tabs + (LFB_BASE shr 10)
407
           or eax, PG_UW
407
           or eax, PG_UW
408
           mov ecx, [pg_count]
408
           mov ecx, [pg_count]
409
           cld
409
           cld
410
@@:
410
@@:
411
           stosd
411
           stosd
412
           add eax, 0x1000
412
           add eax, 0x1000
413
           dec ecx
413
           dec ecx
414
           jnz @B
414
           jnz @B
415
 
415
 
416
           mov dword [LFBAddress], LFB_BASE
416
           mov dword [LFBAddress], LFB_BASE
417
           mov eax, cr3       ;flush TLB
417
           mov eax, cr3       ;flush TLB
418
           mov cr3, eax
418
           mov cr3, eax
419
 
419
 
420
           ret
420
           ret
421
endp
421
endp
422
 
422
 
423
align 4
423
align 4
424
proc new_mem_resize stdcall, new_size:dword
424
proc new_mem_resize stdcall, new_size:dword
425
 
425
 
426
           mov ebx, pg_data.pg_mutex
426
           mov ebx, pg_data.pg_mutex
427
           call wait_mutex    ;ebx
427
           call wait_mutex    ;ebx
428
 
428
 
429
           mov edi, [new_size]
429
           mov edi, [new_size]
430
           add edi,4095
430
           add edi,4095
431
           and edi,not 4095
431
           and edi,not 4095
432
           mov [new_size], edi
432
           mov [new_size], edi
433
 
433
 
434
           mov edx,[current_slot]
434
           mov edx,[current_slot]
435
           cmp [edx+APPDATA.heap_base],0
435
           cmp [edx+APPDATA.heap_base],0
436
           jne .exit
436
           jne .exit
437
 
437
 
438
           mov esi, [edx+APPDATA.mem_size]
438
           mov esi, [edx+APPDATA.mem_size]
439
           add esi, 4095
439
           add esi, 4095
440
           and esi, not 4095
440
           and esi, not 4095
441
 
441
 
442
           cmp edi, esi
442
           cmp edi, esi
443
           jae .expand
443
           jae .expand
444
 
444
 
445
           shr edi, 12
445
           shr edi, 12
446
           shr esi, 12
446
           shr esi, 12
447
@@:
447
@@:
448
           mov eax, [app_page_tabs+edi*4]
448
           mov eax, [app_page_tabs+edi*4]
449
           test eax, 1
449
           test eax, 1
450
           jz .next
450
           jz .next
451
           mov dword [app_page_tabs+edi*4], 2
451
           mov dword [app_page_tabs+edi*4], 2
452
           mov ebx, edi
452
           mov ebx, edi
453
           shl ebx, 12
453
           shl ebx, 12
454
           push eax
454
           push eax
455
           invlpg [ebx]
455
           invlpg [ebx]
456
           pop eax
456
           pop eax
457
           call free_page
457
           call free_page
458
 
458
 
459
.next:     add edi, 1
459
.next:     add edi, 1
460
           cmp edi, esi
460
           cmp edi, esi
461
           jb @B
461
           jb @B
462
 
462
 
463
.update_size:
463
.update_size:
464
           mov     ebx, [new_size]
464
           mov     ebx, [new_size]
465
           call    update_mem_size
465
           call    update_mem_size
466
 
466
 
467
           xor eax, eax
467
           xor eax, eax
468
           dec [pg_data.pg_mutex]
468
           dec [pg_data.pg_mutex]
469
           ret
469
           ret
470
.expand:
470
.expand:
471
 
471
 
472
           push esi
472
           push esi
473
           push edi
473
           push edi
474
 
474
 
475
           add edi, 0x3FFFFF
475
           add edi, 0x3FFFFF
476
           and edi, not(0x3FFFFF)
476
           and edi, not(0x3FFFFF)
477
           add esi, 0x3FFFFF
477
           add esi, 0x3FFFFF
478
           and esi, not(0x3FFFFF)
478
           and esi, not(0x3FFFFF)
479
 
479
 
480
           cmp esi, edi
480
           cmp esi, edi
481
           jae .grow
481
           jae .grow
482
 
482
 
483
           xchg esi, edi
483
           xchg esi, edi
484
 
484
 
485
@@:
485
@@:
486
           call alloc_page
486
           call alloc_page
487
           test eax, eax
487
           test eax, eax
488
           jz .exit_pop
488
           jz .exit_pop
489
 
489
 
490
           stdcall map_page_table, edi, eax
490
           stdcall map_page_table, edi, eax
491
 
491
 
492
           push edi
492
           push edi
493
           shr edi, 10
493
           shr edi, 10
494
           add edi, page_tabs
494
           add edi, page_tabs
495
           mov ecx, 1024
495
           mov ecx, 1024
496
           xor eax, eax
496
           xor eax, eax
497
           cld
497
           cld
498
           rep stosd
498
           rep stosd
499
           pop edi
499
           pop edi
500
 
500
 
501
           add edi, 0x00400000
501
           add edi, 0x00400000
502
           cmp edi, esi
502
           cmp edi, esi
503
           jb @B
503
           jb @B
504
.grow:
504
.grow:
505
;//-
505
;//-
506
	   pop edi
506
	   pop edi
507
	   push edi
507
	   push edi
508
	   mov esi, [pg_data.pages_free]
508
	   mov esi, [pg_data.pages_free]
509
	   sub esi, 1
509
	   sub esi, 1
510
	   shr edi, 12
510
	   shr edi, 12
511
	   cmp esi, edi
511
	   cmp esi, edi
512
	   jle .out_of_memory
512
	   jle .out_of_memory
513
;//-
513
;//-
514
           pop edi
514
           pop edi
515
           pop esi
515
           pop esi
516
@@:
516
@@:
517
           call alloc_page
517
           call alloc_page
518
           test eax, eax
518
           test eax, eax
519
           jz .exit
519
           jz .exit
520
           stdcall map_page,esi,eax,dword PG_UW
520
           stdcall map_page,esi,eax,dword PG_UW
521
 
521
 
522
           push edi
522
           push edi
523
           mov edi, esi
523
           mov edi, esi
524
           xor eax, eax
524
           xor eax, eax
525
           mov ecx, 1024
525
           mov ecx, 1024
526
           cld
526
           cld
527
           rep stosd
527
           rep stosd
528
           pop edi
528
           pop edi
529
 
529
 
530
           add esi, 0x1000
530
           add esi, 0x1000
531
           cmp esi, edi
531
           cmp esi, edi
532
           jb  @B
532
           jb  @B
533
 
533
 
534
           jmp .update_size
534
           jmp .update_size
535
;//-
535
;//-
536
.exit_pop:
536
.exit_pop:
537
.out_of_memory:
537
.out_of_memory:
538
;//-
538
;//-
539
           pop edi
539
           pop edi
540
           pop esi
540
           pop esi
541
.exit:
541
.exit:
542
           xor eax, eax
542
           xor eax, eax
543
           inc eax
543
           inc eax
544
           dec [pg_data.pg_mutex]
544
           dec [pg_data.pg_mutex]
545
           ret
545
           ret
546
endp
546
endp
547
 
547
 
548
update_mem_size:
548
update_mem_size:
549
; in: edx = slot base
549
; in: edx = slot base
550
;     ebx = new memory size
550
;     ebx = new memory size
551
; destroys eax,ecx,edx
551
; destroys eax,ecx,edx
552
 
552
 
553
           mov    [APPDATA.mem_size+edx],ebx
553
           mov    [APPDATA.mem_size+edx],ebx
554
;search threads and update
554
;search threads and update
555
;application memory size infomation
555
;application memory size infomation
556
           mov    ecx,[APPDATA.dir_table+edx]
556
           mov    ecx,[APPDATA.dir_table+edx]
557
           mov    eax,2
557
           mov    eax,2
558
 
558
 
559
.search_threads:
559
.search_threads:
560
;eax = current slot
560
;eax = current slot
561
;ebx = new memory size
561
;ebx = new memory size
562
;ecx = page directory
562
;ecx = page directory
563
           cmp    eax,[TASK_COUNT]
563
           cmp    eax,[TASK_COUNT]
564
           jg     .search_threads_end
564
           jg     .search_threads_end
565
           mov    edx,eax
565
           mov    edx,eax
566
           shl    edx,5
566
           shl    edx,5
567
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
567
           cmp    word [CURRENT_TASK+edx+TASKDATA.state],9 ;if slot empty?
568
           jz     .search_threads_next
568
           jz     .search_threads_next
569
           shl    edx,3
569
           shl    edx,3
570
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
570
           cmp    [SLOT_BASE+edx+APPDATA.dir_table],ecx     ;if it is our thread?
571
           jnz    .search_threads_next
571
           jnz    .search_threads_next
572
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
572
           mov    [SLOT_BASE+edx+APPDATA.mem_size],ebx     ;update memory size
573
.search_threads_next:
573
.search_threads_next:
574
           inc    eax
574
           inc    eax
575
           jmp    .search_threads
575
           jmp    .search_threads
576
.search_threads_end:
576
.search_threads_end:
577
           ret
577
           ret
578
 
578
 
579
; param
579
; param
580
;  eax= linear address
580
;  eax= linear address
581
;
581
;
582
; retval
582
; retval
583
;  eax= phisical page address
583
;  eax= phisical page address
584
 
584
 
585
align 4
585
align 4
586
get_pg_addr:
586
get_pg_addr:
587
           shr eax, 12
587
           shr eax, 12
588
           mov eax, [page_tabs+eax*4]
588
           mov eax, [page_tabs+eax*4]
589
           and eax, 0xFFFFF000
589
           and eax, 0xFFFFF000
590
           ret
590
           ret
591
 
591
 
592
 
592
 
593
align 4
593
align 4
594
; Now it is called from core/sys32::exc_c (see stack frame there)
594
; Now it is called from core/sys32::exc_c (see stack frame there)
595
proc page_fault_handler
595
proc page_fault_handler
596
 
596
 
597
    .err_addr   equ ebp-4
597
    .err_addr   equ ebp-4
598
 
598
 
599
        push    ebx               ;save exception number (#PF)
599
        push    ebx               ;save exception number (#PF)
600
        mov     ebp, esp
600
        mov     ebp, esp
601
        mov     ebx, cr2
601
        mov     ebx, cr2
602
        push    ebx               ;that is locals: .err_addr = cr2
602
        push    ebx               ;that is locals: .err_addr = cr2
603
        inc     [pg_data.pages_faults]
603
        inc     [pg_data.pages_faults]
604
 
604
 
605
        mov     eax, [pf_err_code]
605
        mov     eax, [pf_err_code]
606
 
606
 
607
        cmp     ebx, OS_BASE      ;ebx == .err_addr
607
        cmp     ebx, OS_BASE      ;ebx == .err_addr
608
        jb      .user_space       ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
608
        jb      .user_space       ;ñòðàíèöà â ïàìÿòè ïðèëîæåíèÿ ;
609
 
609
 
610
        cmp     ebx, page_tabs
610
        cmp     ebx, page_tabs
611
        jb      .kernel_space     ;ñòðàíèöà â ïàìÿòè ÿäðà
611
        jb      .kernel_space     ;ñòðàíèöà â ïàìÿòè ÿäðà
612
 
612
 
613
        cmp     ebx, kernel_tabs
613
        cmp     ebx, kernel_tabs
614
        jb      .alloc;.app_tabs  ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
614
        jb      .alloc;.app_tabs  ;òàáëèöû ñòðàíèö ïðèëîæåíèÿ ;
615
                                  ;ïðîñòî ñîçäàäèì îäíó
615
                                  ;ïðîñòî ñîçäàäèì îäíó
616
if 0 ;ïîêà ýòî ïðîñòî ëèøíåå
616
if 0 ;ïîêà ýòî ïðîñòî ëèøíåå
617
        cmp     ebx, LFB_BASE
617
        cmp     ebx, LFB_BASE
618
        jb      .core_tabs        ;òàáëèöû ñòðàíèö ÿäðà
618
        jb      .core_tabs        ;òàáëèöû ñòðàíèö ÿäðà
619
                                  ;Îøèáêà
619
                                  ;Îøèáêà
620
  .lfb:
620
  .lfb:
621
                                  ;îáëàñòü LFB
621
                                  ;îáëàñòü LFB
622
                                  ;Îøèáêà
622
                                  ;Îøèáêà
623
        jmp     .fail
623
        jmp     .fail
624
end if
624
end if
625
.core_tabs:
625
.core_tabs:
626
.fail:  ;simply return to caller
626
.fail:  ;simply return to caller
627
        mov     esp, ebp
627
        mov     esp, ebp
628
        pop     ebx               ;restore exception number (#PF)
628
        pop     ebx               ;restore exception number (#PF)
629
        ret
629
        ret
630
 
630
 
631
;        xchg bx, bx
631
;        xchg bx, bx
632
;        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
632
;        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
633
;        restore_ring3_context
633
;        restore_ring3_context
634
;        iretd
634
;        iretd
635
 
635
 
636
.user_space:
636
.user_space:
637
        test    eax, PG_MAP
637
        test    eax, PG_MAP
638
        jnz     .err_access       ;Ñòðàíèöà ïðèñóòñòâóåò
638
        jnz     .err_access       ;Ñòðàíèöà ïðèñóòñòâóåò
639
                                  ;Îøèáêà äîñòóïà ?
639
                                  ;Îøèáêà äîñòóïà ?
640
 
640
 
641
        shr     ebx, 12
641
        shr     ebx, 12
642
        mov     ecx, ebx
642
        mov     ecx, ebx
643
        shr     ecx, 10
643
        shr     ecx, 10
644
        mov     edx, [master_tab+ecx*4]
644
        mov     edx, [master_tab+ecx*4]
645
        test    edx, PG_MAP
645
        test    edx, PG_MAP
646
        jz      .fail             ;òàáëèöà ñòðàíèö íå ñîçäàíà
646
        jz      .fail             ;òàáëèöà ñòðàíèö íå ñîçäàíà
647
                                  ;íåâåðíûé àäðåñ â ïðîãðàììå
647
                                  ;íåâåðíûé àäðåñ â ïðîãðàììå
648
 
648
 
649
        mov     eax, [page_tabs+ebx*4]
649
        mov     eax, [page_tabs+ebx*4]
650
        test    eax, 2
650
        test    eax, 2
651
        jz      .fail             ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
651
        jz      .fail             ;àäðåñ íå çàðåçåðâèðîâàí äëÿ ;
652
                                  ;èñïîëüçîâàíèÿ. Îøèáêà
652
                                  ;èñïîëüçîâàíèÿ. Îøèáêà
653
.alloc:
653
.alloc:
654
        call    alloc_page
654
        call    alloc_page
655
        test    eax, eax
655
        test    eax, eax
656
        jz      .fail
656
        jz      .fail
657
 
657
 
658
        stdcall map_page,[.err_addr],eax,PG_UW
658
        stdcall map_page,[.err_addr],eax,PG_UW
659
 
659
 
660
        mov     edi, [.err_addr]
660
        mov     edi, [.err_addr]
661
        and     edi, 0xFFFFF000
661
        and     edi, 0xFFFFF000
662
        mov     ecx, 1024
662
        mov     ecx, 1024
663
        xor     eax, eax
663
        xor     eax, eax
664
       ;cld     ;caller is duty for this
664
       ;cld     ;caller is duty for this
665
        rep     stosd
665
        rep     stosd
666
.exit:  ;iret with repeat fault instruction
666
.exit:  ;iret with repeat fault instruction
667
        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
667
        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
668
        restore_ring3_context
668
        restore_ring3_context
669
        iretd
669
        iretd
670
 
670
 
671
.err_access:
671
.err_access:
672
; access denied? this may be a result of copy-on-write protection for DLL
672
; access denied? this may be a result of copy-on-write protection for DLL
673
; check list of HDLLs
673
; check list of HDLLs
674
        and     ebx, not 0xFFF
674
        and     ebx, not 0xFFF
675
        mov     eax, [CURRENT_TASK]
675
        mov     eax, [CURRENT_TASK]
676
        shl     eax, 8
676
        shl     eax, 8
677
        mov     eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
677
        mov     eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
678
        test    eax, eax
678
        test    eax, eax
679
        jz      .fail
679
        jz      .fail
680
        mov     esi, [eax+HDLL.fd]
680
        mov     esi, [eax+HDLL.fd]
681
.scan_hdll:
681
.scan_hdll:
682
        cmp     esi, eax
682
        cmp     esi, eax
683
        jz      .fail
683
        jz      .fail
684
        mov     edx, ebx
684
        mov     edx, ebx
685
        sub     edx, [esi+HDLL.base]
685
        sub     edx, [esi+HDLL.base]
686
        cmp     edx, [esi+HDLL.size]
686
        cmp     edx, [esi+HDLL.size]
687
        jb      .fault_in_hdll
687
        jb      .fault_in_hdll
688
.scan_hdll.next:
688
.scan_hdll.next:
689
        mov     esi, [esi+HDLL.fd]
689
        mov     esi, [esi+HDLL.fd]
690
        jmp     .scan_hdll
690
        jmp     .scan_hdll
691
.fault_in_hdll:
691
.fault_in_hdll:
692
; allocate new page, map it as rw and copy data
692
; allocate new page, map it as rw and copy data
693
        call    alloc_page
693
        call    alloc_page
694
        test    eax, eax
694
        test    eax, eax
695
        jz      .fail
695
        jz      .fail
696
        stdcall map_page,ebx,eax,PG_UW
696
        stdcall map_page,ebx,eax,PG_UW
697
        mov     edi, ebx
697
        mov     edi, ebx
698
        mov     ecx, 1024
698
        mov     ecx, 1024
699
        sub     ebx, [esi+HDLL.base]
699
        sub     ebx, [esi+HDLL.base]
700
        mov     esi, [esi+HDLL.parent]
700
        mov     esi, [esi+HDLL.parent]
701
        mov     esi, [esi+DLLDESCR.data]
701
        mov     esi, [esi+DLLDESCR.data]
702
        add     esi, ebx
702
        add     esi, ebx
703
        rep     movsd
703
        rep     movsd
704
        jmp     .exit
704
        jmp     .exit
705
 
705
 
706
.kernel_space:
706
.kernel_space:
707
        test    eax, PG_MAP
707
        test    eax, PG_MAP
708
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
708
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
709
 
709
 
710
        test    eax,12  ;U/S (+below)
710
        test    eax,12  ;U/S (+below)
711
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
711
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
712
                        ;ÿäðà
712
                        ;ÿäðà
713
       ;test    eax, 8
713
       ;test    eax, 8
714
       ;jnz     .fail   ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
714
       ;jnz     .fail   ;óñòàíîâëåí çàðåçåðâèðîâàííûé áèò
715
                        ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
715
                        ;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
716
 
716
 
717
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
717
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
718
 
718
 
719
        cmp     ebx, tss._io_map_0
719
        cmp     ebx, tss._io_map_0
720
        jb      .fail
720
        jb      .fail
721
 
721
 
722
        cmp     ebx, tss._io_map_0+8192
722
        cmp     ebx, tss._io_map_0+8192
723
        jae     .fail
723
        jae     .fail
724
 
724
 
725
; io permission map
725
; io permission map
726
; copy-on-write protection
726
; copy-on-write protection
727
 
727
 
728
        call    alloc_page
728
        call    alloc_page
729
        test    eax, eax
729
        test    eax, eax
730
        jz      .fail
730
        jz      .fail
731
 
731
 
732
        push    eax
732
        push    eax
733
        stdcall map_page,[.err_addr],eax,dword PG_SW
733
        stdcall map_page,[.err_addr],eax,dword PG_SW
734
        pop     eax
734
        pop     eax
735
        mov     edi, [.err_addr]
735
        mov     edi, [.err_addr]
736
        and     edi, -4096
736
        and     edi, -4096
737
        lea     esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
737
        lea     esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
738
 
738
 
739
        mov     ebx, esi
739
        mov     ebx, esi
740
        shr     ebx, 12
740
        shr     ebx, 12
741
        mov     edx, [current_slot]
741
        mov     edx, [current_slot]
742
        or      eax, PG_SW
742
        or      eax, PG_SW
743
        mov     [edx+APPDATA.io_map+ebx*4], eax
743
        mov     [edx+APPDATA.io_map+ebx*4], eax
744
 
744
 
745
        add     esi, [default_io_map]
745
        add     esi, [default_io_map]
746
        mov     ecx, 4096/4
746
        mov     ecx, 4096/4
747
       ;cld     ;caller is duty for this
747
       ;cld     ;caller is duty for this
748
        rep     movsd
748
        rep     movsd
749
        jmp     .exit
749
        jmp     .exit
750
endp
750
endp
751
 
751
 
752
; returns number of mapped bytes
752
; returns number of mapped bytes
753
proc map_mem stdcall, lin_addr:dword,slot:dword,\
753
proc map_mem stdcall, lin_addr:dword,slot:dword,\
754
                      ofs:dword,buf_size:dword,req_access:dword
754
                      ofs:dword,buf_size:dword,req_access:dword
755
           push 0 ; initialize number of mapped bytes
755
           push 0 ; initialize number of mapped bytes
756
 
756
 
757
           cmp [buf_size], 0
757
           cmp [buf_size], 0
758
           jz .exit
758
           jz .exit
759
 
759
 
760
           mov eax, [slot]
760
           mov eax, [slot]
761
           shl eax, 8
761
           shl eax, 8
762
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
762
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
763
           and eax, 0xFFFFF000
763
           and eax, 0xFFFFF000
764
 
764
 
765
           stdcall map_page,[ipc_pdir],eax,PG_UW
765
           stdcall map_page,[ipc_pdir],eax,PG_UW
766
           mov ebx, [ofs]
766
           mov ebx, [ofs]
767
           shr ebx, 22
767
           shr ebx, 22
768
           mov esi, [ipc_pdir]
768
           mov esi, [ipc_pdir]
769
           mov edi, [ipc_ptab]
769
           mov edi, [ipc_ptab]
770
           mov eax, [esi+ebx*4]
770
           mov eax, [esi+ebx*4]
771
           and eax, 0xFFFFF000
771
           and eax, 0xFFFFF000
772
           jz .exit
772
           jz .exit
773
           stdcall map_page,edi,eax,PG_UW
773
           stdcall map_page,edi,eax,PG_UW
774
;           inc ebx
774
;           inc ebx
775
;           add edi, 0x1000
775
;           add edi, 0x1000
776
;           mov eax, [esi+ebx*4]
776
;           mov eax, [esi+ebx*4]
777
;           test eax, eax
777
;           test eax, eax
778
;           jz @f
778
;           jz @f
779
;          and eax, 0xFFFFF000
779
;          and eax, 0xFFFFF000
780
;           stdcall map_page, edi, eax
780
;           stdcall map_page, edi, eax
781
 
781
 
782
@@:        mov edi, [lin_addr]
782
@@:        mov edi, [lin_addr]
783
           and edi, 0xFFFFF000
783
           and edi, 0xFFFFF000
784
           mov ecx, [buf_size]
784
           mov ecx, [buf_size]
785
           add ecx, 4095
785
           add ecx, 4095
786
           shr ecx, 12
786
           shr ecx, 12
787
           inc ecx
787
           inc ecx
788
 
788
 
789
           mov edx, [ofs]
789
           mov edx, [ofs]
790
           shr edx, 12
790
           shr edx, 12
791
           and edx, 0x3FF
791
           and edx, 0x3FF
792
           mov esi, [ipc_ptab]
792
           mov esi, [ipc_ptab]
793
 
793
 
794
.map:
794
.map:
795
           stdcall safe_map_page,[slot],[req_access],[ofs]
795
           stdcall safe_map_page,[slot],[req_access],[ofs]
796
           jnc .exit
796
           jnc .exit
797
           add dword [ebp-4], 4096
797
           add dword [ebp-4], 4096
798
           add [ofs], 4096
798
           add [ofs], 4096
799
           dec ecx
799
           dec ecx
800
           jz  .exit
800
           jz  .exit
801
           add edi, 0x1000
801
           add edi, 0x1000
802
           inc edx
802
           inc edx
803
           cmp edx, 0x400
803
           cmp edx, 0x400
804
           jnz .map
804
           jnz .map
805
           inc ebx
805
           inc ebx
806
           mov eax, [ipc_pdir]
806
           mov eax, [ipc_pdir]
807
           mov eax, [eax+ebx*4]
807
           mov eax, [eax+ebx*4]
808
           and eax, 0xFFFFF000
808
           and eax, 0xFFFFF000
809
           jz  .exit
809
           jz  .exit
810
           stdcall map_page,esi,eax,PG_UW
810
           stdcall map_page,esi,eax,PG_UW
811
           xor edx, edx
811
           xor edx, edx
812
           jmp .map
812
           jmp .map
813
 
813
 
814
.exit:
814
.exit:
815
           pop eax
815
           pop eax
816
           ret
816
           ret
817
endp
817
endp
818
 
818
 
819
proc map_memEx stdcall, lin_addr:dword,slot:dword,\
819
proc map_memEx stdcall, lin_addr:dword,slot:dword,\
820
                        ofs:dword,buf_size:dword,req_access:dword
820
                        ofs:dword,buf_size:dword,req_access:dword
821
           push 0 ; initialize number of mapped bytes
821
           push 0 ; initialize number of mapped bytes
822
 
822
 
823
           cmp [buf_size], 0
823
           cmp [buf_size], 0
824
           jz .exit
824
           jz .exit
825
 
825
 
826
           mov eax, [slot]
826
           mov eax, [slot]
827
           shl eax, 8
827
           shl eax, 8
828
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
828
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
829
           and eax, 0xFFFFF000
829
           and eax, 0xFFFFF000
830
 
830
 
831
           stdcall map_page,[proc_mem_pdir],eax,PG_UW
831
           stdcall map_page,[proc_mem_pdir],eax,PG_UW
832
           mov ebx, [ofs]
832
           mov ebx, [ofs]
833
           shr ebx, 22
833
           shr ebx, 22
834
           mov esi, [proc_mem_pdir]
834
           mov esi, [proc_mem_pdir]
835
           mov edi, [proc_mem_tab]
835
           mov edi, [proc_mem_tab]
836
           mov eax, [esi+ebx*4]
836
           mov eax, [esi+ebx*4]
837
           and eax, 0xFFFFF000
837
           and eax, 0xFFFFF000
838
           test eax, eax
838
           test eax, eax
839
           jz .exit
839
           jz .exit
840
           stdcall map_page,edi,eax,PG_UW
840
           stdcall map_page,edi,eax,PG_UW
841
 
841
 
842
@@:        mov edi, [lin_addr]
842
@@:        mov edi, [lin_addr]
843
           and edi, 0xFFFFF000
843
           and edi, 0xFFFFF000
844
           mov ecx, [buf_size]
844
           mov ecx, [buf_size]
845
           add ecx, 4095
845
           add ecx, 4095
846
           shr ecx, 12
846
           shr ecx, 12
847
           inc ecx
847
           inc ecx
848
 
848
 
849
           mov edx, [ofs]
849
           mov edx, [ofs]
850
           shr edx, 12
850
           shr edx, 12
851
           and edx, 0x3FF
851
           and edx, 0x3FF
852
           mov esi, [proc_mem_tab]
852
           mov esi, [proc_mem_tab]
853
 
853
 
854
.map:
854
.map:
855
           stdcall safe_map_page,[slot],[req_access],[ofs]
855
           stdcall safe_map_page,[slot],[req_access],[ofs]
856
           jnc .exit
856
           jnc .exit
857
           add dword [ebp-4], 0x1000
857
           add dword [ebp-4], 0x1000
858
           add edi, 0x1000
858
           add edi, 0x1000
859
           add [ofs], 0x1000
859
           add [ofs], 0x1000
860
           inc edx
860
           inc edx
861
           dec ecx
861
           dec ecx
862
           jnz .map
862
           jnz .map
863
.exit:
863
.exit:
864
           pop eax
864
           pop eax
865
           ret
865
           ret
866
endp
866
endp
867
 
867
 
868
; in: esi+edx*4 = pointer to page table entry
868
; in: esi+edx*4 = pointer to page table entry
869
; in: [slot], [req_access], [ofs] on the stack
869
; in: [slot], [req_access], [ofs] on the stack
870
; in: edi = linear address to map
870
; in: edi = linear address to map
871
; out: CF cleared <=> failed
871
; out: CF cleared <=> failed
872
; destroys: only eax
872
; destroys: only eax
873
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
873
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
874
	mov	eax, [esi+edx*4]
874
	mov	eax, [esi+edx*4]
875
	test	al, PG_MAP
875
	test	al, PG_MAP
876
	jz	.not_present
876
	jz	.not_present
877
	test	al, PG_WRITE
877
	test	al, PG_WRITE
878
	jz	.resolve_readonly
878
	jz	.resolve_readonly
879
; normal case: writable page, just map with requested access
879
; normal case: writable page, just map with requested access
880
.map:
880
.map:
881
	stdcall	map_page, edi, eax, [req_access]
881
	stdcall	map_page, edi, eax, [req_access]
882
	stc
882
	stc
883
.fail:
883
.fail:
884
	ret
884
	ret
885
.not_present:
885
.not_present:
886
; check for alloc-on-demand page
886
; check for alloc-on-demand page
887
	test	al, 2
887
	test	al, 2
888
	jz	.fail
888
	jz	.fail
889
; allocate new page, save it to source page table
889
; allocate new page, save it to source page table
890
	push	ecx
890
	push	ecx
891
	call	alloc_page
891
	call	alloc_page
892
	pop	ecx
892
	pop	ecx
893
	test	eax, eax
893
	test	eax, eax
894
	jz	.fail
894
	jz	.fail
895
	or	al, PG_UW
895
	or	al, PG_UW
896
	mov	[esi+edx*4], eax
896
	mov	[esi+edx*4], eax
897
	jmp	.map
897
	jmp	.map
898
.resolve_readonly:
898
.resolve_readonly:
899
; readonly page, probably copy-on-write
899
; readonly page, probably copy-on-write
900
; check: readonly request of readonly page is ok
900
; check: readonly request of readonly page is ok
901
	test	[req_access], PG_WRITE
901
	test	[req_access], PG_WRITE
902
	jz	.map
902
	jz	.map
903
; find control structure for this page
903
; find control structure for this page
904
	pushf
904
	pushf
905
	cli
905
	cli
906
	cld
906
	cld
907
	push	ebx ecx
907
	push	ebx ecx
908
	mov	eax, [slot]
908
	mov	eax, [slot]
909
	shl	eax, 8
909
	shl	eax, 8
910
	mov	eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
910
	mov	eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
911
	test	eax, eax
911
	test	eax, eax
912
	jz	.no_hdll
912
	jz	.no_hdll
913
	mov	ecx, [eax+HDLL.fd]
913
	mov	ecx, [eax+HDLL.fd]
914
.scan_hdll:
914
.scan_hdll:
915
	cmp	ecx, eax
915
	cmp	ecx, eax
916
	jz	.no_hdll
916
	jz	.no_hdll
917
	mov	ebx, [ofs]
917
	mov	ebx, [ofs]
918
	and	ebx, not 0xFFF
918
	and	ebx, not 0xFFF
919
	sub	ebx, [ecx+HDLL.base]
919
	sub	ebx, [ecx+HDLL.base]
920
	cmp	ebx, [ecx+HDLL.size]
920
	cmp	ebx, [ecx+HDLL.size]
921
	jb	.hdll_found
921
	jb	.hdll_found
922
	mov	ecx, [ecx+HDLL.fd]
922
	mov	ecx, [ecx+HDLL.fd]
923
	jmp	.scan_hdll
923
	jmp	.scan_hdll
924
.no_hdll:
924
.no_hdll:
925
	pop	ecx ebx
925
	pop	ecx ebx
926
	popf
926
	popf
927
	clc
927
	clc
928
	ret
928
	ret
929
.hdll_found:
929
.hdll_found:
930
; allocate page, save it in page table, map it, copy contents from base
930
; allocate page, save it in page table, map it, copy contents from base
931
	mov	eax, [ecx+HDLL.parent]
931
	mov	eax, [ecx+HDLL.parent]
932
	add	ebx, [eax+DLLDESCR.data]
932
	add	ebx, [eax+DLLDESCR.data]
933
	call	alloc_page
933
	call	alloc_page
934
	test	eax, eax
934
	test	eax, eax
935
	jz	.no_hdll
935
	jz	.no_hdll
936
	or	al, PG_UW
936
	or	al, PG_UW
937
	mov	[esi+edx*4], eax
937
	mov	[esi+edx*4], eax
938
	stdcall	map_page, edi, eax, [req_access]
938
	stdcall	map_page, edi, eax, [req_access]
939
	push	esi edi
939
	push	esi edi
940
	mov	esi, ebx
940
	mov	esi, ebx
941
	mov	ecx, 4096/4
941
	mov	ecx, 4096/4
942
	rep	movsd
942
	rep	movsd
943
	pop	edi esi
943
	pop	edi esi
944
	pop	ecx ebx
944
	pop	ecx ebx
945
	popf
945
	popf
946
	stc
946
	stc
947
	ret
947
	ret
948
endp
948
endp
949
 
949
 
950
sys_IPC:
950
sys_IPC:
951
;input:
951
;input:
952
;  ebx=1 - set ipc buffer area
952
;  ebx=1 - set ipc buffer area
953
;    ecx=address of buffer
953
;    ecx=address of buffer
954
;    edx=size of buffer
954
;    edx=size of buffer
955
;  eax=2 - send message
955
;  eax=2 - send message
956
;    ebx=PID
956
;    ebx=PID
957
;    ecx=address of message
957
;    ecx=address of message
958
;    edx=size of message
958
;    edx=size of message
959
 
959
 
960
	dec	ebx
960
	dec	ebx
961
	jnz	@f
961
	jnz	@f
962
 
962
 
963
	mov  	eax,[current_slot]
963
	mov  	eax,[current_slot]
964
        pushf
964
        pushf
965
        cli
965
        cli
966
        mov  	[eax+APPDATA.ipc_start],ecx     ;set fields in extended information area
966
        mov  	[eax+APPDATA.ipc_start],ecx     ;set fields in extended information area
967
        mov  	[eax+APPDATA.ipc_size],edx
967
        mov  	[eax+APPDATA.ipc_size],edx
968
 
968
 
969
        add edx, ecx
969
        add edx, ecx
970
        add edx, 4095
970
        add edx, 4095
971
        and edx, not 4095
971
        and edx, not 4095
972
 
972
 
973
.touch: mov eax, [ecx]
973
.touch: mov eax, [ecx]
974
        add ecx, 0x1000
974
        add ecx, 0x1000
975
        cmp ecx, edx
975
        cmp ecx, edx
976
        jb  .touch
976
        jb  .touch
977
 
977
 
978
        popf
978
        popf
979
        mov [esp+32], ebx	;ebx=0
979
        mov [esp+32], ebx	;ebx=0
980
        ret
980
        ret
981
 
981
 
982
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
982
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
983
;2
983
;2
984
@@:
984
@@:
985
	dec	ebx
985
	dec	ebx
986
	jnz	@f
986
	jnz	@f
987
 
987
 
988
        stdcall sys_ipc_send, ecx, edx, esi
988
        stdcall sys_ipc_send, ecx, edx, esi
989
        mov 	[esp+32], eax
989
        mov 	[esp+32], eax
990
        ret
990
        ret
991
@@:
991
@@:
992
	or	eax,-1
992
	or	eax,-1
993
        mov 	[esp+32], eax
993
        mov 	[esp+32], eax
994
        ret
994
        ret
995
 
995
 
996
;align 4
996
;align 4
997
;proc set_ipc_buff
997
;proc set_ipc_buff
998
 
998
 
999
;           mov  eax,[current_slot]
999
;           mov  eax,[current_slot]
1000
;           pushf
1000
;           pushf
1001
;           cli
1001
;           cli
1002
;           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
1002
;           mov  [eax+APPDATA.ipc_start],ebx     ;set fields in extended information area
1003
;           mov  [eax+APPDATA.ipc_size],ecx
1003
;           mov  [eax+APPDATA.ipc_size],ecx
1004
;
1004
;
1005
;           add ecx, ebx
1005
;           add ecx, ebx
1006
;           add ecx, 4095
1006
;           add ecx, 4095
1007
;           and ecx, not 4095
1007
;           and ecx, not 4095
1008
;
1008
;
1009
;.touch:    mov eax, [ebx]
1009
;.touch:    mov eax, [ebx]
1010
;           add ebx, 0x1000
1010
;           add ebx, 0x1000
1011
;           cmp ebx, ecx
1011
;           cmp ebx, ecx
1012
;           jb  .touch
1012
;           jb  .touch
1013
;
1013
;
1014
;           popf
1014
;           popf
1015
;           xor eax, eax
1015
;           xor eax, eax
1016
;           ret
1016
;           ret
1017
;endp
1017
;endp
1018
 
1018
 
1019
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
1019
proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
1020
           locals
1020
           locals
1021
             dst_slot   dd ?
1021
             dst_slot   dd ?
1022
             dst_offset dd ?
1022
             dst_offset dd ?
1023
             buf_size   dd ?
1023
             buf_size   dd ?
1024
             used_buf   dd ?
1024
             used_buf   dd ?
1025
           endl
1025
           endl
1026
 
1026
 
1027
           pushf
1027
           pushf
1028
           cli
1028
           cli
1029
 
1029
 
1030
           mov  eax, [PID]
1030
           mov  eax, [PID]
1031
           call pid_to_slot
1031
           call pid_to_slot
1032
           test eax,eax
1032
           test eax,eax
1033
           jz   .no_pid
1033
           jz   .no_pid
1034
 
1034
 
1035
           mov [dst_slot], eax
1035
           mov [dst_slot], eax
1036
           shl  eax,8
1036
           shl  eax,8
1037
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
1037
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
1038
           test edi,edi
1038
           test edi,edi
1039
           jz   .no_ipc_area
1039
           jz   .no_ipc_area
1040
 
1040
 
1041
           mov ebx, edi
1041
           mov ebx, edi
1042
           and ebx, 0xFFF
1042
           and ebx, 0xFFF
1043
           mov [dst_offset], ebx
1043
           mov [dst_offset], ebx
1044
 
1044
 
1045
           mov esi, [eax+SLOT_BASE+0xa4]
1045
           mov esi, [eax+SLOT_BASE+0xa4]
1046
           mov [buf_size], esi
1046
           mov [buf_size], esi
1047
 
1047
 
1048
           mov ecx, [ipc_tmp]
1048
           mov ecx, [ipc_tmp]
1049
           cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page
1049
           cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page
1050
           jbe @f
1050
           jbe @f
1051
           push esi edi
1051
           push esi edi
1052
           add esi,0x1000
1052
           add esi,0x1000
1053
           stdcall alloc_kernel_space,esi
1053
           stdcall alloc_kernel_space,esi
1054
           mov ecx, eax
1054
           mov ecx, eax
1055
           pop edi esi
1055
           pop edi esi
1056
@@:
1056
@@:
1057
           mov [used_buf], ecx
1057
           mov [used_buf], ecx
1058
           stdcall map_mem, ecx, [dst_slot],\
1058
           stdcall map_mem, ecx, [dst_slot],\
1059
                             edi, esi, PG_SW
1059
                             edi, esi, PG_SW
1060
 
1060
 
1061
           mov edi, [dst_offset]
1061
           mov edi, [dst_offset]
1062
           add edi, [used_buf]
1062
           add edi, [used_buf]
1063
           cmp dword [edi], 0
1063
           cmp dword [edi], 0
1064
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
1064
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
1065
 
1065
 
1066
           mov edx, dword [edi+4]
1066
           mov edx, dword [edi+4]
1067
           lea ebx, [edx+8]
1067
           lea ebx, [edx+8]
1068
           add ebx, [msg_size]
1068
           add ebx, [msg_size]
1069
           cmp ebx, [buf_size]
1069
           cmp ebx, [buf_size]
1070
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
1070
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
1071
 
1071
 
1072
           mov dword [edi+4], ebx
1072
           mov dword [edi+4], ebx
1073
           mov eax,[TASK_BASE]
1073
           mov eax,[TASK_BASE]
1074
           mov eax, [eax+0x04]         ;eax - our PID
1074
           mov eax, [eax+0x04]         ;eax - our PID
1075
           add edi, edx
1075
           add edi, edx
1076
           mov [edi], eax
1076
           mov [edi], eax
1077
           mov ecx, [msg_size]
1077
           mov ecx, [msg_size]
1078
 
1078
 
1079
           mov [edi+4], ecx
1079
           mov [edi+4], ecx
1080
           add edi, 8
1080
           add edi, 8
1081
           mov esi, [msg_addr]
1081
           mov esi, [msg_addr]
1082
       ;    add esi, new_app_base
1082
       ;    add esi, new_app_base
1083
           cld
1083
           cld
1084
           rep movsb
1084
           rep movsb
1085
 
1085
 
1086
           mov ebx, [ipc_tmp]
1086
           mov ebx, [ipc_tmp]
1087
           mov edx, ebx
1087
           mov edx, ebx
1088
           shr ebx, 12
1088
           shr ebx, 12
1089
           xor eax, eax
1089
           xor eax, eax
1090
           mov [page_tabs+ebx*4], eax
1090
           mov [page_tabs+ebx*4], eax
1091
           invlpg [edx]
1091
           invlpg [edx]
1092
 
1092
 
1093
           mov ebx, [ipc_pdir]
1093
           mov ebx, [ipc_pdir]
1094
           mov edx, ebx
1094
           mov edx, ebx
1095
           shr ebx, 12
1095
           shr ebx, 12
1096
           xor eax, eax
1096
           xor eax, eax
1097
           mov [page_tabs+ebx*4], eax
1097
           mov [page_tabs+ebx*4], eax
1098
           invlpg [edx]
1098
           invlpg [edx]
1099
 
1099
 
1100
           mov ebx, [ipc_ptab]
1100
           mov ebx, [ipc_ptab]
1101
           mov edx, ebx
1101
           mov edx, ebx
1102
           shr ebx, 12
1102
           shr ebx, 12
1103
           xor eax, eax
1103
           xor eax, eax
1104
           mov [page_tabs+ebx*4], eax
1104
           mov [page_tabs+ebx*4], eax
1105
           invlpg [edx]
1105
           invlpg [edx]
1106
 
1106
 
1107
           mov  eax, [dst_slot]
1107
           mov  eax, [dst_slot]
1108
           shl eax, 8
1108
           shl eax, 8
1109
           or   [eax+SLOT_BASE+0xA8],dword 0x40
1109
           or   [eax+SLOT_BASE+0xA8],dword 0x40
1110
           cmp  dword [check_idle_semaphore],20
1110
           cmp  dword [check_idle_semaphore],20
1111
           jge  .ipc_no_cis
1111
           jge  .ipc_no_cis
1112
 
1112
 
1113
           mov  dword [check_idle_semaphore],5
1113
           mov  dword [check_idle_semaphore],5
1114
.ipc_no_cis:
1114
.ipc_no_cis:
1115
           push 0
1115
           push 0
1116
           jmp .ret
1116
           jmp .ret
1117
.no_pid:
1117
.no_pid:
1118
           popf
1118
           popf
1119
           mov eax, 4
1119
           mov eax, 4
1120
           ret
1120
           ret
1121
.no_ipc_area:
1121
.no_ipc_area:
1122
           popf
1122
           popf
1123
           xor eax, eax
1123
           xor eax, eax
1124
           inc eax
1124
           inc eax
1125
           ret
1125
           ret
1126
.ipc_blocked:
1126
.ipc_blocked:
1127
           push 2
1127
           push 2
1128
           jmp .ret
1128
           jmp .ret
1129
.buffer_overflow:
1129
.buffer_overflow:
1130
           push 3
1130
           push 3
1131
.ret:
1131
.ret:
1132
           mov eax, [used_buf]
1132
           mov eax, [used_buf]
1133
           cmp eax, [ipc_tmp]
1133
           cmp eax, [ipc_tmp]
1134
           jz @f
1134
           jz @f
1135
           stdcall free_kernel_space,eax
1135
           stdcall free_kernel_space,eax
1136
@@:
1136
@@:
1137
           pop eax
1137
           pop eax
1138
           popf
1138
           popf
1139
           ret
1139
           ret
1140
endp
1140
endp
1141
 
1141
 
1142
align 4
1142
align 4
1143
sysfn_meminfo:
1143
sysfn_meminfo:
1144
 
1144
 
1145
        ;   add ecx, new_app_base
1145
        ;   add ecx, new_app_base
1146
           cmp ecx, OS_BASE
1146
           cmp ecx, OS_BASE
1147
           jae .fail
1147
           jae .fail
1148
 
1148
 
1149
           mov eax, [pg_data.pages_count]
1149
           mov eax, [pg_data.pages_count]
1150
           mov [ecx], eax
1150
           mov [ecx], eax
1151
           shl eax, 12
1151
           shl eax, 12
1152
           mov [esp+32], eax
1152
           mov [esp+32], eax
1153
           mov eax, [pg_data.pages_free]
1153
           mov eax, [pg_data.pages_free]
1154
           mov [ecx+4], eax
1154
           mov [ecx+4], eax
1155
           mov eax, [pg_data.pages_faults]
1155
           mov eax, [pg_data.pages_faults]
1156
           mov [ecx+8], eax
1156
           mov [ecx+8], eax
1157
           mov eax, [heap_size]
1157
           mov eax, [heap_size]
1158
           mov [ecx+12], eax
1158
           mov [ecx+12], eax
1159
           mov eax, [heap_free]
1159
           mov eax, [heap_free]
1160
           mov [ecx+16], eax
1160
           mov [ecx+16], eax
1161
           mov eax, [heap_blocks]
1161
           mov eax, [heap_blocks]
1162
           mov [ecx+20], eax
1162
           mov [ecx+20], eax
1163
           mov eax, [free_blocks]
1163
           mov eax, [free_blocks]
1164
           mov [ecx+24], eax
1164
           mov [ecx+24], eax
1165
           ret
1165
           ret
1166
.fail:
1166
.fail:
1167
           or dword [esp+32], -1
1167
           or dword [esp+32], -1
1168
           ret
1168
           ret
1169
iglobal
-
 
1170
align 4
-
 
1171
f68call:
-
 
1172
           dd f68.11   ; init_heap
-
 
1173
           dd f68.12   ; user_alloc
-
 
1174
           dd f68.13   ; user_free
-
 
1175
           dd f68.14   ; get_event_ex
-
 
1176
           dd f68.fail ;moved to f68.24
-
 
1177
           dd f68.16   ; get_service
-
 
1178
           dd f68.17   ; call_service
-
 
1179
           dd f68.fail ;moved to f68.25
-
 
1180
           dd f68.19   ; load_dll
-
 
1181
           dd f68.20   ; user_realloc
-
 
1182
           dd f68.21   ; load_driver
-
 
1183
           dd f68.22   ; shmem_open
-
 
1184
           dd f68.23   ; shmem_close
-
 
1185
           dd f68.24
-
 
1186
           dd f68.25
-
 
1187
endg
1169
 
1188
align 4
1170
align 4
1189
f68:
1171
f68:
1190
           cmp  ebx,4
1172
           cmp  ebx,4
1191
           jbe  sys_sheduler
1173
           jbe  sys_sheduler
1192
 
1174
 
1193
           cmp ebx, 11
1175
           cmp ebx, 11
1194
           jb .fail
1176
           jb .fail
1195
 
1177
 
1196
           cmp ebx, 25
1178
           cmp ebx, 25
1197
           ja .fail
1179
           ja .fail
1198
 
1180
 
1199
           jmp dword [f68call+ebx*4-11*4]
1181
           jmp dword [f68call+ebx*4-11*4]
1200
.11:
1182
.11:
1201
           call init_heap
1183
           call init_heap
1202
           mov [esp+32], eax
1184
           mov [esp+32], eax
1203
           ret
1185
           ret
1204
.12:
1186
.12:
1205
           stdcall user_alloc, ecx
1187
           stdcall user_alloc, ecx
1206
           mov [esp+32], eax
1188
           mov [esp+32], eax
1207
           ret
1189
           ret
1208
.13:
1190
.13:
1209
           stdcall user_free, ecx
1191
           stdcall user_free, ecx
1210
           mov [esp+32], eax
1192
           mov [esp+32], eax
1211
           ret
1193
           ret
1212
.14:
1194
.14:
1213
           cmp ecx, OS_BASE
1195
           cmp ecx, OS_BASE
1214
           jae .fail
1196
           jae .fail
1215
           mov edi,ecx
1197
           mov edi,ecx
1216
           call get_event_ex
1198
           call get_event_ex
1217
           mov [esp+32], eax
1199
           mov [esp+32], eax
1218
           ret
1200
           ret
1219
.16:
1201
.16:
1220
           test ecx, ecx
1202
           test ecx, ecx
1221
           jz .fail
1203
           jz .fail
1222
           cmp ecx, OS_BASE
1204
           cmp ecx, OS_BASE
1223
           jae .fail
1205
           jae .fail
1224
           stdcall get_service, ecx
1206
           stdcall get_service, ecx
1225
           mov [esp+32], eax
1207
           mov [esp+32], eax
1226
           ret
1208
           ret
1227
.17:
1209
.17:
1228
           call srv_handlerEx   ;ecx
1210
           call srv_handlerEx   ;ecx
1229
           mov [esp+32], eax
1211
           mov [esp+32], eax
1230
           ret
1212
           ret
1231
.19:
1213
.19:
1232
           cmp ecx, OS_BASE
1214
           cmp ecx, OS_BASE
1233
           jae .fail
1215
           jae .fail
1234
           stdcall load_library, ecx
1216
           stdcall load_library, ecx
1235
           mov [esp+32], eax
1217
           mov [esp+32], eax
1236
           ret
1218
           ret
1237
.20:
1219
.20:
1238
           mov     eax, edx
1220
           mov     eax, edx
1239
	   mov	   ebx, ecx
1221
           mov     ebx, ecx
1240
           call    user_realloc		;in: eax = pointer, ebx = new size
1222
           call    user_realloc		;in: eax = pointer, ebx = new size
1241
           mov     [esp+32], eax
1223
           mov     [esp+32], eax
1242
           ret
1224
           ret
1243
.21:
1225
.21:
1244
           cmp ecx, OS_BASE
1226
           cmp ecx, OS_BASE
1245
           jae .fail
1227
           jae .fail
1246
 
1228
 
1247
           cmp ebx, OS_BASE
1229
           cmp ebx, OS_BASE
1248
           jae .fail
1230
           jae .fail
1249
 
1231
 
1250
           mov edi, edx
1232
           mov edi, edx
1251
           stdcall load_PE, ecx
1233
           stdcall load_PE, ecx
1252
           mov esi, eax
1234
           mov esi, eax
1253
           test eax, eax
1235
           test eax, eax
1254
           jz @F
1236
           jz @F
1255
 
1237
 
1256
           push edi
1238
           push edi
1257
           push DRV_ENTRY
1239
           push DRV_ENTRY
1258
           call eax
1240
           call eax
1259
           add esp, 8
1241
           add esp, 8
1260
           test eax, eax
1242
           test eax, eax
1261
           jz @F
1243
           jz @F
1262
 
1244
 
1263
           mov [eax+SRV.entry], esi
1245
           mov [eax+SRV.entry], esi
1264
 
1246
 
1265
@@:
1247
@@:
1266
           mov [esp+32], eax
1248
           mov [esp+32], eax
1267
           ret
1249
           ret
1268
.22:
1250
.22:
1269
           cmp ecx, OS_BASE
1251
           cmp ecx, OS_BASE
1270
           jae .fail
1252
           jae .fail
1271
 
1253
 
1272
           stdcall shmem_open, ecx, edx, esi
1254
           stdcall shmem_open, ecx, edx, esi
1273
           mov [esp+24], edx
1255
           mov [esp+24], edx
1274
           mov [esp+32], eax
1256
           mov [esp+32], eax
1275
           ret
1257
           ret
1276
 
1258
 
1277
.23:
1259
.23:
1278
           cmp ecx, OS_BASE
1260
           cmp ecx, OS_BASE
1279
           jae .fail
1261
           jae .fail
1280
 
1262
 
1281
           stdcall shmem_close, ecx
1263
           stdcall shmem_close, ecx
1282
           mov [esp+32], eax
1264
           mov [esp+32], eax
1283
           ret
1265
           ret
1284
.24:
1266
.24:
1285
           mov  eax, [current_slot]
1267
           mov  eax, [current_slot]
1286
           xchg ecx, [eax+APPDATA.exc_handler]
1268
           xchg ecx, [eax+APPDATA.exc_handler]
1287
           xchg edx, [eax+APPDATA.except_mask]
1269
           xchg edx, [eax+APPDATA.except_mask]
1288
           mov  [esp+32], ecx ; reg_eax+8
1270
           mov  [esp+32], ecx ; reg_eax+8
1289
           mov  [esp+20], edx ; reg_ebx+8
1271
           mov  [esp+20], edx ; reg_ebx+8
1290
           ret
1272
           ret
1291
.25:
1273
.25:
1292
           cmp ecx,32
1274
           cmp ecx,32
1293
           jae .fail
1275
           jae .fail
1294
           mov  eax, [current_slot]
1276
           mov  eax, [current_slot]
1295
           btr  [eax+APPDATA.except_mask],ecx
1277
           btr  [eax+APPDATA.except_mask],ecx
1296
           setc byte[esp+32]
1278
           setc byte[esp+32]
1297
           jecxz @f
1279
           jecxz @f
1298
           bts  [eax+APPDATA.except_mask],ecx
1280
           bts  [eax+APPDATA.except_mask],ecx
1299
@@:
1281
@@:
1300
           ret
1282
           ret
1301
 
1283
 
1302
.fail:
1284
.fail:
1303
           xor eax, eax
1285
           xor eax, eax
1304
           mov [esp+32], eax
1286
           mov [esp+32], eax
1305
           ret
1287
           ret
-
 
1288
 
-
 
1289
 
-
 
1290
align 4
-
 
1291
f68call:   ; keep this table closer to main code
-
 
1292
 
-
 
1293
           dd f68.11   ; init_heap
-
 
1294
           dd f68.12   ; user_alloc
-
 
1295
           dd f68.13   ; user_free
-
 
1296
           dd f68.14   ; get_event_ex
-
 
1297
           dd f68.fail ; moved to f68.24
-
 
1298
           dd f68.16   ; get_service
-
 
1299
           dd f68.17   ; call_service
-
 
1300
           dd f68.fail ; moved to f68.25
-
 
1301
           dd f68.19   ; load_dll
-
 
1302
           dd f68.20   ; user_realloc
-
 
1303
           dd f68.21   ; load_driver
-
 
1304
           dd f68.22   ; shmem_open
-
 
1305
           dd f68.23   ; shmem_close
-
 
1306
           dd f68.24
-
 
1307
           dd f68.25
-
 
1308
 
1306
 
1309
 
1307
align 4
1310
align 4
1308
proc load_pe_driver stdcall, file:dword
1311
proc load_pe_driver stdcall, file:dword
1309
 
1312
 
1310
           stdcall load_PE, [file]
1313
           stdcall load_PE, [file]
1311
           test eax, eax
1314
           test eax, eax
1312
           jz .fail
1315
           jz .fail
1313
 
1316
 
1314
           mov esi, eax
1317
           mov esi, eax
1315
           stdcall eax, DRV_ENTRY
1318
           stdcall eax, DRV_ENTRY
1316
           test eax, eax
1319
           test eax, eax
1317
           jz .fail
1320
           jz .fail
1318
 
1321
 
1319
           mov [eax+SRV.entry], esi
1322
           mov [eax+SRV.entry], esi
1320
           ret
1323
           ret
1321
 
1324
 
1322
.fail:
1325
.fail:
1323
           xor eax, eax
1326
           xor eax, eax
1324
           ret
1327
           ret
1325
endp
1328
endp
1326
 
1329
 
1327
 
1330
 
1328
align 4
1331
align 4
1329
proc init_mtrr
1332
proc init_mtrr
1330
 
1333
 
1331
           cmp [BOOT_VAR+0x901c],byte 2
1334
           cmp [BOOT_VAR+0x901c],byte 2
1332
           je  .exit
1335
           je  .exit
1333
 
1336
 
1334
           bt [cpu_caps], CAPS_MTRR
1337
           bt [cpu_caps], CAPS_MTRR
1335
           jnc .exit
1338
           jnc .exit
1336
 
1339
 
1337
           mov eax, cr0
1340
           mov eax, cr0
1338
           or eax, 0x60000000   ;disable caching
1341
           or eax, 0x60000000   ;disable caching
1339
           mov cr0, eax
1342
           mov cr0, eax
1340
           wbinvd               ;invalidate cache
1343
           wbinvd               ;invalidate cache
1341
 
1344
 
1342
           mov ecx, 0x2FF
1345
           mov ecx, 0x2FF
1343
           rdmsr                ;
1346
           rdmsr                ;
1344
; has BIOS already initialized MTRRs?
1347
; has BIOS already initialized MTRRs?
1345
           test ah, 8
1348
           test ah, 8
1346
           jnz .skip_init
1349
           jnz .skip_init
1347
; rarely needed, so mainly placeholder
1350
; rarely needed, so mainly placeholder
1348
; main memory - cached
1351
; main memory - cached
1349
           push eax
1352
           push eax
1350
 
1353
 
1351
           mov eax, [MEM_AMOUNT]
1354
           mov eax, [MEM_AMOUNT]
1352
; round eax up to next power of 2
1355
; round eax up to next power of 2
1353
           dec eax
1356
           dec eax
1354
           bsr ecx, eax
1357
           bsr ecx, eax
1355
           mov ebx, 2
1358
           mov ebx, 2
1356
           shl ebx, cl
1359
           shl ebx, cl
1357
           dec ebx
1360
           dec ebx
1358
; base of memory range = 0, type of memory range = MEM_WB
1361
; base of memory range = 0, type of memory range = MEM_WB
1359
           xor edx, edx
1362
           xor edx, edx
1360
           mov eax, MEM_WB
1363
           mov eax, MEM_WB
1361
           mov ecx, 0x200
1364
           mov ecx, 0x200
1362
           wrmsr
1365
           wrmsr
1363
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
1366
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
1364
           mov eax, 0xFFFFFFFF
1367
           mov eax, 0xFFFFFFFF
1365
           mov edx, 0x0000000F
1368
           mov edx, 0x0000000F
1366
           sub eax, ebx
1369
           sub eax, ebx
1367
           sbb edx, 0
1370
           sbb edx, 0
1368
           or eax, 0x800
1371
           or eax, 0x800
1369
           inc ecx
1372
           inc ecx
1370
           wrmsr
1373
           wrmsr
1371
; clear unused MTRRs
1374
; clear unused MTRRs
1372
           xor eax, eax
1375
           xor eax, eax
1373
           xor edx, edx
1376
           xor edx, edx
1374
@@:
1377
@@:
1375
           wrmsr
1378
           wrmsr
1376
           inc ecx
1379
           inc ecx
1377
           cmp ecx, 0x210
1380
           cmp ecx, 0x210
1378
           jb @b
1381
           jb @b
1379
; enable MTRRs
1382
; enable MTRRs
1380
           pop eax
1383
           pop eax
1381
           or ah, 8
1384
           or ah, 8
1382
           and al, 0xF0 ; default memtype = UC
1385
           and al, 0xF0 ; default memtype = UC
1383
           mov ecx, 0x2FF
1386
           mov ecx, 0x2FF
1384
           wrmsr
1387
           wrmsr
1385
.skip_init:
1388
.skip_init:
1386
           stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC
1389
           stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC
1387
 
1390
 
1388
           wbinvd               ;again invalidate
1391
           wbinvd               ;again invalidate
1389
 
1392
 
1390
           mov eax, cr0
1393
           mov eax, cr0
1391
           and eax, not 0x60000000
1394
           and eax, not 0x60000000
1392
           mov cr0, eax         ; enable caching
1395
           mov cr0, eax         ; enable caching
1393
.exit:
1396
.exit:
1394
           ret
1397
           ret
1395
endp
1398
endp
1396
 
1399
 
1397
align 4
1400
align 4
1398
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
1401
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
1399
; find unused register
1402
; find unused register
1400
           mov ecx, 0x201
1403
           mov ecx, 0x201
1401
@@:
1404
@@:
1402
           rdmsr
1405
           rdmsr
1403
           dec ecx
1406
           dec ecx
1404
           test ah, 8
1407
           test ah, 8
1405
           jz .found
1408
           jz .found
1406
           rdmsr
1409
           rdmsr
1407
           mov al, 0 ; clear memory type field
1410
           mov al, 0 ; clear memory type field
1408
           cmp eax, [base]
1411
           cmp eax, [base]
1409
           jz .ret
1412
           jz .ret
1410
           add ecx, 3
1413
           add ecx, 3
1411
           cmp ecx, 0x210
1414
           cmp ecx, 0x210
1412
           jb @b
1415
           jb @b
1413
; no free registers, ignore the call
1416
; no free registers, ignore the call
1414
.ret:
1417
.ret:
1415
           ret
1418
           ret
1416
.found:
1419
.found:
1417
; found, write values
1420
; found, write values
1418
           xor edx, edx
1421
           xor edx, edx
1419
           mov eax, [base]
1422
           mov eax, [base]
1420
           or eax, [mem_type]
1423
           or eax, [mem_type]
1421
           wrmsr
1424
           wrmsr
1422
 
1425
 
1423
           mov ebx, [size]
1426
           mov ebx, [size]
1424
           dec ebx
1427
           dec ebx
1425
           mov eax, 0xFFFFFFFF
1428
           mov eax, 0xFFFFFFFF
1426
           mov edx, 0x0000000F
1429
           mov edx, 0x0000000F
1427
           sub eax, ebx
1430
           sub eax, ebx
1428
           sbb edx, 0
1431
           sbb edx, 0
1429
           or eax, 0x800
1432
           or eax, 0x800
1430
           inc ecx
1433
           inc ecx
1431
           wrmsr
1434
           wrmsr
1432
           ret
1435
           ret
1433
endp
1436
endp
1434
 
1437
 
1435
align 4
1438
align 4
1436
proc stall stdcall, delay:dword
1439
proc stall stdcall, delay:dword
1437
           push ecx
1440
           push ecx
1438
           push edx
1441
           push edx
1439
           push ebx
1442
           push ebx
1440
           push eax
1443
           push eax
1441
 
1444
 
1442
           mov eax, [delay]
1445
           mov eax, [delay]
1443
           mul [stall_mcs]
1446
           mul [stall_mcs]
1444
           mov ebx, eax       ;low
1447
           mov ebx, eax       ;low
1445
           mov ecx, edx       ;high
1448
           mov ecx, edx       ;high
1446
           rdtsc
1449
           rdtsc
1447
           add ebx, eax
1450
           add ebx, eax
1448
           adc ecx,edx
1451
           adc ecx,edx
1449
@@:
1452
@@:
1450
           rdtsc
1453
           rdtsc
1451
           sub eax, ebx
1454
           sub eax, ebx
1452
           sbb edx, ecx
1455
           sbb edx, ecx
1453
           jb @B
1456
           jb @B
1454
 
1457
 
1455
           pop eax
1458
           pop eax
1456
           pop ebx
1459
           pop ebx
1457
           pop edx
1460
           pop edx
1458
           pop ecx
1461
           pop ecx
1459
           ret
1462
           ret
1460
endp
1463
endp
1461
 
1464
 
1462
align 4
1465
align 4
1463
proc create_ring_buffer stdcall, size:dword, flags:dword
1466
proc create_ring_buffer stdcall, size:dword, flags:dword
1464
           locals
1467
           locals
1465
             buf_ptr  dd ?
1468
             buf_ptr  dd ?
1466
           endl
1469
           endl
1467
 
1470
 
1468
           mov eax, [size]
1471
           mov eax, [size]
1469
           test eax, eax
1472
           test eax, eax
1470
           jz .fail
1473
           jz .fail
1471
 
1474
 
1472
           add eax, eax
1475
           add eax, eax
1473
           stdcall alloc_kernel_space, eax
1476
           stdcall alloc_kernel_space, eax
1474
           test eax, eax
1477
           test eax, eax
1475
           jz .fail
1478
           jz .fail
1476
 
1479
 
1477
           push ebx
1480
           push ebx
1478
 
1481
 
1479
           mov [buf_ptr], eax
1482
           mov [buf_ptr], eax
1480
 
1483
 
1481
           mov ebx, [size]
1484
           mov ebx, [size]
1482
           shr ebx, 12
1485
           shr ebx, 12
1483
           push ebx
1486
           push ebx
1484
 
1487
 
1485
           stdcall alloc_pages, ebx
1488
           stdcall alloc_pages, ebx
1486
           pop ecx
1489
           pop ecx
1487
 
1490
 
1488
           test eax, eax
1491
           test eax, eax
1489
           jz .mm_fail
1492
           jz .mm_fail
1490
 
1493
 
1491
           push edi
1494
           push edi
1492
 
1495
 
1493
           or eax, [flags]
1496
           or eax, [flags]
1494
           mov edi, [buf_ptr]
1497
           mov edi, [buf_ptr]
1495
           mov ebx, [buf_ptr]
1498
           mov ebx, [buf_ptr]
1496
           mov edx, ecx
1499
           mov edx, ecx
1497
           shl edx, 2
1500
           shl edx, 2
1498
           shr edi, 10
1501
           shr edi, 10
1499
@@:
1502
@@:
1500
           mov [page_tabs+edi], eax
1503
           mov [page_tabs+edi], eax
1501
           mov [page_tabs+edi+edx], eax
1504
           mov [page_tabs+edi+edx], eax
1502
           invlpg [ebx]
1505
           invlpg [ebx]
1503
           invlpg [ebx+0x10000]
1506
           invlpg [ebx+0x10000]
1504
           add eax, 0x1000
1507
           add eax, 0x1000
1505
           add ebx, 0x1000
1508
           add ebx, 0x1000
1506
           add edi, 4
1509
           add edi, 4
1507
           dec ecx
1510
           dec ecx
1508
           jnz @B
1511
           jnz @B
1509
 
1512
 
1510
           mov eax, [buf_ptr]
1513
           mov eax, [buf_ptr]
1511
           pop edi
1514
           pop edi
1512
           pop ebx
1515
           pop ebx
1513
           ret
1516
           ret
1514
.mm_fail:
1517
.mm_fail:
1515
           stdcall free_kernel_space, [buf_ptr]
1518
           stdcall free_kernel_space, [buf_ptr]
1516
           xor eax, eax
1519
           xor eax, eax
1517
           pop ebx
1520
           pop ebx
1518
.fail:
1521
.fail:
1519
           ret
1522
           ret
1520
endp
1523
endp