Subversion Repositories Kolibri OS

Rev

Rev 2217 | Rev 2441 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2217 Rev 2434
Line 3... Line 3...
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 2217 $
8
$Revision: 2434 $
9
 
9
 
Line 10... Line 10...
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
Line 17... Line 17...
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
Line 52... Line 52...
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
Line 118... Line 118...
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]
Line 132... Line 132...
132
           shr ebx, 12
132
        shr     ebx, 12
133
           mov [page_tabs+ebx*4], eax
133
        mov     [page_tabs+ebx*4], eax
Line 134... Line 134...
134
           mov eax, [lin_addr]
134
        mov     eax, [lin_addr]
Line 135... Line 135...
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
Line -... Line 156...
-
 
156
        shr     eax, 3
156
           shr eax, 3
157
        and     eax, not 3                    ;dword offset from page_map
Line 157... Line 158...
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
align 4
169
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
170
proc map_io_mem stdcall, base:dword, size:dword, flags:dword
170
 
171
 
171
           push ebx
172
        push    ebx
172
           push edi
173
        push    edi
173
           mov eax, [size]
174
        mov     eax, [size]
174
           add eax, [base]
175
        add     eax, [base]
175
           add eax, 4095
176
        add     eax, 4095
176
           and eax, -4096
177
        and     eax, -4096
177
           mov ecx, [base]
178
        mov     ecx, [base]
178
           and ecx, -4096
179
        and     ecx, -4096
179
           sub eax, ecx
180
        sub     eax, ecx
180
           mov [size], eax
181
        mov     [size], eax
181
 
182
 
182
           stdcall alloc_kernel_space, eax
183
        stdcall alloc_kernel_space, eax
183
           test eax, eax
184
        test    eax, eax
184
           jz .fail
185
        jz      .fail
185
           push eax
186
        push    eax
186
 
187
 
187
           mov edi, 0x1000
188
        mov     edi, 0x1000
188
           mov ebx, eax
189
        mov     ebx, eax
189
           mov ecx,[size]
190
        mov     ecx, [size]
190
           mov edx, [base]
191
        mov     edx, [base]
191
           shr eax, 12
192
        shr     eax, 12
192
           shr ecx, 12
193
        shr     ecx, 12
193
           and edx, -4096
194
        and     edx, -4096
194
           or edx, [flags]
195
        or      edx, [flags]
195
@@:
196
@@:
196
           mov [page_tabs+eax*4], edx
197
        mov     [page_tabs+eax*4], edx
197
           invlpg [ebx]
198
        invlpg  [ebx]
Line 198... Line 199...
198
           inc eax
199
        inc     eax
199
           add ebx, edi
200
        add     ebx, edi
200
           add edx, edi
201
        add     edx, edi
201
           loop @B
202
        loop    @B
Line 202... Line 203...
202
 
203
 
203
           pop eax
204
        pop     eax
204
           mov edx, [base]
205
        mov     edx, [base]
205
           and edx, 4095
206
        and     edx, 4095
Line 206... Line 207...
206
           add eax, edx
207
        add     eax, edx
207
.fail:
208
.fail:
208
           pop edi
209
        pop     edi
209
           pop ebx
210
        pop     ebx
210
           ret
211
        ret
211
endp
212
endp
212
 
213
 
213
; param
214
; param
214
;  eax= page base + page flags
215
;  eax= page base + page flags
215
;  ebx= linear address
216
;  ebx= linear address
216
;  ecx= count
217
;  ecx= count
217
 
218
 
218
align 4
219
align 4
219
commit_pages:
220
commit_pages:
220
           test ecx, ecx
221
        test    ecx, ecx
221
           jz .fail
222
        jz      .fail
222
 
223
 
Line 223... Line 224...
223
           push edi
224
        push    edi
Line 224... Line 225...
224
           push eax
225
        push    eax
225
           push ecx
226
        push    ecx
226
           mov ecx, pg_data.mutex
227
        mov     ecx, pg_data.mutex
227
           call mutex_lock
228
        call    mutex_lock
Line 228... Line 229...
228
           pop ecx
229
        pop     ecx
229
           pop eax
230
        pop     eax
230
 
231
 
Line 231... Line 232...
231
           mov edi, ebx
232
        mov     edi, ebx
232
           shr edi, 12
233
        shr     edi, 12
Line 233... Line 234...
233
           lea edi, [page_tabs+edi*4]
234
        lea     edi, [page_tabs+edi*4]
234
@@:
235
@@:
235
           stosd
236
        stosd
236
           invlpg [ebx]
237
        invlpg  [ebx]
237
           add eax, 0x1000
238
        add     eax, 0x1000
238
           add ebx, 0x1000
239
        add     ebx, 0x1000
239
           loop @B
240
        loop    @B
240
 
241
 
241
           pop edi
242
        pop     edi
242
 
243
 
243
           mov ecx, pg_data.mutex
244
        mov     ecx, pg_data.mutex
244
           call mutex_unlock
245
        call    mutex_unlock
245
.fail:
246
.fail:
246
           ret
247
        ret
247
 
248
 
248
 
249
 
249
; param
250
; param
250
;  eax= base
251
;  eax= base
251
;  ecx= count
252
;  ecx= count
252
 
253
 
253
align 4
254
align 4
254
release_pages:
255
release_pages:
255
 
256
 
256
           push ebp
-
 
257
           push esi
-
 
258
           push edi
-
 
259
           push ebx
-
 
260
 
-
 
261
           mov esi, eax
-
 
262
           mov edi, eax
-
 
263
 
-
 
264
           shr esi, 12
-
 
265
           lea esi, [page_tabs+esi*4]
-
 
266
 
-
 
267
           push ecx
-
 
268
           mov ecx, pg_data.mutex
-
 
Line -... Line 257...
-
 
257
        push    ebp
-
 
258
        push    esi
-
 
259
        push    edi
-
 
260
        push    ebx
-
 
261
 
-
 
262
        mov     esi, eax
-
 
263
        mov     edi, eax
-
 
264
 
-
 
265
        shr     esi, 12
-
 
266
        lea     esi, [page_tabs+esi*4]
-
 
267
 
-
 
268
        push    ecx
-
 
269
        mov     ecx, pg_data.mutex
269
           call mutex_lock
270
        call    mutex_lock
270
           pop ecx
271
        pop     ecx
271
 
272
 
272
           mov ebp, [pg_data.pages_free]
273
        mov     ebp, [pg_data.pages_free]
273
           mov ebx, [page_start]
274
        mov     ebx, [page_start]
274
           mov edx, sys_pgmap
275
        mov     edx, sys_pgmap
275
@@:
276
@@:
276
           xor eax, eax
277
        xor     eax, eax
277
           xchg eax, [esi]
278
        xchg    eax, [esi]
278
           invlpg [edi]
279
        invlpg  [edi]
279
 
280
 
280
           test eax, 1
281
        test    eax, 1
281
           jz .next
282
        jz      .next
282
 
283
 
283
           shr eax, 12
284
        shr     eax, 12
Line 284... Line 285...
284
           bts [edx], eax
285
        bts     [edx], eax
285
           cmc
286
        cmc
286
           adc ebp, 0
287
        adc     ebp, 0
Line 287... Line 288...
287
           shr eax, 3
288
        shr     eax, 3
288
           and eax, -4
289
        and     eax, -4
Line 289... Line 290...
289
           add eax, edx
290
        add     eax, edx
Line 290... Line 291...
290
           cmp eax, ebx
291
        cmp     eax, ebx
291
           jae .next
292
        jae     .next
Line 292... Line 293...
292
 
293
 
293
           mov ebx, eax
294
        mov     ebx, eax
Line 294... Line 295...
294
.next:
295
.next:
295
           add edi, 0x1000
296
        add     edi, 0x1000
296
           add esi, 4
297
        add     esi, 4
297
           loop @B
298
        loop    @B
298
 
299
 
299
           mov [pg_data.pages_free], ebp
300
        mov     [pg_data.pages_free], ebp
Line 300... Line 301...
300
           mov ecx, pg_data.mutex
301
        mov     ecx, pg_data.mutex
301
           call mutex_unlock
302
        call    mutex_unlock
Line 302... Line 303...
302
 
303
 
303
           pop ebx
304
        pop     ebx
304
           pop edi
305
        pop     edi
305
           pop esi
306
        pop     esi
306
           pop ebp
307
        pop     ebp
307
           ret
308
        ret
308
 
309
 
309
; param
310
; param
310
;  eax= base
311
;  eax= base
311
;  ecx= count
312
;  ecx= count
312
 
313
 
313
align 4
314
align 4
314
unmap_pages:
315
unmap_pages:
315
 
316
 
316
           push edi
317
        push    edi
317
 
318
 
Line 318... Line 319...
318
           mov edi, eax
319
        mov     edi, eax
319
           mov edx, eax
320
        mov     edx, eax
320
 
321
 
321
           shr edi, 10
322
        shr     edi, 10
322
           add edi, page_tabs
323
        add     edi, page_tabs
Line 323... Line 324...
323
 
324
 
324
           xor eax, eax
325
        xor     eax, eax
325
@@:
326
@@:
-
 
327
        stosd
-
 
328
        invlpg  [edx]
326
           stosd
329
        add     edx, 0x1000
327
           invlpg [edx]
330
        loop    @b
328
           add edx, 0x1000
331
 
329
           loop @b
332
        pop     edi
330
 
333
        ret
331
           pop edi
334
 
332
           ret
335
 
333
 
336
align 4
-
 
337
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
-
 
338
        push    ebx
334
 
339
        mov     ebx, [lin_addr]
335
align 4
340
        shr     ebx, 22
336
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
341
        mov     eax, [phis_addr]
337
           push ebx
342
        and     eax, not 0xFFF
338
           mov ebx, [lin_addr]
343
        or      eax, PG_UW        ;+PG_NOCACHE
339
           shr ebx, 22
344
        mov     dword [master_tab+ebx*4], eax
340
           mov eax, [phis_addr]
345
        mov     eax, [lin_addr]
341
           and eax, not 0xFFF
346
        shr     eax, 10
342
           or eax, PG_UW          ;+PG_NOCACHE
347
        add     eax, page_tabs
343
           mov dword [master_tab+ebx*4], eax
348
        invlpg  [eax]
344
           mov eax, [lin_addr]
349
        pop     ebx
345
           shr eax, 10
350
        ret
346
           add eax, page_tabs
351
endp
347
           invlpg [eax]
352
 
348
           pop ebx
353
align 4
349
           ret
354
proc init_LFB
350
endp
355
           locals
351
 
356
             pg_count dd ?
352
align 4
357
           endl
353
proc init_LFB
358
 
354
           locals
359
        cmp     dword [LFBAddress], -1
355
             pg_count dd ?
360
        jne     @f
356
           endl
361
        mov     [BOOT_VAR+0x901c], byte 2
357
 
362
; max VGA=640*480*4=1228800 bytes
358
           cmp dword [LFBAddress], -1
363
; + 32*640*4=81920 bytes for mouse pointer
359
           jne @f
364
        stdcall alloc_pages, ((1228800+81920)/4096)
360
           mov [BOOT_VAR+0x901c],byte 2
365
 
361
           stdcall alloc_pages, (0x280000 / 4096)
366
        push    eax
362
 
367
        call    alloc_page
363
           push eax
368
        stdcall map_page_table, LFB_BASE, eax
364
           call alloc_page
369
        pop     eax
365
           stdcall map_page_table, LFB_BASE, eax
370
        or      eax, PG_UW
366
           pop eax
371
        mov     ebx, LFB_BASE
367
           or eax, PG_UW
372
; max VGA=640*480*4=1228800 bytes
368
           mov ebx, LFB_BASE
373
; + 32*640*4=81920 bytes for mouse pointer
369
           mov ecx, 0x280000 / 4096
374
        mov     ecx, (1228800+81920)/4096
370
           call commit_pages
375
        call    commit_pages
371
           mov [LFBAddress], dword LFB_BASE
376
        mov     [LFBAddress], dword LFB_BASE
372
           ret
377
        ret
373
@@:
378
@@:
Line 374... Line 379...
374
           test [SCR_MODE],word 0100000000000000b
379
        test    [SCR_MODE], word 0100000000000000b
Line 375... Line 380...
375
           jnz @f
380
        jnz     @f
376
           mov [BOOT_VAR+0x901c],byte 2
381
        mov     [BOOT_VAR+0x901c], byte 2
377
           ret
382
        ret
378
@@:
383
@@:
379
           call init_mtrr
384
        call    init_mtrr
380
 
385
 
381
           mov edx, LFB_BASE
386
        mov     edx, LFB_BASE
382
           mov esi, [LFBAddress]
387
        mov     esi, [LFBAddress]
383
           mov edi, 0x00C00000
388
        mov     edi, 0x00C00000
384
           mov dword [exp_lfb+4], edx
389
        mov     dword [exp_lfb+4], edx
385
 
390
 
386
           shr edi, 12
391
        shr     edi, 12
387
           mov [pg_count], edi
392
        mov     [pg_count], edi
388
           shr edi, 10
393
        shr     edi, 10
389
 
394
 
390
           bt [cpu_caps], CAPS_PSE
395
        bt      [cpu_caps], CAPS_PSE
391
           jnc .map_page_tables
396
        jnc     .map_page_tables
392
           or esi, PG_LARGE+PG_UW
397
        or      esi, PG_LARGE+PG_UW
393
           mov edx, sys_pgdir+(LFB_BASE shr 20)
398
        mov     edx, sys_pgdir+(LFB_BASE shr 20)
394
@@:
399
@@:
395
           mov [edx], esi
400
        mov     [edx], esi
Line 396... Line 401...
396
           add edx, 4
401
        add     edx, 4
397
           add esi, 0x00400000
402
        add     esi, 0x00400000
Line 398... Line 403...
398
           dec edi
403
        dec     edi
399
           jnz @B
404
        jnz     @B
Line 400... Line 405...
400
 
405
 
401
           bt [cpu_caps], CAPS_PGE
406
        bt      [cpu_caps], CAPS_PGE
-
 
407
        jnc     @F
-
 
408
        or      dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
-
 
409
@@:
-
 
410
        mov     dword [LFBAddress], LFB_BASE
-
 
411
        mov     eax, cr3      ;flush TLB
-
 
412
        mov     cr3, eax
-
 
413
        ret
-
 
414
 
-
 
415
.map_page_tables:
-
 
416
 
-
 
417
@@:
-
 
418
        call    alloc_page
-
 
419
        stdcall map_page_table, edx, eax
-
 
420
        add     edx, 0x00400000
-
 
421
        dec     edi
-
 
422
        jnz     @B
-
 
423
 
-
 
424
        mov     eax, [LFBAddress]
-
 
425
        mov     edi, page_tabs + (LFB_BASE shr 10)
-
 
426
        or      eax, PG_UW
-
 
427
        mov     ecx, [pg_count]
-
 
428
        cld
-
 
429
@@:
-
 
430
        stosd
-
 
431
        add     eax, 0x1000
-
 
432
        dec     ecx
-
 
433
        jnz     @B
-
 
434
 
-
 
435
        mov     dword [LFBAddress], LFB_BASE
-
 
436
        mov     eax, cr3      ;flush TLB
Line 402... Line -...
402
           jnc @F
-
 
403
           or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL
-
 
404
@@:
-
 
405
           mov dword [LFBAddress], LFB_BASE
-
 
406
           mov eax, cr3       ;flush TLB
-
 
407
           mov cr3, eax
-
 
408
           ret
-
 
409
 
-
 
410
.map_page_tables:
-
 
411
 
-
 
412
@@:
-
 
413
           call alloc_page
-
 
414
           stdcall map_page_table, edx, eax
-
 
415
           add edx, 0x00400000
-
 
416
           dec edi
-
 
417
           jnz @B
-
 
418
 
-
 
419
           mov eax, [LFBAddress]
-
 
420
           mov edi, page_tabs + (LFB_BASE shr 10)
437
        mov     cr3, eax
421
           or eax, PG_UW
-
 
422
           mov ecx, [pg_count]
-
 
423
           cld
-
 
424
@@:
-
 
425
           stosd
-
 
426
           add eax, 0x1000
438
 
427
           dec ecx
-
 
428
           jnz @B
-
 
429
 
-
 
430
           mov dword [LFBAddress], LFB_BASE
-
 
431
           mov eax, cr3       ;flush TLB
-
 
432
           mov cr3, eax
-
 
433
 
439
        ret
434
           ret
440
endp
Line 435... Line 441...
435
endp
441
 
436
 
442
align 4
437
align 4
443
proc new_mem_resize stdcall, new_size:dword
Line 438... Line 444...
438
proc new_mem_resize stdcall, new_size:dword
444
 
439
 
445
        mov     ecx, pg_data.mutex
Line 440... Line 446...
440
           mov ecx, pg_data.mutex
446
        call    mutex_lock
441
           call mutex_lock
447
 
442
 
448
        mov     edi, [new_size]
Line 443... Line 449...
443
           mov edi, [new_size]
449
        add     edi, 4095
444
           add edi,4095
450
        and     edi, not 4095
-
 
451
        mov     [new_size], edi
-
 
452
 
-
 
453
        mov     edx, [current_slot]
-
 
454
        cmp     [edx+APPDATA.heap_base], 0
-
 
455
        jne     .exit
-
 
456
 
-
 
457
        mov     esi, [edx+APPDATA.mem_size]
-
 
458
        add     esi, 4095
-
 
459
        and     esi, not 4095
-
 
460
 
Line 445... Line -...
445
           and edi,not 4095
-
 
446
           mov [new_size], edi
-
 
447
 
-
 
448
           mov edx,[current_slot]
-
 
449
           cmp [edx+APPDATA.heap_base],0
-
 
450
           jne .exit
-
 
451
 
-
 
452
           mov esi, [edx+APPDATA.mem_size]
-
 
453
           add esi, 4095
-
 
454
           and esi, not 4095
-
 
455
 
461
        cmp     edi, esi
456
           cmp edi, esi
462
        jae     .expand
457
           jae .expand
463
 
458
 
464
        shr     edi, 12
459
           shr edi, 12
465
        shr     esi, 12
460
           shr esi, 12
466
@@:
461
@@:
467
        mov     eax, [app_page_tabs+edi*4]
462
           mov eax, [app_page_tabs+edi*4]
468
        test    eax, 1
463
           test eax, 1
469
        jz      .next
464
           jz .next
470
        mov     dword [app_page_tabs+edi*4], 2
465
           mov dword [app_page_tabs+edi*4], 2
471
        mov     ebx, edi
466
           mov ebx, edi
472
        shl     ebx, 12
467
           shl ebx, 12
473
        push    eax
468
           push eax
474
        invlpg  [ebx]
469
           invlpg [ebx]
475
        pop     eax
470
           pop eax
476
        call    free_page
471
           call free_page
477
 
472
 
478
.next:
473
.next:     add edi, 1
479
        add     edi, 1
474
           cmp edi, esi
480
        cmp     edi, esi
475
           jb @B
481
        jb      @B
476
 
482
 
477
.update_size:
483
.update_size:
478
           mov     ebx, [new_size]
484
        mov     ebx, [new_size]
479
           call    update_mem_size
485
        call    update_mem_size
480
 
486
 
481
           mov ecx, pg_data.mutex
487
        mov     ecx, pg_data.mutex
482
           call mutex_unlock
488
        call    mutex_unlock
483
 
489
 
484
           xor eax, eax
490
        xor     eax, eax
485
           ret
491
        ret
486
.expand:
492
.expand:
487
 
493
 
488
           push esi
494
        push    esi
489
           push edi
495
        push    edi
490
 
496
 
491
           add edi, 0x3FFFFF
497
        add     edi, 0x3FFFFF
492
           and edi, not(0x3FFFFF)
498
        and     edi, not(0x3FFFFF)
493
           add esi, 0x3FFFFF
499
        add     esi, 0x3FFFFF
494
           and esi, not(0x3FFFFF)
500
        and     esi, not(0x3FFFFF)
495
 
501
 
496
           cmp esi, edi
502
        cmp     esi, edi
497
           jae .grow
503
        jae     .grow
498
 
504
 
499
           xchg esi, edi
505
        xchg    esi, edi
500
 
506
 
501
@@:
507
@@:
502
           call alloc_page
508
        call    alloc_page
Line 503... Line 509...
503
           test eax, eax
509
        test    eax, eax
504
           jz .exit_pop
510
        jz      .exit_pop
505
 
511
 
506
           stdcall map_page_table, edi, eax
512
        stdcall map_page_table, edi, eax
507
 
513
 
508
           push edi
514
        push    edi
509
           shr edi, 10
515
        shr     edi, 10
510
           add edi, page_tabs
516
        add     edi, page_tabs
511
           mov ecx, 1024
517
        mov     ecx, 1024
512
           xor eax, eax
518
        xor     eax, eax
Line 513... Line 519...
513
           cld
519
        cld
514
           rep stosd
520
        rep stosd
515
           pop edi
521
        pop     edi
516
 
522
 
Line 517... Line 523...
517
           add edi, 0x00400000
523
        add     edi, 0x00400000
518
           cmp edi, esi
524
        cmp     edi, esi
519
           jb @B
525
        jb      @B
520
.grow:
526
.grow:
Line 521... Line 527...
521
;//-
527
;//-
522
	   pop edi
528
        pop     edi
523
	   push edi
529
        push    edi
524
	   mov esi, [pg_data.pages_free]
530
        mov     esi, [pg_data.pages_free]
525
	   sub esi, 1
531
        sub     esi, 1
Line 526... Line 532...
526
	   shr edi, 12
532
        shr     edi, 12
527
	   cmp esi, edi
533
        cmp     esi, edi
528
	   jle .out_of_memory
534
        jle     .out_of_memory
529
;//-
535
;//-
530
           pop edi
536
        pop     edi
531
           pop esi
537
        pop     esi
532
@@:
538
@@:
533
           call alloc_page
539
        call    alloc_page
534
           test eax, eax
540
        test    eax, eax
535
           jz .exit
541
        jz      .exit
536
           stdcall map_page,esi,eax,dword PG_UW
542
        stdcall map_page, esi, eax, dword PG_UW
537
 
543
 
538
           push edi
544
        push    edi
539
           mov edi, esi
545
        mov     edi, esi
540
           xor eax, eax
546
        xor     eax, eax
541
           mov ecx, 1024
547
        mov     ecx, 1024
542
           cld
548
        cld
543
           rep stosd
549
        rep stosd
544
           pop edi
550
        pop     edi
Line 545... Line 551...
545
 
551
 
546
           add esi, 0x1000
552
        add     esi, 0x1000
547
           cmp esi, edi
553
        cmp     esi, edi
548
           jb  @B
554
        jb      @B
549
 
555
 
Line 550... Line 556...
550
           jmp .update_size
556
        jmp     .update_size
551
;//-
557
;//-
552
.exit_pop:
558
.exit_pop:
553
.out_of_memory:
559
.out_of_memory:
554
;//-
560
;//-
555
           pop edi
561
        pop     edi
Line 556... Line 562...
556
           pop esi
562
        pop     esi
557
.exit:
563
.exit:
558
           mov ecx, pg_data.mutex
564
        mov     ecx, pg_data.mutex
Line 671... Line 677...
671
.alloc:
677
.alloc:
672
        call    alloc_page
678
        call    alloc_page
673
        test    eax, eax
679
        test    eax, eax
674
        jz      .fail
680
        jz      .fail
Line 675... Line 681...
675
 
681
 
Line 676... Line 682...
676
        stdcall map_page,[.err_addr],eax,PG_UW
682
        stdcall map_page, [.err_addr], eax, PG_UW
677
 
683
 
678
        mov     edi, [.err_addr]
684
        mov     edi, [.err_addr]
679
        and     edi, 0xFFFFF000
685
        and     edi, 0xFFFFF000
680
        mov     ecx, 1024
686
        mov     ecx, 1024
681
        xor     eax, eax
687
        xor     eax, eax
682
       ;cld     ;caller is duty for this
688
       ;cld     ;caller is duty for this
683
        rep     stosd
689
        rep stosd
684
.exit:  ;iret with repeat fault instruction
690
.exit:  ;iret with repeat fault instruction
685
        add     esp,12 ;clear in stack: locals(.err_addr) + #PF + ret_to_caller
691
        add     esp, 12;clear in stack: locals(.err_addr) + #PF + ret_to_caller
Line 686... Line 692...
686
        restore_ring3_context
692
        restore_ring3_context
687
        iretd
693
        iretd
Line 709... Line 715...
709
.fault_in_hdll:
715
.fault_in_hdll:
710
; allocate new page, map it as rw and copy data
716
; allocate new page, map it as rw and copy data
711
        call    alloc_page
717
        call    alloc_page
712
        test    eax, eax
718
        test    eax, eax
713
        jz      .fail
719
        jz      .fail
714
        stdcall map_page,ebx,eax,PG_UW
720
        stdcall map_page, ebx, eax, PG_UW
715
        mov     edi, ebx
721
        mov     edi, ebx
716
        mov     ecx, 1024
722
        mov     ecx, 1024
717
        sub     ebx, [esi+HDLL.base]
723
        sub     ebx, [esi+HDLL.base]
718
        mov     esi, [esi+HDLL.parent]
724
        mov     esi, [esi+HDLL.parent]
719
        mov     esi, [esi+DLLDESCR.data]
725
        mov     esi, [esi+DLLDESCR.data]
720
        add     esi, ebx
726
        add     esi, ebx
721
        rep     movsd
727
        rep movsd
722
        jmp     .exit
728
        jmp     .exit
Line 723... Line 729...
723
 
729
 
724
.kernel_space:
730
.kernel_space:
725
        test    eax, PG_MAP
731
        test    eax, PG_MAP
Line 726... Line 732...
726
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
732
        jz      .fail   ;ñòðàíèöà íå ïðèñóòñòâóåò
727
 
733
 
728
        test    eax,12  ;U/S (+below)
734
        test    eax, 12 ;U/S (+below)
729
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
735
        jnz     .fail   ;ïðèëîæåíèå îáðàòèëîñü ê ïàìÿòè
730
                        ;ÿäðà
736
                        ;ÿäðà
731
       ;test    eax, 8
737
       ;test    eax, 8
Line 746... Line 752...
746
        call    alloc_page
752
        call    alloc_page
747
        test    eax, eax
753
        test    eax, eax
748
        jz      .fail
754
        jz      .fail
Line 749... Line 755...
749
 
755
 
750
        push    eax
756
        push    eax
751
        stdcall map_page,[.err_addr],eax,dword PG_SW
757
        stdcall map_page, [.err_addr], eax, dword PG_SW
752
        pop     eax
758
        pop     eax
753
        mov     edi, [.err_addr]
759
        mov     edi, [.err_addr]
754
        and     edi, -4096
760
        and     edi, -4096
Line 761... Line 767...
761
        mov     [edx+APPDATA.io_map+ebx*4], eax
767
        mov     [edx+APPDATA.io_map+ebx*4], eax
Line 762... Line 768...
762
 
768
 
763
        add     esi, [default_io_map]
769
        add     esi, [default_io_map]
764
        mov     ecx, 4096/4
770
        mov     ecx, 4096/4
765
       ;cld     ;caller is duty for this
771
       ;cld     ;caller is duty for this
766
        rep     movsd
772
        rep movsd
767
        jmp     .exit
773
        jmp     .exit
Line 768... Line 774...
768
endp
774
endp
769
 
775
 
770
; returns number of mapped bytes
776
; returns number of mapped bytes
771
proc map_mem stdcall, lin_addr:dword,slot:dword,\
777
proc map_mem stdcall, lin_addr:dword,slot:dword,\
Line 772... Line 778...
772
                      ofs:dword,buf_size:dword,req_access:dword
778
                      ofs:dword,buf_size:dword,req_access:dword
773
           push 0 ; initialize number of mapped bytes
779
        push    0 ; initialize number of mapped bytes
Line 774... Line 780...
774
 
780
 
775
           cmp [buf_size], 0
781
        cmp     [buf_size], 0
776
           jz .exit
782
        jz      .exit
777
 
783
 
778
           mov eax, [slot]
784
        mov     eax, [slot]
779
           shl eax, 8
785
        shl     eax, 8
780
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
786
        mov     eax, [SLOT_BASE+eax+APPDATA.dir_table]
781
           and eax, 0xFFFFF000
787
        and     eax, 0xFFFFF000
782
 
788
 
783
           stdcall map_page,[ipc_pdir],eax,PG_UW
789
        stdcall map_page, [ipc_pdir], eax, PG_UW
784
           mov ebx, [ofs]
790
        mov     ebx, [ofs]
785
           shr ebx, 22
791
        shr     ebx, 22
786
           mov esi, [ipc_pdir]
792
        mov     esi, [ipc_pdir]
787
           mov edi, [ipc_ptab]
793
        mov     edi, [ipc_ptab]
788
           mov eax, [esi+ebx*4]
794
        mov     eax, [esi+ebx*4]
789
           and eax, 0xFFFFF000
795
        and     eax, 0xFFFFF000
790
           jz .exit
796
        jz      .exit
791
           stdcall map_page,edi,eax,PG_UW
797
        stdcall map_page, edi, eax, PG_UW
792
;           inc ebx
798
;           inc ebx
793
;           add edi, 0x1000
799
;           add edi, 0x1000
794
;           mov eax, [esi+ebx*4]
800
;           mov eax, [esi+ebx*4]
Line -... Line 801...
-
 
801
;           test eax, eax
795
;           test eax, eax
802
;           jz @f
796
;           jz @f
803
;          and eax, 0xFFFFF000
797
;          and eax, 0xFFFFF000
804
;           stdcall map_page, edi, eax
798
;           stdcall map_page, edi, eax
805
 
799
 
806
@@:
800
@@:        mov edi, [lin_addr]
807
        mov     edi, [lin_addr]
801
           and edi, 0xFFFFF000
808
        and     edi, 0xFFFFF000
802
           mov ecx, [buf_size]
809
        mov     ecx, [buf_size]
803
           add ecx, 4095
810
        add     ecx, 4095
804
           shr ecx, 12
811
        shr     ecx, 12
805
           inc ecx
812
        inc     ecx
Line 806... Line 813...
806
 
813
 
807
           mov edx, [ofs]
814
        mov     edx, [ofs]
808
           shr edx, 12
815
        shr     edx, 12
809
           and edx, 0x3FF
816
        and     edx, 0x3FF
810
           mov esi, [ipc_ptab]
817
        mov     esi, [ipc_ptab]
811
 
818
 
812
.map:
819
.map:
813
           stdcall safe_map_page,[slot],[req_access],[ofs]
820
        stdcall safe_map_page, [slot], [req_access], [ofs]
814
           jnc .exit
821
        jnc     .exit
815
           add dword [ebp-4], 4096
822
        add     dword [ebp-4], 4096
816
           add [ofs], 4096
823
        add     [ofs], 4096
817
           dec ecx
824
        dec     ecx
818
           jz  .exit
825
        jz      .exit
819
           add edi, 0x1000
826
        add     edi, 0x1000
820
           inc edx
827
        inc     edx
821
           cmp edx, 0x400
828
        cmp     edx, 0x400
822
           jnz .map
829
        jnz     .map
823
           inc ebx
830
        inc     ebx
824
           mov eax, [ipc_pdir]
831
        mov     eax, [ipc_pdir]
Line 825... Line 832...
825
           mov eax, [eax+ebx*4]
832
        mov     eax, [eax+ebx*4]
826
           and eax, 0xFFFFF000
833
        and     eax, 0xFFFFF000
827
           jz  .exit
834
        jz      .exit
828
           stdcall map_page,esi,eax,PG_UW
835
        stdcall map_page, esi, eax, PG_UW
Line 829... Line 836...
829
           xor edx, edx
836
        xor     edx, edx
830
           jmp .map
837
        jmp     .map
831
 
838
 
-
 
839
.exit:
-
 
840
        pop     eax
-
 
841
        ret
Line -... Line 842...
-
 
842
endp
-
 
843
 
-
 
844
proc map_memEx stdcall, lin_addr:dword,slot:dword,\
-
 
845
                        ofs:dword,buf_size:dword,req_access:dword
-
 
846
        push    0 ; initialize number of mapped bytes
-
 
847
 
-
 
848
        cmp     [buf_size], 0
-
 
849
        jz      .exit
-
 
850
 
-
 
851
        mov     eax, [slot]
832
.exit:
852
        shl     eax, 8
-
 
853
        mov     eax, [SLOT_BASE+eax+APPDATA.dir_table]
-
 
854
        and     eax, 0xFFFFF000
833
           pop eax
855
 
-
 
856
        stdcall map_page, [proc_mem_pdir], eax, PG_UW
Line 834... Line -...
834
           ret
-
 
835
endp
-
 
836
 
-
 
837
proc map_memEx stdcall, lin_addr:dword,slot:dword,\
-
 
838
                        ofs:dword,buf_size:dword,req_access:dword
857
        mov     ebx, [ofs]
839
           push 0 ; initialize number of mapped bytes
-
 
840
 
-
 
841
           cmp [buf_size], 0
-
 
842
           jz .exit
-
 
843
 
-
 
844
           mov eax, [slot]
-
 
845
           shl eax, 8
-
 
846
           mov eax, [SLOT_BASE+eax+APPDATA.dir_table]
-
 
847
           and eax, 0xFFFFF000
-
 
848
 
-
 
849
           stdcall map_page,[proc_mem_pdir],eax,PG_UW
-
 
850
           mov ebx, [ofs]
858
        shr     ebx, 22
851
           shr ebx, 22
859
        mov     esi, [proc_mem_pdir]
852
           mov esi, [proc_mem_pdir]
860
        mov     edi, [proc_mem_tab]
853
           mov edi, [proc_mem_tab]
861
        mov     eax, [esi+ebx*4]
854
           mov eax, [esi+ebx*4]
862
        and     eax, 0xFFFFF000
855
           and eax, 0xFFFFF000
863
        test    eax, eax
856
           test eax, eax
864
        jz      .exit
857
           jz .exit
865
        stdcall map_page, edi, eax, PG_UW
858
           stdcall map_page,edi,eax,PG_UW
866
 
859
 
867
@@:
860
@@:        mov edi, [lin_addr]
868
        mov     edi, [lin_addr]
Line 861... Line 869...
861
           and edi, 0xFFFFF000
869
        and     edi, 0xFFFFF000
862
           mov ecx, [buf_size]
870
        mov     ecx, [buf_size]
863
           add ecx, 4095
871
        add     ecx, 4095
864
           shr ecx, 12
872
        shr     ecx, 12
865
           inc ecx
873
        inc     ecx
866
 
874
 
867
           mov edx, [ofs]
875
        mov     edx, [ofs]
868
           shr edx, 12
876
        shr     edx, 12
869
           and edx, 0x3FF
877
        and     edx, 0x3FF
870
           mov esi, [proc_mem_tab]
878
        mov     esi, [proc_mem_tab]
871
 
879
 
872
.map:
880
.map:
873
           stdcall safe_map_page,[slot],[req_access],[ofs]
881
        stdcall safe_map_page, [slot], [req_access], [ofs]
Line 874... Line 882...
874
           jnc .exit
882
        jnc     .exit
875
           add dword [ebp-4], 0x1000
883
        add     dword [ebp-4], 0x1000
876
           add edi, 0x1000
884
        add     edi, 0x1000
877
           add [ofs], 0x1000
885
        add     [ofs], 0x1000
878
           inc edx
886
        inc     edx
879
           dec ecx
887
        dec     ecx
880
           jnz .map
888
        jnz     .map
881
.exit:
889
.exit:
882
           pop eax
890
        pop     eax
883
           ret
891
        ret
884
endp
892
endp
885
 
893
 
886
; in: esi+edx*4 = pointer to page table entry
894
; in: esi+edx*4 = pointer to page table entry
887
; in: [slot], [req_access], [ofs] on the stack
895
; in: [slot], [req_access], [ofs] on the stack
888
; in: edi = linear address to map
896
; in: edi = linear address to map
889
; out: CF cleared <=> failed
897
; out: CF cleared <=> failed
890
; destroys: only eax
898
; destroys: only eax
891
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
899
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
892
	mov	eax, [esi+edx*4]
900
        mov     eax, [esi+edx*4]
893
	test	al, PG_MAP
901
        test    al, PG_MAP
894
	jz	.not_present
902
        jz      .not_present
895
	test	al, PG_WRITE
903
        test    al, PG_WRITE
896
	jz	.resolve_readonly
904
        jz      .resolve_readonly
897
; normal case: writable page, just map with requested access
905
; normal case: writable page, just map with requested access
898
.map:
906
.map:
899
	stdcall	map_page, edi, eax, [req_access]
907
        stdcall map_page, edi, eax, [req_access]
900
	stc
908
        stc
901
.fail:
909
.fail:
902
	ret
910
        ret
903
.not_present:
911
.not_present:
904
; check for alloc-on-demand page
912
; check for alloc-on-demand page
905
	test	al, 2
913
        test    al, 2
906
	jz	.fail
914
        jz      .fail
907
; allocate new page, save it to source page table
915
; allocate new page, save it to source page table
908
	push	ecx
916
        push    ecx
909
	call	alloc_page
917
        call    alloc_page
910
	pop	ecx
918
        pop     ecx
911
	test	eax, eax
919
        test    eax, eax
912
	jz	.fail
920
        jz      .fail
913
	or	al, PG_UW
921
        or      al, PG_UW
914
	mov	[esi+edx*4], eax
922
        mov     [esi+edx*4], eax
915
	jmp	.map
923
        jmp     .map
916
.resolve_readonly:
924
.resolve_readonly:
917
; readonly page, probably copy-on-write
925
; readonly page, probably copy-on-write
918
; check: readonly request of readonly page is ok
926
; check: readonly request of readonly page is ok
919
	test	[req_access], PG_WRITE
927
        test    [req_access], PG_WRITE
920
	jz	.map
928
        jz      .map
921
; find control structure for this page
929
; find control structure for this page
922
	pushf
930
        pushf
923
	cli
931
        cli
924
	cld
932
        cld
925
	push	ebx ecx
933
        push    ebx ecx
926
	mov	eax, [slot]
934
        mov     eax, [slot]
927
	shl	eax, 8
935
        shl     eax, 8
928
	mov	eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
936
        mov     eax, [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
929
	test	eax, eax
937
        test    eax, eax
930
	jz	.no_hdll
938
        jz      .no_hdll
931
	mov	ecx, [eax+HDLL.fd]
939
        mov     ecx, [eax+HDLL.fd]
932
.scan_hdll:
940
.scan_hdll:
933
	cmp	ecx, eax
941
        cmp     ecx, eax
934
	jz	.no_hdll
942
        jz      .no_hdll
935
	mov	ebx, [ofs]
943
        mov     ebx, [ofs]
936
	and	ebx, not 0xFFF
944
        and     ebx, not 0xFFF
937
	sub	ebx, [ecx+HDLL.base]
945
        sub     ebx, [ecx+HDLL.base]
938
	cmp	ebx, [ecx+HDLL.size]
946
        cmp     ebx, [ecx+HDLL.size]
939
	jb	.hdll_found
947
        jb      .hdll_found
940
	mov	ecx, [ecx+HDLL.fd]
948
        mov     ecx, [ecx+HDLL.fd]
941
	jmp	.scan_hdll
949
        jmp     .scan_hdll
942
.no_hdll:
950
.no_hdll:
943
	pop	ecx ebx
951
        pop     ecx ebx
944
	popf
952
        popf
945
	clc
953
        clc
946
	ret
954
        ret
947
.hdll_found:
955
.hdll_found:
948
; allocate page, save it in page table, map it, copy contents from base
956
; allocate page, save it in page table, map it, copy contents from base
949
	mov	eax, [ecx+HDLL.parent]
957
        mov     eax, [ecx+HDLL.parent]
950
	add	ebx, [eax+DLLDESCR.data]
958
        add     ebx, [eax+DLLDESCR.data]
951
	call	alloc_page
959
        call    alloc_page
952
	test	eax, eax
960
        test    eax, eax
953
	jz	.no_hdll
961
        jz      .no_hdll
954
	or	al, PG_UW
962
        or      al, PG_UW
Line 955... Line 963...
955
	mov	[esi+edx*4], eax
963
        mov     [esi+edx*4], eax
956
	stdcall	map_page, edi, eax, [req_access]
964
        stdcall map_page, edi, eax, [req_access]
957
	push	esi edi
965
        push    esi edi
Line 973... Line 981...
973
;  eax=2 - send message
981
;  eax=2 - send message
974
;    ebx=PID
982
;    ebx=PID
975
;    ecx=address of message
983
;    ecx=address of message
976
;    edx=size of message
984
;    edx=size of message
Line 977... Line 985...
977
 
985
 
978
	dec	ebx
986
        dec     ebx
Line 979... Line 987...
979
	jnz	@f
987
        jnz     @f
980
 
988
 
981
	mov  	eax,[current_slot]
989
        mov     eax, [current_slot]
982
        pushf
990
        pushf
983
        cli
991
        cli
Line 984... Line 992...
984
        mov  	[eax+APPDATA.ipc_start],ecx     ;set fields in extended information area
992
        mov     [eax+APPDATA.ipc_start], ecx    ;set fields in extended information area
985
        mov  	[eax+APPDATA.ipc_size],edx
993
        mov     [eax+APPDATA.ipc_size], edx
986
 
994
 
987
        add edx, ecx
995
        add     edx, ecx
-
 
996
        add     edx, 4095
988
        add edx, 4095
997
        and     edx, not 4095
989
        and edx, not 4095
998
 
990
 
999
.touch:
991
.touch: mov eax, [ecx]
1000
        mov     eax, [ecx]
Line 992... Line 1001...
992
        add ecx, 0x1000
1001
        add     ecx, 0x1000
993
        cmp ecx, edx
1002
        cmp     ecx, edx
994
        jb  .touch
1003
        jb      .touch
Line 995... Line 1004...
995
 
1004
 
996
        popf
1005
        popf
997
        mov [esp+32], ebx	;ebx=0
1006
        mov     [esp+32], ebx   ;ebx=0
998
        ret
1007
        ret
999
 
1008
 
Line 1000... Line 1009...
1000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1009
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1001
;2
1010
;2
1002
@@:
1011
@@:
1003
	dec	ebx
1012
        dec     ebx
1004
	jnz	@f
1013
        jnz     @f
1005
 
1014
 
1006
        stdcall sys_ipc_send, ecx, edx, esi
1015
        stdcall sys_ipc_send, ecx, edx, esi
Line 1007... Line 1016...
1007
        mov 	[esp+32], eax
1016
        mov     [esp+32], eax
1008
        ret
1017
        ret
Line 1040... Line 1049...
1040
             dst_offset dd ?
1049
             dst_offset dd ?
1041
             buf_size   dd ?
1050
             buf_size   dd ?
1042
             used_buf   dd ?
1051
             used_buf   dd ?
1043
           endl
1052
           endl
Line 1044... Line 1053...
1044
 
1053
 
1045
           pushf
1054
        pushf
-
 
1055
        cli
-
 
1056
 
-
 
1057
        mov     eax, [PID]
-
 
1058
        call    pid_to_slot
-
 
1059
        test    eax, eax
Line 1046... Line -...
1046
           cli
-
 
1047
 
-
 
1048
           mov  eax, [PID]
-
 
1049
           call pid_to_slot
-
 
1050
           test eax,eax
-
 
1051
           jz   .no_pid
1060
        jz      .no_pid
1052
 
1061
 
1053
           mov [dst_slot], eax
1062
        mov     [dst_slot], eax
1054
           shl  eax,8
1063
        shl     eax, 8
1055
           mov  edi,[eax+SLOT_BASE+0xa0]  ;is ipc area defined?
1064
        mov     edi, [eax+SLOT_BASE+0xa0] ;is ipc area defined?
1056
           test edi,edi
1065
        test    edi, edi
1057
           jz   .no_ipc_area
1066
        jz      .no_ipc_area
1058
 
1067
 
1059
           mov ebx, edi
1068
        mov     ebx, edi
1060
           and ebx, 0xFFF
1069
        and     ebx, 0xFFF
1061
           mov [dst_offset], ebx
1070
        mov     [dst_offset], ebx
1062
 
1071
 
1063
           mov esi, [eax+SLOT_BASE+0xa4]
1072
        mov     esi, [eax+SLOT_BASE+0xa4]
1064
           mov [buf_size], esi
1073
        mov     [buf_size], esi
1065
 
1074
 
1066
           mov ecx, [ipc_tmp]
1075
        mov     ecx, [ipc_tmp]
1067
           cmp esi, 0x40000-0x1000 ; size of [ipc_tmp] minus one page
1076
        cmp     esi, 0x40000-0x1000; size of [ipc_tmp] minus one page
1068
           jbe @f
1077
        jbe     @f
1069
           push esi edi
1078
        push    esi edi
1070
           add esi,0x1000
1079
        add     esi, 0x1000
1071
           stdcall alloc_kernel_space,esi
1080
        stdcall alloc_kernel_space, esi
1072
           mov ecx, eax
1081
        mov     ecx, eax
1073
           pop edi esi
1082
        pop     edi esi
1074
@@:
1083
@@:
1075
           mov [used_buf], ecx
1084
        mov     [used_buf], ecx
1076
           stdcall map_mem, ecx, [dst_slot],\
1085
        stdcall map_mem, ecx, [dst_slot], \
1077
                             edi, esi, PG_SW
1086
                edi, esi, PG_SW
1078
 
1087
 
1079
           mov edi, [dst_offset]
1088
        mov     edi, [dst_offset]
1080
           add edi, [used_buf]
1089
        add     edi, [used_buf]
1081
           cmp dword [edi], 0
1090
        cmp     dword [edi], 0
1082
           jnz  .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
1091
        jnz     .ipc_blocked          ;if dword [buffer]<>0 - ipc blocked now
1083
 
1092
 
1084
           mov edx, dword [edi+4]
1093
        mov     edx, dword [edi+4]
1085
           lea ebx, [edx+8]
1094
        lea     ebx, [edx+8]
1086
           add ebx, [msg_size]
1095
        add     ebx, [msg_size]
1087
           cmp ebx, [buf_size]
1096
        cmp     ebx, [buf_size]
1088
           ja .buffer_overflow         ;esi<0 - not enough memory in buffer
1097
        ja      .buffer_overflow       ;esi<0 - not enough memory in buffer
1089
 
1098
 
1090
           mov dword [edi+4], ebx
1099
        mov     dword [edi+4], ebx
1091
           mov eax,[TASK_BASE]
1100
        mov     eax, [TASK_BASE]
1092
           mov eax, [eax+0x04]         ;eax - our PID
1101
        mov     eax, [eax+0x04]        ;eax - our PID
1093
           add edi, edx
1102
        add     edi, edx
1094
           mov [edi], eax
1103
        mov     [edi], eax
1095
           mov ecx, [msg_size]
1104
        mov     ecx, [msg_size]
1096
 
1105
 
1097
           mov [edi+4], ecx
1106
        mov     [edi+4], ecx
1098
           add edi, 8
1107
        add     edi, 8
1099
           mov esi, [msg_addr]
1108
        mov     esi, [msg_addr]
1100
       ;    add esi, new_app_base
1109
       ;    add esi, new_app_base
Line 1101... Line 1110...
1101
           cld
1110
        cld
1102
           rep movsb
-
 
1103
 
-
 
1104
           mov ebx, [ipc_tmp]
-
 
1105
           mov edx, ebx
-
 
1106
           shr ebx, 12
-
 
1107
           xor eax, eax
-
 
1108
           mov [page_tabs+ebx*4], eax
-
 
1109
           invlpg [edx]
-
 
1110
 
-
 
1111
           mov ebx, [ipc_pdir]
-
 
1112
           mov edx, ebx
-
 
1113
           shr ebx, 12
-
 
1114
           xor eax, eax
-
 
1115
           mov [page_tabs+ebx*4], eax
-
 
1116
           invlpg [edx]
1111
        rep movsb
1117
 
1112
 
1118
           mov ebx, [ipc_ptab]
1113
        mov     ebx, [ipc_tmp]
1119
           mov edx, ebx
1114
        mov     edx, ebx
1120
           shr ebx, 12
1115
        shr     ebx, 12
1121
           xor eax, eax
-
 
1122
           mov [page_tabs+ebx*4], eax
-
 
1123
           invlpg [edx]
-
 
1124
 
-
 
1125
           mov  eax, [dst_slot]
-
 
1126
           shl eax, 8
-
 
Line -... Line 1116...
-
 
1116
        xor     eax, eax
-
 
1117
        mov     [page_tabs+ebx*4], eax
-
 
1118
        invlpg  [edx]
-
 
1119
 
-
 
1120
        mov     ebx, [ipc_pdir]
-
 
1121
        mov     edx, ebx
-
 
1122
        shr     ebx, 12
-
 
1123
        xor     eax, eax
-
 
1124
        mov     [page_tabs+ebx*4], eax
-
 
1125
        invlpg  [edx]
-
 
1126
 
-
 
1127
        mov     ebx, [ipc_ptab]
-
 
1128
        mov     edx, ebx
-
 
1129
        shr     ebx, 12
-
 
1130
        xor     eax, eax
-
 
1131
        mov     [page_tabs+ebx*4], eax
-
 
1132
        invlpg  [edx]
-
 
1133
 
-
 
1134
        mov     eax, [dst_slot]
-
 
1135
        shl     eax, 8
1127
           or   [eax+SLOT_BASE+0xA8],dword 0x40
1136
        or      [eax+SLOT_BASE+0xA8], dword 0x40
1128
           cmp  dword [check_idle_semaphore],20
1137
        cmp     dword [check_idle_semaphore], 20
1129
           jge  .ipc_no_cis
1138
        jge     .ipc_no_cis
1130
 
1139
 
1131
           mov  dword [check_idle_semaphore],5
1140
        mov     dword [check_idle_semaphore], 5
1132
.ipc_no_cis:
1141
.ipc_no_cis:
1133
           push 0
1142
        push    0
1134
           jmp .ret
1143
        jmp     .ret
1135
.no_pid:
1144
.no_pid:
1136
           popf
1145
        popf
1137
           mov eax, 4
1146
        mov     eax, 4
1138
           ret
1147
        ret
1139
.no_ipc_area:
1148
.no_ipc_area:
1140
           popf
1149
        popf
1141
           xor eax, eax
1150
        xor     eax, eax
1142
           inc eax
1151
        inc     eax
1143
           ret
1152
        ret
1144
.ipc_blocked:
1153
.ipc_blocked:
1145
           push 2
1154
        push    2
1146
           jmp .ret
1155
        jmp     .ret
1147
.buffer_overflow:
1156
.buffer_overflow:
1148
           push 3
1157
        push    3
1149
.ret:
1158
.ret:
1150
           mov eax, [used_buf]
1159
        mov     eax, [used_buf]
1151
           cmp eax, [ipc_tmp]
1160
        cmp     eax, [ipc_tmp]
1152
           jz @f
1161
        jz      @f
1153
           stdcall free_kernel_space,eax
1162
        stdcall free_kernel_space, eax
1154
@@:
1163
@@:
Line 1155... Line 1164...
1155
           pop eax
1164
        pop     eax
1156
           popf
1165
        popf
Line 1157... Line 1166...
1157
           ret
1166
        ret
1158
endp
1167
endp
1159
 
1168
 
Line 1160... Line 1169...
1160
align 4
1169
align 4
1161
sysfn_meminfo:
1170
sysfn_meminfo:
1162
 
1171
 
1163
        ;   add ecx, new_app_base
1172
        ;   add ecx, new_app_base
1164
           cmp ecx, OS_BASE
1173
        cmp     ecx, OS_BASE
1165
           jae .fail
1174
        jae     .fail
1166
 
1175
 
1167
           mov eax, [pg_data.pages_count]
1176
        mov     eax, [pg_data.pages_count]
1168
           mov [ecx], eax
1177
        mov     [ecx], eax
1169
           shl eax, 12
1178
        shl     eax, 12
1170
           mov [esp+32], eax
1179
        mov     [esp+32], eax
1171
           mov eax, [pg_data.pages_free]
1180
        mov     eax, [pg_data.pages_free]
1172
           mov [ecx+4], eax
1181
        mov     [ecx+4], eax
1173
           mov eax, [pg_data.pages_faults]
1182
        mov     eax, [pg_data.pages_faults]
1174
           mov [ecx+8], eax
1183
        mov     [ecx+8], eax
1175
           mov eax, [heap_size]
1184
        mov     eax, [heap_size]
1176
           mov [ecx+12], eax
1185
        mov     [ecx+12], eax
1177
           mov eax, [heap_free]
1186
        mov     eax, [heap_free]
1178
           mov [ecx+16], eax
1187
        mov     [ecx+16], eax
1179
           mov eax, [heap_blocks]
1188
        mov     eax, [heap_blocks]
Line 1180... Line 1189...
1180
           mov [ecx+20], eax
1189
        mov     [ecx+20], eax
1181
           mov eax, [free_blocks]
1190
        mov     eax, [free_blocks]
1182
           mov [ecx+24], eax
1191
        mov     [ecx+24], eax
1183
           ret
1192
        ret
Line 1184... Line 1193...
1184
.fail:
1193
.fail:
1185
           or dword [esp+32], -1
1194
        or      dword [esp+32], -1
Line 1186... Line 1195...
1186
           ret
1195
        ret
1187
 
1196
 
Line 1188... Line 1197...
1188
align 4
1197
align 4
1189
f68:
1198
f68:
1190
           cmp  ebx,4
1199
        cmp     ebx, 4
1191
           jbe  sys_sheduler
1200
        jbe     sys_sheduler
1192
 
1201
 
1193
           cmp ebx, 11
1202
        cmp     ebx, 11
1194
           jb .fail
1203
        jb      .fail
1195
 
1204
 
1196
           cmp ebx, 25
1205
        cmp     ebx, 25
1197
           ja .fail
1206
        ja      .fail
1198
 
1207
 
1199
           jmp dword [f68call+ebx*4-11*4]
1208
        jmp     dword [f68call+ebx*4-11*4]
1200
.11:
1209
.11:
1201
           call init_heap
1210
        call    init_heap
1202
           mov [esp+32], eax
1211
        mov     [esp+32], eax
1203
           ret
1212
        ret
1204
.12:
1213
.12:
1205
           stdcall user_alloc, ecx
1214
        stdcall user_alloc, ecx
1206
           mov [esp+32], eax
1215
        mov     [esp+32], eax
1207
           ret
1216
        ret
1208
.13:
1217
.13:
1209
           stdcall user_free, ecx
1218
        stdcall user_free, ecx
1210
           mov [esp+32], eax
1219
        mov     [esp+32], eax
1211
           ret
1220
        ret
1212
.14:
1221
.14:
1213
           cmp ecx, OS_BASE
1222
        cmp     ecx, OS_BASE
1214
           jae .fail
1223
        jae     .fail
1215
           mov edi,ecx
1224
        mov     edi, ecx
1216
           call get_event_ex
1225
        call    get_event_ex
1217
           mov [esp+32], eax
1226
        mov     [esp+32], eax
1218
           ret
1227
        ret
1219
.16:
1228
.16:
1220
           test ecx, ecx
1229
        test    ecx, ecx
1221
           jz .fail
1230
        jz      .fail
1222
           cmp ecx, OS_BASE
1231
        cmp     ecx, OS_BASE
1223
           jae .fail
1232
        jae     .fail
1224
           stdcall get_service, ecx
1233
        stdcall get_service, ecx
1225
           mov [esp+32], eax
1234
        mov     [esp+32], eax
1226
           ret
1235
        ret
1227
.17:
1236
.17:
1228
           call srv_handlerEx   ;ecx
1237
        call    srv_handlerEx   ;ecx
1229
           mov [esp+32], eax
1238
        mov     [esp+32], eax
1230
           ret
1239
        ret
1231
.19:
1240
.19:
1232
           cmp ecx, OS_BASE
1241
        cmp     ecx, OS_BASE
1233
           jae .fail
1242
        jae     .fail
1234
           stdcall load_library, ecx
1243
        stdcall load_library, ecx
Line 1235... Line 1244...
1235
           mov [esp+32], eax
1244
        mov     [esp+32], eax
1236
           ret
1245
        ret
Line 1237... Line 1246...
1237
.20:
1246
.20:
1238
           mov     eax, edx
1247
        mov     eax, edx
1239
           mov     ebx, ecx
1248
        mov     ebx, ecx
1240
           call    user_realloc		;in: eax = pointer, ebx = new size
-
 
1241
           mov     [esp+32], eax
-
 
1242
           ret
-
 
1243
.21:
-
 
1244
           cmp ecx, OS_BASE
-
 
1245
           jae .fail
-
 
1246
 
-
 
1247
           cmp ebx, OS_BASE
1249
        call    user_realloc            ;in: eax = pointer, ebx = new size
1248
           jae .fail
1250
        mov     [esp+32], eax
Line -... Line 1251...
-
 
1251
        ret
-
 
1252
.21:
-
 
1253
        cmp     ecx, OS_BASE
-
 
1254
        jae     .fail
-
 
1255
 
-
 
1256
        cmp     ebx, OS_BASE
-
 
1257
        jae     .fail
1249
 
1258
 
Line 1250... Line 1259...
1250
           mov edi, edx
1259
        mov     edi, edx
1251
           stdcall load_PE, ecx
1260
        stdcall load_PE, ecx
1252
           mov esi, eax
1261
        mov     esi, eax
1253
           test eax, eax
1262
        test    eax, eax
1254
           jz @F
1263
        jz      @F
1255
 
1264
 
Line 1256... Line 1265...
1256
           push edi
1265
        push    edi
1257
           push DRV_ENTRY
1266
        push    DRV_ENTRY
1258
           call eax
1267
        call    eax
1259
           add esp, 8
1268
        add     esp, 8
Line 1260... Line 1269...
1260
           test eax, eax
1269
        test    eax, eax
1261
           jz @F
1270
        jz      @F
1262
 
1271
 
Line 1263... Line 1272...
1263
           mov [eax+SRV.entry], esi
1272
        mov     [eax+SRV.entry], esi
1264
 
1273
 
1265
@@:
1274
@@:
1266
           mov [esp+32], eax
1275
        mov     [esp+32], eax
1267
           ret
1276
        ret
1268
.22:
1277
.22:
1269
           cmp ecx, OS_BASE
1278
        cmp     ecx, OS_BASE
1270
           jae .fail
1279
        jae     .fail
1271
 
1280
 
1272
           stdcall shmem_open, ecx, edx, esi
1281
        stdcall shmem_open, ecx, edx, esi
1273
           mov [esp+24], edx
1282
        mov     [esp+24], edx
1274
           mov [esp+32], eax
1283
        mov     [esp+32], eax
1275
           ret
1284
        ret
1276
 
1285
 
1277
.23:
1286
.23:
1278
           cmp ecx, OS_BASE
1287
        cmp     ecx, OS_BASE
1279
           jae .fail
1288
        jae     .fail
1280
 
1289
 
1281
           stdcall shmem_close, ecx
1290
        stdcall shmem_close, ecx
1282
           mov [esp+32], eax
1291
        mov     [esp+32], eax
-
 
1292
        ret
-
 
1293
.24:
-
 
1294
        mov     eax, [current_slot]
-
 
1295
        xchg    ecx, [eax+APPDATA.exc_handler]
-
 
1296
        xchg    edx, [eax+APPDATA.except_mask]
Line 1283... Line 1297...
1283
           ret
1297
        mov     [esp+32], ecx ; reg_eax+8
1284
.24:
1298
        mov     [esp+20], edx ; reg_ebx+8
1285
           mov  eax, [current_slot]
1299
        ret
1286
           xchg ecx, [eax+APPDATA.exc_handler]
1300
.25:
Line 1287... Line 1301...
1287
           xchg edx, [eax+APPDATA.except_mask]
1301
        cmp     ecx, 32
1288
           mov  [esp+32], ecx ; reg_eax+8
1302
        jae     .fail
Line 1319... Line 1333...
1319
           dd f68.19   ; load_dll
1333
           dd f68.19   ; load_dll
1320
           dd f68.20   ; user_realloc
1334
           dd f68.20   ; user_realloc
1321
           dd f68.21   ; load_driver
1335
           dd f68.21   ; load_driver
1322
           dd f68.22   ; shmem_open
1336
           dd f68.22   ; shmem_open
1323
           dd f68.23   ; shmem_close
1337
           dd f68.23   ; shmem_close
-
 
1338
           dd f68.24   ; set exception handler
1324
           dd f68.24
1339
           dd f68.25   ; unmask exception
1325
           dd f68.25
1340
           dd f68.26   ; user_unmap
Line 1326... Line 1341...
1326
 
1341
 
1327
 
1342
 
Line 1328... Line 1343...
1328
align 4
1343
align 4
1329
proc load_pe_driver stdcall, file:dword
-
 
1330
 
-
 
1331
           stdcall load_PE, [file]
-
 
1332
           test eax, eax
-
 
1333
           jz .fail
-
 
1334
 
1344
proc load_pe_driver stdcall, file:dword
1335
           mov esi, eax
1345
 
Line -... Line 1346...
-
 
1346
        stdcall load_PE, [file]
-
 
1347
        test    eax, eax
-
 
1348
        jz      .fail
-
 
1349
 
-
 
1350
        mov     esi, eax
1336
           stdcall eax, DRV_ENTRY
1351
        stdcall eax, DRV_ENTRY
1337
           test eax, eax
1352
        test    eax, eax
Line 1338... Line 1353...
1338
           jz .fail
1353
        jz      .fail
1339
 
1354
 
1340
           mov [eax+SRV.entry], esi
1355
        mov     [eax+SRV.entry], esi
1341
           ret
1356
        ret
Line 1342... Line 1357...
1342
 
1357
 
1343
.fail:
1358
.fail:
Line 1344... Line 1359...
1344
           xor eax, eax
1359
        xor     eax, eax
1345
           ret
1360
        ret
Line 1346... Line 1361...
1346
endp
1361
endp
1347
 
1362
 
Line 1348... Line 1363...
1348
 
1363
 
1349
align 4
1364
align 4
1350
proc init_mtrr
1365
proc init_mtrr
1351
 
1366
 
Line 1352... Line 1367...
1352
           cmp [BOOT_VAR+0x901c],byte 2
1367
        cmp     [BOOT_VAR+0x901c], byte 2
1353
           je  .exit
1368
        je      .exit
1354
 
1369
 
1355
           bt [cpu_caps], CAPS_MTRR
1370
        bt      [cpu_caps], CAPS_MTRR
1356
           jnc .exit
1371
        jnc     .exit
1357
 
1372
 
1358
           mov eax, cr0
1373
        mov     eax, cr0
1359
           or eax, 0x60000000   ;disable caching
1374
        or      eax, 0x60000000 ;disable caching
Line 1360... Line 1375...
1360
           mov cr0, eax
1375
        mov     cr0, eax
1361
           wbinvd               ;invalidate cache
1376
        wbinvd                  ;invalidate cache
1362
 
1377
 
1363
           mov ecx, 0x2FF
1378
        mov     ecx, 0x2FF
1364
           rdmsr                ;
1379
        rdmsr                   ;
1365
; has BIOS already initialized MTRRs?
1380
; has BIOS already initialized MTRRs?
1366
           test ah, 8
1381
        test    ah, 8
1367
           jnz .skip_init
1382
        jnz     .skip_init
1368
; rarely needed, so mainly placeholder
1383
; rarely needed, so mainly placeholder
1369
; main memory - cached
1384
; main memory - cached
1370
           push eax
1385
        push    eax
1371
 
1386
 
1372
           mov eax, [MEM_AMOUNT]
1387
        mov     eax, [MEM_AMOUNT]
1373
; round eax up to next power of 2
1388
; round eax up to next power of 2
1374
           dec eax
1389
        dec     eax
1375
           bsr ecx, eax
1390
        bsr     ecx, eax
1376
           mov ebx, 2
1391
        mov     ebx, 2
1377
           shl ebx, cl
1392
        shl     ebx, cl
1378
           dec ebx
1393
        dec     ebx
1379
; base of memory range = 0, type of memory range = MEM_WB
1394
; base of memory range = 0, type of memory range = MEM_WB
1380
           xor edx, edx
1395
        xor     edx, edx
1381
           mov eax, MEM_WB
1396
        mov     eax, MEM_WB
1382
           mov ecx, 0x200
1397
        mov     ecx, 0x200
1383
           wrmsr
1398
        wrmsr
1384
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
1399
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
1385
           mov eax, 0xFFFFFFFF
1400
        mov     eax, 0xFFFFFFFF
1386
           mov edx, 0x0000000F
1401
        mov     edx, 0x0000000F
1387
           sub eax, ebx
1402
        sub     eax, ebx
1388
           sbb edx, 0
1403
        sbb     edx, 0
1389
           or eax, 0x800
1404
        or      eax, 0x800
1390
           inc ecx
1405
        inc     ecx
1391
           wrmsr
1406
        wrmsr
1392
; clear unused MTRRs
1407
; clear unused MTRRs
1393
           xor eax, eax
1408
        xor     eax, eax
1394
           xor edx, edx
1409
        xor     edx, edx
1395
@@:
1410
@@:
Line 1396... Line 1411...
1396
           wrmsr
1411
        wrmsr
Line 1397... Line 1412...
1397
           inc ecx
1412
        inc     ecx
1398
           cmp ecx, 0x210
1413
        cmp     ecx, 0x210
1399
           jb @b
1414
        jb      @b
1400
; enable MTRRs
1415
; enable MTRRs
1401
           pop eax
1416
        pop     eax
1402
           or ah, 8
1417
        or      ah, 8
Line 1403... Line 1418...
1403
           and al, 0xF0 ; default memtype = UC
1418
        and     al, 0xF0; default memtype = UC
1404
           mov ecx, 0x2FF
1419
        mov     ecx, 0x2FF
1405
           wrmsr
1420
        wrmsr
1406
.skip_init:
1421
.skip_init:
1407
           stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC
1422
        stdcall set_mtrr, [LFBAddress], [LFBSize], MEM_WC
1408
 
1423
 
1409
           wbinvd               ;again invalidate
1424
        wbinvd                  ;again invalidate
1410
 
1425
 
1411
           mov eax, cr0
1426
        mov     eax, cr0
1412
           and eax, not 0x60000000
1427
        and     eax, not 0x60000000
1413
           mov cr0, eax         ; enable caching
1428
        mov     cr0, eax        ; enable caching
1414
.exit:
1429
.exit:
1415
           ret
1430
        ret
1416
endp
1431
endp
1417
 
1432
 
1418
align 4
1433
align 4
1419
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
1434
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
1420
; find unused register
1435
; find unused register
1421
           mov ecx, 0x201
1436
        mov     ecx, 0x201
1422
@@:
1437
@@:
1423
           rdmsr
1438
        rdmsr
1424
           dec ecx
1439
        dec     ecx
1425
           test ah, 8
1440
        test    ah, 8
1426
           jz .found
1441
        jz      .found
1427
           rdmsr
1442
        rdmsr
1428
           mov al, 0 ; clear memory type field
1443
        mov     al, 0; clear memory type field
1429
           cmp eax, [base]
1444
        cmp     eax, [base]
1430
           jz .ret
1445
        jz      .ret
1431
           add ecx, 3
1446
        add     ecx, 3
1432
           cmp ecx, 0x210
1447
        cmp     ecx, 0x210
1433
           jb @b
1448
        jb      @b
1434
; no free registers, ignore the call
1449
; no free registers, ignore the call
1435
.ret:
1450
.ret:
1436
           ret
1451
        ret
1437
.found:
1452
.found:
1438
; found, write values
1453
; found, write values
1439
           xor edx, edx
1454
        xor     edx, edx
Line 1440... Line 1455...
1440
           mov eax, [base]
1455
        mov     eax, [base]
1441
           or eax, [mem_type]
1456
        or      eax, [mem_type]
1442
           wrmsr
1457
        wrmsr
1443
 
1458
 
1444
           mov ebx, [size]
1459
        mov     ebx, [size]
1445
           dec ebx
1460
        dec     ebx
1446
           mov eax, 0xFFFFFFFF
1461
        mov     eax, 0xFFFFFFFF
1447
           mov edx, 0x00000000
1462
        mov     edx, 0x00000000
1448
           sub eax, ebx
1463
        sub     eax, ebx
1449
           sbb edx, 0
1464
        sbb     edx, 0
1450
           or eax, 0x800
1465
        or      eax, 0x800
1451
           inc ecx
1466
        inc     ecx
1452
           wrmsr
1467
        wrmsr
1453
           ret
1468
        ret
1454
endp
1469
endp
1455
 
1470
 
1456
align 4
1471
align 4
1457
proc stall stdcall, delay:dword
1472
proc stall stdcall, delay:dword
1458
           push ecx
1473
        push    ecx
1459
           push edx
1474
        push    edx
1460
           push ebx
1475
        push    ebx
1461
           push eax
1476
        push    eax
1462
 
1477
 
1463
           mov eax, [delay]
1478
        mov     eax, [delay]
1464
           mul [stall_mcs]
1479
        mul     [stall_mcs]
1465
           mov ebx, eax       ;low
1480
        mov     ebx, eax      ;low
Line 1466... Line 1481...
1466
           mov ecx, edx       ;high
1481
        mov     ecx, edx      ;high
1467
           rdtsc
1482
        rdtsc
1468
           add ebx, eax
1483
        add     ebx, eax
1469
           adc ecx,edx
1484
        adc     ecx, edx
1470
@@:
1485
@@:
Line 1471... Line 1486...
1471
           rdtsc
1486
        rdtsc
1472
           sub eax, ebx
1487
        sub     eax, ebx
1473
           sbb edx, ecx
1488
        sbb     edx, ecx
1474
           jb @B
1489
        jb      @B
1475
 
1490
 
1476
           pop eax
1491
        pop     eax
1477
           pop ebx
1492
        pop     ebx
1478
           pop edx
1493
        pop     edx
1479
           pop ecx
1494
        pop     ecx
1480
           ret
1495
        ret
1481
endp
1496
endp
1482
 
1497
 
1483
align 4
1498
align 4
1484
proc create_ring_buffer stdcall, size:dword, flags:dword
1499
proc create_ring_buffer stdcall, size:dword, flags:dword
1485
           locals
1500
           locals
1486
             buf_ptr  dd ?
1501
             buf_ptr  dd ?
1487
           endl
1502
           endl
1488
 
1503
 
1489
           mov eax, [size]
1504
        mov     eax, [size]
1490
           test eax, eax
1505
        test    eax, eax
1491
           jz .fail
1506
        jz      .fail
1492
 
1507
 
1493
           add eax, eax
1508
        add     eax, eax
1494
           stdcall alloc_kernel_space, eax
1509
        stdcall alloc_kernel_space, eax
1495
           test eax, eax
1510
        test    eax, eax
1496
           jz .fail
1511
        jz      .fail
1497
 
1512
 
1498
           push ebx
1513
        push    ebx
1499
 
1514
 
1500
           mov [buf_ptr], eax
1515
        mov     [buf_ptr], eax
1501
 
1516
 
1502
           mov ebx, [size]
1517
        mov     ebx, [size]
1503
           shr ebx, 12
1518
        shr     ebx, 12
1504
           push ebx
1519
        push    ebx
1505
 
1520
 
1506
           stdcall alloc_pages, ebx
1521
        stdcall alloc_pages, ebx
1507
           pop ecx
1522
        pop     ecx
1508
 
1523
 
1509
           test eax, eax
1524
        test    eax, eax
1510
           jz .mm_fail
1525
        jz      .mm_fail
1511
 
1526
 
1512
           push edi
1527
        push    edi
1513
 
1528
 
1514
           or eax, [flags]
1529
        or      eax, [flags]
1515
           mov edi, [buf_ptr]
1530
        mov     edi, [buf_ptr]
1516
           mov ebx, [buf_ptr]
1531
        mov     ebx, [buf_ptr]
1517
           mov edx, ecx
1532
        mov     edx, ecx
1518
           shl edx, 2
1533
        shl     edx, 2
1519
           shr edi, 10
1534
        shr     edi, 10
1520
@@:
1535
@@:
1521
           mov [page_tabs+edi], eax
1536
        mov     [page_tabs+edi], eax
1522
           mov [page_tabs+edi+edx], eax
1537
        mov     [page_tabs+edi+edx], eax
1523
           invlpg [ebx]
1538
        invlpg  [ebx]