priorities in scheduler

git-svn-id: svn://kolibrios.org@3534 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
CleverMouse 2013-05-27 09:02:35 +00:00
parent 09908c25f4
commit f059bc06d5
19 changed files with 398 additions and 249 deletions

View File

@ -710,6 +710,20 @@ EjectMedium:
;* ChannelNumber - íîìåð êàíàëà; * ;* ChannelNumber - íîìåð êàíàëà; *
;* DiskNumber - íîìåð äèñêà íà êàíàëå. * ;* DiskNumber - íîìåð äèñêà íà êàíàëå. *
;************************************************* ;*************************************************
proc check_ATAPI_device_event_has_work?
mov eax, [timer_ticks]
sub eax, [timer_ATAPI_check]
cmp eax, 100
jb .no
.yes:
xor eax, eax
inc eax
ret
.no:
xor eax, eax
ret
endp
align 4 align 4
check_ATAPI_device_event: check_ATAPI_device_event:
pusha pusha

View File

@ -284,6 +284,24 @@ save_timer_fdd_motor:
;***************************************** ;*****************************************
;* 闲温判世 抢呐衅嗜 论仕拮磐冗 涛椅欣 * ;* 闲温判世 抢呐衅嗜 论仕拮磐冗 涛椅欣 *
;***************************************** ;*****************************************
proc check_fdd_motor_status_has_work?
cmp [flp_status], 0
jnz .yes
cmp [fdd_motor_status], 0
jz .no
mov eax, [timer_ticks]
sub eax, [timer_fdd_motor]
cmp eax, 500
jb .no
.yes:
xor eax, eax
inc eax
ret
.no:
xor eax, eax
ret
endp
align 4 align 4
check_fdd_motor_status: check_fdd_motor_status:
cmp [fdd_motor_status], 0 cmp [fdd_motor_status], 0

View File

@ -163,7 +163,6 @@ proc usb_wakeup_if_needed
test ebx, ebx test ebx, ebx
jz usb_wakeup.nothing jz usb_wakeup.nothing
usb_wakeup: usb_wakeup:
mov [check_idle_semaphore], 5 ; we really, really need a normal scheduler
xor edx, edx xor edx, edx
mov eax, [usb_event] mov eax, [usb_event]
mov ebx, [eax+EVENT.id] mov ebx, [eax+EVENT.id]

View File

@ -179,5 +179,5 @@ except_7: ;#NM exception handler
iret iret
iglobal iglobal
fpu_owner dd 0 fpu_owner dd 2
endg endg

View File

@ -267,7 +267,6 @@ align 16
.fail: .fail:
inc [irq_failed+ebp*4] inc [irq_failed+ebp*4]
.exit: .exit:
mov [check_idle_semaphore], 5
mov ecx, ebp mov ecx, ebp
call irq_eoi call irq_eoi

View File

@ -1136,11 +1136,6 @@ proc sys_ipc_send stdcall, PID:dword, msg_addr:dword, msg_size:dword
mov eax, [dst_slot] mov eax, [dst_slot]
shl eax, 8 shl eax, 8
or [eax+SLOT_BASE+0xA8], dword 0x40 or [eax+SLOT_BASE+0xA8], dword 0x40
cmp dword [check_idle_semaphore], 20
jge .ipc_no_cis
mov dword [check_idle_semaphore], 5
.ipc_no_cis:
push 0 push 0
jmp .ret jmp .ret
.no_pid: .no_pid:

View File

@ -89,9 +89,6 @@ update_counters:
ret ret
align 4 align 4
updatecputimes: updatecputimes:
xor eax, eax
xchg eax, [idleuse]
mov [idleusesec], eax
mov ecx, [TASK_COUNT] mov ecx, [TASK_COUNT]
mov edi, TASK_DATA mov edi, TASK_DATA
.newupdate: .newupdate:
@ -102,56 +99,6 @@ updatecputimes:
loop .newupdate loop .newupdate
ret ret
align 4
find_next_task:
;info:
; Find next task to execute
;retval:
; ebx = address of the APPDATA for the selected task (slot-base)
; esi = previous slot-base ([current_slot] at the begin)
; edi = address of the TASKDATA for the selected task
; ZF = 1 if the task is the same
;warning:
; [CURRENT_TASK] = bh , [TASK_BASE] = edi -- as result
; [current_slot] is not set to new value (ebx)!!!
;scratched: eax,ecx
call update_counters ; edi := [TASK_BASE]
Mov esi, ebx, [current_slot]
.loop:
cmp bh, [TASK_COUNT]
jb @f
xor bh, bh
mov edi, CURRENT_TASK
@@:
inc bh ; ebx += APPDATA.size
add edi, 0x20; edi += TASKDATA.size
mov al, [edi+TASKDATA.state]
test al, al
jz .found ; state == 0
cmp al, 5
jne .loop ; state == 1,2,3,4,9
; state == 5
pushad ; more freedom for [APPDATA.wait_test]
call [ebx+APPDATA.wait_test]
mov [esp+28], eax
popad
or eax, eax
jnz @f
; testing for timeout
mov ecx, [timer_ticks]
sub ecx, [ebx+APPDATA.wait_begin]
cmp ecx, [ebx+APPDATA.wait_timeout]
jb .loop
@@:
mov [ebx+APPDATA.wait_param], eax ; retval for wait
mov [edi+TASKDATA.state], 0
.found:
mov [CURRENT_TASK], bh
mov [TASK_BASE], edi
rdtsc ;call _rdtsc
mov [edi+TASKDATA.counter_add], eax; for next using update_counters
cmp ebx, esi ;esi - previous slot-base
ret
;TODO: Íàäî áû óáðàòü èñïîëüçîâàíèå do_change_task èç V86... ;TODO: Íàäî áû óáðàòü èñïîëüçîâàíèå do_change_task èç V86...
; è ïîñëå ýòîãî ïåðåíåñòè îáðàáîòêó TASKDATA.counter_add/sum â do_change_task ; è ïîñëå ýòîãî ïåðåíåñòè îáðàáîòêó TASKDATA.counter_add/sum â do_change_task
@ -305,6 +252,143 @@ mutex_unlock:
purge MUTEX_WAITER purge MUTEX_WAITER
MAX_PRIORITY = 0 ; highest, used for kernel tasks
USER_PRIORITY = 1 ; default
IDLE_PRIORITY = 2 ; lowest, only IDLE thread goes here
NR_SCHED_QUEUES = 3 ; MUST equal IDLE_PRIORYTY + 1
uglobal
; [scheduler_current + i*4] = zero if there are no threads with priority i,
; pointer to APPDATA of the current thread with priority i otherwise.
align 4
scheduler_current rd NR_SCHED_QUEUES
endg
; Add the given thread to the given priority list for the scheduler.
; in: edx -> APPDATA, ecx = priority
proc scheduler_add_thread
; 1. Acquire the lock.
spin_lock_irqsave SchedulerLock
; 2. Store the priority in APPDATA structure.
mov [edx+APPDATA.priority], ecx
; 3. There are two different cases: the given list is empty or not empty.
; In first case, go to 6. Otherwise, advance to 4.
mov eax, [scheduler_current+ecx*4]
test eax, eax
jz .new_list
; 4. Insert the new item immediately before the current item.
mov ecx, [eax+APPDATA.in_schedule.prev]
mov [edx+APPDATA.in_schedule.next], eax
mov [edx+APPDATA.in_schedule.prev], ecx
mov [eax+APPDATA.in_schedule.prev], edx
mov [ecx+APPDATA.in_schedule.next], edx
; 5. Release the lock and return.
spin_unlock_irqrestore SchedulerLock
ret
.new_list:
; 6. Initialize the list with one item and make it the current item.
mov [edx+APPDATA.in_schedule.next], edx
mov [edx+APPDATA.in_schedule.prev], edx
mov [scheduler_current+ecx*4], edx
; 7. Release the lock and return.
spin_unlock_irqrestore SchedulerLock
ret
endp
; Remove the given thread from the corresponding priority list for the scheduler.
; in: edx -> APPDATA
proc scheduler_remove_thread
; 1. Acquire the lock.
spin_lock_irqsave SchedulerLock
; 2. Remove the item from the corresponding list.
mov eax, [edx+APPDATA.in_schedule.next]
mov ecx, [edx+APPDATA.in_schedule.prev]
mov [eax+APPDATA.in_schedule.prev], ecx
mov [ecx+APPDATA.in_schedule.next], eax
; 3. If the given thread is the current item in the list,
; advance the current item.
; 3a. Check whether the given thread is the current item;
; if no, skip the rest of this step.
mov ecx, [edx+APPDATA.priority]
cmp [scheduler_current+ecx*4], edx
jnz .return
; 3b. Set the current item to eax; step 2 has set eax = next item.
mov [scheduler_current+ecx*4], eax
; 3c. If there were only one item in the list, zero the current item.
cmp eax, edx
jnz .return
mov [scheduler_current+ecx*4], 0
.return:
; 4. Release the lock and return.
spin_unlock_irqrestore SchedulerLock
ret
endp
;info:
; Find next task to execute
;retval:
; ebx = address of the APPDATA for the selected task (slot-base)
; edi = address of the TASKDATA for the selected task
; ZF = 1 if the task is the same
;warning:
; [CURRENT_TASK] = bh , [TASK_BASE] = edi -- as result
; [current_slot] is not set to new value (ebx)!!!
;scratched: eax,ecx
proc find_next_task
call update_counters
spin_lock_irqsave SchedulerLock
xor ecx, ecx
.priority_loop:
mov ebx, [scheduler_current+ecx*4]
test ebx, ebx
jz .priority_next
.task_loop:
mov ebx, [ebx+APPDATA.in_schedule.next]
mov edi, ebx
shr edi, 3
add edi, CURRENT_TASK - (SLOT_BASE shr 3)
mov al, [edi+TASKDATA.state]
test al, al
jz .task_found ; state == 0
cmp al, 5
jne .task_next ; state == 1,2,3,4,9
; state == 5
pushad ; more freedom for [APPDATA.wait_test]
call [ebx+APPDATA.wait_test]
mov [esp+28], eax
popad
or eax, eax
jnz @f
; testing for timeout
mov eax, [timer_ticks]
sub eax, [ebx+APPDATA.wait_begin]
cmp eax, [ebx+APPDATA.wait_timeout]
jb .task_next
xor eax, eax
@@:
mov [ebx+APPDATA.wait_param], eax ; retval for wait
mov [edi+TASKDATA.state], 0
.task_found:
mov [scheduler_current+ecx*4], ebx
spin_unlock_irqrestore SchedulerLock
.found:
mov [CURRENT_TASK], bh
mov [TASK_BASE], edi
rdtsc ;call _rdtsc
mov [edi+TASKDATA.counter_add], eax; for next using update_counters
cmp ebx, [current_slot]
ret
.task_next:
cmp ebx, [scheduler_current+ecx*4]
jnz .task_loop
.priority_next:
inc ecx
cmp ecx, NR_SCHED_QUEUES
jb .priority_loop
hlt
jmp $-1
endp
if 0 if 0
struc TIMER struc TIMER
@ -316,13 +400,6 @@ struc TIMER
} }
MAX_PROIRITY 0 ; highest, used for kernel tasks
MAX_USER_PRIORITY 0 ; highest priority for user processes
USER_PRIORITY 7 ; default (should correspond to nice 0)
MIN_USER_PRIORITY 14 ; minimum priority for user processes
IDLE_PRIORITY 15 ; lowest, only IDLE process goes here
NR_SCHED_QUEUES 16 ; MUST equal IDLE_PRIORYTY + 1
uglobal uglobal
rdy_head rd 16 rdy_head rd 16
endg endg

View File

@ -159,6 +159,7 @@ exc_c: ;
call show_error_parameters ;; only ONE using, inline ??? call show_error_parameters ;; only ONE using, inline ???
;mov edx, [TASK_BASE] ;mov edx, [TASK_BASE]
mov [edx + TASKDATA.state], byte 4 ; terminate mov [edx + TASKDATA.state], byte 4 ; terminate
call wakeup_osloop
jmp change_task ; stack - here it does not matter at all, SEE: core/shed.inc jmp change_task ; stack - here it does not matter at all, SEE: core/shed.inc
.debug: .debug:
; we are debugged process, notify debugger and suspend ourself ; we are debugged process, notify debugger and suspend ourself
@ -261,36 +262,31 @@ show_error_parameters:
align 4 align 4
set_application_table_status: lock_application_table:
push eax push eax ecx edx
mov ecx, application_table_mutex
call mutex_lock
mov eax, [CURRENT_TASK] mov eax, [CURRENT_TASK]
shl eax, 5 shl eax, 5
add eax, CURRENT_TASK+TASKDATA.pid add eax, CURRENT_TASK+TASKDATA.pid
mov eax, [eax] mov eax, [eax]
mov [application_table_status], eax mov [application_table_owner], eax
pop eax pop edx ecx eax
ret ret
align 4 align 4
clear_application_table_status: unlock_application_table:
push eax push eax ecx edx
mov eax, [CURRENT_TASK] mov [application_table_owner], 0
shl eax, 5 mov ecx, application_table_mutex
add eax, CURRENT_TASK+TASKDATA.pid call mutex_unlock
mov eax, [eax]
cmp eax, [application_table_status] pop edx ecx eax
jne apptsl1
xor eax, eax
mov [application_table_status], eax
apptsl1:
pop eax
ret ret
@ -338,17 +334,11 @@ terminate: ; terminate application
mov [CURRENT_TASK+esi+TASKDATA.state], 9 mov [CURRENT_TASK+esi+TASKDATA.state], 9
ret ret
@@: @@:
lea edx, [SLOT_BASE+esi]
call scheduler_remove_thread
;mov esi,process_terminating ;mov esi,process_terminating
;call sys_msg_board_str ;call sys_msg_board_str
@@: call lock_application_table
cli
cmp [application_table_status], 0
je term9
sti
call change_task
jmp @b
term9:
call set_application_table_status
; if the process is in V86 mode... ; if the process is in V86 mode...
mov eax, [.slot] mov eax, [.slot]
@ -391,11 +381,11 @@ term9:
stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr] stdcall destroy_app_space, [SLOT_BASE+eax+APPDATA.dir_table], [SLOT_BASE+eax+APPDATA.dlls_list_ptr]
mov esi, [.slot] mov esi, [.slot]
cmp [fpu_owner], esi ; if user fpu last -> fpu user = 1 cmp [fpu_owner], esi ; if user fpu last -> fpu user = 2
jne @F jne @F
mov [fpu_owner], 1 mov [fpu_owner], 2
mov eax, [256+SLOT_BASE+APPDATA.fpu_state] mov eax, [256*2+SLOT_BASE+APPDATA.fpu_state]
clts clts
bt [cpu_caps], CAPS_SSE bt [cpu_caps], CAPS_SSE
jnc .no_SSE jnc .no_SSE
@ -688,7 +678,7 @@ term9:
mov [MOUSE_BACKGROUND], byte 0; no mouse background mov [MOUSE_BACKGROUND], byte 0; no mouse background
mov [DONT_DRAW_MOUSE], byte 0; draw mouse mov [DONT_DRAW_MOUSE], byte 0; draw mouse
and [application_table_status], 0 call unlock_application_table
;mov esi,process_terminated ;mov esi,process_terminated
;call sys_msg_board_str ;call sys_msg_board_str
add esp, 4 add esp, 4

View File

@ -90,7 +90,7 @@ proc fs_execute
stdcall set_cursor, [def_cursor_clock] stdcall set_cursor, [def_cursor_clock]
mov [handle], eax mov [handle], eax
mov [redrawmouse_unconditional], 1 mov [redrawmouse_unconditional], 1
call __sys_draw_pointer call wakeup_osloop
popad popad
@@: @@:
mov [flags], edx mov [flags], edx
@ -152,19 +152,7 @@ proc fs_execute
test eax, eax test eax, eax
jz .err_hdr jz .err_hdr
.wait_lock: call lock_application_table
cmp [application_table_status], 0
je .get_lock
call change_task
jmp .wait_lock
.get_lock:
mov eax, 1
xchg eax, [application_table_status]
test eax, eax
jnz .wait_lock
call set_application_table_status
call get_new_process_place call get_new_process_place
test eax, eax test eax, eax
@ -246,9 +234,8 @@ end if
mov eax, [save_cr3] mov eax, [save_cr3]
call set_cr3 call set_cr3
xor ebx, ebx
mov [application_table_status], ebx;unlock application_table_status mutex
mov eax, [process_number];set result mov eax, [process_number];set result
call unlock_application_table
jmp .final jmp .final
@ -259,8 +246,7 @@ end if
.err_hdr: .err_hdr:
stdcall kernel_free, [file_base] stdcall kernel_free, [file_base]
.err_file: .err_file:
xor eax, eax call unlock_application_table
mov [application_table_status], eax
mov eax, esi mov eax, esi
.final: .final:
cmp [SCR_MODE], word 0x13 cmp [SCR_MODE], word 0x13
@ -268,7 +254,7 @@ end if
pushad pushad
stdcall set_cursor, [handle] stdcall set_cursor, [handle]
mov [redrawmouse_unconditional], 1 mov [redrawmouse_unconditional], 1
call __sys_draw_pointer call wakeup_osloop
popad popad
@@: @@:
ret ret
@ -898,19 +884,7 @@ proc new_sys_threads
mov [app_path], eax mov [app_path], eax
;mov esi,new_process_loading ;mov esi,new_process_loading
;call sys_msg_board_str ;call sys_msg_board_str
.wait_lock: call lock_application_table
cmp [application_table_status], 0
je .get_lock
call change_task
jmp .wait_lock
.get_lock:
mov eax, 1
xchg eax, [application_table_status]
test eax, eax
jnz .wait_lock
call set_application_table_status
call get_new_process_place call get_new_process_place
test eax, eax test eax, eax
@ -967,14 +941,13 @@ proc new_sys_threads
;mov esi,new_process_running ;mov esi,new_process_running
;call sys_msg_board_str ;output information about succefull startup ;call sys_msg_board_str ;output information about succefull startup
xor eax, eax
mov [application_table_status], eax ;unlock application_table_status mutex
mov eax, [process_number] ;set result mov eax, [process_number] ;set result
call unlock_application_table
ret ret
.failed: .failed:
xor eax, eax xor eax, eax
.failed1: .failed1:
mov [application_table_status], eax call unlock_application_table
dec eax ;-1 dec eax ;-1
ret ret
endp endp
@ -1148,6 +1121,7 @@ proc set_app_params stdcall,slot:dword, params:dword,\
mov eax, [esi+0x08] ;app_eip mov eax, [esi+0x08] ;app_eip
mov [ebx+REG_EIP], eax;app_entry mov [ebx+REG_EIP], eax;app_entry
mov [ebx+REG_CS], dword app_code mov [ebx+REG_CS], dword app_code
mov ecx, USER_PRIORITY
mov eax, [CURRENT_TASK] mov eax, [CURRENT_TASK]
shl eax, 8 ; created by kernel? shl eax, 8 ; created by kernel?
cmp [SLOT_BASE+eax+APPDATA.dir_table], sys_pgdir - OS_BASE cmp [SLOT_BASE+eax+APPDATA.dir_table], sys_pgdir - OS_BASE
@ -1155,6 +1129,7 @@ proc set_app_params stdcall,slot:dword, params:dword,\
cmp [app_path], 0 ; it is a thread? cmp [app_path], 0 ; it is a thread?
jnz @f jnz @f
mov [ebx+REG_CS], dword os_code ; kernel thread mov [ebx+REG_CS], dword os_code ; kernel thread
mov ecx, MAX_PRIORITY
@@: @@:
mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF
@ -1162,20 +1137,22 @@ proc set_app_params stdcall,slot:dword, params:dword,\
mov [ebx+REG_APP_ESP], eax;app_stack mov [ebx+REG_APP_ESP], eax;app_stack
mov [ebx+REG_SS], dword app_data mov [ebx+REG_SS], dword app_data
lea ecx, [ebx+REG_RET] lea edx, [ebx+REG_RET]
mov ebx, [slot] mov ebx, [slot]
shl ebx, 5 shl ebx, 5
mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], edx
xor ecx, ecx; process state - running xor edx, edx; process state - running
; set if debuggee ; set if debuggee
test byte [flags], 1 test byte [flags], 1
jz .no_debug jz .no_debug
inc ecx ; process state - suspended inc edx ; process state - suspended
mov eax, [CURRENT_TASK] mov eax, [CURRENT_TASK]
mov [SLOT_BASE+ebx*8+APPDATA.debugger_slot], eax mov [SLOT_BASE+ebx*8+APPDATA.debugger_slot], eax
.no_debug: .no_debug:
mov [CURRENT_TASK+ebx+TASKDATA.state], cl mov [CURRENT_TASK+ebx+TASKDATA.state], dl
lea edx, [SLOT_BASE+ebx*8]
call scheduler_add_thread
;mov esi,new_process_running ;mov esi,new_process_running
;call sys_msg_board_str ;output information about succefull startup ;call sys_msg_board_str ;output information about succefull startup
ret ret

View File

@ -203,3 +203,28 @@ check_timers:
call unlock_timer_list call unlock_timer_list
; 4. Return. ; 4. Return.
ret ret
; This is a simplified version of check_timers that does not call anything,
; just checks whether check_timers should do something.
proc check_timers_has_work?
pushf
cli
mov eax, [timer_list+TIMER.Next]
.loop:
cmp eax, timer_list
jz .done_nowork
mov edx, [timer_ticks]
sub edx, [eax+TIMER.Time]
jns .done_haswork
mov eax, [eax+TIMER.Next]
jmp .loop
.done_nowork:
popf
xor eax, eax
ret
.done_haswork:
popf
xor eax, eax
inc eax
ret
endp

View File

@ -397,7 +397,8 @@ current_slot rd 1
; status ; status
hd1_status rd 1 ; 0 - free : other - pid hd1_status rd 1 ; 0 - free : other - pid
application_table_status rd 1 ; 0 - free : other - pid application_table_owner rd 1 ; 0 - free : other - pid
application_table_mutex MUTEX
; device addresses ; device addresses
mididp rd 1 mididp rd 1

View File

@ -165,7 +165,6 @@ raise_event: ;; EXPORT use
; esi - event data (=0 => skip) ; esi - event data (=0 => skip)
;scratched: ebx,ecx,esi,edi ;scratched: ebx,ecx,esi,edi
call NotDummyTest ; not returned for fail !!! call NotDummyTest ; not returned for fail !!!
mov [check_idle_semaphore], 5
or esi, esi or esi, esi
jz @f jz @f
lea edi, [ebx+EVENT.code] lea edi, [ebx+EVENT.code]
@ -590,6 +589,7 @@ align 4
cmp edx, 0xFFFF ;-ID for Minimize-Button of Form cmp edx, 0xFFFF ;-ID for Minimize-Button of Form
jne .result jne .result
mov [window_minimize], 1 mov [window_minimize], 1
call wakeup_osloop
dec byte[BTN_COUNT] dec byte[BTN_COUNT]
jmp .loop jmp .loop
;-------------------------------------- ;--------------------------------------

View File

@ -1629,6 +1629,7 @@ window._.sys_set_window: ;/////////////////////////////////////////////////////
; Otherwise the user can see cursor specified by f.37.5 from another window. ; Otherwise the user can see cursor specified by f.37.5 from another window.
; He will be really unhappy! He is terrible in rage - usually he throws stones! ; He will be really unhappy! He is terrible in rage - usually he throws stones!
mov [redrawmouse_unconditional], 1 mov [redrawmouse_unconditional], 1
call wakeup_osloop
; NOTE: commented out since doesn't provide necessary functionality ; NOTE: commented out since doesn't provide necessary functionality
; anyway, to be reworked ; anyway, to be reworked
; mov eax, [timer_ticks] ; [0xfdf0] ; mov eax, [timer_ticks] ; [0xfdf0]

View File

@ -339,6 +339,7 @@ send_scancode:
jne .noctrlaltdel jne .noctrlaltdel
mov [ctrl_alt_del], 1 mov [ctrl_alt_del], 1
call wakeup_osloop
.noctrlaltdel: .noctrlaltdel:
test dl, VKEY_CONTROL ; ctrl on ? test dl, VKEY_CONTROL ; ctrl on ?
jz @f jz @f
@ -490,7 +491,6 @@ send_scancode:
mov [KEY_COUNT], al mov [KEY_COUNT], al
mov [KEY_COUNT+eax], bl mov [KEY_COUNT+eax], bl
.exit.irq1: .exit.irq1:
mov [check_idle_semaphore], 5
ret ret
;--------------------------------------------------------------------- ;---------------------------------------------------------------------
set_lights: set_lights:
@ -526,9 +526,14 @@ ps2_set_lights:
ret 8 ret 8
;// mike.dld ] ;// mike.dld ]
check_lights_state: proc check_lights_state_has_work?
mov al, [kb_lights] mov al, [kb_lights]
cmp al, [old_kb_lights] cmp al, [old_kb_lights]
ret
endp
check_lights_state:
call check_lights_state_has_work?
jz .nothing jz .nothing
mov [old_kb_lights], al mov [old_kb_lights], al
call set_lights call set_lights

View File

@ -531,6 +531,7 @@ align 4
mov [mouse_active], 1 mov [mouse_active], 1
mov eax, [timer_ticks] mov eax, [timer_ticks]
mov [mouse_timer_ticks], eax mov [mouse_timer_ticks], eax
call wakeup_osloop
ret ret
endp endp
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------

View File

@ -348,6 +348,9 @@ high_code:
mov ecx, unpack_mutex mov ecx, unpack_mutex
call mutex_init call mutex_init
mov ecx, application_table_mutex
call mutex_init
; SAVE REAL MODE VARIABLES ; SAVE REAL MODE VARIABLES
mov ax, [BOOT_VAR + BOOT_IDE_BASE_ADDR] mov ax, [BOOT_VAR + BOOT_IDE_BASE_ADDR]
mov [IDEContrRegsBaseAddr], ax mov [IDEContrRegsBaseAddr], ax
@ -523,7 +526,7 @@ no_mode_0x12:
;lidt [idtreg] ;lidt [idtreg]
call init_kernel_heap call init_kernel_heap
stdcall kernel_alloc, RING0_STACK_SIZE+512 stdcall kernel_alloc, (RING0_STACK_SIZE+512) * 2
mov [os_stack_seg], eax mov [os_stack_seg], eax
lea esp, [eax+RING0_STACK_SIZE] lea esp, [eax+RING0_STACK_SIZE]
@ -603,10 +606,6 @@ no_mode_0x12:
xor eax, eax xor eax, eax
inc eax inc eax
mov [CURRENT_TASK], eax ;dword 1
mov [TASK_COUNT], eax ;dword 1
mov [TASK_BASE], dword TASK_DATA
mov [current_slot], SLOT_BASE+256
; set background ; set background
@ -621,48 +620,28 @@ no_mode_0x12:
mov esi, boot_setostask mov esi, boot_setostask
call boot_log call boot_log
xor eax, eax mov edx, SLOT_BASE+256
mov dword [SLOT_BASE+APPDATA.fpu_state], fpu_data mov ebx, [os_stack_seg]
mov dword [SLOT_BASE+APPDATA.exc_handler], eax add ebx, 0x2000
mov dword [SLOT_BASE+APPDATA.except_mask], eax call setup_os_slot
mov dword [edx], 'IDLE'
sub [edx+APPDATA.saved_esp], 4
mov eax, [edx+APPDATA.saved_esp]
mov dword [eax], idle_thread
mov ecx, IDLE_PRIORITY
call scheduler_add_thread
; name for OS/IDLE process mov edx, SLOT_BASE+256*2
mov ebx, [os_stack_seg]
call setup_os_slot
mov dword [edx], 'OS'
xor ecx, ecx
call scheduler_add_thread
mov dword [SLOT_BASE+256+APPDATA.app_name], dword 'OS/I' mov dword [CURRENT_TASK], 2
mov dword [SLOT_BASE+256+APPDATA.app_name+4], dword 'DLE ' mov dword [TASK_COUNT], 2
mov edi, [os_stack_seg] mov dword [current_slot], SLOT_BASE + 256*2
mov dword [SLOT_BASE+256+APPDATA.pl0_stack], edi mov dword [TASK_BASE], CURRENT_TASK + 32*2
add edi, 0x2000-512
mov dword [SLOT_BASE+256+APPDATA.fpu_state], edi
mov dword [SLOT_BASE+256+APPDATA.saved_esp0], edi; just for case
mov dword [SLOT_BASE+256+APPDATA.terminate_protection], 80000001h
mov esi, fpu_data
mov ecx, 512/4
cld
rep movsd
mov dword [SLOT_BASE+256+APPDATA.exc_handler], eax
mov dword [SLOT_BASE+256+APPDATA.except_mask], eax
mov ebx, SLOT_BASE+256+APP_OBJ_OFFSET
mov dword [SLOT_BASE+256+APPDATA.fd_obj], ebx
mov dword [SLOT_BASE+256+APPDATA.bk_obj], ebx
mov dword [SLOT_BASE+256+APPDATA.cur_dir], sysdir_path
mov dword [SLOT_BASE+256+APPDATA.tls_base], eax
; task list
mov dword [TASK_DATA+TASKDATA.mem_start], eax; process base address
inc eax
mov dword [CURRENT_TASK], eax
mov dword [TASK_COUNT], eax
mov [current_slot], SLOT_BASE+256
mov [TASK_BASE], dword TASK_DATA
mov byte[TASK_DATA+TASKDATA.wnd_number], al ; on screen number
mov dword [TASK_DATA+TASKDATA.pid], eax ; process id number
mov [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE
stdcall kernel_alloc, 0x10000/8 stdcall kernel_alloc, 0x10000/8
mov edi, eax mov edi, eax
@ -828,8 +807,8 @@ end if
call init_display call init_display
mov eax, [def_cursor] mov eax, [def_cursor]
mov [SLOT_BASE+APPDATA.cursor], eax
mov [SLOT_BASE+APPDATA.cursor+256], eax mov [SLOT_BASE+APPDATA.cursor+256], eax
mov [SLOT_BASE+APPDATA.cursor+256*2], eax
; PRINT CPU FREQUENCY ; PRINT CPU FREQUENCY
@ -947,10 +926,6 @@ first_app_found:
cli cli
;mov [TASK_COUNT],dword 2
push 1
pop dword [CURRENT_TASK] ; set OS task fisrt
; SET KEYBOARD PARAMETERS ; SET KEYBOARD PARAMETERS
mov al, 0xf6 ; reset keyboard, scan enabled mov al, 0xf6 ; reset keyboard, scan enabled
call kb_write call kb_write
@ -1068,7 +1043,7 @@ end if
mov [timer_ticks_enable], 1 ; for cd driver mov [timer_ticks_enable], 1 ; for cd driver
sti sti
call change_task ; call change_task
jmp osloop jmp osloop
@ -1097,6 +1072,43 @@ boot_log:
ret ret
; in: edx -> APPDATA for OS/IDLE slot
; in: ebx = stack base
proc setup_os_slot
xor eax, eax
mov ecx, 256/4
mov edi, edx
rep stosd
mov dword [edx+APPDATA.pl0_stack], ebx
lea edi, [ebx+0x2000-512]
mov dword [edx+APPDATA.fpu_state], edi
mov dword [edx+APPDATA.saved_esp0], edi
mov dword [edx+APPDATA.saved_esp], edi
mov dword [edx+APPDATA.terminate_protection], 1 ; make unkillable
mov esi, fpu_data
mov ecx, 512/4
cld
rep movsd
lea eax, [edx+APP_OBJ_OFFSET]
mov dword [edx+APPDATA.fd_obj], eax
mov dword [edx+APPDATA.bk_obj], eax
mov dword [edx+APPDATA.cur_dir], sysdir_path
mov [edx + APPDATA.dir_table], sys_pgdir - OS_BASE
mov eax, edx
shr eax, 3
add eax, CURRENT_TASK - (SLOT_BASE shr 3)
mov [eax+TASKDATA.wnd_number], dh
mov byte [eax+TASKDATA.pid], dh
ret
endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ; ; ;
; MAIN OS LOOP START ; ; MAIN OS LOOP START ;
@ -1104,14 +1116,21 @@ boot_log:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 32 align 32
osloop: osloop:
mov edx, osloop_has_work?
xor ecx, ecx
call Wait_events
xor eax, eax
xchg eax, [osloop_nonperiodic_work]
test eax, eax
jz .no_periodic
; call [draw_pointer] ; call [draw_pointer]
call __sys_draw_pointer call __sys_draw_pointer
call window_check_events call window_check_events
call mouse_check_events call mouse_check_events
call checkmisc call checkmisc
call checkVga_N13 call checkVga_N13
.no_periodic:
call stack_handler call stack_handler
call checkidle
call check_fdd_motor_status call check_fdd_motor_status
call check_ATAPI_device_event call check_ATAPI_device_event
call check_lights_state call check_lights_state
@ -1122,37 +1141,45 @@ osloop:
; MAIN OS LOOP END ; ; MAIN OS LOOP END ;
; ; ; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
align 4 proc osloop_has_work?
checkidle: cmp [osloop_nonperiodic_work], 0
pushad jnz .yes
call change_task call stack_handler_has_work?
jmp idle_loop_entry jnz .yes
idle_loop: call check_fdd_motor_status_has_work?
cmp eax, [idlemem] ; eax == [timer_ticks] jnz .yes
jne idle_exit call check_ATAPI_device_event_has_work?
rdtsc ;call _rdtsc jnz .yes
mov ecx, eax call check_lights_state_has_work?
hlt jnz .yes
rdtsc ;call _rdtsc call check_timers_has_work?
sub eax, ecx jnz .yes
add [idleuse], eax .no:
idle_loop_entry: xor eax, eax
mov eax, [timer_ticks]; eax = [timer_ticks]
cmp [check_idle_semaphore], 0
je idle_loop
dec [check_idle_semaphore]
idle_exit:
mov [idlemem], eax ; eax == [timer_ticks]
popad
ret ret
.yes:
xor eax, eax
inc eax
ret
endp
proc wakeup_osloop
mov [osloop_nonperiodic_work], 1
ret
endp
uglobal uglobal
idlemem dd 0x0 align 4
idleuse dd 0x0 osloop_nonperiodic_work dd ?
idleusesec dd 0x0
check_idle_semaphore dd 0x0
endg endg
align 4
idle_thread:
sti
idle_loop:
hlt
jmp idle_loop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -1200,7 +1227,7 @@ reserve_irqs_ports:
iglobal iglobal
process_number dd 0x1 process_number dd 0x2
endg endg
set_variables: set_variables:
@ -1217,6 +1244,7 @@ set_variables:
mov ax, [BOOT_VAR+BOOT_X_RES] mov ax, [BOOT_VAR+BOOT_X_RES]
shr ax, 1 shr ax, 1
mov [MOUSE_X], eax mov [MOUSE_X], eax
call wakeup_osloop
xor eax, eax xor eax, eax
mov [BTN_ADDR], dword BUTTON_INFO ; address of button list mov [BTN_ADDR], dword BUTTON_INFO ; address of button list
@ -2007,6 +2035,7 @@ sys_end:
mov eax, [TASK_BASE] mov eax, [TASK_BASE]
mov [eax+TASKDATA.state], 3; terminate this program mov [eax+TASKDATA.state], 3; terminate this program
call wakeup_osloop
waitterm: ; wait here for termination waitterm: ; wait here for termination
mov ebx, 100 mov ebx, 100
@ -2040,6 +2069,7 @@ restore_default_cursor_before_killing:
mov [current_cursor], esi mov [current_cursor], esi
@@: @@:
mov [redrawmouse_unconditional], 1 mov [redrawmouse_unconditional], 1
call wakeup_osloop
popfd popfd
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -2092,6 +2122,7 @@ sysfn_shutdown: ; 18.9 = system shutdown
mov eax, [TASK_COUNT] mov eax, [TASK_COUNT]
mov [SYS_SHUTDOWN], al mov [SYS_SHUTDOWN], al
mov [shutdown_processes], eax mov [shutdown_processes], eax
call wakeup_osloop
and dword [esp+32], 0 and dword [esp+32], 0
exit_for_anyone: exit_for_anyone:
ret ret
@ -2137,11 +2168,12 @@ sysfn_terminate: ; 18.2 = TERMINATE
;-------------------------------------- ;--------------------------------------
;call MEM_Heap_Lock ;guarantee that process isn't working with heap ;call MEM_Heap_Lock ;guarantee that process isn't working with heap
mov [ecx], byte 3; clear possible i40's mov [ecx], byte 3; clear possible i40's
call wakeup_osloop
;call MEM_Heap_UnLock ;call MEM_Heap_UnLock
cmp edx, [application_table_status]; clear app table stat cmp edx, [application_table_owner]; clear app table stat
jne noatsc jne noatsc
and [application_table_status], 0 call unlock_application_table
noatsc: noatsc:
noprocessterminate: noprocessterminate:
add esp, 4 add esp, 4
@ -2150,14 +2182,7 @@ noprocessterminate:
sysfn_terminate2: sysfn_terminate2:
;lock application_table_status mutex ;lock application_table_status mutex
.table_status: .table_status:
cli call lock_application_table
cmp [application_table_status], 0
je .stf
sti
call change_task
jmp .table_status
.stf:
call set_application_table_status
mov eax, ecx mov eax, ecx
call pid_to_slot call pid_to_slot
test eax, eax test eax, eax
@ -2165,12 +2190,12 @@ sysfn_terminate2:
mov ecx, eax mov ecx, eax
cli cli
call sysfn_terminate call sysfn_terminate
and [application_table_status], 0 call unlock_application_table
sti sti
and dword [esp+32], 0 and dword [esp+32], 0
ret ret
.not_found: .not_found:
mov [application_table_status], 0 call unlock_application_table
or dword [esp+32], -1 or dword [esp+32], -1
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -2219,6 +2244,7 @@ sysfn_activate: ; 18.3 = ACTIVATE WINDOW
@@: @@:
;------------------------------------- ;-------------------------------------
mov [window_minimize], 2; restore window if minimized mov [window_minimize], 2; restore window if minimized
call wakeup_osloop
movzx esi, word [WIN_STACK + ecx*2] movzx esi, word [WIN_STACK + ecx*2]
cmp esi, [TASK_COUNT] cmp esi, [TASK_COUNT]
@ -2234,7 +2260,7 @@ sysfn_activate: ; 18.3 = ACTIVATE WINDOW
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
sysfn_getidletime: ; 18.4 = GET IDLETIME sysfn_getidletime: ; 18.4 = GET IDLETIME
mov eax, [idleusesec] mov eax, [CURRENT_TASK+32+TASKDATA.cpu_usage]
mov [esp+32], eax mov [esp+32], eax
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -2276,6 +2302,7 @@ sysfn_sound_flag: ; 18.8 = get/set sound_flag
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
sysfn_minimize: ; 18.10 = minimize window sysfn_minimize: ; 18.10 = minimize window
mov [window_minimize], 1 mov [window_minimize], 1
call wakeup_osloop
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
align 4 align 4
@ -2338,6 +2365,7 @@ sysfn_centermouse: ; 18.15 = mouse centered
mov eax, [Screen_Max_Y] mov eax, [Screen_Max_Y]
shr eax, 1 shr eax, 1
mov [MOUSE_Y], ax mov [MOUSE_Y], ax
call wakeup_osloop
; ret ; ret
;* mouse centered - end code- Mario79 ;* mouse centered - end code- Mario79
xor eax, eax xor eax, eax
@ -2382,6 +2410,7 @@ sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
cmp dx, word[Screen_Max_X] cmp dx, word[Screen_Max_X]
ja .end ja .end
mov [MOUSE_X], edx mov [MOUSE_X], edx
call wakeup_osloop
ret ret
.set_mouse_button: .set_mouse_button:
; cmp ecx,5 ; set mouse button features ; cmp ecx,5 ; set mouse button features
@ -2389,6 +2418,7 @@ sysfn_mouse_acceleration: ; 18.19 = set/get mouse features
jnz .end jnz .end
mov [BTN_DOWN], dl mov [BTN_DOWN], dl
mov [mouse_active], 1 mov [mouse_active], 1
call wakeup_osloop
.end: .end:
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
@ -2848,6 +2878,7 @@ nosb8:
mov [draw_data+32 + RECT.bottom], edx mov [draw_data+32 + RECT.bottom], edx
inc byte[REDRAW_BACKGROUND] inc byte[REDRAW_BACKGROUND]
call wakeup_osloop
;-------------------------------------- ;--------------------------------------
align 4 align 4
.exit: .exit:
@ -2874,6 +2905,7 @@ force_redraw_background:
mov [draw_data+32 + RECT.bottom], ebx mov [draw_data+32 + RECT.bottom], ebx
pop ebx eax pop ebx eax
inc byte[REDRAW_BACKGROUND] inc byte[REDRAW_BACKGROUND]
call wakeup_osloop
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
align 4 align 4
@ -3532,6 +3564,7 @@ markz:
@@: @@:
add edx, 0x20 add edx, 0x20
loop markz loop markz
call wakeup_osloop
;-------------------------------------- ;--------------------------------------
align 4 align 4
@@: @@:
@ -3683,6 +3716,7 @@ align 4
align 4 align 4
@@: @@:
add byte[REDRAW_BACKGROUND], dl add byte[REDRAW_BACKGROUND], dl
call wakeup_osloop
jmp newdw8 jmp newdw8
;-------------------------------------- ;--------------------------------------
align 4 align 4
@ -3704,6 +3738,7 @@ align 4
cmp dword [esp], 1 cmp dword [esp], 1
jne nobgrd jne nobgrd
inc byte[REDRAW_BACKGROUND] inc byte[REDRAW_BACKGROUND]
call wakeup_osloop
;-------------------------------------- ;--------------------------------------
align 4 align 4
newdw8: newdw8:
@ -4697,11 +4732,17 @@ endg
jbe @f jbe @f
mov word [msg_board_pos], 10 mov word [msg_board_pos], 10
@@: @@:
end if
if 0
pusha
mov al, bl
mov edx, 402h
out dx, al
popa
end if end if
inc ecx inc ecx
and ecx, msg_board_data_size - 1 and ecx, msg_board_data_size - 1
mov [msg_board_count], ecx mov [msg_board_count], ecx
mov [check_idle_semaphore], 5
ret ret
.smbl1: .smbl1:
cmp eax, 2 cmp eax, 2

View File

@ -132,19 +132,21 @@ struct APPDATA
wnd_shape_scale dd ? ;+132 wnd_shape_scale dd ? ;+132
dd ? ;+136 dd ? ;+136
mem_size dd ? ;+140 mem_size dd ? ;+140
saved_box BOX saved_box BOX ;+144
ipc_start dd ? ipc_start dd ? ;+160
ipc_size dd ? ipc_size dd ? ;+164
event_mask dd ? event_mask dd ? ;+168
debugger_slot dd ? debugger_slot dd ? ;+172
terminate_protection dd ? terminate_protection dd ? ;+176
keyboard_mode db ? keyboard_mode db ? ;+180
rb 3 rb 3
dir_table dd ? dir_table dd ? ;+184
dbg_event_mem dd ? dbg_event_mem dd ? ;+188
dbg_regs DBG_REGS dbg_regs DBG_REGS ;+192
wnd_caption dd ? wnd_caption dd ? ;+212
wnd_clientbox BOX wnd_clientbox BOX ;+216
priority dd ? ;+232
in_schedule LHEAD ;+236
ends ends

View File

@ -191,6 +191,12 @@ stack_init:
mov [last_1sTick], al mov [last_1sTick], al
ret ret
; Wakeup every tick.
proc stack_handler_has_work?
mov eax, [timer_ticks]
cmp eax, [last_1hsTick]
ret
endp
;*************************************************************************** ;***************************************************************************

View File

@ -146,8 +146,6 @@ proc udp_rx stdcall
shl ecx, 8 shl ecx, 8
or [ecx + SLOT_BASE + APPDATA.event_mask], EVENT_NETWORK ; stack event or [ecx + SLOT_BASE + APPDATA.event_mask], EVENT_NETWORK ; stack event
mov [check_idle_semaphore], 200
.exit: .exit:
pop eax pop eax
call freeBuff ; Discard the packet call freeBuff ; Discard the packet