Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 429 → Rev 430

/kernel/branches/flat_kernel/const.inc
173,6 → 173,8
TSS TSS
end virtual
 
TSS_SIZE equ (128+8192)
 
OS_BASE equ 0x80000000
 
window_data equ OS_BASE
290,15 → 292,17
 
skin_data equ (OS_BASE+0x0778000)
 
draw_data equ (OS_BASE+0x0780000);
 
tss_data equ (OS_BASE+0x780000)
draw_data equ (OS_BASE+0x988000)
virtual at (OS_BASE+0x0783F80)
tss TSS
end virtual
 
tmp_page_tab equ 0x98B000; draw_data+sizeof(drw_data)
tmp_page_tab equ 0x0786000;
 
HEAP_BASE equ (OS_BASE+tmp_page_tab)
HEAP_MIN_SIZE equ 0x01000000
 
 
page_tabs equ 0xFDC00000
app_page_tabs equ 0xFDC00000
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000
310,7 → 314,7
sys_pgmap equ (OS_BASE+0x00052000)
 
 
new_app_base equ 0; 0x01000000
new_app_base equ 0;
 
twdw equ (CURRENT_TASK-window_data)
 
524,7 → 528,6
.pages_free dd ?
.pages_faults dd ?
.pagemap_size dd ?
.kernel_max dd ?
.kernel_pages dd ?
.kernel_tables dd ?
.sys_page_dir dd ?
/kernel/branches/flat_kernel/core/debug.inc
123,19 → 123,19
jnz .ret
call get_debuggee_slot
jc .ret
imul eax, tss_step/32
add eax, tss_data
; imul eax, tss_step/32
; add eax, tss_data
mov edi, edx
cmp [eax+TSS._cs], app_code
jnz .ring0
lea esi, [eax+TSS._eip]
shr ecx, 2
rep movsd
jmp .ret
; cmp [eax+TSS._cs], app_code
; jnz .ring0
; lea esi, [eax+TSS._eip]
; shr ecx, 2
; rep movsd
; jmp .ret
.ring0:
; note that following code assumes that all interrupt/exception handlers
; saves ring-3 context by pushad in this order
mov esi, [eax+TSS._esp0]
mov esi, [tss._esp0]
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad
sub esi, 8+12+20h
lodsd ;edi
182,17 → 182,17
jnz .ret
call get_debuggee_slot
jc .stiret
imul eax, tss_step/32
add eax, tss_data
; imul eax, tss_step/32
; add eax, tss_data
mov esi, edx
cmp [eax+TSS._cs], app_code
jnz .ring0
lea edi, [eax+TSS._eip]
shr ecx, 2
rep movsd
jmp .stiret
; cmp [eax+TSS._cs], app_code
; jnz .ring0
; lea edi, [eax+TSS._eip]
; shr ecx, 2
; rep movsd
; jmp .stiret
.ring0:
mov edi, [eax+TSS._esp0]
mov edi, [tss._esp0]
sub edi, 8+12+20h
mov eax, [esi+24h] ;edi
stosd
247,8 → 247,8
btr dword [eax+10h], ecx ; clear L<i> bit
test byte [eax+10h], 55h
jnz .okret
imul eax, ebp, tss_step/32
and byte [eax + tss_data + TSS._trap], not 1
; imul eax, ebp, tss_step/32
; and byte [eax + tss_data + TSS._trap], not 1
.okret:
and dword [esp+36], 0
sti
289,8 → 289,8
not edx
and [eax+10h+2], dx
or [eax+10h+2], bx ; set R/W and LEN fields
imul eax, ebp, tss_step/32
or byte [eax + tss_data + TSS._trap], 1
; imul eax, ebp, tss_step/32
; or byte [eax + tss_data + TSS._trap], 1
jmp .okret
 
debug_read_process_memory:
/kernel/branches/flat_kernel/core/memory.inc
1,3 → 1,4
; $Revision$
 
align 4
proc alloc_page
544,6 → 545,40
;â òàáëèöàõ ñòðàíèö. äîáàâëåíî â P4/Xeon
 
;ïîïûòêà çàïèñè â çàùèù¸ííóþ ñòðàíèöó ÿäðà
 
cmp ebx, tss._io_map_0
jb .fail
 
cmp ebx, tss._io_map_0+8192
jae .fail
 
; io permission map
; copy-on-write protection
 
call alloc_page
and eax, eax
jz .fail
 
push eax
stdcall map_page,[ebp-4],eax,dword PG_SW
pop eax
mov edi, [.err_addr]
and edi, -4096
lea esi, [edi+(not tss._io_map_0)+1]; -tss._io_map_0
 
mov ebx, esi
shr ebx, 12
mov edx, [current_slot]
or eax, PG_SW
mov [edx+APPDATA.io_map+ebx*4], eax
 
add esi, [default_io_map]
mov ecx, 4096/4
cld
rep movsd
jmp .exit
 
 
;íå îáðàáàòûâàåì. Îøèáêà
 
.core_tabs:
/kernel/branches/flat_kernel/core/sched.inc
180,8 → 180,6
sete al
ret
 
; in: ebx = TSS selector index
;
; param
; ebx = incoming task
; esi = outcomig task
197,12 → 195,18
mov [esi+APPDATA.saved_esp], esp
mov esp, [ebx+APPDATA.saved_esp]
 
; set thread io map
 
mov ecx, [ebx+APPDATA.io_map]
mov edx, [ebx+APPDATA.io_map+4]
mov dword [page_tabs+((tss._io_map_0 and -4096) shr 10)], ecx
mov dword [page_tabs+((tss._io_map_1 and -4096) shr 10)], edx
 
mov eax, [ebx+APPDATA.dir_table]
mov cr3, eax
 
mov ebx, [ebx+APPDATA.pl0_stack]
add ebx, RING0_STACK_SIZE
mov [tss_data+TSS._esp0], ebx
mov [tss._esp0], ebx
mov ecx, cr0
or ecx, CR0_TS ;set task switch flag
mov cr0, ecx
/kernel/branches/flat_kernel/core/sys32.inc
12,25 → 12,6
dw 8*0x41-1
dd idts+8
 
build_process_gdt_tss_pointer:
 
mov ecx,tss_data
mov edi,0
setgdtl2:
mov [edi+gdts+ tss0 +0], word tss_step
mov [edi+gdts+ tss0 +2], cx
mov eax,ecx
shr eax,16
mov [edi+gdts+ tss0 +4], al
mov [edi+gdts+ tss0 +7], ah
mov [edi+gdts+ tss0 +5], word 01010000b *256 +11101001b
add ecx,tss_step
add edi,8
cmp edi,8*(max_processes+5)
jbe setgdtl2
 
ret
 
build_interrupt_table:
 
mov edi, idts+8
836,11 → 817,10
 
mov esi,boot_sched_1
call boot_log
call build_process_gdt_tss_pointer
; call build_process_gdt_tss_pointer
 
mov esi,boot_sched_2
call boot_log
call build_interrupt_table
; mov esi,boot_sched_2
; call boot_log
 
ret
 
/kernel/branches/flat_kernel/core/taskman.inc
454,15 → 454,6
mov ebx, [current_slot]
mov [ebx+APPDATA.dir_table], eax
mov cr3, eax
 
; mov esi, [CURRENT_TASK]
; mov ebx, esi
; shl esi,8
; mov [SLOT_BASE+esi+0xB8],eax
; imul ebx,tss_step
; add ebx,tss_data
; mov [ebx+28], eax
; mov cr3, eax
ret
 
align 4
923,6 → 914,12
mov [eax+SLOT_BASE+APPDATA.fpu_handler], 0
mov [eax+SLOT_BASE+APPDATA.sse_handler], 0
 
;set default io permission map
mov [eax+SLOT_BASE+APPDATA.io_map],\
(tss._io_map_0-OS_BASE+PG_MAP)
mov [eax+SLOT_BASE+APPDATA.io_map+4],\
(tss._io_map_1-OS_BASE+PG_MAP)
 
mov esi, fpu_data
mov ecx, 512/4
rep movsd
1003,47 → 1000,10
mov eax,[ScreenHeight]
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,[SLOT_BASE+ecx+APPDATA.dir_table]
mov [edi+TSS._cr3],eax
 
mov ebx, [pl0_stack]
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_stack
mov ebx, [pl0_stack]
add ebx, RING0_STACK_SIZE
mov [edi+TSS._esp0],ebx
 
lea ecx, [ebx+REG_EIP]
xor eax, eax
mov ebx, [pl0_stack]
lea ecx, [ebx+REG_EIP]
 
mov [ebx+REG_RET], dword irq0.return
mov [ebx+REG_EDI], eax
1071,17 → 1031,6
shl ebx, 8
mov [ebx+SLOT_BASE+APPDATA.saved_esp], ecx
 
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
1108,37 → 1057,6
mov esi,new_process_running
call sys_msg_board_str ;output information about succefull startup
ret
 
if 0
; set stack frame
 
xor eax, eax
lea ecx, [ebx+REG_EIP]
mov ebx, [pl0_stack]
mov esi,[params]
 
mov [ebx+REG_RET], dword irq0.return
mov [ebx+REG_EDI], eax
mov [ebx+REG_ESI], eax
mov [ebx+REG_EBP], eax
mov [ebx+REG_ESP], ecx ;ebx+REG_EIP
mov [ebx+REG_EBX], eax
mov [ebx+REG_EDX], eax
mov [ebx+REG_ECX], eax
mov [ebx+REG_EAX], eax
 
mov [ebx+REG_EFL_2], dword 0x1002
 
mov eax, [esi+0x08] ;app_eip
mov [ebx+REG_EIP], eax ;app_entry
mov [ebx+REG_CS], dword app_code
mov [ebx+REG_EFLAGS], dword 0x1202
 
mov eax, [esi+0x0C] ;app_esp
mov [ebx+REG_ESP], eax ;app_stack
mov [ebx+REG_SS], dword app_data
end if
 
endp
 
include "debug.inc"
/kernel/branches/flat_kernel/data32.inc
183,11 → 183,13
db 0x00
dw 11010000b *256 +11110010b
db 0x00
 
tss0_l:
dw TSS_SIZE-1
dw tss and 0xFFFF
db (tss shr 16) and 0xFF
db 10001001b
dw (tss shr 16) and 0xFF00
endofcode:
tss0_l:
rq (max_processes+10)
 
gdte:
 
align 16
276,6 → 278,8
tmp_task_pdir rd 1
tmp_task_ptab rd 1
 
default_io_map rd 1
 
LFBSize rd 1
 
stall_mcs rd 1
/kernel/branches/flat_kernel/init.inc
15,7 → 15,7
xor edi, edi
mov ebx, 'TEST'
@@:
add edi, 0x400000
add edi, 0x100000
xchg ebx, dword [edi]
cmp dword [edi], 'TEST'
xchg ebx, dword [edi]
32,21 → 32,24
proc init_mem
mov eax, [MEM_AMOUNT-OS_BASE]
mov [pg_data.mem_amount-OS_BASE], eax
mov [pg_data.kernel_max-OS_BASE], eax
 
shr eax, 12
mov edx, eax
mov [pg_data.pages_count-OS_BASE], eax
mov [pg_data.kernel_pages-OS_BASE], eax
 
shr eax, 3
mov [pg_data.pagemap_size-OS_BASE], eax
 
cmp edx, (OS_BASE/4096)
jbe @F
mov edx, (OS_BASE/4096)
jmp .set
@@:
cmp edx, (HEAP_MIN_SIZE/4096)
jae .set
mov edx, (HEAP_MIN_SIZE/4096)
.set:
mov [pg_data.kernel_pages-OS_BASE], edx
shr edx, 10
cmp edx, 3
ja @f
inc edx ;at least 4Mb for kernel heap
@@:
mov [pg_data.kernel_tables-OS_BASE], edx
 
xor eax, eax
70,15 → 73,15
or ebx, CR4_PGE
@@:
mov cr4, ebx
sub [pg_data.kernel_tables-OS_BASE], 2
sub [pg_data.kernel_tables-OS_BASE], 1
 
mov [edx], eax
add eax, 0x00400000
mov [edx+4], eax
add edx, 8
; mov [edx+4], eax
add edx, 4
 
mov eax, 0x800000+PG_SW
mov ecx, (tmp_page_tab-0x800000)/4096
mov eax, 0x400000+PG_SW
mov ecx, (tmp_page_tab-0x400000)/4096
jmp .map_low
.no_PSE:
mov eax, PG_SW
/kernel/branches/flat_kernel/kernel.asm
11,7 → 11,7
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision:$
; $Revision$
 
include "proc32.inc"
include "kglobals.inc"
203,7 → 203,7
mov cr3, eax
 
mov eax,cr0
or eax,CR0_PG
or eax,CR0_PG+CR0_WP
mov cr0,eax
 
lgdt [gdts]
372,12 → 372,37
.noSYSCALL:
; -----------------------------------------
 
; LOAD IDT
 
call build_interrupt_table
lidt [idtreg]
 
call init_kernel_heap
stdcall kernel_alloc, 0x2000
stdcall kernel_alloc, RING0_STACK_SIZE+512
mov [os_stack_seg], eax
 
lea esp, [eax+RING0_STACK_SIZE]
 
mov [tss._ss0], os_stack
mov [tss._esp0], esp
mov [tss._esp], esp
mov [tss._cs],os_code
mov [tss._ss],os_stack
mov [tss._ds],app_data
mov [tss._es],app_data
mov [tss._fs],app_data
mov [tss._gs],app_data
mov [tss._io],128
;Add IO access table - bit array of permitted ports
mov edi, tss._io_map_0
xor eax, eax
not eax
mov ecx, 8192/4
rep stosd ; access to 4096*8=65536 ports
 
mov ax,tss0
ltr ax
 
mov [LFBSize], 0x800000
call init_mtrr
 
385,7 → 410,10
call init_fpu
call init_malloc
 
stdcall alloc_kernel_space, 0x4F000
stdcall alloc_kernel_space, 0x51000
mov [default_io_map], eax
 
add eax, 0x2000
mov [ipc_tmp], eax
mov ebx, 0x1000
 
497,9 → 525,6
 
call build_scheduler ; sys32.inc
 
; LOAD IDT
lidt [idtreg]
 
mov esi,boot_devices
call boot_log
call detect_devices
565,6 → 590,10
mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi
add edi, 0x2000-512
mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
mov dword [SLOT_BASE+256+APPDATA.io_map],\
(tss._io_map_0-OS_BASE+PG_MAP)
mov dword [SLOT_BASE+256+APPDATA.io_map+4],\
(tss._io_map_1-OS_BASE+PG_MAP)
 
mov esi, fpu_data
mov ecx, 512/4
587,31 → 616,6
mov [TASK_DATA+TASKDATA.pid], 1 ; process id number
mov [TASK_DATA+TASKDATA.mem_start], 0 ; process base address
 
mov edi,tss_data+tss_step
mov ecx, (tss_step)/4
xor eax, eax
cld
rep stosd
 
mov edi,tss_data
mov [edi+TSS._ss0], os_stack
mov eax,cr3
mov [edi+TSS._cr3],eax
mov [edi+TSS._eip],osloop
mov [edi+TSS._eflags],dword 0x1202 ; sti and resume
mov eax, [os_stack_seg]
add eax, 0x2000-512
mov [edi+TSS._esp], eax
mov [edi+TSS._cs],os_code
mov [edi+TSS._ss],os_stack ;os_stack
mov [edi+TSS._ds],app_data ;os_data
mov [edi+TSS._es],app_data ;os_data
mov [edi+TSS._fs],app_data ;os_data
mov [edi+TSS._gs],app_data ;os_data
 
mov ax,tss0
ltr ax
 
call init_cursors
mov eax, [def_cursor]
mov [SLOT_BASE+APPDATA.cursor],eax
667,6 → 671,18
movsd
call load_skin
 
;protect io permission map
 
mov esi, [default_io_map]
stdcall map_page,esi,(tss._io_map_0-OS_BASE), PG_MAP
add esi, 0x1000
stdcall map_page,esi,(tss._io_map_1-OS_BASE), PG_MAP
 
stdcall map_page,tss._io_map_0,\
(tss._io_map_0-OS_BASE), PG_MAP
stdcall map_page,tss._io_map_1,\
(tss._io_map_1-OS_BASE), PG_MAP
 
; LOAD FIRST APPLICATION
cli
cmp byte [BOOT_VAR+0x9030],1
3727,25 → 3743,23
 
pushad
 
mov edi,[CURRENT_TASK]
imul edi,tss_step
add edi,tss_data+128
; add edi,128
mov edi, tss._io_map_0
 
mov ecx,eax
and ecx,7 ; offset in byte
; mov ecx,eax
; and ecx,7 ; offset in byte
 
shr eax,3 ; number of byte
add edi,eax
; shr eax,3 ; number of byte
; add edi,eax
 
mov ebx,1
shl ebx,cl
; mov ebx,1
; shl ebx,cl
 
cmp ebp,0 ; enable access - ebp = 0
jne siar1
 
not ebx
and [edi],byte bl
; not ebx
; and [edi],byte bl
btr [edi], eax
 
popad
 
3753,7 → 3767,8
 
siar1:
 
or [edi],byte bl ; disable access - ebp = 1
bts [edi], eax
; or [edi],byte bl ; disable access - ebp = 1
 
popad
 
Property changes:
Added: svn:keywords
+Rev
\ No newline at end of property
/kernel/branches/flat_kernel/kernel32.inc
185,8 → 185,9
.fd_obj dd ? ;+56
.bk_obj dd ? ;+60
.saved_esp dd ? ;+64
.io_map rd 2 ;+68
 
db 60 dup(?) ;+68
db 52 dup(?) ;+76
 
.wnd_shape dd ? ;+128
.wnd_shape_scale dd ? ;+132