1. Edit procedure check exception 12 (overflow stack)
2. Edit func 68,24 3. Add proc "control exception" 4. Add subfuncs func 51 (GetPriorityThread, SetPriorityThread,GetCurrentThreadId) 5. Add info in ReferenceFunc(rus) git-svn-id: svn://kolibrios.org@10002 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ecdf48270f
commit
5eb750c289
@ -511,7 +511,7 @@ struct APPDATA
|
||||
exc_handler dd ? ;+32
|
||||
except_mask dd ? ;+36
|
||||
pl0_stack dd ? ;+40
|
||||
dd ? ;+44
|
||||
exc_reserve_stack dd ? ;+44
|
||||
fd_ev dd ? ;+48
|
||||
bk_ev dd ? ;+52
|
||||
fd_obj dd ? ;+56
|
||||
@ -528,7 +528,9 @@ struct APPDATA
|
||||
tls_base dd ? ;+104
|
||||
event_mask dd ? ;+108 stores event types allowed for task
|
||||
tid dd ? ;+112 thread id
|
||||
dd ? ;+116
|
||||
def_priority db ? ;+116
|
||||
cur_priority db ? ;+117
|
||||
dw ? ;+118
|
||||
dd ? ;+120
|
||||
state db ? ;+124 thread state
|
||||
wnd_number db ? ;+125
|
||||
@ -590,6 +592,8 @@ ZPOS_ALWAYS_BACK = -1
|
||||
ZPOS_NORMAL = 0
|
||||
ZPOS_ALWAYS_TOP = 1 ;ZPOS_ALWAYS_TOP is always last and has max number!
|
||||
|
||||
CONTROL_EXCEPTION = 'EXPT'
|
||||
|
||||
; Window structure:
|
||||
struct WDATA
|
||||
box BOX
|
||||
|
@ -1177,6 +1177,7 @@ f68:
|
||||
mov eax, [current_slot]
|
||||
xchg ecx, [eax + APPDATA.exc_handler]
|
||||
xchg edx, [eax + APPDATA.except_mask]
|
||||
xchg esi, [eax + APPDATA.exc_reserve_stack]
|
||||
mov [esp + SYSCALL_STACK.ebx], edx
|
||||
mov [esp + SYSCALL_STACK.eax], ecx
|
||||
ret
|
||||
|
@ -307,6 +307,13 @@ proc find_next_task
|
||||
mov [ebx + APPDATA.wait_param], eax ; retval for wait
|
||||
mov [ebx + APPDATA.state], TSTATE_RUNNING
|
||||
.task_found:
|
||||
mov dl, [ebx + APPDATA.def_priority]
|
||||
test dl, dl
|
||||
jz .no_local_priority
|
||||
dec [ebx + APPDATA.cur_priority]
|
||||
jnz .task_next
|
||||
xchg [ebx + APPDATA.cur_priority], dl
|
||||
.no_local_priority:
|
||||
mov [scheduler_current+ecx*4], ebx
|
||||
; If we have selected a thread with higher priority
|
||||
; AND rescheduling is due to IRQ,
|
||||
|
@ -114,6 +114,18 @@ endg
|
||||
|
||||
page_fault_exc: ; foolproof: selectors are clobbered ...
|
||||
pop [ss:pf_err_code] ; actually, until the next #PF
|
||||
|
||||
cmp edi, CONTROL_EXCEPTION ; equ 'EXPT'
|
||||
jne .no_ctrl_exc
|
||||
bt dword [esp], 31
|
||||
jc .setret
|
||||
test esi, esi
|
||||
jl .no_ctrl_exc
|
||||
.setret:
|
||||
mov [esp], esi
|
||||
iret
|
||||
|
||||
.no_ctrl_exc:
|
||||
save_ring3_context
|
||||
mov bl, 14
|
||||
|
||||
@ -211,8 +223,7 @@ IRetToUserHook:
|
||||
add ecx, 1000h
|
||||
jl .nostack
|
||||
.ex_stack:
|
||||
xor ecx, ecx
|
||||
mov ecx, [ecx+APP_HEADER_01_.except_stack_top]
|
||||
mov ecx, [esi+APPDATA.exc_reserve_stack]
|
||||
test ecx, ecx
|
||||
jle .nostack
|
||||
xchg edi, eax
|
||||
|
@ -28,7 +28,6 @@ struct APP_HEADER_01_
|
||||
stack_top dd ? ;+24
|
||||
i_param dd ? ;+28
|
||||
i_icon dd ? ;+32
|
||||
except_stack_top dd ? ;+36
|
||||
ends
|
||||
|
||||
struct APP_HDR
|
||||
@ -1009,6 +1008,7 @@ proc set_app_params stdcall,slot:dword, params:dword, flags:dword
|
||||
|
||||
;set draw data to full screen
|
||||
xor eax, eax
|
||||
mov [SLOT_BASE + ebx + APPDATA.def_priority], al
|
||||
mov [ecx + WDATA.draw_data.left], eax
|
||||
mov [ecx + WDATA.draw_data.top], eax
|
||||
mov eax, [screen_workarea.right]
|
||||
|
@ -2550,11 +2550,12 @@ dword-значение цвета 0x00RRGGBB
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_SET_WINDOW_SHAPE (50)
|
||||
======================================================================
|
||||
===================== Функция 51 - создать поток. ====================
|
||||
===================== Функция 51, подфункция 1 =======================
|
||||
========================== Создать поток =============================
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 51 - номер функции
|
||||
* ebx = 1 - единственная подфункция
|
||||
* ebx = 1 - номер подфункции
|
||||
* ecx = адрес точки входа потока (начальный eip)
|
||||
* edx = указатель стэка потока (начальный esp)
|
||||
Возвращаемое значение:
|
||||
@ -2564,6 +2565,47 @@ dword-значение цвета 0x00RRGGBB
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_CREATE_THREAD (51)
|
||||
======================================================================
|
||||
===================== Функция 51, подфункция 2 =======================
|
||||
=================== Получить номер слота потока ======================
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 51 - номер функции
|
||||
* ebx = 2 - номер подфункции
|
||||
Возвращаемое значение:
|
||||
* eax = номер слота потока
|
||||
|
||||
======================================================================
|
||||
===================== Функция 51, подфункция 3 =======================
|
||||
==================== Получить приоритет потока =======================
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 51 - номер функции
|
||||
* ebx = 3 - номер подфункции
|
||||
* ecx = номер слота потока или -1 (текущий поток)
|
||||
Возвращаемое значение:
|
||||
* eax = -1 - ошибка (неверный номер слота потока или поток завершен)
|
||||
* иначе eax = номер приоритета потока
|
||||
Замечания:
|
||||
* Приоритет потока имеет диапазон значений от 0 до 255.
|
||||
Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
|
||||
|
||||
======================================================================
|
||||
===================== Функция 51, подфункция 4 =======================
|
||||
=================== Установить приоритет потока ======================
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 51 - номер функции
|
||||
* ebx = 4 - номер подфункции
|
||||
* ecx = номер слота потока или -1 (текущий поток)
|
||||
* edx = приоритет потока
|
||||
Возвращаемое значение:
|
||||
* eax = -1 - ошибка (неверный номер слота потока или поток завершен)
|
||||
* иначе eax = старое значение приоритета потока
|
||||
Замечания:
|
||||
* Приоритет потока имеет диапазон значений от 0 до 255.
|
||||
Значение 0 - наивысший приоритет потока, устанавливаемый по умолчанию при создании потока.
|
||||
|
||||
======================================================================
|
||||
====================== Функция 54, подфункция 0 ======================
|
||||
============== Узнать количество слотов в буфере обмена. =============
|
||||
======================================================================
|
||||
@ -3599,9 +3641,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
|
||||
|
||||
Внимание:
|
||||
Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_ taskman.inc).
|
||||
В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
|
||||
Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
|
||||
1) Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен стартовый адрес резервного стека в регистре ESI.
|
||||
При возникновении исключения (#SS), в этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
|
||||
При завершении обработки этого исключения, пользовательский обработчик должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
|
||||
|
||||
2) Вы можете использовать режим "контролируемое исключение" для проверок на корректность адресов памяти при считывании\записи данных.
|
||||
Для этого:
|
||||
- В регистр ESI заносится адрес, куда должно перейти выполнение кода при возникновении исключения.
|
||||
- В регистр EDI заносится сигнатура - текст 'EXPT'.
|
||||
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
|
@ -4281,15 +4281,85 @@ align 4
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
align 4
|
||||
syscall_threads: ; CreateThreads
|
||||
;
|
||||
; ecx=thread entry point
|
||||
; edx=thread stack pointer
|
||||
;
|
||||
; on return : eax = pid
|
||||
xor ebx, ebx
|
||||
syscall_threads:
|
||||
; eax = 51
|
||||
; if ebx = 1 CreateThreads
|
||||
; ecx = thread entry point
|
||||
; edx = thread stack pointer
|
||||
; return eax = pid
|
||||
|
||||
; if ebx = 2 GetCurrentThreadId
|
||||
; return eax = current id slot
|
||||
|
||||
; if ebx = 3 GetThreadPriority
|
||||
; ecx = -1 curr slot or id slot
|
||||
; return eax = priority
|
||||
|
||||
; if ebx = 4 SetThreadPriority
|
||||
; ecx = -1 curr slot or id slot
|
||||
; edx = set priority
|
||||
; return eax = old priority
|
||||
|
||||
dec ebx
|
||||
jz .create
|
||||
mov eax, [current_slot_idx]
|
||||
dec ebx
|
||||
jz .end ;get_curr_slot
|
||||
|
||||
test ecx, ecx ;-1 curr slot
|
||||
jl .cur_slot
|
||||
mov eax, ecx
|
||||
.cur_slot:
|
||||
shl eax, BSF sizeof.APPDATA
|
||||
add eax, SLOT_BASE
|
||||
|
||||
test ecx, ecx ;-1 curr slot
|
||||
jl .curr_slot
|
||||
|
||||
mov esi, .err_exit
|
||||
mov edi, CONTROL_EXCEPTION
|
||||
|
||||
movzx ecx, [eax+APPDATA.state]
|
||||
test ecx, ecx
|
||||
jnz .check_state
|
||||
|
||||
cmp [eax+APPDATA.tid], ecx
|
||||
jnz .curr_slot
|
||||
jmp .err_exit
|
||||
|
||||
.check_state:
|
||||
sub ecx, 3 ;TSTATE_ZOMBIE
|
||||
jl .curr_slot
|
||||
je .err_exit
|
||||
dec ecx ; 4 TSTATE_TERMINATING
|
||||
dec ecx ; 5 TSTATE_WAITING
|
||||
jnz .err_exit
|
||||
|
||||
.curr_slot:
|
||||
dec ebx
|
||||
jz .get_priority
|
||||
dec ebx
|
||||
jz .set_priority
|
||||
|
||||
.err_exit:
|
||||
push -1
|
||||
pop eax
|
||||
jmp .end
|
||||
|
||||
.set_priority: ;;sysfn 51,4
|
||||
mov dh, dl
|
||||
lock xchg word [eax+APPDATA.def_priority], dx
|
||||
movzx eax, dl ;old priority
|
||||
jmp .end
|
||||
|
||||
.get_priority: ;;sysfn 51,3
|
||||
movzx eax, [eax+APPDATA.def_priority]
|
||||
jmp .end
|
||||
|
||||
.create: ;sysfn 51,1
|
||||
call new_sys_threads
|
||||
|
||||
.end:
|
||||
mov [esp + SYSCALL_STACK.eax], eax
|
||||
ret
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user