forked from KolibriOS/kolibrios
kos-acpi: PAE support
git-svn-id: svn://kolibrios.org@6339 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
22e9386a23
commit
03c7eb4fa9
@ -223,6 +223,7 @@ TASK_ACTIVATE equ (OS_BASE+0x000FF01)
|
||||
TMP_STACK_TOP equ 0x006CC00
|
||||
|
||||
sys_proc equ (OS_BASE+0x006F000)
|
||||
sys_pml2 equ 0x0072000
|
||||
|
||||
SLOT_BASE equ (OS_BASE+0x0080000)
|
||||
|
||||
@ -239,10 +240,10 @@ end virtual
|
||||
HEAP_BASE equ (OS_BASE+0x0800000)
|
||||
HEAP_MIN_SIZE equ 0x01000000
|
||||
|
||||
page_tabs equ 0xFDC00000
|
||||
app_page_tabs equ 0xFDC00000
|
||||
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
|
||||
master_tab equ (page_tabs+ (page_tabs shr 10)) ;0xFDFF70000
|
||||
page_tabs equ 0xFD800000
|
||||
app_page_tabs equ 0xFD800000
|
||||
kernel_tabs equ (page_tabs+ (OS_BASE shr 9)) ;0xFDE00000
|
||||
master_tab equ (page_tabs+ (page_tabs shr 9)) ;0xFDFF70000
|
||||
|
||||
LFB_BASE equ 0xFE000000
|
||||
|
||||
@ -281,7 +282,7 @@ PG_PWT equ 0x010
|
||||
PG_ACCESSED equ 0x020
|
||||
PG_DIRTY equ 0x040
|
||||
PG_PAT equ 0x080
|
||||
PG_GLOBAL equ 0x100
|
||||
PG_GLOBAL equ 0; 0x100
|
||||
PG_SHARED equ 0x200
|
||||
|
||||
PG_SWR equ 0x003 ; (PG_WRITE+PG_READ)
|
||||
@ -428,9 +429,7 @@ struct PROC
|
||||
ht_free rd 1 ;htab[0] stdin
|
||||
ht_next rd 1 ;htab[1] stdout
|
||||
htab rd (4096-$)/4 ;htab[2] stderr
|
||||
; htab rd (4096+3072-$)/4 ;htab[2] stderr
|
||||
; workdir rb 1024
|
||||
pdt_0 rd 1024
|
||||
pdt_0 rd 2048
|
||||
ends
|
||||
|
||||
struct DBG_REGS
|
||||
|
@ -594,7 +594,7 @@ proc load_file_umode stdcall, file_name:dword
|
||||
jz .err_2
|
||||
|
||||
mov edx, [file_size] ;preallocate page memory
|
||||
shr eax, 10
|
||||
shr eax, 9
|
||||
lea edi, [page_tabs+eax]
|
||||
add edx, 4095
|
||||
shr edx, 12
|
||||
@ -605,6 +605,8 @@ proc load_file_umode stdcall, file_name:dword
|
||||
|
||||
or eax, PG_UWR
|
||||
stosd
|
||||
xor eax, eax
|
||||
stosd
|
||||
dec edx
|
||||
jnz @B
|
||||
|
||||
@ -649,14 +651,14 @@ proc load_file_umode stdcall, file_name:dword
|
||||
test eax, eax
|
||||
jz .err_2
|
||||
|
||||
shr eax, 10 ; and remap pages.
|
||||
shr eax, 9 ; and remap pages.
|
||||
|
||||
mov ecx, [file_size]
|
||||
add ecx, 4095
|
||||
shr ecx, 12
|
||||
|
||||
mov esi, [km_file]
|
||||
shr esi, 10
|
||||
shr esi, 9
|
||||
add esi, page_tabs
|
||||
|
||||
lea edi, [page_tabs+eax]
|
||||
@ -667,6 +669,8 @@ proc load_file_umode stdcall, file_name:dword
|
||||
and eax, 0xFFFFF000
|
||||
or eax, PG_UWR
|
||||
stosd
|
||||
xor eax, eax
|
||||
stosd
|
||||
loop @B
|
||||
|
||||
stdcall free_kernel_space, [km_file] ; release allocated kernel space
|
||||
@ -1222,17 +1226,17 @@ proc load_library stdcall, file_name:dword
|
||||
mov [eax+HDLL.parent], esi
|
||||
mov edx, ebx
|
||||
shr edx, 12
|
||||
or dword [page_tabs+(edx-1)*4], DONT_FREE_BLOCK
|
||||
or dword [page_tabs+(edx-1)*8], DONT_FREE_BLOCK
|
||||
; copy entries of page table from kernel-side image to usermode
|
||||
; use copy-on-write for user-mode image, so map as readonly
|
||||
xor edi, edi
|
||||
mov ecx, [esi+DLLDESCR.data]
|
||||
shr ecx, 12
|
||||
.map_pages_loop:
|
||||
mov eax, [page_tabs+ecx*4]
|
||||
mov eax, [page_tabs+ecx*8]
|
||||
and eax, not 0xFFF
|
||||
or al, PG_UR
|
||||
xchg eax, [page_tabs+edx*4]
|
||||
xchg eax, [page_tabs+edx*8]
|
||||
test al, 1
|
||||
jz @f
|
||||
call free_page
|
||||
|
@ -585,7 +585,7 @@ proc init_heap
|
||||
mov [ebx+PROC.heap_top], eax
|
||||
|
||||
sub eax, esi
|
||||
shr esi, 10
|
||||
shr esi, 9
|
||||
mov ecx, eax
|
||||
sub eax, PAGE_SIZE
|
||||
or ecx, FREE_BLOCK
|
||||
@ -616,7 +616,7 @@ proc user_alloc stdcall, alloc_size:dword
|
||||
|
||||
mov ebx, esi
|
||||
shr ebx, 12
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
mov eax, [page_tabs+ebx*8]
|
||||
test al, FREE_BLOCK
|
||||
jz .test_used
|
||||
and eax, 0xFFFFF000
|
||||
@ -628,16 +628,16 @@ proc user_alloc stdcall, alloc_size:dword
|
||||
sub eax, ecx
|
||||
or al, FREE_BLOCK
|
||||
shr edx, 12
|
||||
mov [page_tabs+edx*4], eax
|
||||
mov [page_tabs+edx*8], eax
|
||||
@@:
|
||||
or ecx, USED_BLOCK
|
||||
mov [page_tabs+ebx*4], ecx
|
||||
mov [page_tabs+ebx*8], ecx
|
||||
shr ecx, 12
|
||||
inc ebx
|
||||
dec ecx
|
||||
jz .no
|
||||
@@:
|
||||
mov dword [page_tabs+ebx*4], 2
|
||||
mov dword [page_tabs+ebx*8], 2
|
||||
inc ebx
|
||||
dec ecx
|
||||
jnz @B
|
||||
@ -703,7 +703,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
jae .error
|
||||
mov ebx, esi
|
||||
shr ebx, 12
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
mov eax, [page_tabs+ebx*8]
|
||||
mov ecx, eax
|
||||
and ecx, 0xFFFFF000
|
||||
add ecx, esi
|
||||
@ -740,7 +740,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
sub eax, esi
|
||||
jz .nofirst
|
||||
or al, FREE_BLOCK
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
.nofirst:
|
||||
mov eax, [alloc_size]
|
||||
add eax, 0x1FFF
|
||||
@ -749,13 +749,13 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
add edx, eax
|
||||
shr ebx, 12
|
||||
or al, USED_BLOCK
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
shr eax, 12
|
||||
dec eax
|
||||
jz .second_nofill
|
||||
inc ebx
|
||||
.fill:
|
||||
mov dword [page_tabs+ebx*4], 2
|
||||
mov dword [page_tabs+ebx*8], 2
|
||||
inc ebx
|
||||
dec eax
|
||||
jnz .fill
|
||||
@ -764,7 +764,7 @@ proc user_alloc_at stdcall, address:dword, alloc_size:dword
|
||||
sub ecx, edx
|
||||
jz .nothird
|
||||
or cl, FREE_BLOCK
|
||||
mov [page_tabs+ebx*4], ecx
|
||||
mov [page_tabs+ebx*8], ecx
|
||||
|
||||
.nothird:
|
||||
mov edx, [current_process]
|
||||
@ -801,7 +801,7 @@ proc user_free stdcall, base:dword
|
||||
|
||||
xor ebx, ebx
|
||||
shr esi, 12
|
||||
mov eax, [page_tabs+(esi-1)*4]
|
||||
mov eax, [page_tabs+(esi-1)*8]
|
||||
test al, USED_BLOCK
|
||||
jz .cantfree
|
||||
test al, DONT_FREE_BLOCK
|
||||
@ -810,14 +810,14 @@ proc user_free stdcall, base:dword
|
||||
and eax, not 4095
|
||||
mov ecx, eax
|
||||
or al, FREE_BLOCK
|
||||
mov [page_tabs+(esi-1)*4], eax
|
||||
mov [page_tabs+(esi-1)*8], eax
|
||||
sub ecx, 4096
|
||||
mov ebx, ecx
|
||||
shr ecx, 12
|
||||
jz .released
|
||||
.release:
|
||||
xor eax, eax
|
||||
xchg eax, [page_tabs+esi*4]
|
||||
xchg eax, [page_tabs+esi*8]
|
||||
test al, 1
|
||||
jz @F
|
||||
test eax, PG_SHARED
|
||||
@ -877,7 +877,7 @@ proc user_unmap stdcall, base:dword, offset:dword, size:dword
|
||||
js .error
|
||||
|
||||
shr ebx, 12 ; chek block attributes
|
||||
lea ebx, [page_tabs+ebx*4]
|
||||
lea ebx, [page_tabs+ebx*8]
|
||||
mov eax, [ebx-4] ; block attributes
|
||||
test al, USED_BLOCK
|
||||
jz .error
|
||||
@ -885,15 +885,15 @@ proc user_unmap stdcall, base:dword, offset:dword, size:dword
|
||||
jnz .error
|
||||
|
||||
shr edx, 12
|
||||
lea edx, [page_tabs+edx*4] ; unmap offset
|
||||
lea edx, [page_tabs+edx*8] ; unmap offset
|
||||
|
||||
mov ecx, [size]
|
||||
add ecx, 4095
|
||||
shr ecx, 12 ; unmap size in pages
|
||||
|
||||
shr eax, 12 ; block size + 1 page
|
||||
lea ebx, [ebx+eax*4-4] ; block end ptr
|
||||
lea eax, [edx+ecx*4] ; unmap end ptr
|
||||
lea ebx, [ebx+eax*8-8] ; block end ptr
|
||||
lea eax, [edx+ecx*8] ; unmap end ptr
|
||||
|
||||
cmp eax, ebx ; check for overflow
|
||||
ja .error
|
||||
@ -914,7 +914,7 @@ proc user_unmap stdcall, base:dword, offset:dword, size:dword
|
||||
call free_page ; empty c-o-w page instead this ?
|
||||
@@:
|
||||
add ebx, 4096
|
||||
add edx, 4
|
||||
add edx, 8
|
||||
dec ecx
|
||||
jnz .unmap
|
||||
|
||||
@ -935,7 +935,7 @@ user_normalize:
|
||||
shr esi, 12
|
||||
shr edi, 12
|
||||
@@:
|
||||
mov eax, [page_tabs+esi*4]
|
||||
mov eax, [page_tabs+esi*8]
|
||||
test al, USED_BLOCK
|
||||
jz .test_free
|
||||
shr eax, 12
|
||||
@ -950,7 +950,7 @@ user_normalize:
|
||||
cmp edx, edi
|
||||
jae .exit
|
||||
|
||||
mov ebx, [page_tabs+edx*4]
|
||||
mov ebx, [page_tabs+edx*8]
|
||||
test bl, USED_BLOCK
|
||||
jz .next_free
|
||||
|
||||
@ -961,11 +961,11 @@ user_normalize:
|
||||
.next_free:
|
||||
test bl, FREE_BLOCK
|
||||
jz .err
|
||||
and dword [page_tabs+edx*4], 0
|
||||
and dword [page_tabs+edx*8], 0
|
||||
add eax, ebx
|
||||
and eax, not 4095
|
||||
or eax, FREE_BLOCK
|
||||
mov [page_tabs+esi*4], eax
|
||||
mov [page_tabs+esi*8], eax
|
||||
jmp @B
|
||||
.exit:
|
||||
xor eax, eax
|
||||
@ -995,7 +995,7 @@ user_realloc:
|
||||
|
||||
lea ecx, [eax - 0x1000]
|
||||
shr ecx, 12
|
||||
mov edx, [page_tabs+ecx*4]
|
||||
mov edx, [page_tabs+ecx*8]
|
||||
test dl, USED_BLOCK
|
||||
jnz @f
|
||||
; attempt to realloc invalid pointer
|
||||
@ -1024,7 +1024,7 @@ user_realloc:
|
||||
jz .release_done
|
||||
dec edx
|
||||
xor eax, eax
|
||||
xchg eax, [page_tabs+edx*4]
|
||||
xchg eax, [page_tabs+edx*8]
|
||||
test al, 1
|
||||
jz .loop
|
||||
call free_page
|
||||
@ -1036,14 +1036,14 @@ user_realloc:
|
||||
sub ebx, ecx
|
||||
cmp ebx, 1
|
||||
jnz .nofreeall
|
||||
mov eax, [page_tabs+ecx*4]
|
||||
mov eax, [page_tabs+ecx*8]
|
||||
and eax, not 0xFFF
|
||||
mov edx, [current_process]
|
||||
mov ebx, [edx+PROC.mem_used]
|
||||
sub ebx, eax
|
||||
add ebx, 0x1000
|
||||
or al, FREE_BLOCK
|
||||
mov [page_tabs+ecx*4], eax
|
||||
mov [page_tabs+ecx*8], eax
|
||||
push esi edi
|
||||
mov esi, [edx+PROC.heap_base]
|
||||
mov edi, [edx+PROC.heap_top]
|
||||
@ -1055,7 +1055,7 @@ user_realloc:
|
||||
sub edx, ecx
|
||||
shl ebx, 12
|
||||
or ebx, USED_BLOCK
|
||||
xchg [page_tabs+ecx*4], ebx
|
||||
xchg [page_tabs+ecx*8], ebx
|
||||
shr ebx, 12
|
||||
sub ebx, edx
|
||||
push ebx ecx edx
|
||||
@ -1079,10 +1079,10 @@ user_realloc:
|
||||
@@:
|
||||
cmp edx, esi
|
||||
jae .merge_done
|
||||
mov eax, [page_tabs+edx*4]
|
||||
mov eax, [page_tabs+edx*8]
|
||||
test al, USED_BLOCK
|
||||
jnz .merge_done
|
||||
and dword [page_tabs+edx*4], 0
|
||||
and dword [page_tabs+edx*8], 0
|
||||
shr eax, 12
|
||||
add edx, eax
|
||||
shl eax, 12
|
||||
@ -1091,7 +1091,7 @@ user_realloc:
|
||||
.merge_done:
|
||||
pop esi
|
||||
or ebx, FREE_BLOCK
|
||||
mov [page_tabs+ecx*4], ebx
|
||||
mov [page_tabs+ecx*8], ebx
|
||||
.ret:
|
||||
mov ecx, [current_process]
|
||||
lea ecx, [ecx+PROC.heap_lock]
|
||||
@ -1106,7 +1106,7 @@ user_realloc:
|
||||
shr eax, 12
|
||||
cmp edx, eax
|
||||
jae .cant_inplace
|
||||
mov eax, [page_tabs+edx*4]
|
||||
mov eax, [page_tabs+edx*8]
|
||||
test al, FREE_BLOCK
|
||||
jz .cant_inplace
|
||||
shr eax, 12
|
||||
@ -1116,18 +1116,18 @@ user_realloc:
|
||||
jz @f
|
||||
shl eax, 12
|
||||
or al, FREE_BLOCK
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
@@:
|
||||
mov eax, ebx
|
||||
sub eax, ecx
|
||||
shl eax, 12
|
||||
or al, USED_BLOCK
|
||||
mov [page_tabs+ecx*4], eax
|
||||
mov [page_tabs+ecx*8], eax
|
||||
lea eax, [ecx+1]
|
||||
shl eax, 12
|
||||
push eax
|
||||
push edi
|
||||
lea edi, [page_tabs+edx*4]
|
||||
lea edi, [page_tabs+edx*8]
|
||||
mov eax, 2
|
||||
sub ebx, edx
|
||||
mov ecx, ebx
|
||||
@ -1155,7 +1155,7 @@ user_realloc:
|
||||
.find_place:
|
||||
cmp esi, edi
|
||||
jae .place_not_found
|
||||
mov eax, [page_tabs+esi*4]
|
||||
mov eax, [page_tabs+esi*8]
|
||||
test al, FREE_BLOCK
|
||||
jz .next_place
|
||||
shr eax, 12
|
||||
@ -1177,30 +1177,30 @@ user_realloc:
|
||||
add esi, ebx
|
||||
shl eax, 12
|
||||
or al, FREE_BLOCK
|
||||
mov [page_tabs+esi*4], eax
|
||||
mov [page_tabs+esi*8], eax
|
||||
pop esi
|
||||
@@:
|
||||
mov eax, ebx
|
||||
shl eax, 12
|
||||
or al, USED_BLOCK
|
||||
mov [page_tabs+esi*4], eax
|
||||
mov [page_tabs+esi*8], eax
|
||||
inc esi
|
||||
mov eax, esi
|
||||
shl eax, 12
|
||||
push eax
|
||||
mov eax, [page_tabs+ecx*4]
|
||||
mov eax, [page_tabs+ecx*8]
|
||||
and eax, not 0xFFF
|
||||
or al, FREE_BLOCK
|
||||
sub edx, ecx
|
||||
mov [page_tabs+ecx*4], eax
|
||||
mov [page_tabs+ecx*8], eax
|
||||
inc ecx
|
||||
dec ebx
|
||||
dec edx
|
||||
jz .no
|
||||
@@:
|
||||
xor eax, eax
|
||||
xchg eax, [page_tabs+ecx*4]
|
||||
mov [page_tabs+esi*4], eax
|
||||
xchg eax, [page_tabs+ecx*8]
|
||||
mov [page_tabs+esi*8], eax
|
||||
mov eax, ecx
|
||||
shl eax, 12
|
||||
invlpg [eax]
|
||||
@ -1216,7 +1216,7 @@ user_realloc:
|
||||
add [edx+PROC.mem_used], ebx
|
||||
pop ebx
|
||||
@@:
|
||||
mov dword [page_tabs+esi*4], 2
|
||||
mov dword [page_tabs+esi*8], 2
|
||||
inc esi
|
||||
dec ebx
|
||||
jnz @b
|
||||
@ -1441,10 +1441,10 @@ align 4
|
||||
mov [size], ecx
|
||||
|
||||
shr ecx, 12
|
||||
shr eax, 10
|
||||
shr eax, 9
|
||||
|
||||
mov esi, [esi+SMEM.base]
|
||||
shr esi, 10
|
||||
shr esi, 9
|
||||
lea edi, [page_tabs+eax]
|
||||
add esi, page_tabs
|
||||
|
||||
@ -1457,6 +1457,7 @@ align 4
|
||||
and eax, 0xFFFFF000
|
||||
or eax, edx
|
||||
stosd
|
||||
movsd
|
||||
loop @B
|
||||
|
||||
xor edx, edx
|
||||
|
@ -131,7 +131,7 @@ map_page:
|
||||
and eax, [pte_valid_mask]
|
||||
mov ebx, [esp+8] ; lin_addr
|
||||
shr ebx, 12
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
mov eax, [esp+8] ; lin_addr
|
||||
pop ebx
|
||||
invlpg [eax]
|
||||
@ -194,7 +194,8 @@ proc map_io_mem stdcall, base:dword, size:dword, flags:dword
|
||||
or edx, [flags]
|
||||
and edx, [pte_valid_mask]
|
||||
@@:
|
||||
mov [page_tabs+eax*4], edx
|
||||
mov [page_tabs+eax*8], edx
|
||||
mov [page_tabs+eax*8+4], dword 0
|
||||
invlpg [ebx]
|
||||
inc eax
|
||||
add ebx, edi
|
||||
@ -232,12 +233,14 @@ commit_pages:
|
||||
and eax, [pte_valid_mask ]
|
||||
mov edi, ebx
|
||||
shr edi, 12
|
||||
lea edi, [page_tabs+edi*4]
|
||||
lea edi, [page_tabs+edi*8]
|
||||
@@:
|
||||
stosd
|
||||
mov [edi], eax
|
||||
mov [edi+4], dword 0
|
||||
invlpg [ebx]
|
||||
add eax, 0x1000
|
||||
add ebx, 0x1000
|
||||
add edi, 8
|
||||
loop @B
|
||||
|
||||
pop edi
|
||||
@ -264,7 +267,7 @@ release_pages:
|
||||
mov edi, eax
|
||||
|
||||
shr esi, 12
|
||||
lea esi, [page_tabs+esi*4]
|
||||
lea esi, [page_tabs+esi*8]
|
||||
|
||||
push ecx
|
||||
mov ecx, pg_data.mutex
|
||||
@ -295,7 +298,7 @@ release_pages:
|
||||
mov ebx, eax
|
||||
.next:
|
||||
add edi, 0x1000
|
||||
add esi, 4
|
||||
add esi, 8
|
||||
loop @B
|
||||
|
||||
mov [pg_data.pages_free], ebp
|
||||
@ -320,11 +323,12 @@ unmap_pages:
|
||||
mov edi, eax
|
||||
mov edx, eax
|
||||
|
||||
shr edi, 10
|
||||
shr edi, 9
|
||||
add edi, page_tabs
|
||||
|
||||
xor eax, eax
|
||||
@@:
|
||||
stosd
|
||||
stosd
|
||||
invlpg [edx]
|
||||
add edx, 0x1000
|
||||
@ -338,13 +342,14 @@ align 4
|
||||
proc map_page_table stdcall, lin_addr:dword, phis_addr:dword
|
||||
push ebx
|
||||
mov ebx, [lin_addr]
|
||||
shr ebx, 22
|
||||
shr ebx, 21
|
||||
mov eax, [phis_addr]
|
||||
and eax, not 0xFFF
|
||||
or eax, PG_UWR
|
||||
mov dword [master_tab+ebx*4], eax
|
||||
mov [master_tab+ebx*8], eax
|
||||
mov [master_tab+ebx*8+4], dword 0
|
||||
mov eax, [lin_addr]
|
||||
shr eax, 10
|
||||
shr eax, 9
|
||||
add eax, page_tabs
|
||||
invlpg [eax]
|
||||
pop ebx
|
||||
@ -437,11 +442,11 @@ proc new_mem_resize stdcall, new_size:dword
|
||||
mov ecx, pg_data.mutex
|
||||
call mutex_lock
|
||||
@@:
|
||||
mov eax, [app_page_tabs+edi*4]
|
||||
mov eax, [app_page_tabs+edi*8]
|
||||
test eax, 1
|
||||
jz .next
|
||||
|
||||
mov dword [app_page_tabs+edi*4], 0
|
||||
mov dword [app_page_tabs+edi*8], 0
|
||||
invlpg [ebx]
|
||||
call free_page
|
||||
|
||||
@ -476,10 +481,10 @@ proc new_mem_resize stdcall, new_size:dword
|
||||
push esi ;new size
|
||||
push edi ;old size
|
||||
|
||||
add edi, 0x3FFFFF
|
||||
and edi, not(0x3FFFFF)
|
||||
add esi, 0x3FFFFF
|
||||
and esi, not(0x3FFFFF)
|
||||
add edi, 0x1FFFFF
|
||||
and edi, not(0x1FFFFF)
|
||||
add esi, 0x1FFFFF
|
||||
and esi, not(0x1FFFFF)
|
||||
|
||||
cmp edi, esi
|
||||
jae .grow
|
||||
@ -491,7 +496,7 @@ proc new_mem_resize stdcall, new_size:dword
|
||||
stdcall map_page_table, edi, eax
|
||||
|
||||
push edi
|
||||
shr edi, 10
|
||||
shr edi, 9
|
||||
add edi, page_tabs
|
||||
mov ecx, 1024
|
||||
xor eax, eax
|
||||
@ -499,7 +504,7 @@ proc new_mem_resize stdcall, new_size:dword
|
||||
rep stosd
|
||||
pop edi
|
||||
|
||||
add edi, 0x00400000
|
||||
add edi, 0x00200000
|
||||
cmp edi, esi
|
||||
jb @B
|
||||
.grow:
|
||||
@ -546,7 +551,7 @@ get_pg_addr:
|
||||
cmp eax, 0x400000
|
||||
jb @f
|
||||
shr eax, 12
|
||||
mov eax, [page_tabs+(eax+(OS_BASE shr 12))*4]
|
||||
mov eax, [page_tabs+(eax+(OS_BASE shr 12))*8]
|
||||
@@:
|
||||
and eax, 0xFFFFF000
|
||||
ret
|
||||
@ -588,13 +593,13 @@ proc page_fault_handler
|
||||
|
||||
shr ebx, 12
|
||||
mov ecx, ebx
|
||||
shr ecx, 10
|
||||
mov edx, [master_tab+ecx*4]
|
||||
shr ecx, 9
|
||||
mov edx, [master_tab+ecx*8]
|
||||
test edx, PG_READ
|
||||
jz .fail ;таблица страниц не создана
|
||||
;неверный адрес в программе
|
||||
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
mov eax, [page_tabs+ebx*8]
|
||||
test eax, 2
|
||||
jz .fail ;адрес не зарезервирован для ;
|
||||
;использования. Ошибка
|
||||
@ -703,7 +708,7 @@ proc map_mem_ipc stdcall, lin_addr:dword,slot:dword,\
|
||||
count dd ?
|
||||
process dd ?
|
||||
endl
|
||||
|
||||
xchg bx, bx
|
||||
mov [count], 0
|
||||
cmp [buf_size], 0
|
||||
jz .exit
|
||||
@ -829,7 +834,7 @@ endp
|
||||
; out: CF cleared <=> failed
|
||||
; destroys: only eax
|
||||
proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
|
||||
mov eax, [esi+edx*4]
|
||||
mov eax, [esi+edx*8]
|
||||
test al, PG_READ
|
||||
jz .not_present
|
||||
test al, PG_WRITE
|
||||
@ -851,7 +856,7 @@ proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
|
||||
test eax, eax
|
||||
jz .fail
|
||||
or al, PG_UWR
|
||||
mov [esi+edx*4], eax
|
||||
mov [esi+edx*8], eax
|
||||
jmp .map
|
||||
.resolve_readonly:
|
||||
; readonly page, probably copy-on-write
|
||||
@ -893,7 +898,7 @@ proc safe_map_page stdcall, slot:dword, req_access:dword, ofs:dword
|
||||
test eax, eax
|
||||
jz .no_hdll
|
||||
or al, PG_UWR
|
||||
mov [esi+edx*4], eax
|
||||
mov [esi+edx*8], eax
|
||||
stdcall map_page, edi, eax, [req_access]
|
||||
push esi edi
|
||||
mov esi, ebx
|
||||
@ -1024,21 +1029,24 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
|
||||
mov edx, ebx
|
||||
shr ebx, 12
|
||||
xor eax, eax
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
mov [page_tabs+ebx*8+4], eax
|
||||
invlpg [edx]
|
||||
|
||||
mov ebx, [ipc_pdir]
|
||||
mov edx, ebx
|
||||
shr ebx, 12
|
||||
xor eax, eax
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
mov [page_tabs+ebx*8+4], eax
|
||||
invlpg [edx]
|
||||
|
||||
mov ebx, [ipc_ptab]
|
||||
mov edx, ebx
|
||||
shr ebx, 12
|
||||
xor eax, eax
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
mov [page_tabs+ebx*8+4], eax
|
||||
invlpg [edx]
|
||||
|
||||
mov eax, [dst_slot]
|
||||
|
@ -56,9 +56,6 @@ change_task:
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
; far_jump:
|
||||
; .offs dd ?
|
||||
; .sel dw ?
|
||||
context_counter dd 0 ;noname & halyavin
|
||||
next_usage_update dd 0
|
||||
timer_ticks dd 0
|
||||
@ -103,15 +100,29 @@ do_change_task:
|
||||
mov esp, [ebx+APPDATA.saved_esp]
|
||||
; set new thread io-map
|
||||
mov eax, [ebx+APPDATA.io_map]
|
||||
mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)], eax
|
||||
; mov dword [page_tabs+((tss._io_map_0 and -4096) shr 9)], eax
|
||||
mov eax, [ebx+APPDATA.io_map+4]
|
||||
mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)], eax
|
||||
; mov dword [page_tabs+((tss._io_map_1 and -4096) shr 9)], eax
|
||||
; set new thread memory-map
|
||||
mov eax, [ebx+APPDATA.process]
|
||||
cmp eax, [current_process]
|
||||
je @f
|
||||
mov [current_process], eax
|
||||
mov eax, [eax+PROC.pdt_0_phys]
|
||||
|
||||
mov ecx, [eax+PROC.pdt_0_phys]
|
||||
mov eax, [eax+PROC.pdt_1_phys]
|
||||
or ecx, PG_READ
|
||||
or eax, PG_READ
|
||||
mov [sys_pml3], ecx
|
||||
mov [sys_pml3+8], eax
|
||||
|
||||
or ecx, PG_SWR
|
||||
or eax, PG_SWR
|
||||
|
||||
mov [sys_pml2+OS_BASE+8192-20*8], ecx
|
||||
mov [sys_pml2+OS_BASE+8192-19*8], eax
|
||||
|
||||
mov eax, sys_pml3-OS_BASE
|
||||
mov cr3, eax
|
||||
@@:
|
||||
; set tss.esp0
|
||||
|
@ -306,13 +306,13 @@ show_error_parameters:
|
||||
push ebx
|
||||
shr ebx, 12
|
||||
mov ecx, ebx
|
||||
shr ecx, 10
|
||||
mov edx, [master_tab+ecx*4]
|
||||
shr ecx, 9
|
||||
mov edx, [master_tab+ecx*8]
|
||||
test edx, PG_READ
|
||||
jz .fail ;page table is not created
|
||||
;incorrect address in the program
|
||||
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
mov eax, [page_tabs+ebx*8]
|
||||
test eax, 2
|
||||
jz .fail ;address not reserved for use. error
|
||||
|
||||
|
@ -337,11 +337,11 @@ proc create_process stdcall, app_size:dword
|
||||
mov [process], eax
|
||||
|
||||
mov eax, [app_size]
|
||||
add eax, 0x3FFFFF
|
||||
shr eax, 22
|
||||
add eax, 0x1FFFFF
|
||||
shr eax, 21
|
||||
mov [app_tabs], eax
|
||||
|
||||
stdcall kernel_alloc, 0x2000
|
||||
stdcall kernel_alloc, 0x3000
|
||||
test eax, eax
|
||||
jz .fail
|
||||
mov [process], eax
|
||||
@ -371,20 +371,15 @@ proc create_process stdcall, app_size:dword
|
||||
mov eax, edi
|
||||
call get_pg_addr
|
||||
mov [edi-4096+PROC.pdt_0_phys], eax
|
||||
lea eax, [edi+4096]
|
||||
call get_pg_addr
|
||||
mov [edi-4096+PROC.pdt_1_phys], eax
|
||||
|
||||
mov ecx, (OS_BASE shr 20)/4
|
||||
mov ecx, 2048
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
|
||||
mov ecx, (OS_BASE shr 20)/4
|
||||
mov esi, sys_proc+PROC.pdt_0+(OS_BASE shr 20)
|
||||
rep movsd
|
||||
|
||||
mov eax, [edi-8192+PROC.pdt_0_phys]
|
||||
or eax, PG_SWR
|
||||
mov [edi-4096+(page_tabs shr 20)], eax
|
||||
|
||||
lea edx, [edi-4096]
|
||||
lea edx, [edi-8192]
|
||||
mov esi, [app_tabs]
|
||||
|
||||
.alloc_page_dir:
|
||||
@ -393,6 +388,7 @@ proc create_process stdcall, app_size:dword
|
||||
jz .fail
|
||||
or eax, PG_UWR
|
||||
mov [edx], eax
|
||||
mov [edx+4], dword 0
|
||||
|
||||
mov edi, [tmp_task_ptab]
|
||||
stdcall map_page, edi, eax, PG_SWR
|
||||
@ -400,7 +396,7 @@ proc create_process stdcall, app_size:dword
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
|
||||
add edx, 4
|
||||
add edx, 8
|
||||
dec esi
|
||||
jnz .alloc_page_dir
|
||||
|
||||
@ -430,7 +426,7 @@ proc destroy_page_table stdcall, pg_tab:dword
|
||||
push esi
|
||||
|
||||
mov esi, [pg_tab]
|
||||
mov ecx, 1024
|
||||
mov ecx, 512
|
||||
.free:
|
||||
mov eax, [esi]
|
||||
test eax, 1
|
||||
@ -441,7 +437,7 @@ proc destroy_page_table stdcall, pg_tab:dword
|
||||
jnz .next ;skip shared pages
|
||||
call free_page
|
||||
.next:
|
||||
add esi, 4
|
||||
add esi, 8
|
||||
dec ecx
|
||||
jnz .free
|
||||
pop esi
|
||||
@ -467,7 +463,7 @@ align 4
|
||||
|
||||
mov esi, [esp]
|
||||
add esi, PROC.pdt_0
|
||||
mov edi, (0x80000000 shr 20)/4
|
||||
mov edi, 1024
|
||||
.destroy:
|
||||
mov eax, [esi]
|
||||
test eax, 1
|
||||
@ -478,7 +474,7 @@ align 4
|
||||
mov eax, [esi]
|
||||
call free_page
|
||||
.next:
|
||||
add esi, 4
|
||||
add esi, 8
|
||||
dec edi
|
||||
jnz .destroy
|
||||
|
||||
@ -808,7 +804,7 @@ proc map_process_image stdcall, img_size:dword, file_base:dword, file_size:dword
|
||||
shr ecx, 12 ; image pages
|
||||
|
||||
mov edi, page_tabs
|
||||
shr esi, 10
|
||||
shr esi, 9
|
||||
add esi, edi
|
||||
|
||||
.map_image:
|
||||
@ -816,6 +812,7 @@ proc map_process_image stdcall, img_size:dword, file_base:dword, file_size:dword
|
||||
and eax, -4096
|
||||
or eax, PG_UWR
|
||||
stosd
|
||||
movsd
|
||||
dec edx
|
||||
loop .map_image
|
||||
|
||||
@ -828,6 +825,8 @@ proc map_process_image stdcall, img_size:dword, file_base:dword, file_size:dword
|
||||
|
||||
or eax, PG_UWR
|
||||
stosd
|
||||
xor eax, eax
|
||||
stosd
|
||||
dec edx
|
||||
jnz .map_bss
|
||||
|
||||
@ -867,7 +866,41 @@ common_app_entry:
|
||||
add esi, ecx
|
||||
jmp .check_cmdline
|
||||
|
||||
.copy_full_path:
|
||||
mov esi, [current_slot]
|
||||
mov esi, [esi+APPDATA.cur_dir]
|
||||
mov ebx, 1023
|
||||
mov al, '/'
|
||||
stosb
|
||||
|
||||
.copy_path:
|
||||
dec ebx
|
||||
jz .finish_path
|
||||
lodsb
|
||||
stosb
|
||||
test al, al
|
||||
jnz .copy_path
|
||||
mov byte [edi-1], '/'
|
||||
|
||||
cmp ecx, ebx
|
||||
jbe @F
|
||||
mov ecx, ebx
|
||||
@@:
|
||||
lea esi, [ebp+sizeof.APP_HDR]
|
||||
xor eax, eax
|
||||
rep movsb
|
||||
stosb
|
||||
jmp .check_cmdline
|
||||
|
||||
.finish_path:
|
||||
xor eax, eax
|
||||
stosb
|
||||
jmp .check_cmdline
|
||||
|
||||
.copy_filename:
|
||||
cmp byte [esi], '/'
|
||||
jne .copy_full_path
|
||||
|
||||
rep movsb
|
||||
stosb
|
||||
|
||||
@ -914,8 +947,8 @@ common_app_entry:
|
||||
mov fs, dx
|
||||
|
||||
.cleanup:
|
||||
stdcall free_kernel_space, [ebp+APP_HDR.img_base]
|
||||
stdcall kernel_free, ebp
|
||||
; stdcall free_kernel_space, [ebp+APP_HDR.img_base]
|
||||
; stdcall kernel_free, ebp
|
||||
.exit:
|
||||
popad
|
||||
iretd
|
||||
|
@ -107,8 +107,10 @@ v86_create:
|
||||
add eax, edx
|
||||
loop @b
|
||||
|
||||
mov eax, [sys_proc+PROC.pdt_0_phys]
|
||||
mov cr3, eax
|
||||
mov eax, sys_proc
|
||||
push ebx
|
||||
; call set_cr3
|
||||
pop ebx
|
||||
popfd
|
||||
|
||||
pop edi
|
||||
|
@ -333,7 +333,10 @@ gdte:
|
||||
|
||||
diff16 "end of .data segment",0,$
|
||||
|
||||
align 16
|
||||
align 32
|
||||
|
||||
sys_pml3 rd 4*2
|
||||
|
||||
cur_saved_data:
|
||||
rb 4096
|
||||
fpu_data:
|
||||
|
@ -124,29 +124,29 @@ proc init_mem
|
||||
mov edx, (HEAP_BASE-OS_BASE+HEAP_MIN_SIZE)/4096
|
||||
.set:
|
||||
mov [pg_data.kernel_pages-OS_BASE], edx
|
||||
shr edx, 10
|
||||
shr edx, 9
|
||||
mov [pg_data.kernel_tables-OS_BASE], edx
|
||||
|
||||
xor eax, eax
|
||||
mov edi, sys_proc-OS_BASE
|
||||
mov ecx, 8192/4
|
||||
cld
|
||||
rep stosd
|
||||
|
||||
mov edx, (sys_proc-OS_BASE+PROC.pdt_0)+ 0x800; (OS_BASE shr 20)
|
||||
mov edx, sys_pml2
|
||||
mov edi, 0x0070000 ;sys_proc+PROC.pdt_0-OS_BASE
|
||||
bt [cpu_caps-OS_BASE], CAPS_PSE
|
||||
jnc .no_PSE
|
||||
|
||||
mov ebx, cr4
|
||||
or ebx, CR4_PSE
|
||||
or ebx, CR4_PSE+CR4_PAE
|
||||
mov eax, PDE_LARGE+PG_SWR
|
||||
mov cr4, ebx
|
||||
dec [pg_data.kernel_tables-OS_BASE]
|
||||
|
||||
mov [edx], eax
|
||||
add edx, 4
|
||||
mov [edi], eax
|
||||
add edx, 8
|
||||
add edi, 8
|
||||
add eax, 0x200000
|
||||
mov [edx], eax
|
||||
mov [edi], eax
|
||||
add edx, 8
|
||||
|
||||
mov edi, [tmp_page_tabs]
|
||||
jmp .map_kernel_heap ; new kernel fits to the first 4Mb - nothing to do with ".map_low"
|
||||
.no_PSE:
|
||||
mov eax, PG_SWR
|
||||
@ -161,28 +161,28 @@ proc init_mem
|
||||
jnz @B
|
||||
|
||||
.map_kernel_heap:
|
||||
mov ecx, [pg_data.kernel_tables-OS_BASE]
|
||||
shl ecx, 10
|
||||
xor eax, eax
|
||||
rep stosd
|
||||
|
||||
mov ecx, [pg_data.kernel_tables-OS_BASE]
|
||||
mov eax, [tmp_page_tabs]
|
||||
or eax, PG_SWR
|
||||
mov edi, edx
|
||||
|
||||
.map_kernel_tabs:
|
||||
stosd
|
||||
mov [edx], eax
|
||||
add eax, 0x1000
|
||||
add edx, 8
|
||||
dec ecx
|
||||
jnz .map_kernel_tabs
|
||||
|
||||
mov dword [sys_proc-OS_BASE+PROC.pdt_0+(page_tabs shr 20)], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE
|
||||
mov dword [sys_pml2+8192-20*8], sys_proc+PROC.pdt_0+PG_SWR-OS_BASE
|
||||
mov dword [sys_pml2+8192-19*8], sys_proc+PROC.pdt_0+4096+PG_SWR-OS_BASE
|
||||
mov dword [sys_pml2+8192-18*8], sys_pml2+PG_SWR
|
||||
mov dword [sys_pml2+8192-17*8], sys_pml2+4096+PG_SWR
|
||||
|
||||
mov [sys_pml3-OS_BASE], 0x0070000+PG_READ ;sys_proc+PROC.pdt_0+PG_UWR-OS_BASE
|
||||
mov [sys_pml3+8-OS_BASE], 0x0071000+PG_READ ;sys_proc+PROC.pdt_0+4096+PG_UWR-OS_BASE
|
||||
mov [sys_pml3+16-OS_BASE],0x0072000+PG_READ ;sys_pml2+PG_SWR
|
||||
mov [sys_pml3+24-OS_BASE],0x0073000+PG_READ ;sys_pml2+4096+PG_SWR
|
||||
|
||||
mov edi, (sys_proc+PROC.pdt_0-OS_BASE)
|
||||
lea esi, [edi+(OS_BASE shr 20)]
|
||||
movsd
|
||||
movsd
|
||||
ret
|
||||
endp
|
||||
|
||||
|
@ -292,7 +292,7 @@ B32:
|
||||
|
||||
; ENABLE PAGING
|
||||
|
||||
mov eax, sys_proc-OS_BASE+PROC.pdt_0
|
||||
mov eax, sys_pml3-OS_BASE
|
||||
mov cr3, eax
|
||||
|
||||
mov eax, cr0
|
||||
@ -358,7 +358,8 @@ high_code:
|
||||
bt [cpu_caps], CAPS_PGE
|
||||
jnc @F
|
||||
|
||||
or [sys_proc+PROC.pdt_0+(OS_BASE shr 20)], eax
|
||||
or [sys_pml2], eax
|
||||
or [sys_pml2+8], eax
|
||||
or ebx, eax
|
||||
|
||||
mov eax, cr4
|
||||
@ -369,7 +370,7 @@ high_code:
|
||||
|
||||
xor eax, eax
|
||||
mov dword [sys_proc+PROC.pdt_0], eax
|
||||
mov dword [sys_proc+PROC.pdt_0+4], eax
|
||||
mov dword [sys_proc+PROC.pdt_0+8], eax
|
||||
|
||||
mov eax, cr3
|
||||
mov cr3, eax ; flush TLB
|
||||
@ -649,6 +650,7 @@ high_code:
|
||||
jbe @B
|
||||
|
||||
mov [sys_proc+PROC.pdt_0_phys], sys_proc-OS_BASE+PROC.pdt_0
|
||||
mov [sys_proc+PROC.pdt_1_phys], sys_proc-OS_BASE+PROC.pdt_0+4096
|
||||
|
||||
mov eax, -1
|
||||
mov edi, thr_slot_map+4
|
||||
@ -761,7 +763,7 @@ endg
|
||||
mov esi, boot_v86machine
|
||||
call boot_log
|
||||
; Initialize system V86 machine
|
||||
call init_sys_v86
|
||||
; call init_sys_v86
|
||||
|
||||
mov esi, boot_inittimer
|
||||
call boot_log
|
||||
@ -859,20 +861,8 @@ include 'detect/dev_fd.inc'
|
||||
;-----------------------------------------------------------------------------
|
||||
include 'detect/init_ata.inc'
|
||||
;-----------------------------------------------------------------------------
|
||||
if 0
|
||||
mov ax, [OS_BASE+0x10000+bx_from_load]
|
||||
cmp ax, 'r1'; if using not ram disk, then load librares and parameters {SPraid.simba}
|
||||
je no_lib_load
|
||||
|
||||
mov esi, boot_loadlibs
|
||||
call boot_log
|
||||
; LOADING LIBRARES
|
||||
stdcall dll.Load, @IMPORT ; loading librares for kernel (.obj files)
|
||||
call load_file_parse_table ; prepare file parse table
|
||||
call set_kernel_conf ; configure devices and gui
|
||||
no_lib_load:
|
||||
end if
|
||||
|
||||
cli
|
||||
; Display APIC status
|
||||
mov esi, boot_APIC_found
|
||||
cmp [irq_mode], IRQ_APIC
|
||||
@ -902,16 +892,9 @@ end if
|
||||
inc edi
|
||||
call display_number_force
|
||||
|
||||
; BUILD SCHEDULER
|
||||
|
||||
; call build_scheduler; sys32.inc
|
||||
|
||||
; mov esi, boot_devices
|
||||
; call boot_log
|
||||
|
||||
include "detect/vortex86.inc" ; Vortex86 SoC detection code
|
||||
|
||||
stdcall load_pe_driver, szVidintel, 0
|
||||
; stdcall load_pe_driver, szVidintel, 0
|
||||
|
||||
call usb_init
|
||||
|
||||
@ -1115,7 +1098,7 @@ end if
|
||||
|
||||
sti
|
||||
|
||||
call mtrr_validate
|
||||
; call mtrr_validate
|
||||
|
||||
jmp osloop
|
||||
|
||||
@ -2254,7 +2237,7 @@ sysfn_terminate2:
|
||||
cli
|
||||
call sysfn_terminate
|
||||
call unlock_application_table
|
||||
sti
|
||||
; sti
|
||||
and dword [esp+32], 0
|
||||
ret
|
||||
.not_found:
|
||||
@ -2847,7 +2830,7 @@ align 4
|
||||
jz .nomem
|
||||
mov ebx, eax
|
||||
shr ebx, 12
|
||||
or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
|
||||
or dword [page_tabs+(ebx-1)*8], DONT_FREE_BLOCK
|
||||
mov esi, [img_background]
|
||||
shr esi, 12
|
||||
mov ecx, [mem_BACKGROUND]
|
||||
@ -2856,16 +2839,16 @@ align 4
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.z:
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
mov eax, [page_tabs+ebx*8]
|
||||
test al, 1
|
||||
jz @f
|
||||
call free_page
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov eax, [page_tabs+esi*4]
|
||||
mov eax, [page_tabs+esi*8]
|
||||
or al, PG_UWR
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov [page_tabs+ebx*8], eax
|
||||
mov eax, ebx
|
||||
shl eax, 12
|
||||
invlpg [eax]
|
||||
@ -2891,7 +2874,7 @@ nosb6:
|
||||
mov eax, ecx
|
||||
mov ebx, ecx
|
||||
shr eax, 12
|
||||
mov ecx, [page_tabs+(eax-1)*4]
|
||||
mov ecx, [page_tabs+(eax-1)*8]
|
||||
test cl, USED_BLOCK+DONT_FREE_BLOCK
|
||||
jz .err
|
||||
jnp .err
|
||||
@ -2901,7 +2884,7 @@ nosb6:
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
and dword [page_tabs+eax*4], 0
|
||||
and dword [page_tabs+eax*8], 0
|
||||
mov edx, eax
|
||||
shl edx, 12
|
||||
push eax
|
||||
@ -2910,7 +2893,7 @@ align 4
|
||||
inc eax
|
||||
loop @b
|
||||
pop eax
|
||||
and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
|
||||
and dword [page_tabs+(eax-1)*8], not DONT_FREE_BLOCK
|
||||
stdcall user_free, ebx
|
||||
mov [esp+32], eax
|
||||
and [bgrlockpid], 0
|
||||
@ -3275,7 +3258,7 @@ sys_clock:
|
||||
add ecx, edx
|
||||
movzx edx, al
|
||||
add ecx, edx
|
||||
sti
|
||||
; sti
|
||||
mov [esp + 32], ecx
|
||||
ret
|
||||
|
||||
@ -3310,7 +3293,7 @@ sys_date:
|
||||
out 0x70, al
|
||||
in al, 0x71
|
||||
mov cl, al
|
||||
sti
|
||||
; sti
|
||||
mov [esp+32], ecx
|
||||
ret
|
||||
|
||||
@ -4234,7 +4217,7 @@ new_port_access:
|
||||
; pop ebp
|
||||
no_unmask_io:
|
||||
popad ; end enable io map
|
||||
sti
|
||||
; sti
|
||||
|
||||
mov eax, [RESERVED_PORTS]
|
||||
add eax, 1
|
||||
|
@ -20,7 +20,7 @@ struct FRB
|
||||
pitch rd 1
|
||||
format rd 1
|
||||
private rd 1
|
||||
pde rd 8
|
||||
pde rd 16*2
|
||||
ends
|
||||
|
||||
align 4
|
||||
@ -126,17 +126,17 @@ init_video:
|
||||
bt [cpu_caps], CAPS_PSE
|
||||
jnc .create_page_tables
|
||||
|
||||
mov edx, 0x00400000
|
||||
mov edx, 0x00200000
|
||||
or esi, PG_GLOBAL+PAT_WC+PG_UWR
|
||||
and esi, [pte_valid_mask]
|
||||
or esi, PDE_LARGE
|
||||
mov [ebp+FRB.pde], esi
|
||||
add esi, edx
|
||||
mov [ebp+FRB.pde+4], esi
|
||||
add esi, edx
|
||||
mov [ebp+FRB.pde+8], esi
|
||||
add esi, edx
|
||||
mov [ebp+FRB.pde+12], esi
|
||||
mov [ebp+FRB.pde+16], esi
|
||||
add esi, edx
|
||||
mov [ebp+FRB.pde+24], esi
|
||||
add esi, edx
|
||||
.ok:
|
||||
call calculate_fast_getting_offset_for_WinMapAddress
|
||||
@ -154,7 +154,7 @@ init_video:
|
||||
|
||||
stdcall alloc_kernel_space, 0x1000
|
||||
mov edi, eax
|
||||
mov ebx, 4
|
||||
mov ebx, 8
|
||||
|
||||
.new_pd:
|
||||
call alloc_page
|
||||
@ -164,13 +164,15 @@ init_video:
|
||||
stdcall map_page, edi, eax, PG_SWR
|
||||
|
||||
mov eax, esi
|
||||
mov ecx, 1024
|
||||
mov ecx, 512
|
||||
@@:
|
||||
stosd
|
||||
mov [edi], eax
|
||||
mov [edi+4], dword 0
|
||||
add eax, 0x1000
|
||||
add edi, 8
|
||||
loop @B
|
||||
|
||||
add esi, 0x400000
|
||||
add esi, 0x200000
|
||||
add ebp, 4
|
||||
sub edi, 4096
|
||||
dec ebx
|
||||
@ -198,8 +200,10 @@ init_video:
|
||||
and eax, [pte_valid_mask]
|
||||
mov ecx, (1228800+81920)/4096
|
||||
@@:
|
||||
stosd
|
||||
mov [edi], eax
|
||||
mov [edi+4],dword 0
|
||||
add eax, 0x1000
|
||||
add edi, 8
|
||||
loop @B
|
||||
|
||||
call free_kernel_space
|
||||
@ -210,20 +214,17 @@ set_framebuffer:
|
||||
push esi
|
||||
push edi
|
||||
lea esi, [ecx+FRB.pde]
|
||||
mov eax, sys_proc
|
||||
mov edi, sys_pml2+OS_BASE+8192-16*8
|
||||
|
||||
cld
|
||||
pushfd
|
||||
cli
|
||||
|
||||
mov [_display.current_lfb], ecx
|
||||
|
||||
.patch_pde:
|
||||
lea edi, [eax+PROC.pdt_0+4096-32] ;last 8 pd entries up to 32Mb framebuffer
|
||||
mov ecx, 4
|
||||
rep movsd ;patch pde
|
||||
sub esi, 16
|
||||
mov eax, [eax+PROC.list.next] ;next process/address space
|
||||
cmp eax, sys_proc
|
||||
jne .patch_pde
|
||||
mov ecx, 16*2
|
||||
rep movsd
|
||||
|
||||
bt [cpu_caps], CAPS_PGE
|
||||
jnc .cr3_flush
|
||||
|
Loading…
Reference in New Issue
Block a user