forked from KolibriOS/kolibrios
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
|
exc_handler dd ? ;+32
|
||||||
except_mask dd ? ;+36
|
except_mask dd ? ;+36
|
||||||
pl0_stack dd ? ;+40
|
pl0_stack dd ? ;+40
|
||||||
dd ? ;+44
|
exc_reserve_stack dd ? ;+44
|
||||||
fd_ev dd ? ;+48
|
fd_ev dd ? ;+48
|
||||||
bk_ev dd ? ;+52
|
bk_ev dd ? ;+52
|
||||||
fd_obj dd ? ;+56
|
fd_obj dd ? ;+56
|
||||||
@ -528,7 +528,9 @@ struct APPDATA
|
|||||||
tls_base dd ? ;+104
|
tls_base dd ? ;+104
|
||||||
event_mask dd ? ;+108 stores event types allowed for task
|
event_mask dd ? ;+108 stores event types allowed for task
|
||||||
tid dd ? ;+112 thread id
|
tid dd ? ;+112 thread id
|
||||||
dd ? ;+116
|
def_priority db ? ;+116
|
||||||
|
cur_priority db ? ;+117
|
||||||
|
dw ? ;+118
|
||||||
dd ? ;+120
|
dd ? ;+120
|
||||||
state db ? ;+124 thread state
|
state db ? ;+124 thread state
|
||||||
wnd_number db ? ;+125
|
wnd_number db ? ;+125
|
||||||
@ -590,6 +592,8 @@ ZPOS_ALWAYS_BACK = -1
|
|||||||
ZPOS_NORMAL = 0
|
ZPOS_NORMAL = 0
|
||||||
ZPOS_ALWAYS_TOP = 1 ;ZPOS_ALWAYS_TOP is always last and has max number!
|
ZPOS_ALWAYS_TOP = 1 ;ZPOS_ALWAYS_TOP is always last and has max number!
|
||||||
|
|
||||||
|
CONTROL_EXCEPTION = 'EXPT'
|
||||||
|
|
||||||
; Window structure:
|
; Window structure:
|
||||||
struct WDATA
|
struct WDATA
|
||||||
box BOX
|
box BOX
|
||||||
|
@ -1177,6 +1177,7 @@ f68:
|
|||||||
mov eax, [current_slot]
|
mov eax, [current_slot]
|
||||||
xchg ecx, [eax + APPDATA.exc_handler]
|
xchg ecx, [eax + APPDATA.exc_handler]
|
||||||
xchg edx, [eax + APPDATA.except_mask]
|
xchg edx, [eax + APPDATA.except_mask]
|
||||||
|
xchg esi, [eax + APPDATA.exc_reserve_stack]
|
||||||
mov [esp + SYSCALL_STACK.ebx], edx
|
mov [esp + SYSCALL_STACK.ebx], edx
|
||||||
mov [esp + SYSCALL_STACK.eax], ecx
|
mov [esp + SYSCALL_STACK.eax], ecx
|
||||||
ret
|
ret
|
||||||
|
@ -307,6 +307,13 @@ proc find_next_task
|
|||||||
mov [ebx + APPDATA.wait_param], eax ; retval for wait
|
mov [ebx + APPDATA.wait_param], eax ; retval for wait
|
||||||
mov [ebx + APPDATA.state], TSTATE_RUNNING
|
mov [ebx + APPDATA.state], TSTATE_RUNNING
|
||||||
.task_found:
|
.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
|
mov [scheduler_current+ecx*4], ebx
|
||||||
; If we have selected a thread with higher priority
|
; If we have selected a thread with higher priority
|
||||||
; AND rescheduling is due to IRQ,
|
; AND rescheduling is due to IRQ,
|
||||||
|
@ -114,6 +114,18 @@ endg
|
|||||||
|
|
||||||
page_fault_exc: ; foolproof: selectors are clobbered ...
|
page_fault_exc: ; foolproof: selectors are clobbered ...
|
||||||
pop [ss:pf_err_code] ; actually, until the next #PF
|
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
|
save_ring3_context
|
||||||
mov bl, 14
|
mov bl, 14
|
||||||
|
|
||||||
@ -211,8 +223,7 @@ IRetToUserHook:
|
|||||||
add ecx, 1000h
|
add ecx, 1000h
|
||||||
jl .nostack
|
jl .nostack
|
||||||
.ex_stack:
|
.ex_stack:
|
||||||
xor ecx, ecx
|
mov ecx, [esi+APPDATA.exc_reserve_stack]
|
||||||
mov ecx, [ecx+APP_HEADER_01_.except_stack_top]
|
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
jle .nostack
|
jle .nostack
|
||||||
xchg edi, eax
|
xchg edi, eax
|
||||||
|
@ -28,7 +28,6 @@ struct APP_HEADER_01_
|
|||||||
stack_top dd ? ;+24
|
stack_top dd ? ;+24
|
||||||
i_param dd ? ;+28
|
i_param dd ? ;+28
|
||||||
i_icon dd ? ;+32
|
i_icon dd ? ;+32
|
||||||
except_stack_top dd ? ;+36
|
|
||||||
ends
|
ends
|
||||||
|
|
||||||
struct APP_HDR
|
struct APP_HDR
|
||||||
@ -1009,6 +1008,7 @@ proc set_app_params stdcall,slot:dword, params:dword, flags:dword
|
|||||||
|
|
||||||
;set draw data to full screen
|
;set draw data to full screen
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
|
mov [SLOT_BASE + ebx + APPDATA.def_priority], al
|
||||||
mov [ecx + WDATA.draw_data.left], eax
|
mov [ecx + WDATA.draw_data.left], eax
|
||||||
mov [ecx + WDATA.draw_data.top], eax
|
mov [ecx + WDATA.draw_data.top], eax
|
||||||
mov eax, [screen_workarea.right]
|
mov eax, [screen_workarea.right]
|
||||||
|
@ -2550,11 +2550,12 @@ dword-значение цвета 0x00RRGGBB
|
|||||||
---------------------- Константы для регистров: ----------------------
|
---------------------- Константы для регистров: ----------------------
|
||||||
eax - SF_SET_WINDOW_SHAPE (50)
|
eax - SF_SET_WINDOW_SHAPE (50)
|
||||||
======================================================================
|
======================================================================
|
||||||
===================== Функция 51 - создать поток. ====================
|
===================== Функция 51, подфункция 1 =======================
|
||||||
|
========================== Создать поток =============================
|
||||||
======================================================================
|
======================================================================
|
||||||
Параметры:
|
Параметры:
|
||||||
* eax = 51 - номер функции
|
* eax = 51 - номер функции
|
||||||
* ebx = 1 - единственная подфункция
|
* ebx = 1 - номер подфункции
|
||||||
* ecx = адрес точки входа потока (начальный eip)
|
* ecx = адрес точки входа потока (начальный eip)
|
||||||
* edx = указатель стэка потока (начальный esp)
|
* edx = указатель стэка потока (начальный esp)
|
||||||
Возвращаемое значение:
|
Возвращаемое значение:
|
||||||
@ -2564,6 +2565,47 @@ dword-значение цвета 0x00RRGGBB
|
|||||||
---------------------- Константы для регистров: ----------------------
|
---------------------- Константы для регистров: ----------------------
|
||||||
eax - SF_CREATE_THREAD (51)
|
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 ======================
|
====================== Функция 54, подфункция 0 ======================
|
||||||
============== Узнать количество слотов в буфере обмена. =============
|
============== Узнать количество слотов в буфере обмена. =============
|
||||||
======================================================================
|
======================================================================
|
||||||
@ -3599,9 +3641,14 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
|||||||
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
|
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя.
|
||||||
|
|
||||||
Внимание:
|
Внимание:
|
||||||
Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_ taskman.inc).
|
1) Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен стартовый адрес резервного стека в регистре ESI.
|
||||||
В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
|
При возникновении исключения (#SS), в этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc).
|
||||||
Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
|
При завершении обработки этого исключения, пользовательский обработчик должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK.
|
||||||
|
|
||||||
|
2) Вы можете использовать режим "контролируемое исключение" для проверок на корректность адресов памяти при считывании\записи данных.
|
||||||
|
Для этого:
|
||||||
|
- В регистр ESI заносится адрес, куда должно перейти выполнение кода при возникновении исключения.
|
||||||
|
- В регистр EDI заносится сигнатура - текст 'EXPT'.
|
||||||
|
|
||||||
|
|
||||||
---------------------- Константы для регистров: ----------------------
|
---------------------- Константы для регистров: ----------------------
|
||||||
|
@ -4281,15 +4281,85 @@ align 4
|
|||||||
;-----------------------------------------------------------------------------
|
;-----------------------------------------------------------------------------
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
syscall_threads: ; CreateThreads
|
syscall_threads:
|
||||||
;
|
; eax = 51
|
||||||
|
; if ebx = 1 CreateThreads
|
||||||
; ecx = thread entry point
|
; ecx = thread entry point
|
||||||
; edx = thread stack pointer
|
; edx = thread stack pointer
|
||||||
;
|
; return eax = pid
|
||||||
; on return : eax = pid
|
|
||||||
xor ebx, ebx
|
; 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
|
call new_sys_threads
|
||||||
|
|
||||||
|
.end:
|
||||||
mov [esp + SYSCALL_STACK.eax], eax
|
mov [esp + SYSCALL_STACK.eax], eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user