Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6332 → Rev 6339

/kernel/branches/Kolibri-acpi/const.inc
223,6 → 223,7
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
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_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
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
/kernel/branches/Kolibri-acpi/core/dll.inc
594,7 → 594,7
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
 
or eax, PG_UWR
stosd
xor eax, eax
stosd
dec edx
jnz @B
 
649,7 → 651,7
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
656,7 → 658,7
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
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,7 → 1226,7
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
1229,10 → 1233,10
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
/kernel/branches/Kolibri-acpi/core/heap.inc
585,7 → 585,7
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
 
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
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
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
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
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
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
 
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,7 → 810,7
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
817,7 → 817,7
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
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,7 → 885,7
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
892,8 → 892,8
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
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
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
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
.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
 
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
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,7 → 1036,7
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]
1043,7 → 1043,7
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
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
@@:
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
.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
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
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
.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,22 → 1177,22
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
1199,8 → 1199,8
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
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
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
and eax, 0xFFFFF000
or eax, edx
stosd
movsd
loop @B
 
xor edx, edx
/kernel/branches/Kolibri-acpi/core/memory.inc
131,7 → 131,7
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
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
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
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
mov ebx, eax
.next:
add edi, 0x1000
add esi, 4
add esi, 8
loop @B
 
mov [pg_data.pages_free], ebp
320,12 → 323,13
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
loop @b
338,13 → 342,14
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
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
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
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
rep stosd
pop edi
 
add edi, 0x00400000
add edi, 0x00200000
cmp edi, esi
jb @B
.grow:
546,7 → 551,7
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
 
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
count dd ?
process dd ?
endl
 
xchg bx, bx
mov [count], 0
cmp [buf_size], 0
jz .exit
829,7 → 834,7
; 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
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
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,7 → 1029,8
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]
1031,7 → 1037,8
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]
1038,7 → 1045,8
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]
/kernel/branches/Kolibri-acpi/core/sched.inc
56,9 → 56,6
 
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
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
/kernel/branches/Kolibri-acpi/core/sys32.inc
306,13 → 306,13
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
 
/kernel/branches/Kolibri-acpi/core/taskman.inc
337,11 → 337,11
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
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
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
xor eax, eax
rep stosd
 
add edx, 4
add edx, 8
dec esi
jnz .alloc_page_dir
 
430,7 → 426,7
push esi
 
mov esi, [pg_tab]
mov ecx, 1024
mov ecx, 512
.free:
mov eax, [esi]
test eax, 1
441,7 → 437,7
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
 
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
mov eax, [esi]
call free_page
.next:
add esi, 4
add esi, 8
dec edi
jnz .destroy
 
808,7 → 804,7
shr ecx, 12 ; image pages
 
mov edi, page_tabs
shr esi, 10
shr esi, 9
add esi, edi
 
.map_image:
816,6 → 812,7
and eax, -4096
or eax, PG_UWR
stosd
movsd
dec edx
loop .map_image
 
828,6 → 825,8
 
or eax, PG_UWR
stosd
xor eax, eax
stosd
dec edx
jnz .map_bss
 
867,7 → 866,41
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
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
/kernel/branches/Kolibri-acpi/core/v86.inc
107,8 → 107,10
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
/kernel/branches/Kolibri-acpi/data32.inc
333,7 → 333,10
 
diff16 "end of .data segment",0,$
 
align 16
align 32
 
sys_pml3 rd 4*2
 
cur_saved_data:
rb 4096
fpu_data:
/kernel/branches/Kolibri-acpi/init.inc
124,29 → 124,29
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
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 edi, (sys_proc+PROC.pdt_0-OS_BASE)
lea esi, [edi+(OS_BASE shr 20)]
movsd
movsd
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
 
ret
endp
 
/kernel/branches/Kolibri-acpi/kernel.asm
292,7 → 292,7
 
; 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
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
 
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
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
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/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
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
 
sti
 
call mtrr_validate
; call mtrr_validate
 
jmp osloop
 
2254,7 → 2237,7
cli
call sysfn_terminate
call unlock_application_table
sti
; sti
and dword [esp+32], 0
ret
.not_found:
2847,7 → 2830,7
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,7 → 2839,7
;--------------------------------------
align 4
.z:
mov eax, [page_tabs+ebx*4]
mov eax, [page_tabs+ebx*8]
test al, 1
jz @f
call free_page
2863,9 → 2846,9
;--------------------------------------
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
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
;--------------------------------------
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
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
add ecx, edx
movzx edx, al
add ecx, edx
sti
; sti
mov [esp + 32], ecx
ret
 
3310,7 → 3293,7
out 0x70, al
in al, 0x71
mov cl, al
sti
; sti
mov [esp+32], ecx
ret
 
4234,7 → 4217,7
; pop ebp
no_unmask_io:
popad ; end enable io map
sti
; sti
 
mov eax, [RESERVED_PORTS]
add eax, 1
/kernel/branches/Kolibri-acpi/video/framebuffer.inc
20,7 → 20,7
pitch rd 1
format rd 1
private rd 1
pde rd 8
pde rd 16*2
ends
 
align 4
126,18 → 126,18
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
; for Qemu or non standart video cards
154,7 → 154,7
 
stdcall alloc_kernel_space, 0x1000
mov edi, eax
mov ebx, 4
mov ebx, 8
 
.new_pd:
call alloc_page
164,13 → 164,15
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
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
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