/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 |