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 ;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

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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