forked from KolibriOS/kolibrios
kolibri-process: v86 ready
git-svn-id: svn://kolibrios.org@5120 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6eb724186d
commit
933e63dccf
@ -103,7 +103,6 @@ v86_create:
|
|||||||
|
|
||||||
mov eax, 0xC0000+PG_UW
|
mov eax, 0xC0000+PG_UW
|
||||||
mov edi, page_tabs+0xC0*4
|
mov edi, page_tabs+0xC0*4
|
||||||
mov edx, 0x1000
|
|
||||||
mov ecx, 64
|
mov ecx, 64
|
||||||
@@:
|
@@:
|
||||||
stosd
|
stosd
|
||||||
@ -145,10 +144,11 @@ v86_create:
|
|||||||
v86_get_lin_addr:
|
v86_get_lin_addr:
|
||||||
push ecx edx
|
push ecx edx
|
||||||
mov ecx, eax
|
mov ecx, eax
|
||||||
mov edx, page_tabs
|
|
||||||
shr ecx, 12
|
shr ecx, 12
|
||||||
|
mov edx, [page_tabs+ecx*4]
|
||||||
and eax, 0xFFF
|
and eax, 0xFFF
|
||||||
add eax, [edx+ecx*4] ; atomic operation, no mutex needed
|
and edx, 0xFFFFF000
|
||||||
|
or eax, edx
|
||||||
pop edx ecx
|
pop edx ecx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -255,34 +255,35 @@ ends
|
|||||||
; destroys: nothing
|
; destroys: nothing
|
||||||
v86_start:
|
v86_start:
|
||||||
|
|
||||||
xchg bx, bx
|
|
||||||
|
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
cli
|
cli
|
||||||
|
|
||||||
mov ecx, [CURRENT_TASK]
|
mov ecx, [current_slot]
|
||||||
shl ecx, 8
|
|
||||||
add ecx, SLOT_BASE
|
|
||||||
|
|
||||||
mov eax, [esi+V86_machine.iopm]
|
|
||||||
call get_pg_addr
|
|
||||||
inc eax
|
|
||||||
push dword [ecx+APPDATA.io_map]
|
push dword [ecx+APPDATA.io_map]
|
||||||
push dword [ecx+APPDATA.io_map+4]
|
push dword [ecx+APPDATA.io_map+4]
|
||||||
mov dword [ecx+APPDATA.io_map], eax
|
|
||||||
mov dword [page_tabs + (tss._io_map_0 shr 10)], eax
|
|
||||||
add eax, 0x1000
|
|
||||||
mov dword [ecx+APPDATA.io_map+4], eax
|
|
||||||
mov dword [page_tabs + (tss._io_map_1 shr 10)], eax
|
|
||||||
|
|
||||||
push [ecx+APPDATA.process]
|
push [ecx+APPDATA.process]
|
||||||
push [ecx+APPDATA.saved_esp0]
|
push [ecx+APPDATA.saved_esp0]
|
||||||
mov [ecx+APPDATA.saved_esp0], esp
|
mov [ecx+APPDATA.saved_esp0], esp
|
||||||
mov [tss._esp0], esp
|
mov [tss._esp0], esp
|
||||||
|
|
||||||
|
mov eax, [esi+V86_machine.iopm]
|
||||||
|
call get_pg_addr
|
||||||
|
inc eax
|
||||||
|
mov dword [ecx+APPDATA.io_map], eax
|
||||||
|
mov dword [page_tabs + (tss._io_map_0 shr 10)], eax
|
||||||
|
|
||||||
|
mov eax, [esi+V86_machine.iopm]
|
||||||
|
add eax, 0x1000
|
||||||
|
call get_pg_addr
|
||||||
|
inc eax
|
||||||
|
mov dword [ecx+APPDATA.io_map+4], eax
|
||||||
|
mov dword [page_tabs + (tss._io_map_1 shr 10)], eax
|
||||||
|
|
||||||
mov eax, [esi+V86_machine.process]
|
mov eax, [esi+V86_machine.process]
|
||||||
mov [ecx+APPDATA.process], eax
|
mov [ecx+APPDATA.process], eax
|
||||||
|
mov [current_process], eax
|
||||||
mov eax, [eax+PROC.pdt_0_phys]
|
mov eax, [eax+PROC.pdt_0_phys]
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
|
|
||||||
@ -765,19 +766,20 @@ end if
|
|||||||
mov esp, esi
|
mov esp, esi
|
||||||
|
|
||||||
cli
|
cli
|
||||||
mov ecx, [CURRENT_TASK]
|
mov ecx, [current_slot]
|
||||||
shl ecx, 8
|
|
||||||
pop eax
|
pop eax
|
||||||
mov [SLOT_BASE+ecx+APPDATA.saved_esp0], eax
|
|
||||||
|
mov [ecx+APPDATA.saved_esp0], eax
|
||||||
mov [tss._esp0], eax
|
mov [tss._esp0], eax
|
||||||
pop eax
|
pop eax
|
||||||
mov [SLOT_BASE+ecx+APPDATA.process], eax
|
mov [ecx+APPDATA.process], eax
|
||||||
pop ebx
|
pop ebx
|
||||||
mov dword [SLOT_BASE+ecx+APPDATA.io_map+4], ebx
|
mov dword [ecx+APPDATA.io_map+4], ebx
|
||||||
mov dword [page_tabs + (tss._io_map_1 shr 10)], ebx
|
mov dword [page_tabs + (tss._io_map_1 shr 10)], ebx
|
||||||
pop ebx
|
pop ebx
|
||||||
mov dword [SLOT_BASE+ecx+APPDATA.io_map], ebx
|
mov dword [ecx+APPDATA.io_map], ebx
|
||||||
mov dword [page_tabs + (tss._io_map_0 shr 10)], ebx
|
mov dword [page_tabs + (tss._io_map_0 shr 10)], ebx
|
||||||
|
mov [current_process], eax
|
||||||
mov eax, [eax+PROC.pdt_0_phys]
|
mov eax, [eax+PROC.pdt_0_phys]
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
sti
|
sti
|
||||||
@ -906,74 +908,3 @@ v86_irq2:
|
|||||||
call do_change_task
|
call do_change_task
|
||||||
popad
|
popad
|
||||||
iretd
|
iretd
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
v86_entry:
|
|
||||||
xchg bx, bx
|
|
||||||
mov ebx, 100000
|
|
||||||
call delay_hs
|
|
||||||
jmp v86_entry
|
|
||||||
|
|
||||||
align 4
|
|
||||||
proc v86_init
|
|
||||||
locals
|
|
||||||
v86_slot dd ?
|
|
||||||
v86_cmdline dd ? ;0x00
|
|
||||||
v86_path dd ? ;0x04
|
|
||||||
v86_eip dd ? ;0x08
|
|
||||||
v86_esp dd ? ;0x0C
|
|
||||||
v86_mem dd ? ;0x10
|
|
||||||
endl
|
|
||||||
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
mov [v86_eip], v86_entry
|
|
||||||
mov [v86_cmdline], eax
|
|
||||||
mov [v86_esp], eax
|
|
||||||
mov [v86_path], eax
|
|
||||||
|
|
||||||
call lock_application_table
|
|
||||||
|
|
||||||
call alloc_thread_slot
|
|
||||||
test eax, eax
|
|
||||||
jz .failed
|
|
||||||
|
|
||||||
mov [v86_slot], eax
|
|
||||||
|
|
||||||
mov edi, eax
|
|
||||||
shl edi, 8
|
|
||||||
add edi, SLOT_BASE
|
|
||||||
mov esi, edi ;edx=edi - pointer to extended infomation about new thread
|
|
||||||
mov ecx, 256/4
|
|
||||||
xor eax, eax
|
|
||||||
cld
|
|
||||||
rep stosd ;clean extended information about new thread
|
|
||||||
mov [esi], dword 'V86 '
|
|
||||||
|
|
||||||
stdcall create_process, 4096, OS_BASE, 4096
|
|
||||||
test eax, eax
|
|
||||||
jz .failed
|
|
||||||
|
|
||||||
mov [eax+PROC.mem_used], 4096
|
|
||||||
mov [esi+APPDATA.process], eax
|
|
||||||
|
|
||||||
lea ebx, [esi+APPDATA.list]
|
|
||||||
lea ecx, [eax+PROC.thr_list]
|
|
||||||
list_add_tail ebx, ecx ;add thread to process child's list
|
|
||||||
|
|
||||||
|
|
||||||
lea eax, [v86_cmdline]
|
|
||||||
stdcall set_app_params , [v86_slot], eax, 0, 0, 2
|
|
||||||
|
|
||||||
mov eax, [process_number] ;set result
|
|
||||||
call unlock_application_table
|
|
||||||
ret
|
|
||||||
.failed:
|
|
||||||
xor eax, eax
|
|
||||||
.failed1:
|
|
||||||
call unlock_application_table
|
|
||||||
dec eax ;-1
|
|
||||||
ret
|
|
||||||
endp
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user