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:
Jurgen 2024-03-23 19:19:24 +00:00
parent ecdf48270f
commit 5eb750c289
7 changed files with 157 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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]

View File

@ -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'.
---------------------- Константы для регистров: ---------------------- ---------------------- Константы для регистров: ----------------------

View File

@ -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