From 03c7eb4fa96f059fce3f63cea694ea753da83d4f Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Mon, 14 Mar 2016 03:45:15 +0000 Subject: [PATCH] kos-acpi: PAE support git-svn-id: svn://kolibrios.org@6339 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/branches/Kolibri-acpi/const.inc | 15 ++-- kernel/branches/Kolibri-acpi/core/dll.inc | 16 ++-- kernel/branches/Kolibri-acpi/core/heap.inc | 89 ++++++++++--------- kernel/branches/Kolibri-acpi/core/memory.inc | 66 ++++++++------ kernel/branches/Kolibri-acpi/core/sched.inc | 23 +++-- kernel/branches/Kolibri-acpi/core/sys32.inc | 6 +- kernel/branches/Kolibri-acpi/core/taskman.inc | 75 +++++++++++----- kernel/branches/Kolibri-acpi/core/v86.inc | 6 +- kernel/branches/Kolibri-acpi/data32.inc | 5 +- kernel/branches/Kolibri-acpi/init.inc | 44 ++++----- kernel/branches/Kolibri-acpi/kernel.asm | 57 +++++------- kernel/branches/Kolibri-acpi/unpacker.inc | 2 +- .../Kolibri-acpi/video/framebuffer.inc | 37 ++++---- 13 files changed, 243 insertions(+), 198 deletions(-) diff --git a/kernel/branches/Kolibri-acpi/const.inc b/kernel/branches/Kolibri-acpi/const.inc index 83f139eee7..8f5617b921 100644 --- a/kernel/branches/Kolibri-acpi/const.inc +++ b/kernel/branches/Kolibri-acpi/const.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/dll.inc b/kernel/branches/Kolibri-acpi/core/dll.inc index ba5688d6ea..778a3ddc19 100644 --- a/kernel/branches/Kolibri-acpi/core/dll.inc +++ b/kernel/branches/Kolibri-acpi/core/dll.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/heap.inc b/kernel/branches/Kolibri-acpi/core/heap.inc index b9afad480b..d7dc105d71 100644 --- a/kernel/branches/Kolibri-acpi/core/heap.inc +++ b/kernel/branches/Kolibri-acpi/core/heap.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/memory.inc b/kernel/branches/Kolibri-acpi/core/memory.inc index e604e7c330..61f4a576d8 100644 --- a/kernel/branches/Kolibri-acpi/core/memory.inc +++ b/kernel/branches/Kolibri-acpi/core/memory.inc @@ -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] diff --git a/kernel/branches/Kolibri-acpi/core/sched.inc b/kernel/branches/Kolibri-acpi/core/sched.inc index 91144d7ff2..85418b115b 100644 --- a/kernel/branches/Kolibri-acpi/core/sched.inc +++ b/kernel/branches/Kolibri-acpi/core/sched.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/sys32.inc b/kernel/branches/Kolibri-acpi/core/sys32.inc index f49562d0d5..064bfaf752 100644 --- a/kernel/branches/Kolibri-acpi/core/sys32.inc +++ b/kernel/branches/Kolibri-acpi/core/sys32.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/taskman.inc b/kernel/branches/Kolibri-acpi/core/taskman.inc index 58474d8a89..c89e306e78 100644 --- a/kernel/branches/Kolibri-acpi/core/taskman.inc +++ b/kernel/branches/Kolibri-acpi/core/taskman.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/core/v86.inc b/kernel/branches/Kolibri-acpi/core/v86.inc index 1005b38783..360b6e6425 100644 --- a/kernel/branches/Kolibri-acpi/core/v86.inc +++ b/kernel/branches/Kolibri-acpi/core/v86.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/data32.inc b/kernel/branches/Kolibri-acpi/data32.inc index a2a828ccd8..491a12a6e0 100644 --- a/kernel/branches/Kolibri-acpi/data32.inc +++ b/kernel/branches/Kolibri-acpi/data32.inc @@ -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: diff --git a/kernel/branches/Kolibri-acpi/init.inc b/kernel/branches/Kolibri-acpi/init.inc index dd7478416d..0f957eb403 100644 --- a/kernel/branches/Kolibri-acpi/init.inc +++ b/kernel/branches/Kolibri-acpi/init.inc @@ -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 diff --git a/kernel/branches/Kolibri-acpi/kernel.asm b/kernel/branches/Kolibri-acpi/kernel.asm index 1b47ee3080..f501e1f747 100644 --- a/kernel/branches/Kolibri-acpi/kernel.asm +++ b/kernel/branches/Kolibri-acpi/kernel.asm @@ -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 diff --git a/kernel/branches/Kolibri-acpi/unpacker.inc b/kernel/branches/Kolibri-acpi/unpacker.inc index 04f44f8fd9..8bec9e0b3f 100644 --- a/kernel/branches/Kolibri-acpi/unpacker.inc +++ b/kernel/branches/Kolibri-acpi/unpacker.inc @@ -8,7 +8,7 @@ $Revision$ -; void __stdcall unpack(void* packed_data, void* unpacked_data); +; void __stdcall unpack(void* packed_data, void* unpacked_data); unpack: pushad mov esi, [esp+32+4] diff --git a/kernel/branches/Kolibri-acpi/video/framebuffer.inc b/kernel/branches/Kolibri-acpi/video/framebuffer.inc index da83375b6f..9d5d482eff 100644 --- a/kernel/branches/Kolibri-acpi/video/framebuffer.inc +++ b/kernel/branches/Kolibri-acpi/video/framebuffer.inc @@ -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