dynamic stack with fpu state area

git-svn-id: svn://kolibrios.org@357 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-02-17 10:09:23 +00:00
parent 45d720c0c7
commit ee29610808
10 changed files with 212 additions and 249 deletions

View File

@ -226,9 +226,10 @@ resendQ equ OS_BASE+0x0770000
;skin_data equ OS_BASE+0x0778000
draw_data equ OS_BASE+0x0800000
sysint_stack_data equ OS_BASE+0x0803000
tss_data equ OS_BASE+0x0920000
tss_data equ 0x0803000 ;OS_BASE+0x0920000
HEAP_BASE equ 0xA0B000 ;x00C00000
pages_tab equ 0x60000000
master_tab equ 0x60180000
@ -238,11 +239,7 @@ sys_pgdir equ OS_BASE+0x00050000
sys_master_tab equ OS_BASE+0x00051000
sys_pgmap equ OS_BASE+0x00052000
;lfb_start equ 0x00800000
;new_app_pdir equ OS_BASE+0x01000000
;new_app_master_table equ OS_BASE+0x01001000
;new_app_ptable equ OS_BASE+0x01002000
new_app_base equ 0x60400000

View File

@ -512,13 +512,13 @@ proc load_file stdcall, file_name:dword
.exit:
push eax
lea edi, [eax+ebx] ;cleanup remain space
mov ecx, ebx ;from file end
add ecx, 4095
and ecx, not 4095
mov ecx, 4096 ;from file end
and ebx, 4095
sub ecx, ebx
xor eax, eax
cld
rep stosb
mov ebx, [file_size]
pop eax
ret
.cleanup:

View File

@ -6,9 +6,6 @@ init_fpu:
bt [cpu_caps], CAPS_SSE
jnc .no_SSE
stdcall kernel_alloc, 512*256
mov [fpu_data], eax
mov ebx, cr4
mov ecx, cr0
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
@ -29,16 +26,14 @@ init_fpu:
xorps xmm5, xmm5
xorps xmm6, xmm6
xorps xmm7, xmm7
fxsave [eax]
fxsave [fpu_data] ;[eax]
ret
.no_SSE:
stdcall kernel_alloc, 112*256
mov [fpu_data], eax
mov ecx, cr0
and ecx, not CR0_EM
or ecx, CR0_MP+CR0_NE
mov cr0, ecx
fnsave [eax]
fnsave [fpu_data]
ret
align 4
@ -118,8 +113,6 @@ iglobal
fpu_owner dd 1
endg
reg_eip equ ebp+4
reg_cs equ ebp+8
reg_eflags equ ebp+12

View File

@ -1,18 +1,16 @@
HEAP_BASE equ 0x00C00000
;HEAP_SIZE equ 0x01000000
struc MEM_BLOCK
{ .next_block dd ?
.prev_block dd ? ;+4
.list_next dd ? ;+8
.list_prev dd ? ;+12
.list_fd dd ? ;+8
.list_bk dd ? ;+12
.base dd ? ;+16
.size dd ? ;+20
.flags dd ? ;+24
.handle dd ? ;+28
}
MEM_LIST_OFFSET equ 8
FREE_BLOCK equ 4
USED_BLOCK equ 8
@ -24,8 +22,8 @@ MEM_BLOCK_SIZE equ 8*4
block_next equ MEM_BLOCK.next_block
block_prev equ MEM_BLOCK.prev_block
list_next equ MEM_BLOCK.list_next
list_prev equ MEM_BLOCK.list_prev
list_fd equ MEM_BLOCK.list_fd
list_bk equ MEM_BLOCK.list_bk
block_base equ MEM_BLOCK.base
block_size equ MEM_BLOCK.size
block_flags equ MEM_BLOCK.flags
@ -40,18 +38,18 @@ macro calc_index op
}
macro remove_from_list op
{ mov edx, [op+list_next]
mov ecx, [op+list_prev]
{ mov edx, [op+list_fd]
mov ecx, [op+list_bk]
test edx, edx
jz @f
mov [edx+list_prev], ecx
mov [edx+list_bk], ecx
@@:
test ecx, ecx
jz @f
mov [ecx+list_next], edx
mov [ecx+list_fd], edx
@@:
mov [op+list_next],0
mov [op+list_prev],0
mov [op+list_fd],0
mov [op+list_bk],0
}
macro remove_from_free op
@ -72,11 +70,12 @@ macro remove_from_free op
macro remove_from_used op
{
remove_from_list op
cmp [mem_used_list], op
jne @f
mov [mem_used_list], edx
@@:
mov edx, [op+list_fd]
mov ecx, [op+list_bk]
mov [edx+list_bk], ecx
mov [ecx+list_fd], edx
mov [op+list_fd], 0
mov [op+list_bk], 0
}
align 4
@ -97,6 +96,10 @@ proc init_kernel_heap
mov [mem_block_end], mem_block_map+512
mov [mem_block_arr], HEAP_BASE
mov eax, mem_used.fd-MEM_LIST_OFFSET
mov [mem_used.fd], eax
mov [mem_used.bk], eax
stdcall alloc_pages, dword 32
mov ecx, 32
mov edx, eax
@ -109,20 +112,20 @@ proc init_kernel_heap
jnz .l1
mov edi, HEAP_BASE
mov ebx, edi
add ebx, MEM_BLOCK_SIZE
mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
xor eax, eax
mov [edi+block_next], ebx
mov [edi+block_prev], eax
mov [edi+list_next], eax
mov [edi+list_prev], eax
mov [edi+list_fd], eax
mov [edi+list_bk], eax
mov [edi+block_base], HEAP_BASE
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
mov [edi+block_flags], USED_BLOCK
mov [ebx+block_next], eax
mov [ebx+block_prev], eax
mov [ebx+list_next], eax
mov [ebx+list_fd], eax
mov [ebx+list_bk], eax
mov [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
mov ecx, [MEM_AMOUNT]
@ -135,7 +138,6 @@ proc init_kernel_heap
mov [mem_block_mask], eax
mov [mem_block_mask+4],0x80000000
mov [mem_used_list], eax
mov [mem_block_list+63*4], ebx
mov byte [mem_block_map], 0xFC
and [heap_mutex], 0
@ -220,6 +222,15 @@ found:
endp
proc free_mem_block
mov dword [eax], 0
mov dword [eax+4], 0
mov dword [eax+8], 0
mov dword [eax+12], 0
mov dword [eax+16], 0
; mov dword [eax+20], 0
mov dword [eax+24], 0
mov dword [eax+28], 0
sub eax, [mem_block_arr]
shr eax, 5
@ -285,8 +296,8 @@ proc alloc_kernel_space stdcall, size:dword
mov eax, [edi+block_prev]
mov [esi+block_prev], eax
mov [edi+block_prev], esi
mov [esi+list_next], 0
mov [esi+list_prev], 0
mov [esi+list_fd], 0
mov [esi+list_bk], 0
and eax, eax
jz @f
mov [eax+block_next], esi
@ -318,22 +329,22 @@ proc alloc_kernel_space stdcall, size:dword
btr [mem_block_mask], ecx
@@:
mov edx, [mem_block_list+eax*4]
mov [edi+list_next], edx
mov [edi+list_fd], edx
test edx, edx
jz @f
mov [edx+list_prev], edi
mov [edx+list_bk], edi
@@:
mov [mem_block_list+eax*4], edi
bts [mem_block_mask], eax
.m_eq_ind:
mov ebx, [mem_used_list]
mov [esi+list_next], ebx
test ebx, ebx
jz @f
mov [ebx+list_prev], esi
@@:
mov ecx, mem_used.fd-MEM_LIST_OFFSET
mov edx, [ecx+list_fd]
mov [esi+list_fd], edx
mov [esi+list_bk], ecx
mov [ecx+list_fd], esi
mov [edx+list_bk], esi
mov [esi+block_flags], USED_BLOCK
mov [mem_used_list], esi
mov eax, [esi+block_base]
mov ebx, [size]
sub [heap_free], ebx
@ -346,13 +357,13 @@ proc alloc_kernel_space stdcall, size:dword
jnz @f
btr [mem_block_mask], ebx
@@:
mov ecx, [mem_used_list]
mov [edi+list_next], ecx
test ecx, ecx
jnz @f
mov [ecx+list_prev], edi
@@:
mov [mem_used_list], edi
mov ecx, mem_used.fd-MEM_LIST_OFFSET
mov edx, [ecx+list_fd]
mov [edi+list_fd], edx
mov [edi+list_bk], ecx
mov [ecx+list_fd], edi
mov [edx+list_bk], edi
mov [edi+block_flags], USED_BLOCK
mov eax, [edi+block_base]
mov ebx, [size]
@ -372,14 +383,14 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
call wait_mutex ;ebx
mov eax, [base]
mov esi, [mem_used_list]
mov esi, [mem_used.fd]
@@:
test esi, esi
jz .fail
cmp esi, mem_used.fd-MEM_LIST_OFFSET
je .fail
cmp [esi+block_base], eax
je .found
mov esi, [esi+list_next]
mov esi, [esi+list_fd]
jmp @b
.found:
cmp [esi+block_flags], USED_BLOCK
@ -452,10 +463,10 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
@@:
mov esi, [mem_block_list+eax*4]
mov [mem_block_list+eax*4], edi
mov [edi+list_next], esi
mov [edi+list_fd], esi
test esi, esi
jz @f
mov [esi+list_prev], edi
mov [esi+list_bk], edi
@@:
bts [mem_block_mask], eax
.m_eq:
@ -471,10 +482,10 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
mov edi, [mem_block_list+eax*4]
mov [mem_block_list+eax*4], esi
mov [esi+list_next], edi
mov [esi+list_fd], edi
test edi, edi
jz @f
mov [edi+list_prev], esi
mov [edi+list_bk], esi
@@:
bts [mem_block_mask], eax
mov [esi+block_flags],FREE_BLOCK
@ -500,14 +511,14 @@ proc kernel_alloc stdcall, size:dword
and eax, not 4095;
mov [size], eax
and eax, eax
jz .error
jz .err
mov ebx, eax
shr ebx, 12
mov [pages_count], ebx
stdcall alloc_kernel_space, eax
and eax, eax
jz .error
test eax, eax
jz .err
mov [lin_addr], eax
mov ecx, [pages_count]
@ -522,7 +533,7 @@ proc kernel_alloc stdcall, size:dword
stdcall alloc_pages, ebx
pop ecx ; yes ecx!!!
and eax, eax
jz .error
jz .err
mov edi, eax
mov edx, [lin_addr]
@ -536,12 +547,12 @@ proc kernel_alloc stdcall, size:dword
mov ecx, [pages_count]
and ecx, 7
jz .end
@@: push ecx
@@:
push ecx
call alloc_page
pop ecx
test eax, eax
jz .error
jz .err
stdcall map_page,edx,eax,dword PG_SW
add edx, 0x1000
@ -550,7 +561,7 @@ proc kernel_alloc stdcall, size:dword
.end:
mov eax, [lin_addr]
ret
.error:
.err:
xor eax, eax
ret
endp
@ -563,14 +574,14 @@ proc kernel_free stdcall, base:dword
call wait_mutex ;ebx
mov eax, [base]
mov esi, [mem_used_list]
mov esi, [mem_used.fd]
@@:
test esi, esi
jz .fail
cmp esi, mem_used.fd-MEM_LIST_OFFSET
je .fail
cmp [esi+block_base], eax
je .found
mov esi, [esi+list_next]
mov esi, [esi+list_fd]
jmp @b
.found:
cmp [esi+block_flags], USED_BLOCK

View File

@ -1,5 +1,5 @@
tmp_page_tab equ 0x00C00000
tmp_page_tab equ HEAP_BASE
align 4
proc mem_test
@ -18,6 +18,7 @@ proc mem_test
cmp dword [edi], 'TEST'
xchg ebx, dword [edi]
je @b
mov [MEM_AMOUNT], edi
and eax, not (CR0_CD+CR0_NW) ;enable caching
mov cr0, eax
@ -27,12 +28,35 @@ proc mem_test
endp
align 4
proc init_memEx
proc init_mem
mov eax, [MEM_AMOUNT]
mov [pg_data.mem_amount], eax
mov [pg_data.kernel_max], eax
shr eax, 12
mov edx, eax
mov [pg_data.pages_count], eax
mov [pg_data.kernel_pages], eax
shr eax, 3
mov [pg_data.pagemap_size], eax
shr edx, 10
cmp edx, 3
ja @f
inc edx ;at least 4Mb for kernel heap
@@:
mov [pg_data.kernel_tables], edx
xor eax, eax
mov edi, sys_pgdir
mov ecx, 2048
cld
rep stosd
mov edx, sys_pgdir
bt [cpu_caps], CAPS_PSE
jnc .no_PSE
@ -45,89 +69,68 @@ proc init_memEx
or ebx, CR4_PGE
@@:
mov cr4, ebx
sub [pg_data.kernel_tables], 2
mov dword [sys_pgdir], eax
mov [edx], eax
add eax, 0x00400000
mov dword [sys_pgdir+4], eax
add eax, 0x00400000
mov dword [sys_pgdir+8], eax
mov [edx+4], eax
add edx, 8
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
mov ecx, [pg_data.kernel_tables]
sub ecx, 3 ;4
mov eax, tmp_page_tab+PG_SW
mov edi, sys_pgdir+12 ;16
jmp .map_kernel_tabs
mov eax, 0x800000+PG_SW
mov ecx, (HEAP_BASE-0x800000)/4096
jmp .map_low
.no_PSE:
mov eax, PG_SW
mov esi, tmp_page_tab
mov ecx, 3072/4; 4096/4 ;0x0 - 0x00FFFFFF
mov ecx, HEAP_BASE/4096
.map_low:
mov [esi], eax
mov edi, tmp_page_tab
@@: ;
stosd
add eax, 0x1000
mov [esi+4], eax
add eax, 0x1000
mov [esi+8], eax
add eax, 0x1000
mov [esi+12], eax
add eax, 0x1000
add esi, 16
dec ecx
jnz .map_low ;ÿäðî
jnz @B
mov ecx, [pg_data.kernel_tables]
shl ecx, 10
xor eax, eax
rep stosd
mov ecx, [pg_data.kernel_tables]
mov eax, tmp_page_tab+PG_SW
mov edi, sys_pgdir
mov edi, edx
.map_kernel_tabs:
mov [edi], eax
stosd
add eax, 0x1000
add edi, 4
dec ecx
jnz .map_kernel_tabs
mov edi, tmp_page_tab
bt [cpu_caps], CAPS_PSE
jc @F
add edi, 3072*4 ;4096*4 ;skip low kernel memory
@@:
mov ecx, [pg_data.kernel_tables]
sub ecx, 3
shl ecx, 10
xor eax, eax
cld
rep stosd
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
ret
endp
align 4
proc init_page_map
mov edi, sys_pgmap
mov ecx, 384/4
mov ecx, (HEAP_BASE/4096)/32 ;384/4
mov ebx, ecx
xor eax,eax
cld
rep stosd
not eax
mov ecx, [pg_data.pagemap_size]
sub ecx, 384
sub ecx, ebx
shr ecx, 2
rep stosd
mov edi, sys_pgmap+384
lea edi, [sys_pgmap+ebx*4] ;+384
mov edx, [pg_data.pages_count]
mov ecx, [pg_data.kernel_tables]
bt [cpu_caps], CAPS_PSE
jnc @f
sub ecx, 3
@@:
sub edx, 3072
add ecx, (HEAP_BASE/4096) and 31
sub edx, HEAP_BASE/4096
sub edx, ecx
mov [pg_data.pages_free], edx
@ -140,9 +143,9 @@ proc init_page_map
mov ecx, ebx
and ecx, 31
shl eax, cl
mov [page_start], edi; sys_pgmap+384
stosd
mov [page_start], sys_pgmap+384
mov ebx, sys_pgmap
add ebx, [pg_data.pagemap_size]
mov [page_end], ebx
@ -1348,7 +1351,6 @@ uglobal
align 16
irq_tab rd 16
MEM_FreeSpace rd 1
ipc_tmp rd 1
@ -1363,7 +1365,6 @@ align 16
tmp_task_ptab rd 1
tmp_task_data rd 1
fpu_data rd 1
fdd_buff rd 1
LFBSize rd 1
@ -1395,6 +1396,8 @@ endg
uglobal
align 16
fpu_data:
rb 512
mst MEM_STATE
@ -1406,7 +1409,9 @@ align 16
srv.fd rd 1
srv.bk rd 1
mem_used_list rd 1
mem_used.fd rd 1
mem_used.bk rd 1
mem_block_arr rd 1
mem_block_start rd 1
mem_block_end rd 1
@ -1424,6 +1429,7 @@ align 16
event_end rd 1
event_uid rd 1
sys_page_map rd 1
os_stack rd 1
endg
if 0

View File

@ -31,7 +31,6 @@ build_process_gdt_tss_pointer:
ret
build_interrupt_table:
mov edi, idts+8
@ -623,10 +622,9 @@ term9:
mov eax,[PROC_BASE+eax+APPDATA.dir_table]
stdcall destroy_app_space, eax
;; mov esi, [.slot]
pop esi ;restore stack
mov esi, [.slot]
cmp [fpu_owner],esi ; if user fpu last -> fpu user = 1
jne fpu_ok_1
jne @F
mov [fpu_owner],1
mov eax, [256+PROC_BASE+APPDATA.fpu_state]
@ -634,11 +632,11 @@ term9:
clts
jnc .no_SSE
fxrstor [eax]
jmp fpu_ok_1
jmp @F
.no_SSE:
fnclex
frstor [eax]
fpu_ok_1:
@@:
mov [0xf400],byte 0 ; empty keyboard buffer
mov [0xf500],byte 0 ; empty button buffer
@ -747,24 +745,22 @@ fpu_ok_1:
.nodebug:
popad
pusha ; at 0x80000+
mov edi,esi
mov ebx, [.slot]
shl ebx, 8
mov ebx,[PROC_BASE+ebx+APPDATA.pl0_stack]
stdcall kernel_free, ebx
mov edi, [.slot]
shl edi,8
add edi,0x80000
mov ecx,256/4
mov eax, 0x20202020
stosd
stosd
stosd
mov ecx,244/4
xor eax, eax
rep stosd
popa
pusha ; name to spaces
mov edi,esi
shl edi,8
add edi,0x80000+APPDATA.app_name
mov ecx,11
mov eax,' '
rep stosb
popa
; activate window
movzx eax, word [0xC000 + esi*2]
@ -824,7 +820,6 @@ fpu_ok_1:
loop newirqfree
popa
pusha ; remove all port reservations
mov edx,esi
shl edx, 5
@ -910,6 +905,7 @@ fpu_ok_1:
mov [application_table_status],0
mov esi,process_terminated
call sys_msg_board_str
add esp, 4
ret
restore .slot

View File

@ -1,4 +1,4 @@
GREEDY_KERNEL equ 0
GREEDY_KERNEL equ 0
struc APP_HEADER_00
@ -168,7 +168,8 @@ proc fs_exec stdcall file_name:dword, cmd_line:dword, flags:dword
mov eax,[app_mem]
mov [ebx+APPDATA.mem_size],eax
if not GREEDY_KERNEL
if GREEDY_KERNEL
else
mov ecx, [app_mem]
mov edi, [file_size]
add edi, 4095
@ -301,7 +302,6 @@ proc get_new_process_place
ret
endp
align 4
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
locals
@ -449,7 +449,7 @@ end if
.fail:
dec [pg_data.pg_mutex]
cmp [dir_addr], 0
jz @f
je @f
stdcall destroy_app_space, [dir_addr]
@@:
xor eax, eax
@ -968,35 +968,27 @@ 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
locals
pl0_stack dd ?
endl
stdcall kernel_alloc, 0x2000
mov [pl0_stack], eax
lea edi, [eax+0x2000-512]
mov eax, [slot]
mov ebx, eax
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
@@:
mov esi, fpu_data
mov ecx, 512/4
rep movsd
mov ebx,[slot]
cmp ebx,[TASK_COUNT]
jle .noinc
inc dword [TASK_COUNT] ;update number of processes
@ -1012,6 +1004,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
mov ecx, [def_cursor]
mov [PROC_BASE+APPDATA.cursor+ebx],ecx
mov eax, [pl0_stack]
mov [PROC_BASE+APPDATA.pl0_stack+ebx],eax
shr ebx,3
mov eax, new_app_base
@ -1105,9 +1099,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
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 ebx, [pl0_stack]
add ebx, 0x2000-512
mov [edi+TSS._esp0],ebx
mov ecx, edi ;ecx - address of application TSS

View File

@ -356,32 +356,6 @@ B32:
mov [0xe024],dword Vesa20_getpixel32
no_mode_0x12:
; MEMORY MODEL
call mem_test
mov [MEM_AMOUNT], eax
mov [pg_data.mem_amount], eax
mov [pg_data.kernel_max], eax
shr eax, 12
mov edx, eax
mov [pg_data.pages_count], eax
mov [pg_data.kernel_pages], eax
shr eax, 3
mov [pg_data.pagemap_size], eax
shr edx, 10
cmp edx, 3
ja @f
inc edx ;at least 4Mb for kernel heap
@@:
mov [pg_data.kernel_tables], edx
; ENABLE PAGING
call test_cpu
; btr [cpu_caps], CAPS_SSE ;test: dont't use sse code
; btr [cpu_caps], CAPS_SSE2 ;test: don't use sse2
@ -393,9 +367,12 @@ B32:
; btr [cpu_caps], CAPS_MTRR ;test: don't use MTRR
bts [cpu_caps], CAPS_TSC ;force use rdtsc
call init_memEx
; MEMORY MODEL
call mem_test
call init_mem
call init_page_map
; ENABLE PAGING
mov eax, sys_pgdir
mov cr3, eax
@ -404,6 +381,8 @@ B32:
mov cr0,eax
call init_kernel_heap
stdcall kernel_alloc, 0x2000
mov [os_stack], eax
call init_LFB
call init_mtrr
call init_fpu
@ -580,7 +559,7 @@ include 'vmodeld.inc'
mov esi,boot_setostask
call boot_log
mov eax, [fpu_data]
mov eax, fpu_data
mov dword [0x80000+APPDATA.fpu_state], eax
mov dword [0x80000+APPDATA.fpu_handler], 0
mov dword [0x80000+APPDATA.sse_handler], 0
@ -589,32 +568,26 @@ include 'vmodeld.inc'
mov dword [0x80000+256+APPDATA.app_name], dword 'OS/I'
mov dword [0x80000+256+APPDATA.app_name+4], dword 'DLE '
mov ebx, [def_cursor]
mov dword [0x80000+256+APPDATA.cursor], ebx
mov edi, [os_stack]
mov dword [0x80000+256+APPDATA.pl0_stack], edi
add edi, 0x2000-512
mov dword [0x80000+256+APPDATA.fpu_state], edi
mov esi, fpu_data
mov ecx, 512/4
cld
rep movsd
mov dword [0x80000+256+APPDATA.fpu_handler], 0
mov dword [0x80000+256+APPDATA.sse_handler], 0
mov ebx, [def_cursor]
mov dword [0x80000+256+APPDATA.cursor], ebx
mov ebx, PROC_BASE+256+APP_OBJ_OFFSET
mov dword [0x80000+256+APPDATA.fd_obj], ebx
mov dword [0x80000+256+APPDATA.bk_obj], ebx
;set fpu save area
mov esi, eax
bt [cpu_caps], CAPS_SSE
jnc .no_sse
lea edi, [eax+512]
mov dword [PROC_BASE+256+APPDATA.fpu_state], edi
mov ecx, 512/4
jmp @F
.no_sse:
lea edi, [eax+112]
mov dword [PROC_BASE+256+APPDATA.fpu_state], edi
mov ecx, 112/4
@@:
rep movsd
; task list
mov [0x3020+TASKDATA.wnd_number], 1 ; on screen number
mov [0x3020+TASKDATA.pid], 1 ; process id number
@ -632,7 +605,9 @@ include 'vmodeld.inc'
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 eax, [os_stack]
add eax, 0x2000-512
mov [edi+TSS._esp], eax
mov [edi+TSS._cs],os_code
mov [edi+TSS._ss],os_data
mov [edi+TSS._ds],os_data

View File

@ -176,7 +176,7 @@ struc APPDATA
.ev_count dd ? ;+20
.fpu_handler dd ? ;+24
.sse_handler dd ? ;+28
dd ? ;unused ;+32
.pl0_stack dd ? ;unused ;+32
.heap_base dd ? ;+36
.heap_top dd ? ;+40
.cursor dd ? ;+44

View File

@ -209,19 +209,11 @@
; 08 dword draw limit - x end
; 0C dword draw limit - y end
;
; 802000 -> 802fff free (4 Kb)
;
; 803000 -> 902fff sysint_stack_data
; - ring0 stacks for ring3 processes
; - used for interrupt handling
; - 256 entries * 4096 step
;
; 903000 -> 91ffff free (116 Kb)
;
; 920000 -> B28000 TSS and IO map for (8192*8)=65536 ports
; 803000 -> 0xA0AFFF TSS and IO map for (8192*8)=65536 ports
; (128+8192)*256 = 2129920 = 0x208000
;
; C00000 -> kernel heap
; 0xA0B000 -> kernel heap