kernel support for loading compressed apps - part 1

git-svn-id: svn://kolibrios.org@237 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2006-12-17 06:22:59 +00:00
parent 46d4105bf9
commit 54e1aacfec
7 changed files with 705 additions and 569 deletions

View File

@ -127,16 +127,16 @@ debug_getcontext:
imul eax, tss_step/32 imul eax, tss_step/32
add eax, tss_data add eax, tss_data
mov edi, edx mov edi, edx
cmp [l.cs - tss_sceleton + eax], app_code cmp [eax+TSS._cs], app_code
jnz .ring0 jnz .ring0
lea esi, [l.eip - tss_sceleton + eax] lea esi, [eax+TSS._eip]
shr ecx, 2 shr ecx, 2
rep movsd rep movsd
jmp .ret jmp .ret
.ring0: .ring0:
; note that following code assumes that all interrupt/exception handlers ; note that following code assumes that all interrupt/exception handlers
; saves ring-3 context by push ds es, pushad in this order ; saves ring-3 context by push ds es, pushad in this order
mov esi, [l.esp0 - tss_sceleton + eax] mov esi, [eax+TSS._esp0]
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), ds, es, pushad ; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), ds, es, pushad
sub esi, 8+12+8+20h sub esi, 8+12+8+20h
lodsd lodsd
@ -186,14 +186,14 @@ debug_setcontext:
imul eax, tss_step/32 imul eax, tss_step/32
add eax, tss_data add eax, tss_data
mov esi, edx mov esi, edx
cmp [l.cs - tss_sceleton + eax], app_code cmp [eax+TSS._cs], app_code
jnz .ring0 jnz .ring0
lea edi, [l.eip - tss_sceleton + eax] lea edi, [eax+TSS._eip]
shr ecx, 2 shr ecx, 2
rep movsd rep movsd
jmp .stiret jmp .stiret
.ring0: .ring0:
mov edi, [l.esp0 - tss_sceleton + eax] mov edi, [eax+TSS._esp0]
sub edi, 8+12+8+20h sub edi, 8+12+8+20h
mov eax, [esi+24h] mov eax, [esi+24h]
stosd stosd
@ -249,7 +249,7 @@ debug_set_drx:
test byte [eax+10h], 55h test byte [eax+10h], 55h
jnz .okret jnz .okret
imul eax, ebp, tss_step/32 imul eax, ebp, tss_step/32
and byte [eax + tss_data + l.trap - tss_sceleton], not 1 and byte [eax + tss_data + TSS._trap], not 1
.okret: .okret:
and dword [esp+36], 0 and dword [esp+36], 0
sti sti
@ -291,7 +291,7 @@ debug_set_drx:
and [eax+10h+2], dx and [eax+10h+2], dx
or [eax+10h+2], bx ; set R/W and LEN fields or [eax+10h+2], bx ; set R/W and LEN fields
imul eax, ebp, tss_step/32 imul eax, ebp, tss_step/32
or byte [eax + tss_data + l.trap - tss_sceleton], 1 or byte [eax + tss_data + TSS._trap], 1
jmp .okret jmp .okret
debug_read_process_memory: debug_read_process_memory:

View File

@ -518,6 +518,8 @@ proc load_file stdcall, file_name:dword
jnz .fail jnz .fail
mov eax, [file_size] mov eax, [file_size]
cmp eax, 1024*1024*16
ja .fail
stdcall kernel_alloc, [file_size] stdcall kernel_alloc, [file_size]
mov [file], eax mov [file], eax
@ -529,8 +531,9 @@ proc load_file stdcall, file_name:dword
mov eax, [file] mov eax, [file]
cmp dword [eax], 0x4B43504B cmp dword [eax], 0x4B43504B
jne .exit jne .exit
mov ebx, [eax+4]
stdcall kernel_alloc, [eax+4] mov [file_size], ebx
stdcall kernel_alloc, ebx
test eax, eax test eax, eax
jz .cleanup jz .cleanup
@ -539,12 +542,14 @@ proc load_file stdcall, file_name:dword
stdcall unpack, [file], eax stdcall unpack, [file], eax
stdcall kernel_free, [file] stdcall kernel_free, [file]
mov eax, [file2] mov eax, [file2]
mov ebx, [file_size]
.exit: .exit:
ret ret
.cleanup: .cleanup:
stdcall kernel_free, [file] stdcall kernel_free, [file]
.fail: .fail:
xor eax, eax xor eax, eax
xor ebx, ebx
ret ret
endp endp
@ -862,7 +867,6 @@ proc load_library stdcall, file_name:dword
cli cli
stdcall load_file, [file_name] stdcall load_file, [file_name]
test eax, eax test eax, eax
jz .fail jz .fail

View File

@ -1335,3 +1335,223 @@ endg
; pop edx ; pop edx
; pop eax ; pop eax
align 4
k_strrchr:
push eax
xor eax,eax
or ecx,-1
repne scasb
add ecx,1
neg ecx
sub edi,1
pop eax
std
repne scasb
cld
add edi,1
cmp [edi],al
jne @F
mov eax,edi
ret
@@:
xor eax,eax
ret
align 4
proc k_strncpy stdcall, dest:dword, src:dword, maxlen:dword
mov eax, [dest]
mov esi, [src]
mov ecx, [maxlen]
test eax, eax
jz .L9
test esi, esi
jz .L9
test ecx, ecx
jz .L9
sub esi, eax
jmp .L1
align 4
.L2:
mov edx, [esi+eax]
mov [eax], dl
test dl, dl
jz .L7
mov [eax+1], dh
test dh, dh
jz .L6
shr edx, 16
mov [eax+2],dl
test dl, dl
jz .L5
mov [eax+3], dh
test dh, dh
jz .L4
add eax, 4
.L1:
sub ecx, 4
jae .L2
add ecx, 4
jz .L9
mov dl, [eax+esi]
mov [eax], dl
test dl, dl
jz .L3
inc eax
dec ecx
jz .L9
mov dl, [eax+esi]
mov [eax], dl
test dl, dl
jz .L3
inc eax
dec ecx
jz .L9
mov dl, [eax+esi]
mov [eax], dl
test dl, dl
jz .L3
inc eax
jmp .L9
.L4: dec ecx
inc eax
.L5: dec ecx
inc eax
.L6: dec ecx
inc eax
.L7:
add ecx,3
jz .L9
.L8:
mov byte [ecx+eax], 0
.L3:
dec ecx
jnz .L8
.L9:
ret
endp
if 0
magic equ 0xfefefeff
k_strlen:
mov eax,[esp+4]
mov edx, 3
and edx, eax
jz .L1
jp .L0
cmp dh, byte [eax]
je .L2
inc eax
cmp dh, byte [eax]
je .L2
inc eax
xor edx, 2
jz .L1
.L0:
cmp dh, [eax]
je .L2
inc eax
xor edx, edx
.L1:
mov ecx, [eax]
add eax, 4
sub edx, ecx
add ecx, magic
dec edx
jnc .L3
xor edx, ecx
and edx, not magic
jne .L3
mov ecx, [eax]
add eax, 4
sub edx, ecx
add ecx, magic
dec edx
jnc .L3
xor edx, ecx
and edx, not magic
jne .L3
mov ecx, [eax]
add eax, 4
sub edx, ecx
add ecx, magic
dec edx
jnc .L3
xor edx, ecx
and edx, not magic
jne .L3
mov ecx, [eax]
add eax, 4
sub edx, ecx
add ecx, magic
dec edx
jnc .L3
xor edx, ecx
and edx, not magic
je .L1
.L3: sub eax ,4
sub ecx, magic
cmp cl, 0
jz .L2
inc eax
test ch, ch
jz .L2
shr ecx, 16
inc eax
cmp cl,0
jz .L2
inc eax
.L2:
sub eax, [esp+4]
ret
end if

View File

@ -12,39 +12,6 @@ idtreg:
dd idts+8 dd idts+8
;label idts at 0xB100-8 ;label idts at 0xB100-8
uglobal
tss_sceleton:
l.back dw 0,0
l.esp0 dd 0
l.ss0 dw 0,0
l.esp1 dd 0
l.ss1 dw 0,0
l.esp2 dd 0
l.ss2 dw 0,0
l.cr3 dd 0
l.eip dd 0
l.eflags dd 0
l.eax dd 0
l.ecx dd 0
l.edx dd 0
l.ebx dd 0
l.esp dd 0
l.ebp dd 0
l.esi dd 0
l.edi dd 0
l.es dw 0,0
l.cs dw 0,0
l.ss dw 0,0
l.ds dw 0,0
l.fs dw 0,0
l.gs dw 0,0
l.ldt dw 0,0
l.trap dw 0
l.io dw 0
endg
build_process_gdt_tss_pointer: build_process_gdt_tss_pointer:
mov ecx,tss_data mov ecx,tss_data
@ -512,8 +479,7 @@ sys_resize_app_memory:
.no_application_mem_resize: .no_application_mem_resize:
ret ret
if 0
get_app_params: get_app_params:
push eax push eax
@ -577,20 +543,19 @@ get_app_params:
stc stc
ret ret
end if
uglobal
new_process_place dd 0x0 ;uglobal
app_start dd 0x0 ; new_process_place dd 0x0
app_i_end dd 0x0 ; app_start dd 0x0
app_mem dd 0x0 ; app_i_end dd 0x0
app_esp dd 0x0 ; app_mem dd 0x0
app_i_param dd 0x0 ; app_esp dd 0x0
app_i_icon dd 0x0 ; app_i_param dd 0x0
; app_i_icon dd 0x0
; app_mem_pos dd 0x0 ; app_mem_pos dd 0x0
appl_path dd 0x0 ;endg
appl_path_size dd 0x0
endg
sys_threads: sys_threads:

View File

@ -1,4 +1,4 @@
GREEDY_KERNEL equ 0 GREEDY_KERNEL equ 0
struc APP_HEADER_00 struc APP_HEADER_00
@ -21,61 +21,235 @@ struc APP_HEADER_01
.i_icon dd ? ;+32 .i_icon dd ? ;+32
} }
struc TSS
{
._back rw 2
._esp0 rd 1
._ss0 rw 2
._esp1 rd 1
._ss1 rw 2
._esp2 rd 1
._ss2 rw 2
._cr3 rd 1
._eip rd 1
._eflags rd 1
._eax rd 1
._ecx rd 1
._edx rd 1
._ebx rd 1
._esp rd 1
._ebp rd 1
._esi rd 1
._edi rd 1
._es rw 2
._cs rw 2
._ss rw 2
._ds rw 2
._fs rw 2
._gs rw 2
._ldt rw 2
._trap rw 1
._io rw 1
}
virtual at 0
TSS TSS
end virtual
struc APP_PARAMS
{ .app_cmdline ;0x00
.app_path ;0x04
.app_eip ;0x08
.app_esp ;0x0C
.app_mem ;0x10
}
macro _clear_ op
{ mov ecx, op/4
xor eax, eax
cld
rep stosd
}
align 4 align 4
proc test_app_header stdcall, header:dword proc fs_exec_EX stdcall file_name:dword, cmd_line:dword, flags:dword
virtual at ebx locals
save_cr3 dd ?
slot dd ?
slot_base dd ?
file_base dd ?
file_size dd ?
app_cmdline dd ? ;0x00
app_path dd ? ;0x04
app_eip dd ? ;0x08
app_esp dd ? ;0x0C
app_mem dd ? ;0x10
endl
stdcall load_file,[file_name]
mov ecx, -ERROR_FILE_NOT_FOUND
test eax, eax
jz .err ;fail
mov [file_base], eax
mov [file_size], ebx
lea ebx, [app_cmdline]
call test_app_header
mov ecx, -0x1F
test eax, eax
jz .err ;fail
mov esi, new_process_loading
call sys_msg_board_str ; write message to message board
pushfd
cli
.wait_lock:
cmp [application_table_status],0
je .get_lock
call change_task
jmp .wait_lock
.get_lock:
mov eax, 1
xchg eax, [application_table_status]
cmp eax, 0
jne .wait_lock
call set_application_table_status
call get_new_process_place
test eax, eax
mov ecx, -0x20 ; too many processes
jz .err
mov [slot], eax
shl eax, 8
add eax, PROC_BASE
mov [slot_base], eax
mov edi, eax
_clear_ 256 ;clean extended information about process
; write application name
mov edi, [file_name]
mov al, '/'
call k_strrchr ; now eax points to name without path
lea esi, [eax+1]
test eax, eax
jnz @F
mov esi, [file_name]
@@:
mov ecx, 8 ; 8 chars for name
mov edi, [slot_base]
.copy_process_name_loop:
lodsb
cmp al, '.'
jz .copy_process_name_done
test al, al
jz .copy_process_name_done
stosb
loop .copy_process_name_loop
.copy_process_name_done:
mov ebx, cr3
mov [save_cr3], ebx
if GREEDY_KERNEL
stdcall create_app_space,[app_mem],[file_size]
else
stdcall create_app_space,[app_mem],[app_mem]
end if
test eax, eax
jz .failed
mov ebx,[slot_base]
mov [ebx+APPDATA.dir_table],eax
mov eax,[app_mem]
mov [ebx+APPDATA.mem_size],eax
mov ecx, [file_size]
add ecx, 3
shr ecx, 2
mov esi, [file_base]
mov edi, new_app_base
cld
rep movsd
stdcall kernel_free, [file_base]
lea eax, [app_cmdline]
stdcall set_app_params ,[slot],eax,[cmd_line],\
[file_name], dword 0 ;[flags]
mov eax, [save_cr3]
call set_cr3
xor eax, eax
mov [application_table_status],eax ;unlock application_table_status mutex
popfd
mov eax,[process_number] ;set result
ret
.failed:
mov eax, [save_cr3]
call set_cr3
.err:
popfd
xor eax, eax
mov [application_table_status],eax
ret
endp
align 4
test_app_header:
virtual at eax
APP_HEADER_00 APP_HEADER_00 APP_HEADER_00 APP_HEADER_00
end virtual end virtual
virtual at eax
mov ebx, [header]
cmp [ebx+6], word '00'
jne .check_01_header
mov eax,[APP_HEADER_00.start]
mov [app_start],eax
mov eax,[APP_HEADER_00.i_end]
mov [app_i_end],eax
mov eax,[APP_HEADER_00.mem_size]
mov [app_mem],eax
shr eax,1
sub eax,0x10
mov [app_esp],eax
mov eax,[APP_HEADER_00.i_param]
mov [app_i_param],eax
mov [app_i_icon],dword 0
mov eax,1
ret
.check_01_header:
virtual at ebx
APP_HEADER_01 APP_HEADER_01 APP_HEADER_01 APP_HEADER_01
end virtual end virtual
cmp [ebx+6],word '01' cmp dword [eax], 'MENU'
jne .no_01_header jne .fail
cmp word [eax+4],'ET'
jne .fail
mov eax,[APP_HEADER_01.start] cmp [eax+6], word '00'
mov [app_start],eax jne .check_01_header
mov eax,[APP_HEADER_01.i_end]
mov [app_i_end],eax
mov eax,[APP_HEADER_01.mem_size]
mov [app_mem],eax
mov eax,[APP_HEADER_01.stack_top]
mov [app_esp],eax
mov eax,[APP_HEADER_01.i_param]
mov [app_i_param],eax
mov eax,[APP_HEADER_01.i_icon]
mov [app_i_icon],eax
mov eax,1 mov ecx,[APP_HEADER_00.start]
mov [ebx+0x08], ecx ;app_eip
mov edx,[APP_HEADER_00.mem_size]
mov [ebx+0x10], edx ;app_mem
shr edx,1
sub edx,0x10
mov [ebx+0x0C], edx ;app_esp
mov ecx,[APP_HEADER_00.i_param]
mov [ebx], ecx ;app_cmdline
mov [ebx+4], dword 0 ;app_path
ret ret
.no_01_header: .check_01_header:
cmp [eax+6],word '01'
jne .fail
mov ecx,[APP_HEADER_01.start]
mov [ebx+0x08], ecx ;app_eip
mov edx,[APP_HEADER_01.mem_size]
mov [ebx+0x10], edx ;app_mem
mov ecx,[APP_HEADER_01.stack_top]
mov [ebx+0x0C], ecx ;app_esp
mov edx,[APP_HEADER_01.i_param]
mov [ebx], edx ;app_cmdline
mov ecx,[APP_HEADER_01.i_icon]
mov [ebx+4], ecx ;app_path
ret
.fail:
xor eax, eax xor eax, eax
ret ret
endp
align 4 align 4
proc get_new_process_place proc get_new_process_place
@ -399,8 +573,10 @@ proc fs_execute
mov ebx, [tmp_task_data] ;cmd line mov ebx, [tmp_task_data] ;cmd line
add ebx, TMP_CMD_LINE add ebx, TMP_CMD_LINE
stdcall fs_exec, eax, ebx, [flags], [ebp+8],\ stdcall fs_exec_EX, eax, ebx, [flags]
[ebp+12], [ebp+16],[ebp+20]
; stdcall fs_exec, eax, ebx, [flags], [ebp+8],\
; [ebp+12], [ebp+16],[ebp+20]
mov [retval], eax mov [retval], eax
popad popad
mov [pg_data.tmp_task_mutex], 0 mov [pg_data.tmp_task_mutex], 0
@ -409,400 +585,6 @@ proc fs_execute
endp endp
align 4
proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword,\
fn_read:dword, file_size:dword,\
cluster:dword, some_data:dword
locals
slot dd ?
app_path_size dd ?
save_cr3 dd ?
img_size dd ?
endl
; check filename length - with terminating NULL must be no more than 1024 symbols
mov edi, [file_name]
mov ecx, 1024
xor eax, eax
repnz scasb
jz @f
mov eax, -ERROR_FILE_NOT_FOUND
ret
@@:
sub edi, [file_name]
mov [app_path_size], edi
mov esi, new_process_loading
call sys_msg_board_str ; write message to message board
pushfd
cli
.wait_lock:
cmp [application_table_status],0
je .get_lock
call change_task
jmp .wait_lock
.get_lock:
mov eax, 1
xchg eax, [application_table_status]
cmp eax, 0
jne .wait_lock
call set_application_table_status
call get_new_process_place
test eax, eax
mov ecx, -0x20 ; too many processes
jz .err
mov [slot], eax
mov edi,eax
shl edi,8
add edi,PROC_BASE
mov ecx,256/4
xor eax,eax
cld
rep stosd ;clean extended information about process
; write application name
mov edi, [file_name]
mov ecx, [app_path_size]
add edi, ecx
dec edi
std
mov al, '/'
repnz scasb
cld
jnz @f
inc edi
@@:
inc edi
; now edi points to name without path
mov esi, edi
mov ecx, 8 ; 8 chars for name
mov edi, [slot]
shl edi, cl
add edi, PROC_BASE
.copy_process_name_loop:
lodsb
cmp al, '.'
jz .copy_process_name_done
test al, al
jz .copy_process_name_done
stosb
loop .copy_process_name_loop
.copy_process_name_done:
mov al, ' '
rep stosb
pop eax
mov cl, 3 ; 3 chars for extension
dec esi
@@:
dec eax
cmp eax, esi
jbe .copy_process_ext_done
cmp byte [eax], '.'
jnz @b
lea esi, [eax+1]
.copy_process_ext_loop:
lodsb
test al, al
jz .copy_process_ext_done
stosb
loop .copy_process_ext_loop
.copy_process_ext_done:
mov al, ' '
rep stosb
; read header
lea eax, [file_size]
mov ebx, [eax]
mov [img_size], ebx
mov edi, TMP_BUFF
call [fn_read]
test eax, eax
jnz .err
; check menuet signature
mov ecx, -0x1F
;check MENUET signature
cmp [TMP_BUFF],dword 'MENU'
jnz .err
cmp [TMP_BUFF+4],word 'ET'
jnz .err
stdcall test_app_header, TMP_BUFF
test eax, eax
jz .err
mov eax, cr3
mov [save_cr3], eax
if GREEDY_KERNEL
stdcall create_app_space,[app_mem],[img_size]
else
stdcall create_app_space,[app_mem],[app_mem]
end if
test eax, eax
jz .failed
mov ebx,[slot]
shl ebx,8
mov [PROC_BASE+ebx+0xB8],eax
mov esi, TMP_BUFF
mov edi, new_app_base
mov ecx, 512/4
cld
rep movsd
;read file
@@:
lea eax, [file_size]
cmp dword [eax], 0
jz .done
push edi
call [fn_read]
pop edi
add edi, 512
test eax, eax
jz @b
cmp ebx, 6
jne .failed
.done:
stdcall add_app_parameters, [slot], new_app_base,\
[cmd_line],[file_name],[flags]
mov eax, [save_cr3]
call set_cr3
xor eax, eax
mov [application_table_status],eax ;unlock application_table_status mutex
popfd
mov eax,[process_number] ;set result
ret
.failed:
mov eax, [save_cr3]
call set_cr3
.err:
popfd
xor eax, eax
mov [application_table_status],eax
ret
endp
align 4
proc add_app_parameters stdcall,slot:dword,img_base:dword,\
cmd_line:dword, app_path:dword, flags:dword
mov edi, [slot]
mov esi, [fpu_data]
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
shl edi, 8
mov eax, edi
lea edi, [esi+edi*2]
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 512/4
jmp @F
.no_SSE:
mov eax, edi
shl eax, 8
mov ebx, edi
shl edi, 7
shl ebx, 4
sub edi, ebx ;edi*=112
add edi, esi
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 112/4
@@:
rep movsd
mov ebx,[slot]
cmp ebx,[TASK_COUNT]
jle .noinc
inc dword [TASK_COUNT] ;update number of processes
.noinc:
shl ebx,8
mov eax,[app_mem]
mov [PROC_BASE+APPDATA.mem_size+ebx],eax
mov ecx, [def_cursor]
mov [PROC_BASE+APPDATA.cursor+ebx],ecx
shr ebx,3
mov eax, new_app_base
mov dword [CURRENT_TASK+ebx+0x10],eax
.add_command_line:
mov edx,[app_i_param]
test edx,edx
jz .no_command_line ;application don't need parameters
mov eax,[cmd_line]
test eax,eax
jz .no_command_line ;no parameters specified
;calculate parameter length
xor ecx,ecx
.command_line_len:
cmp byte [eax],0
jz .command_line_len_end
inc eax
inc ecx
cmp ecx,255
jl .command_line_len
.command_line_len_end:
;ecx - parameter length
;edx - address of parameters in new process address space
inc ecx
mov edi, [img_base]
add edi, edx
mov esi, [cmd_line]
rep movsb
.no_command_line:
mov edx,[app_i_icon]
test edx,edx
jz .no_command_line_1 ;application don't need path of file
mov esi,[app_path]
test esi, esi
jz .no_command_line_1 ;application don't need path of file
mov ecx, 64
mov edi, [img_base]
add edi, edx
rep movsb
.no_command_line_1:
mov ebx,[slot]
mov eax,ebx
shl ebx,5
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
mov [ebx+window_data+WDATA.fl_redraw], 1
add ebx,CURRENT_TASK ;ebx - pointer to information about process
mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
inc dword [process_number]
mov eax,[process_number]
mov [ebx+4],eax ;set PID
mov ecx,ebx
add ecx,(draw_data-CURRENT_TASK) ;ecx - pointer to draw data
;set draw data to full screen
mov [ecx+0],dword 0
mov [ecx+4],dword 0
mov eax,[SCR_X_SIZE]
mov [ecx+8],eax
mov eax,[SCR_Y_SIZE]
mov [ecx+12],eax
;set cr3 register in TSS of application
mov ecx,[slot]
shl ecx,8
mov eax,[PROC_BASE+0xB8+ecx]
;or eax, PG_NOCACHE
mov [l.cr3],eax
mov eax,[app_start]
mov [l.eip],eax ;set eip in TSS
mov eax,[app_esp]
mov [l.esp],eax ;set stack in TSS
;gdt
mov ax,app_code ;ax - selector of code segment
mov [l.cs],ax
mov ax,app_data
mov [l.ss],ax
mov [l.ds],ax
mov [l.es],ax
mov [l.fs],ax
mov ax,graph_data ;ax - selector of graphic segment
mov [l.gs],ax
mov [l.io],word 128
mov [l.eflags],dword 0x1202
mov [l.ss0],os_data
mov ebx,[slot]
shl ebx,12
add ebx,sysint_stack_data+4096
mov [l.esp0],ebx
;copy tss to it place
mov eax,tss_sceleton
mov ebx,[slot]
imul ebx,tss_step
add ebx,tss_data ;ebx - address of application TSS
mov ecx,120
call memmove
;Add IO access table - bit array of permitted ports
or eax,-1
mov edi,[slot]
imul edi,tss_step
add edi,tss_data+128
mov ecx,2048
cld
rep stosd ;full access to 2048*8=16384 ports
mov ecx,ebx ;ecx - address of application TSS
mov edi,[slot]
shl edi,3
;set TSS descriptor
mov [edi+gdts+tss0+0],word tss_step ;limit (size)
mov [edi+gdts+tss0+2],cx ;part of offset
mov eax,ecx
shr eax,16
mov [edi+gdts+tss0+4],al ;part of offset
mov [edi+gdts+tss0+7],ah ;part of offset
mov [edi+gdts+tss0+5],word 01010000b*256+11101001b ;system flags
;flush keyboard and buttons queue
mov [KEY_COUNT],byte 0
mov [BTN_COUNT],byte 0
mov edi,[slot]
shl edi,5
add edi,window_data
mov ebx,[slot]
movzx esi,word [WIN_STACK+ebx*2]
lea esi,[WIN_POS+esi*2]
call windowactivate ;gui initialization
mov ebx,[slot]
shl ebx,5
mov [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running
; set if debuggee
mov eax, [flags]
test byte [flags], 1
jz .no_debug
mov [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended
mov eax,[CURRENT_TASK]
mov [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current
.no_debug:
mov esi,new_process_running
call sys_msg_board_str ;output information about succefull startup
ret
endp
pid_to_slot: pid_to_slot:
;Input: ;Input:
@ -1054,27 +836,28 @@ proc write_process_memory
ret ret
endp endp
align 4 align 4
proc new_sys_threads proc new_sys_threads
locals locals
thread_start dd ?
thread_stack dd ?
params dd ?
slot dd ? slot dd ?
app_cmdline dd ? ;0x00
app_path dd ? ;0x04
app_eip dd ? ;0x08
app_esp dd ? ;0x0C
app_mem dd ? ;0x10
endl endl
mov [thread_start], ebx
mov [thread_stack], ecx
mov [params], 0
xor edx,edx ; flags=0
cmp eax,1 cmp eax,1
jnz .failed ;other subfunctions jne .failed ;other subfunctions
xor eax,eax
mov [app_cmdline], eax
mov [app_path], eax
mov [app_eip], ebx
mov [app_esp], ecx
mov esi,new_process_loading mov esi,new_process_loading
call sys_msg_board_str call sys_msg_board_str
.wait_lock: .wait_lock:
cmp [application_table_status],0 cmp [application_table_status],0
je .get_lock je .get_lock
@ -1095,41 +878,39 @@ proc new_sys_threads
mov [slot], eax mov [slot], eax
xor eax,eax
mov [app_i_param],eax
mov [app_i_icon],eax
mov ebx, [thread_start]
mov ecx, [thread_stack]
mov [app_start],ebx
mov [app_esp],ecx
mov esi,[CURRENT_TASK] mov esi,[CURRENT_TASK]
shl esi,8 shl esi,8
add esi,PROC_BASE add esi,PROC_BASE
mov ebx,esi ;ebx=esi - pointer to extended information about current thread mov ebx,esi ;ebx=esi - pointer to extended information about current thread
mov edi,[slot] mov edi, eax
shl edi,8 shl edi,8
add edi,PROC_BASE add edi,PROC_BASE
mov edx,edi ;edx=edi - pointer to extended infomation about new thread mov edx,edi ;edx=edi - pointer to extended infomation about new thread
mov ecx,256/4 mov ecx,256/4
xor eax, eax
cld
rep stosd ;clean extended information about new thread rep stosd ;clean extended information about new thread
mov esi,ebx
mov edi,edx mov edi,edx
mov ecx,11 mov ecx,11
rep movsb ;copy process name rep movsb ;copy process name
mov eax,[ebx+APPDATA.heap_base] mov eax,[ebx+APPDATA.heap_base]
mov [edx+APPDATA.heap_base], eax mov [edx+APPDATA.heap_base], eax
mov ecx,[ebx+APPDATA.heap_top] mov ecx,[ebx+APPDATA.heap_top]
mov [edx+APPDATA.heap_top], ecx mov [edx+APPDATA.heap_top], ecx
mov eax,[ebx+APPDATA.mem_size]
mov [app_mem],eax ;set memory size
mov eax,[ebx+0xb8]
mov [edx+0xb8],eax ;copy page directory
stdcall add_app_parameters, [slot], new_app_base,\ mov eax,[ebx+APPDATA.mem_size]
[params], dword 0,dword 0 mov [edx+APPDATA.mem_size], eax
mov ecx,[ebx+APPDATA.dir_table]
mov [edx+APPDATA.dir_table],ecx ;copy page directory
lea eax, [app_cmdline]
stdcall set_app_params ,[slot],eax,dword 0,\
dword 0,dword 0
mov esi,new_process_running mov esi,new_process_running
call sys_msg_board_str ;output information about succefull startup call sys_msg_board_str ;output information about succefull startup
@ -1162,6 +943,171 @@ proc wait_mutex stdcall, mutex:dword
ret ret
endp endp
align 4
proc set_app_params stdcall,slot:dword, params:dword,\
cmd_line:dword, app_path:dword, flags:dword
mov edi, [slot]
mov esi, [fpu_data]
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
shl edi, 8
mov eax, edi
lea edi, [esi+edi*2]
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 512/4
jmp @F
.no_SSE:
mov eax, edi
shl eax, 8
mov ebx, edi
shl edi, 7
shl ebx, 4
sub edi, ebx ;edi*=112
add edi, esi
mov [eax+PROC_BASE+APPDATA.fpu_state], edi
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
mov ecx, 112/4
@@:
rep movsd
mov ebx,[slot]
cmp ebx,[TASK_COUNT]
jle .noinc
inc dword [TASK_COUNT] ;update number of processes
.noinc:
shl ebx,8
mov ecx, [def_cursor]
mov [PROC_BASE+APPDATA.cursor+ebx],ecx
shr ebx,3
mov eax, new_app_base
mov dword [CURRENT_TASK+ebx+0x10],eax
.add_command_line:
mov edx,[params]
mov edx,[edx] ;app_cmdline
test edx,edx
jz @F ;application don't need parameters
add edx, new_app_base
stdcall k_strncpy, edx, [cmd_line], 255
@@:
mov edx,[params]
mov edx, [edx+4] ;app_path
test edx,edx
jz @F ;application don't need path of file
add edx, new_app_base
stdcall k_strncpy, edx, [app_path], 64
@@:
mov ebx,[slot]
mov eax,ebx
shl ebx,5
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
mov [ebx+window_data+WDATA.fl_redraw], 1
add ebx,CURRENT_TASK ;ebx - pointer to information about process
mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot
mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function)
inc dword [process_number]
mov eax,[process_number]
mov [ebx+4],eax ;set PID
mov ecx,ebx
add ecx,(draw_data-CURRENT_TASK) ;ecx - pointer to draw data
;set draw data to full screen
mov [ecx+0],dword 0
mov [ecx+4],dword 0
mov eax,[SCR_X_SIZE]
mov [ecx+8],eax
mov eax,[SCR_Y_SIZE]
mov [ecx+12],eax
mov edi,[slot]
imul edi,tss_step
add edi,tss_data
mov ecx,128/4
xor eax, eax
cld
rep stosd
;Add IO access table - bit array of permitted ports
not eax
mov ecx,2048
rep stosd ; access to 4096*8=65536 ports
sub edi, tss_step
;set cr3 register in TSS of application
mov ecx, [slot]
shl ecx, 8
mov eax,[PROC_BASE+ecx+APPDATA.dir_table]
mov [edi+TSS._cr3],eax
mov esi,[params]
mov eax, [esi+0x08] ;app_eip
mov [edi+TSS._eip],eax ;set eip in TSS
mov eax, [esi+0x0C] ;app_esp
mov [edi+TSS._esp],eax ;set stack in TSS
mov [edi+TSS._eflags],dword 0x1202
mov [edi+TSS._cs],app_code ;selector of code segment
mov [edi+TSS._ss],app_data
mov [edi+TSS._ds],app_data
mov [edi+TSS._es],app_data
mov [edi+TSS._fs],app_data
mov [edi+TSS._gs],graph_data ;selector of graphic segment
mov [edi+TSS._io],word 128
mov [edi+TSS._ss0], os_data
mov ebx,[slot]
shl ebx,12
add ebx,sysint_stack_data+4096
mov [edi+TSS._esp0],ebx
mov ecx, edi ;ecx - address of application TSS
mov ebx,[slot]
shl ebx,3
;set TSS descriptor
mov [ebx+gdts+tss0+0],word tss_step ;limit (size)
mov [ebx+gdts+tss0+2],cx ;part of offset
shr ecx,16
mov [ebx+gdts+tss0+4],cl ;part of offset
mov [ebx+gdts+tss0+7],ch ;part of offset
mov [ebx+gdts+tss0+5],word 01010000b*256+11101001b ;system flags
;flush keyboard and buttons queue
mov [KEY_COUNT],byte 0
mov [BTN_COUNT],byte 0
mov edi,[slot]
shl edi,5
add edi,window_data
mov ebx,[slot]
movzx esi,word [WIN_STACK+ebx*2]
lea esi,[WIN_POS+esi*2]
call windowactivate ;gui initialization
mov ebx,[slot]
shl ebx,5
mov [CURRENT_TASK+ebx+0xa],byte 0 ;set process state - running
; set if debuggee
mov eax, [flags]
test byte [flags], 1
jz .no_debug
mov [CURRENT_TASK+ebx+0xa],byte 1 ;set process state - suspended
mov eax,[CURRENT_TASK]
mov [PROC_BASE+ebx*8+0xac],eax ;set debugger PID - current
.no_debug:
mov esi,new_process_running
call sys_msg_board_str ;output information about succefull startup
ret
endp
include "debug.inc" include "debug.inc"

View File

@ -97,6 +97,18 @@ file_system_lfn:
add esi, std_application_base_address add esi, std_application_base_address
mov ebp, esi mov ebp, esi
lodsb lodsb
@@:
cmp dword [ebx], 7
jne @F
mov edx, [ebx+4]
mov ebx, [ebx+8]
test ebx, ebx
jz .l1
add ebx, new_app_base
.l1:
call fs_execute ; ebp, ebx, edx
mov [esp+36], eax
ret
@@: @@:
cmp al, '/' cmp al, '/'
jz @f jz @f

View File

@ -23,7 +23,6 @@ max_processes equ 255
;window_data equ 0x0000 ;window_data equ 0x0000
;tss_data equ 0xD20000 ;tss_data equ 0xD20000
;tss_step equ (128+2048) ; tss & i/o - 16384 ports, * 256=557056
tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4 tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
;draw_data equ 0xC00000 ;draw_data equ 0xC00000
;sysint_stack_data equ 0xC03000 ;sysint_stack_data equ 0xC03000
@ -619,26 +618,25 @@ include 'vmodeld.inc'
mov [0x3020+TASKDATA.pid], 1 ; process id number mov [0x3020+TASKDATA.pid], 1 ; process id number
mov [0x3020+TASKDATA.mem_start], 0 ; process base address mov [0x3020+TASKDATA.mem_start], 0 ; process base address
; set default flags & stacks
mov [l.eflags],dword 0x11202 ; sti and resume
mov [l.ss0], os_data
; osloop - TSS
mov eax,cr3
mov [l.cr3],eax
mov [l.eip],osloop
mov [l.esp],sysint_stack_data + 4096*2 ; uses slot 1 stack
mov [l.cs],os_code
mov [l.ss],os_data
mov [l.ds],os_data
mov [l.es],os_data
mov [l.fs],os_data
mov [l.gs],os_data
; move tss to tss_data+tss_step
mov esi,tss_sceleton
mov edi,tss_data+tss_step mov edi,tss_data+tss_step
mov ecx,120/4 mov ecx, (tss_step)/4
xor eax, eax
cld cld
rep movsd rep stosd
mov edi,tss_data+tss_step
mov [edi+TSS._ss0], os_data
mov eax,cr3
mov [edi+TSS._cr3],eax
mov [edi+TSS._eip],osloop
mov [edi+TSS._eflags],dword 0x11202 ; sti and resume
mov [edi+TSS._esp],sysint_stack_data + 4096*2 ; uses slot 1 stack
mov [edi+TSS._cs],os_code
mov [edi+TSS._ss],os_data
mov [edi+TSS._ds],os_data
mov [edi+TSS._es],os_data
mov [edi+TSS._fs],os_data
mov [edi+TSS._gs],os_data
mov ax,tss0 mov ax,tss0
ltr ax ltr ax
@ -699,26 +697,18 @@ include 'vmodeld.inc'
cli cli
cmp byte [0x2f0000+0x9030],1 cmp byte [0x2f0000+0x9030],1
jne no_load_vrr_m jne no_load_vrr_m
mov ebp,vrr_m
lea esi,[ebp+6] ; skip '/rd/1/' stdcall fs_exec_EX, vrr_m, dword 0, dword 0
xor ebx,ebx ; no parameters
xor edx,edx ; no flags
call fs_RamdiskExecute.flags
cmp eax,2 ; if vrr_m app found (PID=2) cmp eax,2 ; if vrr_m app found (PID=2)
je first_app_found je first_app_found
no_load_vrr_m: no_load_vrr_m:
mov ebp,firstapp stdcall fs_exec_EX, firstapp, dword 0, dword 0
lea esi,[ebp+6]
xor ebx,ebx ; no parameters
xor edx,edx ; no flags
call fs_RamdiskExecute.flags
cmp eax,2 ; continue if a process has been loaded cmp eax,2 ; continue if a process has been loaded
je first_app_found je first_app_found
mov eax, 0xDEADBEEF ; otherwise halt mov eax, 0xDEADBEEF ; otherwise halt
hlt hlt
first_app_found: first_app_found:
cli cli
;mov [0x3004],dword 2 ;mov [0x3004],dword 2
@ -799,7 +789,6 @@ include 'vmodeld.inc'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 32 align 32
osloop: osloop:
call [draw_pointer] call [draw_pointer]
call checkbuttons call checkbuttons
call checkwindows call checkwindows