Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6332 → Rev 6339

/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