forked from KolibriOS/kolibrios
dynamic stack with fpu state area
git-svn-id: svn://kolibrios.org@357 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
45d720c0c7
commit
ee29610808
@ -226,9 +226,10 @@ resendQ equ OS_BASE+0x0770000
|
|||||||
;skin_data equ OS_BASE+0x0778000
|
;skin_data equ OS_BASE+0x0778000
|
||||||
|
|
||||||
draw_data equ OS_BASE+0x0800000
|
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
|
pages_tab equ 0x60000000
|
||||||
master_tab equ 0x60180000
|
master_tab equ 0x60180000
|
||||||
@ -238,11 +239,7 @@ sys_pgdir equ OS_BASE+0x00050000
|
|||||||
sys_master_tab equ OS_BASE+0x00051000
|
sys_master_tab equ OS_BASE+0x00051000
|
||||||
sys_pgmap equ OS_BASE+0x00052000
|
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
|
new_app_base equ 0x60400000
|
||||||
|
|
||||||
|
@ -512,13 +512,13 @@ proc load_file stdcall, file_name:dword
|
|||||||
.exit:
|
.exit:
|
||||||
push eax
|
push eax
|
||||||
lea edi, [eax+ebx] ;cleanup remain space
|
lea edi, [eax+ebx] ;cleanup remain space
|
||||||
mov ecx, ebx ;from file end
|
mov ecx, 4096 ;from file end
|
||||||
add ecx, 4095
|
and ebx, 4095
|
||||||
and ecx, not 4095
|
|
||||||
sub ecx, ebx
|
sub ecx, ebx
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
cld
|
cld
|
||||||
rep stosb
|
rep stosb
|
||||||
|
mov ebx, [file_size]
|
||||||
pop eax
|
pop eax
|
||||||
ret
|
ret
|
||||||
.cleanup:
|
.cleanup:
|
||||||
|
@ -6,9 +6,6 @@ init_fpu:
|
|||||||
bt [cpu_caps], CAPS_SSE
|
bt [cpu_caps], CAPS_SSE
|
||||||
jnc .no_SSE
|
jnc .no_SSE
|
||||||
|
|
||||||
stdcall kernel_alloc, 512*256
|
|
||||||
mov [fpu_data], eax
|
|
||||||
|
|
||||||
mov ebx, cr4
|
mov ebx, cr4
|
||||||
mov ecx, cr0
|
mov ecx, cr0
|
||||||
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
|
or ebx, CR4_OSFXSR+CR4_OSXMMEXPT
|
||||||
@ -29,16 +26,14 @@ init_fpu:
|
|||||||
xorps xmm5, xmm5
|
xorps xmm5, xmm5
|
||||||
xorps xmm6, xmm6
|
xorps xmm6, xmm6
|
||||||
xorps xmm7, xmm7
|
xorps xmm7, xmm7
|
||||||
fxsave [eax]
|
fxsave [fpu_data] ;[eax]
|
||||||
ret
|
ret
|
||||||
.no_SSE:
|
.no_SSE:
|
||||||
stdcall kernel_alloc, 112*256
|
|
||||||
mov [fpu_data], eax
|
|
||||||
mov ecx, cr0
|
mov ecx, cr0
|
||||||
and ecx, not CR0_EM
|
and ecx, not CR0_EM
|
||||||
or ecx, CR0_MP+CR0_NE
|
or ecx, CR0_MP+CR0_NE
|
||||||
mov cr0, ecx
|
mov cr0, ecx
|
||||||
fnsave [eax]
|
fnsave [fpu_data]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
@ -118,8 +113,6 @@ iglobal
|
|||||||
fpu_owner dd 1
|
fpu_owner dd 1
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
reg_eip equ ebp+4
|
reg_eip equ ebp+4
|
||||||
reg_cs equ ebp+8
|
reg_cs equ ebp+8
|
||||||
reg_eflags equ ebp+12
|
reg_eflags equ ebp+12
|
||||||
|
@ -1,18 +1,16 @@
|
|||||||
|
|
||||||
HEAP_BASE equ 0x00C00000
|
|
||||||
;HEAP_SIZE equ 0x01000000
|
|
||||||
|
|
||||||
struc MEM_BLOCK
|
struc MEM_BLOCK
|
||||||
{ .next_block dd ?
|
{ .next_block dd ?
|
||||||
.prev_block dd ? ;+4
|
.prev_block dd ? ;+4
|
||||||
.list_next dd ? ;+8
|
.list_fd dd ? ;+8
|
||||||
.list_prev dd ? ;+12
|
.list_bk dd ? ;+12
|
||||||
.base dd ? ;+16
|
.base dd ? ;+16
|
||||||
.size dd ? ;+20
|
.size dd ? ;+20
|
||||||
.flags dd ? ;+24
|
.flags dd ? ;+24
|
||||||
.handle dd ? ;+28
|
.handle dd ? ;+28
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MEM_LIST_OFFSET equ 8
|
||||||
FREE_BLOCK equ 4
|
FREE_BLOCK equ 4
|
||||||
USED_BLOCK equ 8
|
USED_BLOCK equ 8
|
||||||
|
|
||||||
@ -24,8 +22,8 @@ MEM_BLOCK_SIZE equ 8*4
|
|||||||
|
|
||||||
block_next equ MEM_BLOCK.next_block
|
block_next equ MEM_BLOCK.next_block
|
||||||
block_prev equ MEM_BLOCK.prev_block
|
block_prev equ MEM_BLOCK.prev_block
|
||||||
list_next equ MEM_BLOCK.list_next
|
list_fd equ MEM_BLOCK.list_fd
|
||||||
list_prev equ MEM_BLOCK.list_prev
|
list_bk equ MEM_BLOCK.list_bk
|
||||||
block_base equ MEM_BLOCK.base
|
block_base equ MEM_BLOCK.base
|
||||||
block_size equ MEM_BLOCK.size
|
block_size equ MEM_BLOCK.size
|
||||||
block_flags equ MEM_BLOCK.flags
|
block_flags equ MEM_BLOCK.flags
|
||||||
@ -40,18 +38,18 @@ macro calc_index op
|
|||||||
}
|
}
|
||||||
|
|
||||||
macro remove_from_list op
|
macro remove_from_list op
|
||||||
{ mov edx, [op+list_next]
|
{ mov edx, [op+list_fd]
|
||||||
mov ecx, [op+list_prev]
|
mov ecx, [op+list_bk]
|
||||||
test edx, edx
|
test edx, edx
|
||||||
jz @f
|
jz @f
|
||||||
mov [edx+list_prev], ecx
|
mov [edx+list_bk], ecx
|
||||||
@@:
|
@@:
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
jz @f
|
jz @f
|
||||||
mov [ecx+list_next], edx
|
mov [ecx+list_fd], edx
|
||||||
@@:
|
@@:
|
||||||
mov [op+list_next],0
|
mov [op+list_fd],0
|
||||||
mov [op+list_prev],0
|
mov [op+list_bk],0
|
||||||
}
|
}
|
||||||
|
|
||||||
macro remove_from_free op
|
macro remove_from_free op
|
||||||
@ -72,11 +70,12 @@ macro remove_from_free op
|
|||||||
|
|
||||||
macro remove_from_used op
|
macro remove_from_used op
|
||||||
{
|
{
|
||||||
remove_from_list op
|
mov edx, [op+list_fd]
|
||||||
cmp [mem_used_list], op
|
mov ecx, [op+list_bk]
|
||||||
jne @f
|
mov [edx+list_bk], ecx
|
||||||
mov [mem_used_list], edx
|
mov [ecx+list_fd], edx
|
||||||
@@:
|
mov [op+list_fd], 0
|
||||||
|
mov [op+list_bk], 0
|
||||||
}
|
}
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
@ -97,6 +96,10 @@ proc init_kernel_heap
|
|||||||
mov [mem_block_end], mem_block_map+512
|
mov [mem_block_end], mem_block_map+512
|
||||||
mov [mem_block_arr], HEAP_BASE
|
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
|
stdcall alloc_pages, dword 32
|
||||||
mov ecx, 32
|
mov ecx, 32
|
||||||
mov edx, eax
|
mov edx, eax
|
||||||
@ -109,20 +112,20 @@ proc init_kernel_heap
|
|||||||
jnz .l1
|
jnz .l1
|
||||||
|
|
||||||
mov edi, HEAP_BASE
|
mov edi, HEAP_BASE
|
||||||
mov ebx, edi
|
mov ebx, HEAP_BASE+MEM_BLOCK_SIZE
|
||||||
add ebx, MEM_BLOCK_SIZE
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
mov [edi+block_next], ebx
|
mov [edi+block_next], ebx
|
||||||
mov [edi+block_prev], eax
|
mov [edi+block_prev], eax
|
||||||
mov [edi+list_next], eax
|
mov [edi+list_fd], eax
|
||||||
mov [edi+list_prev], eax
|
mov [edi+list_bk], eax
|
||||||
mov [edi+block_base], HEAP_BASE
|
mov [edi+block_base], HEAP_BASE
|
||||||
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
|
mov [edi+block_size], 4096*MEM_BLOCK_SIZE
|
||||||
mov [edi+block_flags], USED_BLOCK
|
mov [edi+block_flags], USED_BLOCK
|
||||||
|
|
||||||
mov [ebx+block_next], eax
|
mov [ebx+block_next], eax
|
||||||
mov [ebx+block_prev], 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 [ebx+block_base], HEAP_BASE+4096*MEM_BLOCK_SIZE
|
||||||
|
|
||||||
mov ecx, [MEM_AMOUNT]
|
mov ecx, [MEM_AMOUNT]
|
||||||
@ -135,7 +138,6 @@ proc init_kernel_heap
|
|||||||
mov [mem_block_mask], eax
|
mov [mem_block_mask], eax
|
||||||
mov [mem_block_mask+4],0x80000000
|
mov [mem_block_mask+4],0x80000000
|
||||||
|
|
||||||
mov [mem_used_list], eax
|
|
||||||
mov [mem_block_list+63*4], ebx
|
mov [mem_block_list+63*4], ebx
|
||||||
mov byte [mem_block_map], 0xFC
|
mov byte [mem_block_map], 0xFC
|
||||||
and [heap_mutex], 0
|
and [heap_mutex], 0
|
||||||
@ -220,6 +222,15 @@ found:
|
|||||||
endp
|
endp
|
||||||
|
|
||||||
proc free_mem_block
|
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]
|
sub eax, [mem_block_arr]
|
||||||
shr eax, 5
|
shr eax, 5
|
||||||
|
|
||||||
@ -285,8 +296,8 @@ proc alloc_kernel_space stdcall, size:dword
|
|||||||
mov eax, [edi+block_prev]
|
mov eax, [edi+block_prev]
|
||||||
mov [esi+block_prev], eax
|
mov [esi+block_prev], eax
|
||||||
mov [edi+block_prev], esi
|
mov [edi+block_prev], esi
|
||||||
mov [esi+list_next], 0
|
mov [esi+list_fd], 0
|
||||||
mov [esi+list_prev], 0
|
mov [esi+list_bk], 0
|
||||||
and eax, eax
|
and eax, eax
|
||||||
jz @f
|
jz @f
|
||||||
mov [eax+block_next], esi
|
mov [eax+block_next], esi
|
||||||
@ -318,22 +329,22 @@ proc alloc_kernel_space stdcall, size:dword
|
|||||||
btr [mem_block_mask], ecx
|
btr [mem_block_mask], ecx
|
||||||
@@:
|
@@:
|
||||||
mov edx, [mem_block_list+eax*4]
|
mov edx, [mem_block_list+eax*4]
|
||||||
mov [edi+list_next], edx
|
mov [edi+list_fd], edx
|
||||||
test edx, edx
|
test edx, edx
|
||||||
jz @f
|
jz @f
|
||||||
mov [edx+list_prev], edi
|
mov [edx+list_bk], edi
|
||||||
@@:
|
@@:
|
||||||
mov [mem_block_list+eax*4], edi
|
mov [mem_block_list+eax*4], edi
|
||||||
bts [mem_block_mask], eax
|
bts [mem_block_mask], eax
|
||||||
.m_eq_ind:
|
.m_eq_ind:
|
||||||
mov ebx, [mem_used_list]
|
mov ecx, mem_used.fd-MEM_LIST_OFFSET
|
||||||
mov [esi+list_next], ebx
|
mov edx, [ecx+list_fd]
|
||||||
test ebx, ebx
|
mov [esi+list_fd], edx
|
||||||
jz @f
|
mov [esi+list_bk], ecx
|
||||||
mov [ebx+list_prev], esi
|
mov [ecx+list_fd], esi
|
||||||
@@:
|
mov [edx+list_bk], esi
|
||||||
|
|
||||||
mov [esi+block_flags], USED_BLOCK
|
mov [esi+block_flags], USED_BLOCK
|
||||||
mov [mem_used_list], esi
|
|
||||||
mov eax, [esi+block_base]
|
mov eax, [esi+block_base]
|
||||||
mov ebx, [size]
|
mov ebx, [size]
|
||||||
sub [heap_free], ebx
|
sub [heap_free], ebx
|
||||||
@ -346,13 +357,13 @@ proc alloc_kernel_space stdcall, size:dword
|
|||||||
jnz @f
|
jnz @f
|
||||||
btr [mem_block_mask], ebx
|
btr [mem_block_mask], ebx
|
||||||
@@:
|
@@:
|
||||||
mov ecx, [mem_used_list]
|
mov ecx, mem_used.fd-MEM_LIST_OFFSET
|
||||||
mov [edi+list_next], ecx
|
mov edx, [ecx+list_fd]
|
||||||
test ecx, ecx
|
mov [edi+list_fd], edx
|
||||||
jnz @f
|
mov [edi+list_bk], ecx
|
||||||
mov [ecx+list_prev], edi
|
mov [ecx+list_fd], edi
|
||||||
@@:
|
mov [edx+list_bk], edi
|
||||||
mov [mem_used_list], edi
|
|
||||||
mov [edi+block_flags], USED_BLOCK
|
mov [edi+block_flags], USED_BLOCK
|
||||||
mov eax, [edi+block_base]
|
mov eax, [edi+block_base]
|
||||||
mov ebx, [size]
|
mov ebx, [size]
|
||||||
@ -372,14 +383,14 @@ proc free_kernel_space stdcall uses ebx ecx edx esi edi, base:dword
|
|||||||
call wait_mutex ;ebx
|
call wait_mutex ;ebx
|
||||||
|
|
||||||
mov eax, [base]
|
mov eax, [base]
|
||||||
mov esi, [mem_used_list]
|
mov esi, [mem_used.fd]
|
||||||
@@:
|
@@:
|
||||||
test esi, esi
|
cmp esi, mem_used.fd-MEM_LIST_OFFSET
|
||||||
jz .fail
|
je .fail
|
||||||
|
|
||||||
cmp [esi+block_base], eax
|
cmp [esi+block_base], eax
|
||||||
je .found
|
je .found
|
||||||
mov esi, [esi+list_next]
|
mov esi, [esi+list_fd]
|
||||||
jmp @b
|
jmp @b
|
||||||
.found:
|
.found:
|
||||||
cmp [esi+block_flags], USED_BLOCK
|
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 esi, [mem_block_list+eax*4]
|
||||||
mov [mem_block_list+eax*4], edi
|
mov [mem_block_list+eax*4], edi
|
||||||
mov [edi+list_next], esi
|
mov [edi+list_fd], esi
|
||||||
test esi, esi
|
test esi, esi
|
||||||
jz @f
|
jz @f
|
||||||
mov [esi+list_prev], edi
|
mov [esi+list_bk], edi
|
||||||
@@:
|
@@:
|
||||||
bts [mem_block_mask], eax
|
bts [mem_block_mask], eax
|
||||||
.m_eq:
|
.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 edi, [mem_block_list+eax*4]
|
||||||
mov [mem_block_list+eax*4], esi
|
mov [mem_block_list+eax*4], esi
|
||||||
mov [esi+list_next], edi
|
mov [esi+list_fd], edi
|
||||||
test edi, edi
|
test edi, edi
|
||||||
jz @f
|
jz @f
|
||||||
mov [edi+list_prev], esi
|
mov [edi+list_bk], esi
|
||||||
@@:
|
@@:
|
||||||
bts [mem_block_mask], eax
|
bts [mem_block_mask], eax
|
||||||
mov [esi+block_flags],FREE_BLOCK
|
mov [esi+block_flags],FREE_BLOCK
|
||||||
@ -500,14 +511,14 @@ proc kernel_alloc stdcall, size:dword
|
|||||||
and eax, not 4095;
|
and eax, not 4095;
|
||||||
mov [size], eax
|
mov [size], eax
|
||||||
and eax, eax
|
and eax, eax
|
||||||
jz .error
|
jz .err
|
||||||
mov ebx, eax
|
mov ebx, eax
|
||||||
shr ebx, 12
|
shr ebx, 12
|
||||||
mov [pages_count], ebx
|
mov [pages_count], ebx
|
||||||
|
|
||||||
stdcall alloc_kernel_space, eax
|
stdcall alloc_kernel_space, eax
|
||||||
and eax, eax
|
test eax, eax
|
||||||
jz .error
|
jz .err
|
||||||
mov [lin_addr], eax
|
mov [lin_addr], eax
|
||||||
|
|
||||||
mov ecx, [pages_count]
|
mov ecx, [pages_count]
|
||||||
@ -522,7 +533,7 @@ proc kernel_alloc stdcall, size:dword
|
|||||||
stdcall alloc_pages, ebx
|
stdcall alloc_pages, ebx
|
||||||
pop ecx ; yes ecx!!!
|
pop ecx ; yes ecx!!!
|
||||||
and eax, eax
|
and eax, eax
|
||||||
jz .error
|
jz .err
|
||||||
|
|
||||||
mov edi, eax
|
mov edi, eax
|
||||||
mov edx, [lin_addr]
|
mov edx, [lin_addr]
|
||||||
@ -536,12 +547,12 @@ proc kernel_alloc stdcall, size:dword
|
|||||||
mov ecx, [pages_count]
|
mov ecx, [pages_count]
|
||||||
and ecx, 7
|
and ecx, 7
|
||||||
jz .end
|
jz .end
|
||||||
|
@@:
|
||||||
@@: push ecx
|
push ecx
|
||||||
call alloc_page
|
call alloc_page
|
||||||
pop ecx
|
pop ecx
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .error
|
jz .err
|
||||||
|
|
||||||
stdcall map_page,edx,eax,dword PG_SW
|
stdcall map_page,edx,eax,dword PG_SW
|
||||||
add edx, 0x1000
|
add edx, 0x1000
|
||||||
@ -550,7 +561,7 @@ proc kernel_alloc stdcall, size:dword
|
|||||||
.end:
|
.end:
|
||||||
mov eax, [lin_addr]
|
mov eax, [lin_addr]
|
||||||
ret
|
ret
|
||||||
.error:
|
.err:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -563,14 +574,14 @@ proc kernel_free stdcall, base:dword
|
|||||||
call wait_mutex ;ebx
|
call wait_mutex ;ebx
|
||||||
|
|
||||||
mov eax, [base]
|
mov eax, [base]
|
||||||
mov esi, [mem_used_list]
|
mov esi, [mem_used.fd]
|
||||||
@@:
|
@@:
|
||||||
test esi, esi
|
cmp esi, mem_used.fd-MEM_LIST_OFFSET
|
||||||
jz .fail
|
je .fail
|
||||||
|
|
||||||
cmp [esi+block_base], eax
|
cmp [esi+block_base], eax
|
||||||
je .found
|
je .found
|
||||||
mov esi, [esi+list_next]
|
mov esi, [esi+list_fd]
|
||||||
jmp @b
|
jmp @b
|
||||||
.found:
|
.found:
|
||||||
cmp [esi+block_flags], USED_BLOCK
|
cmp [esi+block_flags], USED_BLOCK
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
tmp_page_tab equ 0x00C00000
|
tmp_page_tab equ HEAP_BASE
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc mem_test
|
proc mem_test
|
||||||
@ -18,6 +18,7 @@ proc mem_test
|
|||||||
cmp dword [edi], 'TEST'
|
cmp dword [edi], 'TEST'
|
||||||
xchg ebx, dword [edi]
|
xchg ebx, dword [edi]
|
||||||
je @b
|
je @b
|
||||||
|
mov [MEM_AMOUNT], edi
|
||||||
|
|
||||||
and eax, not (CR0_CD+CR0_NW) ;enable caching
|
and eax, not (CR0_CD+CR0_NW) ;enable caching
|
||||||
mov cr0, eax
|
mov cr0, eax
|
||||||
@ -27,12 +28,35 @@ proc mem_test
|
|||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
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
|
xor eax, eax
|
||||||
mov edi, sys_pgdir
|
mov edi, sys_pgdir
|
||||||
mov ecx, 2048
|
mov ecx, 2048
|
||||||
|
cld
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
|
mov edx, sys_pgdir
|
||||||
bt [cpu_caps], CAPS_PSE
|
bt [cpu_caps], CAPS_PSE
|
||||||
jnc .no_PSE
|
jnc .no_PSE
|
||||||
|
|
||||||
@ -45,89 +69,68 @@ proc init_memEx
|
|||||||
or ebx, CR4_PGE
|
or ebx, CR4_PGE
|
||||||
@@:
|
@@:
|
||||||
mov cr4, ebx
|
mov cr4, ebx
|
||||||
|
sub [pg_data.kernel_tables], 2
|
||||||
|
|
||||||
mov dword [sys_pgdir], eax
|
mov [edx], eax
|
||||||
add eax, 0x00400000
|
add eax, 0x00400000
|
||||||
mov dword [sys_pgdir+4], eax
|
mov [edx+4], eax
|
||||||
add eax, 0x00400000
|
add edx, 8
|
||||||
mov dword [sys_pgdir+8], eax
|
|
||||||
|
|
||||||
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
|
mov eax, 0x800000+PG_SW
|
||||||
|
mov ecx, (HEAP_BASE-0x800000)/4096
|
||||||
mov ecx, [pg_data.kernel_tables]
|
jmp .map_low
|
||||||
sub ecx, 3 ;4
|
|
||||||
mov eax, tmp_page_tab+PG_SW
|
|
||||||
mov edi, sys_pgdir+12 ;16
|
|
||||||
|
|
||||||
jmp .map_kernel_tabs
|
|
||||||
.no_PSE:
|
.no_PSE:
|
||||||
mov eax, PG_SW
|
mov eax, PG_SW
|
||||||
mov esi, tmp_page_tab
|
mov ecx, HEAP_BASE/4096
|
||||||
mov ecx, 3072/4; 4096/4 ;0x0 - 0x00FFFFFF
|
|
||||||
.map_low:
|
.map_low:
|
||||||
mov [esi], eax
|
mov edi, tmp_page_tab
|
||||||
|
@@: ;
|
||||||
|
stosd
|
||||||
add eax, 0x1000
|
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
|
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 ecx, [pg_data.kernel_tables]
|
||||||
mov eax, tmp_page_tab+PG_SW
|
mov eax, tmp_page_tab+PG_SW
|
||||||
mov edi, sys_pgdir
|
mov edi, edx
|
||||||
|
|
||||||
.map_kernel_tabs:
|
.map_kernel_tabs:
|
||||||
|
|
||||||
mov [edi], eax
|
stosd
|
||||||
add eax, 0x1000
|
add eax, 0x1000
|
||||||
add edi, 4
|
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .map_kernel_tabs
|
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
|
mov dword [sys_pgdir+0x600], sys_pgdir+PG_SW
|
||||||
|
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc init_page_map
|
proc init_page_map
|
||||||
|
|
||||||
mov edi, sys_pgmap
|
mov edi, sys_pgmap
|
||||||
mov ecx, 384/4
|
mov ecx, (HEAP_BASE/4096)/32 ;384/4
|
||||||
|
mov ebx, ecx
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
cld
|
cld
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
not eax
|
not eax
|
||||||
mov ecx, [pg_data.pagemap_size]
|
mov ecx, [pg_data.pagemap_size]
|
||||||
sub ecx, 384
|
sub ecx, ebx
|
||||||
shr ecx, 2
|
shr ecx, 2
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
mov edi, sys_pgmap+384
|
lea edi, [sys_pgmap+ebx*4] ;+384
|
||||||
mov edx, [pg_data.pages_count]
|
mov edx, [pg_data.pages_count]
|
||||||
mov ecx, [pg_data.kernel_tables]
|
mov ecx, [pg_data.kernel_tables]
|
||||||
bt [cpu_caps], CAPS_PSE
|
add ecx, (HEAP_BASE/4096) and 31
|
||||||
jnc @f
|
sub edx, HEAP_BASE/4096
|
||||||
sub ecx, 3
|
|
||||||
@@:
|
|
||||||
sub edx, 3072
|
|
||||||
sub edx, ecx
|
sub edx, ecx
|
||||||
mov [pg_data.pages_free], edx
|
mov [pg_data.pages_free], edx
|
||||||
|
|
||||||
@ -140,9 +143,9 @@ proc init_page_map
|
|||||||
mov ecx, ebx
|
mov ecx, ebx
|
||||||
and ecx, 31
|
and ecx, 31
|
||||||
shl eax, cl
|
shl eax, cl
|
||||||
|
mov [page_start], edi; sys_pgmap+384
|
||||||
stosd
|
stosd
|
||||||
|
|
||||||
mov [page_start], sys_pgmap+384
|
|
||||||
mov ebx, sys_pgmap
|
mov ebx, sys_pgmap
|
||||||
add ebx, [pg_data.pagemap_size]
|
add ebx, [pg_data.pagemap_size]
|
||||||
mov [page_end], ebx
|
mov [page_end], ebx
|
||||||
@ -1348,7 +1351,6 @@ uglobal
|
|||||||
align 16
|
align 16
|
||||||
irq_tab rd 16
|
irq_tab rd 16
|
||||||
|
|
||||||
|
|
||||||
MEM_FreeSpace rd 1
|
MEM_FreeSpace rd 1
|
||||||
|
|
||||||
ipc_tmp rd 1
|
ipc_tmp rd 1
|
||||||
@ -1363,7 +1365,6 @@ align 16
|
|||||||
tmp_task_ptab rd 1
|
tmp_task_ptab rd 1
|
||||||
tmp_task_data rd 1
|
tmp_task_data rd 1
|
||||||
|
|
||||||
fpu_data rd 1
|
|
||||||
fdd_buff rd 1
|
fdd_buff rd 1
|
||||||
LFBSize rd 1
|
LFBSize rd 1
|
||||||
|
|
||||||
@ -1395,6 +1396,8 @@ endg
|
|||||||
|
|
||||||
uglobal
|
uglobal
|
||||||
align 16
|
align 16
|
||||||
|
fpu_data:
|
||||||
|
rb 512
|
||||||
|
|
||||||
mst MEM_STATE
|
mst MEM_STATE
|
||||||
|
|
||||||
@ -1406,7 +1409,9 @@ align 16
|
|||||||
srv.fd rd 1
|
srv.fd rd 1
|
||||||
srv.bk 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_arr rd 1
|
||||||
mem_block_start rd 1
|
mem_block_start rd 1
|
||||||
mem_block_end rd 1
|
mem_block_end rd 1
|
||||||
@ -1424,6 +1429,7 @@ align 16
|
|||||||
event_end rd 1
|
event_end rd 1
|
||||||
event_uid rd 1
|
event_uid rd 1
|
||||||
sys_page_map rd 1
|
sys_page_map rd 1
|
||||||
|
os_stack rd 1
|
||||||
endg
|
endg
|
||||||
|
|
||||||
if 0
|
if 0
|
||||||
|
@ -31,7 +31,6 @@ build_process_gdt_tss_pointer:
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
build_interrupt_table:
|
build_interrupt_table:
|
||||||
|
|
||||||
mov edi, idts+8
|
mov edi, idts+8
|
||||||
@ -623,10 +622,9 @@ term9:
|
|||||||
mov eax,[PROC_BASE+eax+APPDATA.dir_table]
|
mov eax,[PROC_BASE+eax+APPDATA.dir_table]
|
||||||
stdcall destroy_app_space, eax
|
stdcall destroy_app_space, eax
|
||||||
|
|
||||||
;; mov esi, [.slot]
|
mov esi, [.slot]
|
||||||
pop esi ;restore stack
|
|
||||||
cmp [fpu_owner],esi ; if user fpu last -> fpu user = 1
|
cmp [fpu_owner],esi ; if user fpu last -> fpu user = 1
|
||||||
jne fpu_ok_1
|
jne @F
|
||||||
|
|
||||||
mov [fpu_owner],1
|
mov [fpu_owner],1
|
||||||
mov eax, [256+PROC_BASE+APPDATA.fpu_state]
|
mov eax, [256+PROC_BASE+APPDATA.fpu_state]
|
||||||
@ -634,11 +632,11 @@ term9:
|
|||||||
clts
|
clts
|
||||||
jnc .no_SSE
|
jnc .no_SSE
|
||||||
fxrstor [eax]
|
fxrstor [eax]
|
||||||
jmp fpu_ok_1
|
jmp @F
|
||||||
.no_SSE:
|
.no_SSE:
|
||||||
fnclex
|
fnclex
|
||||||
frstor [eax]
|
frstor [eax]
|
||||||
fpu_ok_1:
|
@@:
|
||||||
|
|
||||||
mov [0xf400],byte 0 ; empty keyboard buffer
|
mov [0xf400],byte 0 ; empty keyboard buffer
|
||||||
mov [0xf500],byte 0 ; empty button buffer
|
mov [0xf500],byte 0 ; empty button buffer
|
||||||
@ -747,24 +745,22 @@ fpu_ok_1:
|
|||||||
.nodebug:
|
.nodebug:
|
||||||
popad
|
popad
|
||||||
|
|
||||||
pusha ; at 0x80000+
|
mov ebx, [.slot]
|
||||||
mov edi,esi
|
shl ebx, 8
|
||||||
shl edi,8
|
mov ebx,[PROC_BASE+ebx+APPDATA.pl0_stack]
|
||||||
add edi,0x80000
|
|
||||||
mov ecx,256/4
|
|
||||||
xor eax, eax
|
|
||||||
rep stosd
|
|
||||||
popa
|
|
||||||
|
|
||||||
pusha ; name to spaces
|
stdcall kernel_free, ebx
|
||||||
mov edi,esi
|
|
||||||
shl edi,8
|
|
||||||
add edi,0x80000+APPDATA.app_name
|
|
||||||
mov ecx,11
|
|
||||||
mov eax,' '
|
|
||||||
rep stosb
|
|
||||||
popa
|
|
||||||
|
|
||||||
|
mov edi, [.slot]
|
||||||
|
shl edi,8
|
||||||
|
add edi,0x80000
|
||||||
|
mov eax, 0x20202020
|
||||||
|
stosd
|
||||||
|
stosd
|
||||||
|
stosd
|
||||||
|
mov ecx,244/4
|
||||||
|
xor eax, eax
|
||||||
|
rep stosd
|
||||||
|
|
||||||
; activate window
|
; activate window
|
||||||
movzx eax, word [0xC000 + esi*2]
|
movzx eax, word [0xC000 + esi*2]
|
||||||
@ -824,7 +820,6 @@ fpu_ok_1:
|
|||||||
loop newirqfree
|
loop newirqfree
|
||||||
popa
|
popa
|
||||||
|
|
||||||
|
|
||||||
pusha ; remove all port reservations
|
pusha ; remove all port reservations
|
||||||
mov edx,esi
|
mov edx,esi
|
||||||
shl edx, 5
|
shl edx, 5
|
||||||
@ -910,6 +905,7 @@ fpu_ok_1:
|
|||||||
mov [application_table_status],0
|
mov [application_table_status],0
|
||||||
mov esi,process_terminated
|
mov esi,process_terminated
|
||||||
call sys_msg_board_str
|
call sys_msg_board_str
|
||||||
|
add esp, 4
|
||||||
ret
|
ret
|
||||||
restore .slot
|
restore .slot
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
GREEDY_KERNEL equ 0
|
GREEDY_KERNEL equ 0
|
||||||
|
|
||||||
|
|
||||||
struc APP_HEADER_00
|
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 eax,[app_mem]
|
||||||
mov [ebx+APPDATA.mem_size],eax
|
mov [ebx+APPDATA.mem_size],eax
|
||||||
|
|
||||||
if not GREEDY_KERNEL
|
if GREEDY_KERNEL
|
||||||
|
else
|
||||||
mov ecx, [app_mem]
|
mov ecx, [app_mem]
|
||||||
mov edi, [file_size]
|
mov edi, [file_size]
|
||||||
add edi, 4095
|
add edi, 4095
|
||||||
@ -301,7 +302,6 @@ proc get_new_process_place
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword
|
||||||
locals
|
locals
|
||||||
@ -449,7 +449,7 @@ end if
|
|||||||
.fail:
|
.fail:
|
||||||
dec [pg_data.pg_mutex]
|
dec [pg_data.pg_mutex]
|
||||||
cmp [dir_addr], 0
|
cmp [dir_addr], 0
|
||||||
jz @f
|
je @f
|
||||||
stdcall destroy_app_space, [dir_addr]
|
stdcall destroy_app_space, [dir_addr]
|
||||||
@@:
|
@@:
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@ -968,38 +968,30 @@ align 4
|
|||||||
proc set_app_params stdcall,slot:dword, params:dword,\
|
proc set_app_params stdcall,slot:dword, params:dword,\
|
||||||
cmd_line:dword, app_path:dword, flags:dword
|
cmd_line:dword, app_path:dword, flags:dword
|
||||||
|
|
||||||
mov edi, [slot]
|
locals
|
||||||
mov esi, [fpu_data]
|
pl0_stack dd ?
|
||||||
bt [cpu_caps], CAPS_SSE
|
endl
|
||||||
jnc .no_SSE
|
|
||||||
|
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
|
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_state], edi
|
||||||
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
|
mov [eax+PROC_BASE+APPDATA.fpu_handler], 0
|
||||||
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
|
mov [eax+PROC_BASE+APPDATA.sse_handler], 0
|
||||||
mov ecx, 112/4
|
|
||||||
@@:
|
mov esi, fpu_data
|
||||||
|
mov ecx, 512/4
|
||||||
rep movsd
|
rep movsd
|
||||||
|
|
||||||
mov ebx,[slot]
|
cmp ebx,[TASK_COUNT]
|
||||||
cmp ebx,[TASK_COUNT]
|
jle .noinc
|
||||||
jle .noinc
|
inc dword [TASK_COUNT] ;update number of processes
|
||||||
inc dword [TASK_COUNT] ;update number of processes
|
|
||||||
.noinc:
|
.noinc:
|
||||||
shl ebx,8
|
shl ebx,8
|
||||||
lea edx, [ebx+PROC_BASE+APP_EV_OFFSET]
|
lea edx, [ebx+PROC_BASE+APP_EV_OFFSET]
|
||||||
@ -1012,6 +1004,8 @@ proc set_app_params stdcall,slot:dword, params:dword,\
|
|||||||
|
|
||||||
mov ecx, [def_cursor]
|
mov ecx, [def_cursor]
|
||||||
mov [PROC_BASE+APPDATA.cursor+ebx],ecx
|
mov [PROC_BASE+APPDATA.cursor+ebx],ecx
|
||||||
|
mov eax, [pl0_stack]
|
||||||
|
mov [PROC_BASE+APPDATA.pl0_stack+ebx],eax
|
||||||
|
|
||||||
shr ebx,3
|
shr ebx,3
|
||||||
mov eax, new_app_base
|
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._gs],graph_data ;selector of graphic segment
|
||||||
mov [edi+TSS._io],word 128
|
mov [edi+TSS._io],word 128
|
||||||
mov [edi+TSS._ss0], os_data
|
mov [edi+TSS._ss0], os_data
|
||||||
mov ebx,[slot]
|
mov ebx, [pl0_stack]
|
||||||
shl ebx,12
|
add ebx, 0x2000-512
|
||||||
add ebx,sysint_stack_data+4096
|
|
||||||
mov [edi+TSS._esp0],ebx
|
mov [edi+TSS._esp0],ebx
|
||||||
|
|
||||||
mov ecx, edi ;ecx - address of application TSS
|
mov ecx, edi ;ecx - address of application TSS
|
||||||
|
@ -356,32 +356,6 @@ B32:
|
|||||||
mov [0xe024],dword Vesa20_getpixel32
|
mov [0xe024],dword Vesa20_getpixel32
|
||||||
no_mode_0x12:
|
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
|
call test_cpu
|
||||||
; btr [cpu_caps], CAPS_SSE ;test: dont't use sse code
|
; btr [cpu_caps], CAPS_SSE ;test: dont't use sse code
|
||||||
; btr [cpu_caps], CAPS_SSE2 ;test: don't use sse2
|
; 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
|
; btr [cpu_caps], CAPS_MTRR ;test: don't use MTRR
|
||||||
bts [cpu_caps], CAPS_TSC ;force use rdtsc
|
bts [cpu_caps], CAPS_TSC ;force use rdtsc
|
||||||
|
|
||||||
call init_memEx
|
; MEMORY MODEL
|
||||||
|
call mem_test
|
||||||
|
call init_mem
|
||||||
call init_page_map
|
call init_page_map
|
||||||
|
|
||||||
|
; ENABLE PAGING
|
||||||
mov eax, sys_pgdir
|
mov eax, sys_pgdir
|
||||||
mov cr3, eax
|
mov cr3, eax
|
||||||
|
|
||||||
@ -404,6 +381,8 @@ B32:
|
|||||||
mov cr0,eax
|
mov cr0,eax
|
||||||
|
|
||||||
call init_kernel_heap
|
call init_kernel_heap
|
||||||
|
stdcall kernel_alloc, 0x2000
|
||||||
|
mov [os_stack], eax
|
||||||
call init_LFB
|
call init_LFB
|
||||||
call init_mtrr
|
call init_mtrr
|
||||||
call init_fpu
|
call init_fpu
|
||||||
@ -580,41 +559,35 @@ include 'vmodeld.inc'
|
|||||||
mov esi,boot_setostask
|
mov esi,boot_setostask
|
||||||
call boot_log
|
call boot_log
|
||||||
|
|
||||||
mov eax, [fpu_data]
|
mov eax, fpu_data
|
||||||
mov dword [0x80000+APPDATA.fpu_state], eax
|
mov dword [0x80000+APPDATA.fpu_state], eax
|
||||||
mov dword [0x80000+APPDATA.fpu_handler], 0
|
mov dword [0x80000+APPDATA.fpu_handler], 0
|
||||||
mov dword [0x80000+APPDATA.sse_handler], 0
|
mov dword [0x80000+APPDATA.sse_handler], 0
|
||||||
|
|
||||||
; name for OS/IDLE process
|
; name for OS/IDLE process
|
||||||
|
|
||||||
mov dword [0x80000+256+APPDATA.app_name], dword 'OS/I'
|
mov dword [0x80000+256+APPDATA.app_name], dword 'OS/I'
|
||||||
mov dword [0x80000+256+APPDATA.app_name+4], dword 'DLE '
|
mov dword [0x80000+256+APPDATA.app_name+4], dword 'DLE '
|
||||||
|
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 ebx, [def_cursor]
|
||||||
mov dword [0x80000+256+APPDATA.cursor], ebx
|
mov dword [0x80000+256+APPDATA.cursor], ebx
|
||||||
mov dword [0x80000+256+APPDATA.fpu_handler], 0
|
|
||||||
mov dword [0x80000+256+APPDATA.sse_handler], 0
|
|
||||||
|
|
||||||
mov ebx, PROC_BASE+256+APP_OBJ_OFFSET
|
mov ebx, PROC_BASE+256+APP_OBJ_OFFSET
|
||||||
mov dword [0x80000+256+APPDATA.fd_obj], ebx
|
mov dword [0x80000+256+APPDATA.fd_obj], ebx
|
||||||
mov dword [0x80000+256+APPDATA.bk_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
|
; task list
|
||||||
mov [0x3020+TASKDATA.wnd_number], 1 ; on screen number
|
mov [0x3020+TASKDATA.wnd_number], 1 ; on screen number
|
||||||
mov [0x3020+TASKDATA.pid], 1 ; process id number
|
mov [0x3020+TASKDATA.pid], 1 ; process id number
|
||||||
@ -632,7 +605,9 @@ include 'vmodeld.inc'
|
|||||||
mov [edi+TSS._cr3],eax
|
mov [edi+TSS._cr3],eax
|
||||||
mov [edi+TSS._eip],osloop
|
mov [edi+TSS._eip],osloop
|
||||||
mov [edi+TSS._eflags],dword 0x11202 ; sti and resume
|
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._cs],os_code
|
||||||
mov [edi+TSS._ss],os_data
|
mov [edi+TSS._ss],os_data
|
||||||
mov [edi+TSS._ds],os_data
|
mov [edi+TSS._ds],os_data
|
||||||
|
@ -176,7 +176,7 @@ struc APPDATA
|
|||||||
.ev_count dd ? ;+20
|
.ev_count dd ? ;+20
|
||||||
.fpu_handler dd ? ;+24
|
.fpu_handler dd ? ;+24
|
||||||
.sse_handler dd ? ;+28
|
.sse_handler dd ? ;+28
|
||||||
dd ? ;unused ;+32
|
.pl0_stack dd ? ;unused ;+32
|
||||||
.heap_base dd ? ;+36
|
.heap_base dd ? ;+36
|
||||||
.heap_top dd ? ;+40
|
.heap_top dd ? ;+40
|
||||||
.cursor dd ? ;+44
|
.cursor dd ? ;+44
|
||||||
|
@ -209,19 +209,11 @@
|
|||||||
; 08 dword draw limit - x end
|
; 08 dword draw limit - x end
|
||||||
; 0C dword draw limit - y end
|
; 0C dword draw limit - y end
|
||||||
;
|
;
|
||||||
; 802000 -> 802fff free (4 Kb)
|
|
||||||
;
|
;
|
||||||
; 803000 -> 902fff sysint_stack_data
|
; 803000 -> 0xA0AFFF TSS and IO map for (8192*8)=65536 ports
|
||||||
; - 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
|
|
||||||
; (128+8192)*256 = 2129920 = 0x208000
|
; (128+8192)*256 = 2129920 = 0x208000
|
||||||
;
|
;
|
||||||
; C00000 -> kernel heap
|
; 0xA0B000 -> kernel heap
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user