Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 420 → Rev 419

/kernel/branches/flat_kernel/boot/bootcode.inc
209,9 → 209,6
jmp $
cpugood:
 
push 0
popf
sti
 
; set up esp
movzx esp, sp
/kernel/branches/flat_kernel/const.inc
279,20 → 279,19
RING0_STACK_SIZE equ (0x2000 - 512) ;512 áàéò äëÿ êîíòåêñòà FPU
 
REG_SS equ (RING0_STACK_SIZE-4)
REG_APP_ESP equ (RING0_STACK_SIZE-8)
REG_ESP equ (RING0_STACK_SIZE-8)
REG_EFLAGS equ (RING0_STACK_SIZE-12)
REG_CS equ (RING0_STACK_SIZE-16)
REG_EIP equ (RING0_STACK_SIZE-20)
REG_EFL_2 equ (RING0_STACK_SIZE-24)
REG_EAX equ (RING0_STACK_SIZE-28)
REG_ECX equ (RING0_STACK_SIZE-32)
REG_EDX equ (RING0_STACK_SIZE-36)
REG_EBX equ (RING0_STACK_SIZE-40)
REG_ESP equ (RING0_STACK_SIZE-44) ;RING0_STACK_SIZE-20
REG_EBP equ (RING0_STACK_SIZE-48)
REG_ESI equ (RING0_STACK_SIZE-52)
REG_EDI equ (RING0_STACK_SIZE-56)
REG_RET equ (RING0_STACK_SIZE-60) ;irq0.return
REG_EAX equ (RING0_STACK_SIZE-24)
REG_ECX equ (RING0_STACK_SIZE-28)
REG_EDX equ (RING0_STACK_SIZE-32)
REG_EBX equ (RING0_STACK_SIZE-36)
REG_ESP equ (RING0_STACK_SIZE-40) ;RING0_STACK_SIZE-20
REG_EBP equ (RING0_STACK_SIZE-44)
REG_ESI equ (RING0_STACK_SIZE-48)
REG_EDI equ (RING0_STACK_SIZE-52)
REG_RET equ (RING0_STACK_SIZE-56) ;irq0.return
 
PG_UNMAP equ 0x000
PG_MAP equ 0x001
/kernel/branches/flat_kernel/core/debug.inc
135,32 → 135,32
jmp .ret
.ring0:
; note that following code assumes that all interrupt/exception handlers
; saves ring-3 context by pushad in this order
; saves ring-3 context by push ds es, pushad in this order
mov esi, [eax+TSS._esp0]
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), pushad
sub esi, 8+12+20h
lodsd ;edi
; top of ring0 stack: ring3 stack ptr (ss+esp), iret data (cs+eip+eflags), ds, es, pushad
sub esi, 8+12+8+20h
lodsd
mov [edi+24h], eax
lodsd ;esi
lodsd
mov [edi+20h], eax
lodsd ; ebp
lodsd
mov [edi+1Ch], eax
lodsd ;esp
lodsd ;ebx
lodsd
lodsd
mov [edi+14h], eax
lodsd ;edx
lodsd
mov [edi+10h], eax
lodsd ;ecx
lodsd
mov [edi+0Ch], eax
lodsd ;eax
lodsd
mov [edi+8], eax
;;; add esi, 8 ;ds es
lodsd ;eip
add esi, 8
lodsd
mov [edi], eax
lodsd ;cs
lodsd ;eflags
lodsd
lodsd
mov [edi+4], eax
lodsd ;esp
lodsd
mov [edi+18h], eax
.ret:
sti
194,29 → 194,29
jmp .stiret
.ring0:
mov edi, [eax+TSS._esp0]
sub edi, 8+12+20h
mov eax, [esi+24h] ;edi
sub edi, 8+12+8+20h
mov eax, [esi+24h]
stosd
mov eax, [esi+20h] ;esi
mov eax, [esi+20h]
stosd
mov eax, [esi+1Ch] ;ebp
mov eax, [esi+1Ch]
stosd
scasd
mov eax, [esi+14h] ;ebx
mov eax, [esi+14h]
stosd
mov eax, [esi+10h] ;edx
mov eax, [esi+10h]
stosd
mov eax, [esi+0Ch] ;ecx
mov eax, [esi+0Ch]
stosd
mov eax, [esi+8] ;eax
mov eax, [esi+8]
stosd
;;; add edi, 8 ;ds es
mov eax, [esi] ;eip
add edi, 8
mov eax, [esi]
stosd
scasd
mov eax, [esi+4] ;eflags
mov eax, [esi+4]
stosd
mov eax, [esi+18h] ;esp
mov eax, [esi+18h]
stosd
.stiret:
sti
422,7 → 422,7
; int 1 = #DB
save_ring3_context
cld
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
mov eax, dr6
460,7 → 460,7
jnz .debug
sti
; not debuggee => say error and terminate
add esp, 0x20+4
add esp, 28h+4
mov [error_interrupt], 1
call show_error_parameters
mov edx, [TASK_BASE]
/kernel/branches/flat_kernel/core/dll.inc
125,7 → 125,7
align 16
.main:
save_ring3_context
mov bx, app_data ;os_data
mov bx, os_data
mov ds, bx
mov es, bx
 
/kernel/branches/flat_kernel/core/fpu.inc
130,7 → 130,7
e7: ;#NM exception handler
save_ring3_context
clts
mov ax, app_data ;
mov ax, os_data
mov ds, ax
mov es, ax
 
183,10 → 183,10
push ecx
push edx
 
mov ebx, [CURRENT_TASK]
mov ebx, [ss:CURRENT_TASK]
shl ebx, 8
 
mov eax, [ebx+SLOT_BASE+APPDATA.fpu_handler]
mov eax, [ss:ebx+SLOT_BASE+APPDATA.fpu_handler]
test eax, eax
jz .default
 
193,7 → 193,7
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [edx], ecx
mov [ss:edx], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
 
227,10 → 227,10
push ecx
push edx
 
mov ebx, [CURRENT_TASK]
mov ebx, [ss:CURRENT_TASK]
shl ebx, 8
 
mov eax, [ebx+SLOT_BASE+APPDATA.sse_handler]
mov eax, [ss:ebx+SLOT_BASE+APPDATA.sse_handler]
test eax, eax
jz .default
 
237,7 → 237,7
mov ecx, [reg_eip]
mov edx, [reg_esp]
sub edx, 4
mov [edx], ecx
mov [ss:edx], ecx
mov [reg_esp], edx
mov dword [reg_eip], eax
 
/kernel/branches/flat_kernel/core/memory.inc
1339,9 → 1339,9
if 0
push eax
push edx
mov edx, 0x400 ;bochs
mov al,0xff ;bochs
out dx, al ;bochs
mov edx, 0x400 ;bocsh
mov al,0xff ;bocsh
out dx, al ;bocsh
pop edx
pop eax
end if
/kernel/branches/flat_kernel/core/taskman.inc
1011,8 → 1011,6
mov ebx,[slot]
mov eax,ebx
shl ebx,5
lea ecx,[draw_data+ebx] ;ecx - pointer to draw data
 
; set window state to 'normal' (non-minimized/maximized/rolled-up) state
mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL
mov [ebx+window_data+WDATA.fl_redraw], 1
1025,6 → 1023,8
mov eax,[process_number]
mov [ebx+4],eax ;set PID
 
mov ecx,ebx
add ecx,(draw_data-CURRENT_TASK) ;ecx - pointer to draw data
;set draw data to full screen
 
mov [ecx+0],dword 0
1058,7 → 1058,7
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._eflags],dword 0x3202
 
mov [edi+TSS._cs],app_code ;selector of code segment
mov [edi+TSS._ss],app_data
1067,41 → 1067,11
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 [edi+TSS._ss0], os_data
mov ebx, [pl0_stack]
add ebx, RING0_STACK_SIZE
mov [edi+TSS._esp0],ebx
 
xor eax, eax
mov ebx, [pl0_stack]
lea ecx, [ebx+REG_EIP]
 
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_APP_ESP], eax ;app_stack
mov [ebx+REG_SS], dword app_data
 
lea ecx, [ebx+REG_RET]
mov ebx, [slot]
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
1139,37 → 1109,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/core/sys32.inc
78,11 → 78,13
 
macro save_ring3_context
{
push ds es
pushad
}
macro restore_ring3_context
{
popad
pop es ds
}
 
; simply return control to interrupted process
112,9 → 114,9
exc_w_code 8, 10, 11, 12, 13, 14, 17
 
exc_c:
mov ax, app_data ;èñêëþ÷åíèå
mov ds, ax ;çàãðóçèì ïðàâèëüíûå çíà÷åíè
mov es, ax ;â ðåãèñòðû
mov ax, os_data
mov ds, ax
mov es, ax
 
; test if debugging
cli
125,7 → 127,7
jnz .debug
sti
; not debuggee => say error and terminate
add esp, 0x20 ;28h
add esp, 28h
movzx eax, bl
mov [error_interrupt], eax
call show_error_parameters
241,7 → 243,7
irqh 2,5,7,8,9,10,11
 
irq_c:
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
call irqhandler
250,7 → 252,7
 
p_irq6:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
call fdc_irq
260,7 → 262,7
 
p_irq3:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
cmp [com2_mouse_detected],0
276,7 → 278,7
 
p_irq4:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
cmp [com1_mouse_detected],0
292,7 → 294,7
 
p_irq12:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
call check_mouse_data_ps2
301,7 → 303,7
 
p_irq14:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
call [irq14_func]
310,7 → 312,7
iret
p_irq15:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
call [irq15_func]
333,7 → 335,7
 
irqD:
save_ring3_context
mov ax, app_data ;os_data
mov ax, os_data
mov ds, ax
mov es, ax
 
/kernel/branches/flat_kernel/core/syscall.inc
4,14 → 4,15
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
align 16
align 32
i40:
push ds es
pushad
cld
 
; mov ax, word app_data
; mov ds, ax
; mov es, ax
mov ax,word os_data
mov ds,ax
mov es,ax
 
; load all registers in crossed order
mov eax, ebx
27,8 → 28,10
and edi,0xff
call dword [servetable+edi*4]
pop eax
; cli
 
popad
pop es ds
iretd
 
 
55,18 → 58,19
; lea esp, [eax + RING0_STACK_SIZE] ; configure ESP
; mov eax, [ss:sysenter_stack - 4] ; eax - original eax, from app
 
mov esp, [CURRENT_TASK]
mov esp, [ss:CURRENT_TASK]
shl esp, 8
mov esp, [SLOT_BASE + esp + APPDATA.pl0_stack]
mov esp, [ss:SLOT_BASE + esp + APPDATA.pl0_stack]
add esp, RING0_STACK_SIZE ; configure ESP
sti
;------------------
push ds es
pushad
cld
 
; mov ax, word app_data
; mov ds, ax
; mov es, ax
mov ax, word os_data
mov ds, ax
mov es, ax
 
mov eax, ebx
mov ebx, ecx
81,6 → 85,7
pop eax
 
popad
pop es ds
;------------------
mov edx, [SYSENTER_VAR] ; eip
mov ecx, [SYSENTER_VAR + 4] ; esp
104,20 → 109,20
; lea esp, [eax + RING0_STACK_SIZE] ; configure ESP
; mov eax, [ss:sysenter_stack - 4] ; eax - original eax, from app
 
mov esp, [CURRENT_TASK]
mov esp, [ss:CURRENT_TASK]
shl esp, 8
mov esp, [SLOT_BASE + esp + APPDATA.pl0_stack]
mov esp, [ss:SLOT_BASE + esp + APPDATA.pl0_stack]
add esp, RING0_STACK_SIZE ; configure ESP
 
sti
;------------------
; push ds es
push ds es
pushad
cld
 
; mov ax, word app_data
; mov ds, ax
; mov es, ax
mov ax, word os_data
mov ds, ax
mov es, ax
 
mov eax, ebx
mov ebx, ecx
132,7 → 137,7
pop eax
 
popad
; pop es ds
pop es ds
;------------------
 
cli
/kernel/branches/flat_kernel/core/sched.inc
5,9 → 5,8
 
align 32
irq0:
pushfd
pushad
mov ax, app_data ;
save_ring3_context
mov ax, os_data
mov ds, ax
mov es, ax
 
22,6 → 21,7
mov [next_usage_update],eax
call updatecputimes
.nocounter:
 
cmp [DONT_SWITCH], byte 1
jne .change_task
 
31,9 → 31,8
 
mov [DONT_SWITCH], byte 0
 
popad
popfd
iretd
restore_ring3_context
iret
 
.change_task:
call update_counters
51,9 → 50,8
call do_change_task
 
.return:
popad
popfd
iretd
restore_ring3_context
iret
 
 
align 4
87,6 → 85,7
.return:
popad
popfd
 
ret
 
 
106,7 → 105,7
update_counters:
mov edi, [TASK_BASE]
mov ebx, [edi+TASKDATA.counter_add] ; time stamp counter add
rdtsc
call _rdtsc
sub eax, ebx
add eax, [edi+TASKDATA.counter_sum] ; counter sum
mov [edi+TASKDATA.counter_sum], eax
165,57 → 164,27
.found:
mov [CURRENT_TASK],ebx
mov [TASK_BASE],edi
rdtsc ;call _rdtsc
call _rdtsc
mov [edi+TASKDATA.counter_add],eax
 
mov esi, [prev_slot]
xor eax, eax
cmp ebx, esi
cmp ebx, [prev_slot]
sete al
ret
 
; in: ebx = TSS selector index
;
; param
; ebx = incoming task
; esi = outcomig task
 
do_change_task:
 
shl ebx, 8
add ebx, SLOT_BASE
mov [current_slot], ebx
shl esi, 8
add esi, SLOT_BASE
 
mov [esi+APPDATA.saved_esp], esp
mov esp, [ebx+APPDATA.saved_esp]
 
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 ecx, cr0
or ecx, CR0_TS ;set task switch flag
mov cr0, ecx
shl ebx, 3
xor eax, eax
add ebx, tss0
mov [far_jump.sel], bx ; selector
mov [far_jump.offs], eax ; offset
jmp pword [far_jump]
inc [context_counter] ;noname & halyavin
 
ret
 
;
; shl ebx, 3
; xor eax, eax
; add ebx, tss0
; mov [far_jump.sel], bx ; selector
; mov [far_jump.offs], eax ; offset
; jmp pword [far_jump]
; inc [context_counter] ;noname & halyavin
;ret
 
 
 
align 4
updatecputimes:
 
/kernel/branches/flat_kernel/data32.inc
245,7 → 245,7
event_end rd 1
event_uid rd 1
sys_page_map rd 1
os_stack_seg rd 1
os_stack rd 1
 
srv.fd rd 1
srv.bk rd 1
279,7 → 279,6
LFBSize rd 1
 
stall_mcs rd 1
current_slot rd 1
 
; status
hd1_status rd 1 ; 0 - free : other - pid
/kernel/branches/flat_kernel/kernel.asm
19,7 → 19,7
tss_step equ (128+8192) ; tss & i/o - 65535 ports, * 256=557056*4
 
 
os_stack equ os_data_l-gdts ; GDTs
os_data equ os_data_l-gdts ; GDTs
os_code equ os_code_l-gdts
graph_data equ 3+graph_data_l-gdts
tss0 equ tss0_l-gdts
151,7 → 151,7
 
align 4
B32:
mov ax,os_stack ; Selector for os
mov ax,os_data ; Selector for os
mov ds,ax
mov es,ax
mov fs,ax
214,16 → 214,14
 
align 4
high_code:
mov ax,os_stack
mov bx,app_data
mov ax,os_data
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
add esp, OS_BASE
 
mov ds,bx
mov es,bx
mov fs,bx
mov gs,bx
 
mov dword [sys_pgdir], 0
mov dword [sys_pgdir+4], 0
mov dword [sys_pgdir+8], 0
371,10 → 369,8
 
call init_kernel_heap
stdcall kernel_alloc, 0x2000
mov [os_stack_seg], eax
mov [os_stack], eax
 
lea esp, [eax+RING0_STACK_SIZE]
 
mov [LFBSize], 0x800000
call init_mtrr
 
556,7 → 552,7
 
mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I'
mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE '
mov edi, [os_stack_seg]
mov edi, [os_stack]
mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi
add edi, 0x2000-512
mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
587,21 → 583,21
cld
rep stosd
 
mov edi,tss_data
mov [edi+TSS._ss0], os_stack
mov edi,tss_data+tss_step
mov [edi+TSS._ss0], os_data
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]
mov [edi+TSS._eflags],dword 0x11202 ; sti and resume
mov eax, [os_stack]
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 [edi+TSS._ss],os_data
mov [edi+TSS._ds],os_data
mov [edi+TSS._es],os_data
mov [edi+TSS._fs],os_data
mov [edi+TSS._gs],os_data
 
mov ax,tss0
ltr ax
747,15 → 743,11
 
; mov [dma_hdd],1
cmp [IDEContrRegsBaseAddr], 0
; setnz [dma_hdd]
setnz [dma_hdd]
 
stdcall init_uart_service, DRV_ENTRY
 
sti
call change_task
 
jmp osloop
 
jmp $ ; wait here for timer to take control
 
; Fly :)
/kernel/branches/flat_kernel/kernel32.inc
184,9 → 184,8
.bk_ev dd ? ;+52
.fd_obj dd ? ;+56
.bk_obj dd ? ;+60
.saved_esp dd ? ;+64
 
db 60 dup(?) ;+68
db 64 dup(?) ;+64
 
.wnd_shape dd ? ;+128
.wnd_shape_scale dd ? ;+132