From 8d75380caf13188832fda7426102e251fc2605fc Mon Sep 17 00:00:00 2001 From: Galkov Date: Fri, 22 May 2009 08:55:09 +0000 Subject: [PATCH] change functionality of f68:15, f68:18 (discussion on forum topic 1253) git-svn-id: svn://kolibrios.org@1074 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/const.inc | 2 +- kernel/trunk/core/fpu.inc | 107 --- kernel/trunk/core/memory.inc | 20 +- kernel/trunk/core/sys32.inc | 26 +- kernel/trunk/core/taskman.inc | 1304 ++++++++++++++++---------------- kernel/trunk/docs/sysfuncr.txt | 139 ++-- kernel/trunk/docs/sysfuncs.txt | 107 ++- kernel/trunk/kernel.asm | 8 +- kernel/trunk/kernel32.inc | 4 +- 9 files changed, 828 insertions(+), 889 deletions(-) diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index 39ac37e702..10be1bf82a 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -468,7 +468,7 @@ struc EVENT .id dd ? ;event uid .state dd ? ;internal flags .code dd ? - rd 6 + rd 5 .size = $ - .magic .codesize = $ - .code } diff --git a/kernel/trunk/core/fpu.inc b/kernel/trunk/core/fpu.inc index 541efe2067..5b11e0aa83 100644 --- a/kernel/trunk/core/fpu.inc +++ b/kernel/trunk/core/fpu.inc @@ -181,110 +181,3 @@ except_7: ;#NM exception handler iglobal fpu_owner dd 0 endg - -reg_eip equ ebp+4 -reg_cs equ ebp+8 -reg_eflags equ ebp+12 -reg_esp equ ebp+16 -reg_ss equ ebp+20 - -align 4 ;not used now -proc except_16 ;fpu native exceptions handler - test byte [esp+8+2], 2 - jnz v86_except_16 - push ebp - mov ebp, esp - - push eax - push ebx - push ecx - push edx - - mov ebx, [CURRENT_TASK] - shl ebx, 8 - - mov eax, [ebx+SLOT_BASE+APPDATA.fpu_handler] - test eax, eax - jz .default - - mov ecx, [reg_eip] - mov edx, [reg_esp] - sub edx, 4 - mov [edx], ecx - mov [reg_esp], edx - mov dword [reg_eip], eax - - pop edx - pop ecx - pop ebx - pop eax - - leave - iretd - -.default: - pop edx - pop ecx - pop ebx - pop eax - leave - - save_ring3_context ;debugger support - - mov bl, 16 - jmp exc_c -endp - -align 4 ;not used now -proc except_19 ;sse exceptions handler - test byte [esp+8+2], 2 - jnz v86_except_19 - push ebp - mov ebp, esp - - push eax - push ebx - push ecx - push edx - - mov ebx, [current_slot] - - mov eax, [ebx+APPDATA.sse_handler] - test eax, eax - jz .default - - mov ecx, [reg_eip] - mov edx, [reg_esp] - sub edx, 4 - mov [edx], ecx - mov [reg_esp], edx - mov dword [reg_eip], eax - - pop edx - pop ecx - pop ebx - pop eax - - leave - iretd - -.default: - pop edx - pop ecx - pop ebx - pop eax - leave - - save_ring3_context ;debugger support - - mov bl, 19 - jmp exc_c -endp - -restore reg_eip -restore reg_cs -restore reg_eflags -restore reg_esp -restore reg_ss - - diff --git a/kernel/trunk/core/memory.inc b/kernel/trunk/core/memory.inc index 0d97232bf5..010bae9c07 100644 --- a/kernel/trunk/core/memory.inc +++ b/kernel/trunk/core/memory.inc @@ -1033,10 +1033,11 @@ f68: mov [esp+36], eax ret .15: - mov ecx, [current_slot] - mov eax, [ecx+APPDATA.fpu_handler] - mov [ecx+APPDATA.fpu_handler], ebx - mov [esp+36], eax + mov eax, [current_slot] + xchg ebx, [eax+APPDATA.exc_handler] + xchg ecx, [eax+APPDATA.except_mask] + mov [esp+36], ebx ; reg_eax+8 + mov [esp+24], ecx ; reg_ebx+8 ret .16: test ebx, ebx @@ -1051,11 +1052,12 @@ f68: mov [esp+36], eax ret .18: - mov ecx, [current_slot] - mov eax, [ecx+APPDATA.sse_handler] - mov [ecx+APPDATA.sse_handler], ebx - mov [esp+36], eax - ret + mov eax, [current_slot] + btr [eax+APPDATA.except_mask],ebx + setc byte[esp+36] + jecxz @f + bts [eax+APPDATA.except_mask],ebx + @@: ret .19: cmp ebx, OS_BASE jae .fail diff --git a/kernel/trunk/core/sys32.inc b/kernel/trunk/core/sys32.inc index aef52b4d0a..5c73303042 100644 --- a/kernel/trunk/core/sys32.inc +++ b/kernel/trunk/core/sys32.inc @@ -124,22 +124,20 @@ exc_c: ; Mov ds,ax,app_data ; чруЁєчшь яЁртшы№э√х чэрўхэш  mov es,ax ; т ёхуьхэЄэ√х ЁхушёЄЁ√ cld ; ш яЁштюфшь DF ъ ёЄрэфрЁЄє + movzx ebx,bl ; redirect to V86 manager? (EFLAGS & 0x20000) != 0? test byte[reg_eflags+2],2 jnz v86_exc_c cmp bl,14 ; #PF - jne .l0 + jne @f call page_fault_handler - .l0: mov esi, [current_slot] - mov eax,[esi+APPDATA.fpu_handler] - cmp bl,16 ; #MF - je .l1 - cmp bl,19 ; #XF - jne .l2 - mov eax,[esi+APPDATA.sse_handler] - .l1: test eax, eax + @@: mov esi, [current_slot] + btr [esi+APPDATA.except_mask], ebx + jnc @f + mov eax,[esi+APPDATA.exc_handler] + test eax, eax jnz IRetToUserHook - .l2: cli + @@: cli mov eax, [esi+APPDATA.debugger_slot] test eax, eax jnz .debug @@ -154,15 +152,16 @@ exc_c: ; ; eax=debugger PID cmp bl,1 ; #DB je debug_ex - movzx edx, bl ; debug_message data=Number_Of_Exception + mov edx, ebx ; debug_message data=Number_Of_Exception mov ecx,1 ; debug_message code=other_exception jmp debug_ex.notify ; notify debugger and suspend ourself IRetToUserHook: xchg eax, [reg_eip] - sub dword[reg_esp3], 4 + sub dword[reg_esp3], 8 mov edi, [reg_esp3] stosd + mov [edi], ebx restore_ring3_context unknown_interrupt: iretd @@ -176,8 +175,7 @@ show_error_parameters: cmp bl, 0x0e jbe .l1 .l0: mov bl, 0x09 - .l1: movzx eax,bl - mov eax,[msg_fault_sel+eax*4 - 0x08*4] + .l1: mov eax,[msg_fault_sel+ebx*4 - 0x08*4] DEBUGF 1, "K : %s\n", eax mov eax, [reg_cs3+4] mov edi, msg_sel_app diff --git a/kernel/trunk/core/taskman.inc b/kernel/trunk/core/taskman.inc index 35395b7cf8..fb6ae4cf64 100644 --- a/kernel/trunk/core/taskman.inc +++ b/kernel/trunk/core/taskman.inc @@ -32,11 +32,11 @@ struc APP_HEADER_01 struc APP_PARAMS -{ .app_cmdline ;0x00 - .app_path ;0x04 - .app_eip ;0x08 - .app_esp ;0x0C - .app_mem ;0x10 +{ .app_cmdline ;0x00 + .app_path ;0x04 + .app_eip ;0x08 + .app_esp ;0x0C + .app_mem ;0x10 } macro _clear_ op @@ -47,9 +47,9 @@ macro _clear_ op } fs_execute_from_sysdir: - xor ebx, ebx - xor edx, edx - mov esi, sysdir_path + xor ebx, ebx + xor edx, edx + mov esi, sysdir_path align 4 proc fs_execute @@ -61,249 +61,249 @@ proc fs_execute ; ebp - full filename ; [esp+4] = procedure DoRead, [esp+8] = filesize & [esp+12]... - arguments for it - locals - cmdline rd 64 ;256/4 - filename rd 256 ;1024/4 - flags dd ? + locals + cmdline rd 64 ;256/4 + filename rd 256 ;1024/4 + flags dd ? - save_cr3 dd ? - slot dd ? - slot_base dd ? - file_base dd ? - file_size dd ? - ;app header data - hdr_cmdline dd ? ;0x00 - hdr_path dd ? ;0x04 - hdr_eip dd ? ;0x08 - hdr_esp dd ? ;0x0C - hdr_mem dd ? ;0x10 - hdr_i_end dd ? ;0x14 - endl + save_cr3 dd ? + slot dd ? + slot_base dd ? + file_base dd ? + file_size dd ? + ;app header data + hdr_cmdline dd ? ;0x00 + hdr_path dd ? ;0x04 + hdr_eip dd ? ;0x08 + hdr_esp dd ? ;0x0C + hdr_mem dd ? ;0x10 + hdr_i_end dd ? ;0x14 + endl - pushad + pushad - mov [flags], edx + mov [flags], edx ; [ebp] pointer to filename - lea edi, [filename] - lea ecx, [edi+1024] - mov al, '/' - stosb + lea edi, [filename] + lea ecx, [edi+1024] + mov al, '/' + stosb @@: - cmp edi, ecx - jae .bigfilename - lodsb - stosb - test al, al - jnz @b - mov esi, [ebp] - test esi, esi - jz .namecopied - mov byte [edi-1], '/' + cmp edi, ecx + jae .bigfilename + lodsb + stosb + test al, al + jnz @b + mov esi, [ebp] + test esi, esi + jz .namecopied + mov byte [edi-1], '/' @@: - cmp edi, ecx - jae .bigfilename - lodsb - stosb - test al, al - jnz @b - jmp .namecopied + cmp edi, ecx + jae .bigfilename + lodsb + stosb + test al, al + jnz @b + jmp .namecopied .bigfilename: - popad - mov eax, -ERROR_FILE_NOT_FOUND - ret + popad + mov eax, -ERROR_FILE_NOT_FOUND + ret .namecopied: - mov [cmdline], ebx - test ebx, ebx - jz @F + mov [cmdline], ebx + test ebx, ebx + jz @F - lea eax, [cmdline] - mov dword [eax+252], 0 - stdcall strncpy, eax, ebx, 255 + lea eax, [cmdline] + mov dword [eax+252], 0 + stdcall strncpy, eax, ebx, 255 @@: - lea eax, [filename] - stdcall load_file, eax - mov ecx, -ERROR_FILE_NOT_FOUND - test eax, eax - jz .err_file + lea eax, [filename] + stdcall load_file, eax + mov ecx, -ERROR_FILE_NOT_FOUND + test eax, eax + jz .err_file - mov [file_base], eax - mov [file_size], ebx + mov [file_base], eax + mov [file_size], ebx - lea ebx, [hdr_cmdline] - call test_app_header - mov ecx, -0x1F - test eax, eax - jz .err_hdr + lea ebx, [hdr_cmdline] + call test_app_header + mov ecx, -0x1F + test eax, eax + jz .err_hdr - ;mov esi, new_process_loading - ;call sys_msg_board_str ; write message to message board + ;mov esi, new_process_loading + ;call sys_msg_board_str ; write message to message board .wait_lock: - cmp [application_table_status],0 - je .get_lock - call change_task - jmp .wait_lock + cmp [application_table_status],0 + je .get_lock + call change_task + jmp .wait_lock .get_lock: - mov eax, 1 - xchg eax, [application_table_status] - cmp eax, 0 - jne .wait_lock + mov eax, 1 + xchg eax, [application_table_status] + cmp eax, 0 + jne .wait_lock - call set_application_table_status + call set_application_table_status - call get_new_process_place - test eax, eax - mov ecx, -0x20 ; too many processes - jz .err + call get_new_process_place + test eax, eax + mov ecx, -0x20 ; too many processes + jz .err - mov [slot], eax - shl eax, 8 - add eax, SLOT_BASE - mov [slot_base], eax - mov edi, eax - _clear_ 256 ;clean extended information about process + mov [slot], eax + shl eax, 8 + add eax, SLOT_BASE + mov [slot_base], eax + mov edi, eax + _clear_ 256 ;clean extended information about process ; write application name - lea eax, [filename] - stdcall strrchr, eax, '/' ; now eax points to name without path + lea eax, [filename] + stdcall strrchr, eax, '/' ; now eax points to name without path - lea esi, [eax+1] - test eax, eax - jnz @F - lea esi, [filename] + lea esi, [eax+1] + test eax, eax + jnz @F + lea esi, [filename] @@: - mov ecx, 8 ; 8 chars for name - mov edi, [slot_base] + mov ecx, 8 ; 8 chars for name + mov edi, [slot_base] .copy_process_name_loop: - lodsb - cmp al, '.' - jz .copy_process_name_done - test al, al - jz .copy_process_name_done - stosb - loop .copy_process_name_loop + lodsb + cmp al, '.' + jz .copy_process_name_done + test al, al + jz .copy_process_name_done + stosb + loop .copy_process_name_loop .copy_process_name_done: - mov ebx, cr3 - mov [save_cr3], ebx + mov ebx, cr3 + mov [save_cr3], ebx - stdcall create_app_space,[hdr_mem],[file_base],[file_size] - mov ecx, -30 ; no memory - test eax, eax - jz .failed + stdcall create_app_space,[hdr_mem],[file_base],[file_size] + mov ecx, -30 ; no memory + test eax, eax + jz .failed - mov ebx,[slot_base] - mov [ebx+APPDATA.dir_table],eax - mov eax,[hdr_mem] - mov [ebx+APPDATA.mem_size],eax + mov ebx,[slot_base] + mov [ebx+APPDATA.dir_table],eax + mov eax,[hdr_mem] + mov [ebx+APPDATA.mem_size],eax if GREEDY_KERNEL else - mov ecx, [hdr_mem] - mov edi, [file_size] - add edi, 4095 - and edi, not 4095 - sub ecx, edi - jna @F + mov ecx, [hdr_mem] + mov edi, [file_size] + add edi, 4095 + and edi, not 4095 + sub ecx, edi + jna @F - xor eax, eax + xor eax, eax cld - rep stosb + rep stosb @@: end if ; release only virtual space, not phisical memory - stdcall free_kernel_space, [file_base] - lea eax, [hdr_cmdline] - lea ebx, [cmdline] - lea ecx, [filename] - stdcall set_app_params ,[slot],eax,ebx,ecx,[flags] + stdcall free_kernel_space, [file_base] + lea eax, [hdr_cmdline] + lea ebx, [cmdline] + lea ecx, [filename] + stdcall set_app_params ,[slot],eax,ebx,ecx,[flags] - mov eax, [save_cr3] - call set_cr3 + mov eax, [save_cr3] + call set_cr3 - xor ebx, ebx - mov [application_table_status],ebx ;unlock application_table_status mutex - mov eax,[process_number] ;set result - ret + xor ebx, ebx + mov [application_table_status],ebx ;unlock application_table_status mutex + mov eax,[process_number] ;set result + ret .failed: - mov eax, [save_cr3] - call set_cr3 + mov eax, [save_cr3] + call set_cr3 .err: .err_hdr: - stdcall kernel_free,[file_base] + stdcall kernel_free,[file_base] .err_file: - xor eax, eax - mov [application_table_status],eax - mov eax, ecx - ret + xor eax, eax + mov [application_table_status],eax + mov eax, ecx + ret endp align 4 test_app_header: - virtual at eax - APP_HEADER_00 APP_HEADER_00 - end virtual - virtual at eax - APP_HEADER_01 APP_HEADER_01 - end virtual + virtual at eax + APP_HEADER_00 APP_HEADER_00 + end virtual + virtual at eax + APP_HEADER_01 APP_HEADER_01 + end virtual - cmp dword [eax], 'MENU' - jne .fail - cmp word [eax+4],'ET' - jne .fail + cmp dword [eax], 'MENU' + jne .fail + cmp word [eax+4],'ET' + jne .fail - cmp [eax+6], word '00' - jne .check_01_header + cmp [eax+6], word '00' + jne .check_01_header - mov ecx,[APP_HEADER_00.start] - mov [ebx+0x08], ecx ;app_eip - mov edx,[APP_HEADER_00.mem_size] - mov [ebx+0x10], edx ;app_mem - shr edx,1 - sub edx,0x10 - mov [ebx+0x0C], edx ;app_esp - mov ecx,[APP_HEADER_00.i_param] - mov [ebx], ecx ;app_cmdline - mov [ebx+4], dword 0 ;app_path - mov edx, [APP_HEADER_00.i_end] - mov [ebx+0x14], edx - ret + mov ecx,[APP_HEADER_00.start] + mov [ebx+0x08], ecx ;app_eip + mov edx,[APP_HEADER_00.mem_size] + mov [ebx+0x10], edx ;app_mem + shr edx,1 + sub edx,0x10 + mov [ebx+0x0C], edx ;app_esp + mov ecx,[APP_HEADER_00.i_param] + mov [ebx], ecx ;app_cmdline + mov [ebx+4], dword 0 ;app_path + mov edx, [APP_HEADER_00.i_end] + mov [ebx+0x14], edx + ret .check_01_header: - cmp [eax+6],word '01' - jne .fail + cmp [eax+6],word '01' + jne .fail - mov ecx,[APP_HEADER_01.start] - mov [ebx+0x08], ecx ;app_eip - mov edx,[APP_HEADER_01.mem_size] + mov ecx,[APP_HEADER_01.start] + mov [ebx+0x08], ecx ;app_eip + mov edx,[APP_HEADER_01.mem_size] ; \begin{diamond}[20.08.2006] ; sanity check (functions 19,58 load app_i_end bytes and that must ; fit in allocated memory to prevent kernel faults) - cmp edx,[APP_HEADER_01.i_end] - jb .fail + cmp edx,[APP_HEADER_01.i_end] + jb .fail ; \end{diamond}[20.08.2006] - mov [ebx+0x10], edx ;app_mem - mov ecx,[APP_HEADER_01.stack_top] - mov [ebx+0x0C], ecx ;app_esp - mov edx,[APP_HEADER_01.i_param] - mov [ebx], edx ;app_cmdline - mov ecx,[APP_HEADER_01.i_icon] - mov [ebx+4], ecx ;app_path - mov edx, [APP_HEADER_01.i_end] - mov [ebx+0x14], edx - ret + mov [ebx+0x10], edx ;app_mem + mov ecx,[APP_HEADER_01.stack_top] + mov [ebx+0x0C], ecx ;app_esp + mov edx,[APP_HEADER_01.i_param] + mov [ebx], edx ;app_cmdline + mov ecx,[APP_HEADER_01.i_icon] + mov [ebx+4], ecx ;app_path + mov edx, [APP_HEADER_01.i_end] + mov [ebx+0x14], edx + ret .fail: - xor eax, eax - ret + xor eax, eax + ret align 4 proc get_new_process_place @@ -314,266 +314,266 @@ proc get_new_process_place ; 0 - failed. ;This function find least empty slot. ;It doesn't increase [TASK_COUNT]! - mov eax,CURRENT_TASK - mov ebx,[TASK_COUNT] - inc ebx - shl ebx,5 - add ebx,eax ;ebx - address of process information for (last+1) slot + mov eax,CURRENT_TASK + mov ebx,[TASK_COUNT] + inc ebx + shl ebx,5 + add ebx,eax ;ebx - address of process information for (last+1) slot .newprocessplace: ;eax = address of process information for current slot - cmp eax,ebx - jz .endnewprocessplace ;empty slot after high boundary - add eax,0x20 - cmp word [eax+0xa],9 ;check process state, 9 means that process slot is empty - jnz .newprocessplace + cmp eax,ebx + jz .endnewprocessplace ;empty slot after high boundary + add eax,0x20 + cmp word [eax+0xa],9 ;check process state, 9 means that process slot is empty + jnz .newprocessplace .endnewprocessplace: - mov ebx,eax - sub eax,CURRENT_TASK - shr eax,5 ;calculate slot index - cmp eax,256 - jge .failed ;it should be <256 - mov word [ebx+0xa],9 ;set process state to 9 (for slot after hight boundary) - ret + mov ebx,eax + sub eax,CURRENT_TASK + shr eax,5 ;calculate slot index + cmp eax,256 + jge .failed ;it should be <256 + mov word [ebx+0xa],9 ;set process state to 9 (for slot after hight boundary) + ret .failed: - xor eax,eax - ret + xor eax,eax + ret endp align 4 proc create_app_space stdcall, app_size:dword,img_base:dword,img_size:dword - locals - app_pages dd ? - img_pages dd ? - dir_addr dd ? - app_tabs dd ? - endl + locals + app_pages dd ? + img_pages dd ? + dir_addr dd ? + app_tabs dd ? + endl - mov ebx, pg_data.pg_mutex - call wait_mutex ;ebx + mov ebx, pg_data.pg_mutex + call wait_mutex ;ebx - xor eax, eax - mov [dir_addr], eax + xor eax, eax + mov [dir_addr], eax - mov eax, [app_size] - add eax, 4095 - and eax, NOT(4095) - mov [app_size], eax - mov ebx, eax - shr eax, 12 - mov [app_pages], eax + mov eax, [app_size] + add eax, 4095 + and eax, NOT(4095) + mov [app_size], eax + mov ebx, eax + shr eax, 12 + mov [app_pages], eax - add ebx, 0x3FFFFF - and ebx, NOT(0x3FFFFF) - shr ebx, 22 - mov [app_tabs], ebx + add ebx, 0x3FFFFF + and ebx, NOT(0x3FFFFF) + shr ebx, 22 + mov [app_tabs], ebx - mov ecx, [img_size] - add ecx, 4095 - and ecx, NOT(4095) + mov ecx, [img_size] + add ecx, 4095 + and ecx, NOT(4095) - mov [img_size], ecx - shr ecx, 12 - mov [img_pages], ecx + mov [img_size], ecx + shr ecx, 12 + mov [img_pages], ecx if GREEDY_KERNEL - lea eax, [ecx+ebx+2] ;only image size + lea eax, [ecx+ebx+2] ;only image size else - lea eax, [eax+ebx+2] ;all requested memory + lea eax, [eax+ebx+2] ;all requested memory end if - cmp eax, [pg_data.pages_free] - ja .fail + cmp eax, [pg_data.pages_free] + ja .fail - call alloc_page - test eax, eax - jz .fail - mov [dir_addr], eax - stdcall map_page,[tmp_task_pdir],eax,dword PG_SW + call alloc_page + test eax, eax + jz .fail + mov [dir_addr], eax + stdcall map_page,[tmp_task_pdir],eax,dword PG_SW - mov edi, [tmp_task_pdir] - mov ecx, (OS_BASE shr 20)/4 - xor eax, eax - cld - rep stosd + mov edi, [tmp_task_pdir] + mov ecx, (OS_BASE shr 20)/4 + xor eax, eax + cld + rep stosd - mov ecx, (OS_BASE shr 20)/4 - mov esi, sys_pgdir+(OS_BASE shr 20) - rep movsd + mov ecx, (OS_BASE shr 20)/4 + mov esi, sys_pgdir+(OS_BASE shr 20) + rep movsd - mov eax, [dir_addr] - or eax, PG_SW - mov [edi-4096+(page_tabs shr 20)], eax + mov eax, [dir_addr] + or eax, PG_SW + mov [edi-4096+(page_tabs shr 20)], eax - and eax, -4096 - call set_cr3 + and eax, -4096 + call set_cr3 - mov edx, [app_tabs] - mov edi, new_app_base + mov edx, [app_tabs] + mov edi, new_app_base @@: - call alloc_page - test eax, eax - jz .fail + call alloc_page + test eax, eax + jz .fail - stdcall map_page_table, edi, eax - add edi, 0x00400000 - dec edx - jnz @B + stdcall map_page_table, edi, eax + add edi, 0x00400000 + dec edx + jnz @B - mov edi, new_app_base - shr edi, 10 - add edi, page_tabs + mov edi, new_app_base + shr edi, 10 + add edi, page_tabs - mov ecx, [app_tabs] - shl ecx, 10 - xor eax, eax - rep stosd + mov ecx, [app_tabs] + shl ecx, 10 + xor eax, eax + rep stosd - mov ecx, [img_pages] - mov ebx, PG_UW - mov edx, new_app_base - mov esi, [img_base] - mov edi, new_app_base - shr esi, 10 - shr edi, 10 - add esi, page_tabs - add edi, page_tabs + mov ecx, [img_pages] + mov ebx, PG_UW + mov edx, new_app_base + mov esi, [img_base] + mov edi, new_app_base + shr esi, 10 + shr edi, 10 + add esi, page_tabs + add edi, page_tabs .remap: - lodsd - or eax, ebx ; force user level r/w access - stosd - add edx, 0x1000 - dec [app_pages] - dec ecx - jnz .remap + lodsd + or eax, ebx ; force user level r/w access + stosd + add edx, 0x1000 + dec [app_pages] + dec ecx + jnz .remap - mov ecx, [app_pages] - test ecx, ecx - jz .done + mov ecx, [app_pages] + test ecx, ecx + jz .done if GREEDY_KERNEL - mov eax, 0x02 + mov eax, 0x02 rep stosd else .alloc: - call alloc_page - test eax, eax - jz .fail + call alloc_page + test eax, eax + jz .fail - stdcall map_page,edx,eax,dword PG_UW - add edx, 0x1000 - dec [app_pages] - jnz .alloc + stdcall map_page,edx,eax,dword PG_UW + add edx, 0x1000 + dec [app_pages] + jnz .alloc end if .done: - stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP + stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP - dec [pg_data.pg_mutex] - mov eax, [dir_addr] - ret + dec [pg_data.pg_mutex] + mov eax, [dir_addr] + ret .fail: - dec [pg_data.pg_mutex] - cmp [dir_addr], 0 - je @f - stdcall destroy_app_space, [dir_addr] + dec [pg_data.pg_mutex] + cmp [dir_addr], 0 + je @f + stdcall destroy_app_space, [dir_addr] @@: - xor eax, eax - ret + xor eax, eax + ret endp align 4 set_cr3: - mov ebx, [current_slot] - mov [ebx+APPDATA.dir_table], eax - mov cr3, eax - ret + mov ebx, [current_slot] + mov [ebx+APPDATA.dir_table], eax + mov cr3, eax + ret align 4 proc destroy_page_table stdcall, pg_tab:dword - push esi + push esi - mov esi, [pg_tab] - mov ecx, 1024 + mov esi, [pg_tab] + mov ecx, 1024 .free: - mov eax, [esi] - test eax, 1 - jz .next + mov eax, [esi] + test eax, 1 + jz .next test eax, 1 shl 9 jnz .next ;skip shared pages - call free_page + call free_page .next: - add esi, 4 - dec ecx - jnz .free - pop esi - ret + add esi, 4 + dec ecx + jnz .free + pop esi + ret endp align 4 proc destroy_app_space stdcall, pg_dir:dword - mov ebx, pg_data.pg_mutex - call wait_mutex ;ebx + mov ebx, pg_data.pg_mutex + call wait_mutex ;ebx - xor edx,edx - mov eax,0x2 - mov ebx, [pg_dir] + xor edx,edx + mov eax,0x2 + mov ebx, [pg_dir] .loop: ;eax = current slot of process - mov ecx,eax - shl ecx,5 - cmp byte [CURRENT_TASK+ecx+0xa],9 ;if process running? - jz @f ;skip empty slots - shl ecx,3 - cmp [SLOT_BASE+ecx+0xB8],ebx ;compare page directory addresses - jnz @f - inc edx ;thread found + mov ecx,eax + shl ecx,5 + cmp byte [CURRENT_TASK+ecx+0xa],9 ;if process running? + jz @f ;skip empty slots + shl ecx,3 + cmp [SLOT_BASE+ecx+0xB8],ebx ;compare page directory addresses + jnz @f + inc edx ;thread found @@: - inc eax - cmp eax,[TASK_COUNT] ;exit loop if we look through all processes - jle .loop + inc eax + cmp eax,[TASK_COUNT] ;exit loop if we look through all processes + jle .loop ;edx = number of threads ;our process is zombi so it isn't counted - cmp edx,1 - jg .exit + cmp edx,1 + jg .exit ;if there isn't threads then clear memory. - mov eax, [pg_dir] - and eax, not 0xFFF - stdcall map_page,[tmp_task_pdir],eax,dword PG_SW - mov esi, [tmp_task_pdir] - mov edi, (OS_BASE shr 20)/4 + mov eax, [pg_dir] + and eax, not 0xFFF + stdcall map_page,[tmp_task_pdir],eax,dword PG_SW + mov esi, [tmp_task_pdir] + mov edi, (OS_BASE shr 20)/4 .destroy: - mov eax, [esi] - test eax, 1 - jz .next - and eax, not 0xFFF - stdcall map_page,[tmp_task_ptab],eax,dword PG_SW - stdcall destroy_page_table, [tmp_task_ptab] - mov eax, [esi] - call free_page + mov eax, [esi] + test eax, 1 + jz .next + and eax, not 0xFFF + stdcall map_page,[tmp_task_ptab],eax,dword PG_SW + stdcall destroy_page_table, [tmp_task_ptab] + mov eax, [esi] + call free_page .next: - add esi, 4 - dec edi - jnz .destroy + add esi, 4 + dec edi + jnz .destroy - mov eax, [pg_dir] - call free_page + mov eax, [pg_dir] + call free_page .exit: - stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP - stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP - dec [pg_data.pg_mutex] - ret + stdcall map_page,[tmp_task_ptab],dword 0,dword PG_UNMAP + stdcall map_page,[tmp_task_pdir],dword 0,dword PG_UNMAP + dec [pg_data.pg_mutex] + ret endp align 4 get_pid: - mov eax, [TASK_BASE] + mov eax, [TASK_BASE] mov eax, [eax+TASKDATA.pid] - ret + ret pid_to_slot: ;Input: @@ -591,9 +591,9 @@ pid_to_slot: ;ecx=offset of current process info entry ;ebx=maximum permitted offset cmp byte [CURRENT_TASK+ecx+0xa],9 - jz .endloop ;skip empty slots + jz .endloop ;skip empty slots cmp [CURRENT_TASK+ecx+0x4],eax ;check PID - jz .pid_found + jz .pid_found .endloop: add ecx,32 cmp ecx,ebx @@ -606,7 +606,7 @@ pid_to_slot: .pid_found: shr ecx,5 - mov eax,ecx ;convert offset to index of slot + mov eax,ecx ;convert offset to index of slot pop ecx pop ebx ret @@ -703,61 +703,61 @@ proc read_process_memory ; edx - start address in other process ;Output: ; eax - number of bytes read. - locals - slot dd ? - buff dd ? - r_count dd ? - offset dd ? - tmp_r_cnt dd ? - endl + locals + slot dd ? + buff dd ? + r_count dd ? + offset dd ? + tmp_r_cnt dd ? + endl - mov [slot], eax - mov [buff], ebx - and [r_count], 0 - mov [tmp_r_cnt], ecx - mov [offset], edx + mov [slot], eax + mov [buff], ebx + and [r_count], 0 + mov [tmp_r_cnt], ecx + mov [offset], edx - pushad + pushad .read_mem: - mov edx, [offset] - mov ebx, [tmp_r_cnt] + mov edx, [offset] + mov ebx, [tmp_r_cnt] - mov ecx, 0x400000 - and edx, 0x3FFFFF - sub ecx, edx - cmp ecx, ebx - jbe @f - mov ecx, ebx + mov ecx, 0x400000 + and edx, 0x3FFFFF + sub ecx, edx + cmp ecx, ebx + jbe @f + mov ecx, ebx @@: - cmp ecx, 0x8000 - jna @F - mov ecx, 0x8000 + cmp ecx, 0x8000 + jna @F + mov ecx, 0x8000 @@: - mov eax, [slot] - shl eax,8 - mov ebx, [offset] + mov eax, [slot] + shl eax,8 + mov ebx, [offset] ; add ebx, new_app_base - push ecx - stdcall map_memEx, [proc_mem_map],\ - [SLOT_BASE+eax+0xB8],\ - ebx, ecx - pop ecx + push ecx + stdcall map_memEx, [proc_mem_map],\ + [SLOT_BASE+eax+0xB8],\ + ebx, ecx + pop ecx - mov esi, [offset] - and esi, 0xfff - add esi, [proc_mem_map] - mov edi, [buff] - mov edx, ecx - rep movsb - add [r_count], edx + mov esi, [offset] + and esi, 0xfff + add esi, [proc_mem_map] + mov edi, [buff] + mov edx, ecx + rep movsb + add [r_count], edx - add [offset], edx - sub [tmp_r_cnt], edx - jnz .read_mem + add [offset], edx + sub [tmp_r_cnt], edx + jnz .read_mem - popad - mov eax, [r_count] - ret + popad + mov eax, [r_count] + ret endp align 4 @@ -770,147 +770,147 @@ proc write_process_memory ;Output: ; eax - number of bytes written - locals - slot dd ? - buff dd ? - w_count dd ? - offset dd ? - tmp_w_cnt dd ? - endl + locals + slot dd ? + buff dd ? + w_count dd ? + offset dd ? + tmp_w_cnt dd ? + endl - mov [slot], eax - mov [buff], ebx - and [w_count], 0 - mov [tmp_w_cnt], ecx - mov [offset], edx + mov [slot], eax + mov [buff], ebx + and [w_count], 0 + mov [tmp_w_cnt], ecx + mov [offset], edx - pushad + pushad .read_mem: - mov edx, [offset] - mov ebx, [tmp_w_cnt] + mov edx, [offset] + mov ebx, [tmp_w_cnt] - mov ecx, 0x400000 - and edx, 0x3FFFFF - sub ecx, edx - cmp ecx, ebx - jbe @f - mov ecx, ebx + mov ecx, 0x400000 + and edx, 0x3FFFFF + sub ecx, edx + cmp ecx, ebx + jbe @f + mov ecx, ebx @@: - cmp ecx, 0x8000 - jna @F - mov ecx, 0x8000 + cmp ecx, 0x8000 + jna @F + mov ecx, 0x8000 @@: - mov eax, [slot] - shl eax,8 - mov ebx, [offset] + mov eax, [slot] + shl eax,8 + mov ebx, [offset] ; add ebx, new_app_base - push ecx - stdcall map_memEx, [proc_mem_map],\ - [SLOT_BASE+eax+0xB8],\ - ebx, ecx - pop ecx + push ecx + stdcall map_memEx, [proc_mem_map],\ + [SLOT_BASE+eax+0xB8],\ + ebx, ecx + pop ecx - mov edi, [offset] - and edi, 0xfff - add edi, [proc_mem_map] - mov esi, [buff] - mov edx, ecx - rep movsb + mov edi, [offset] + and edi, 0xfff + add edi, [proc_mem_map] + mov esi, [buff] + mov edx, ecx + rep movsb - add [w_count], edx - add [offset], edx - sub [tmp_w_cnt], edx - jnz .read_mem + add [w_count], edx + add [offset], edx + sub [tmp_w_cnt], edx + jnz .read_mem - popad - mov eax, [w_count] - ret + popad + mov eax, [w_count] + ret endp align 4 proc new_sys_threads - locals - slot dd ? - app_cmdline dd ? ;0x00 - app_path dd ? ;0x04 - app_eip dd ? ;0x08 - app_esp dd ? ;0x0C - app_mem dd ? ;0x10 - endl + locals + slot dd ? + app_cmdline dd ? ;0x00 + app_path dd ? ;0x04 + app_eip dd ? ;0x08 + app_esp dd ? ;0x0C + app_mem dd ? ;0x10 + endl - cmp eax,1 - jne .failed ;other subfunctions + cmp eax,1 + jne .failed ;other subfunctions - xor eax,eax - mov [app_cmdline], eax - mov [app_path], eax - mov [app_eip], ebx - mov [app_esp], ecx + xor eax,eax + mov [app_cmdline], eax + mov [app_path], eax + mov [app_eip], ebx + mov [app_esp], ecx - ;mov esi,new_process_loading - ;call sys_msg_board_str + ;mov esi,new_process_loading + ;call sys_msg_board_str .wait_lock: - cmp [application_table_status],0 - je .get_lock - call change_task - jmp .wait_lock + cmp [application_table_status],0 + je .get_lock + call change_task + jmp .wait_lock .get_lock: - mov eax, 1 - xchg eax, [application_table_status] - cmp eax, 0 - jne .wait_lock + mov eax, 1 + xchg eax, [application_table_status] + cmp eax, 0 + jne .wait_lock - call set_application_table_status + call set_application_table_status - call get_new_process_place - test eax, eax - jz .failed + call get_new_process_place + test eax, eax + jz .failed - mov [slot], eax + mov [slot], eax - mov esi,[current_slot] - mov ebx,esi ;ebx=esi - pointer to extended information about current thread + mov esi,[current_slot] + mov ebx,esi ;ebx=esi - pointer to extended information about current thread - mov edi, eax - shl edi,8 - add edi,SLOT_BASE - mov edx,edi ;edx=edi - pointer to extended infomation about new thread - mov ecx,256/4 - xor eax, eax - cld - rep stosd ;clean extended information about new thread - mov esi,ebx - mov edi,edx - mov ecx,11 - rep movsb ;copy process name + mov edi, eax + shl edi,8 + add edi,SLOT_BASE + mov edx,edi ;edx=edi - pointer to extended infomation about new thread + mov ecx,256/4 + xor eax, eax + cld + rep stosd ;clean extended information about new thread + mov esi,ebx + mov edi,edx + mov ecx,11 + rep movsb ;copy process name - mov eax,[ebx+APPDATA.heap_base] - mov [edx+APPDATA.heap_base], eax + mov eax,[ebx+APPDATA.heap_base] + mov [edx+APPDATA.heap_base], eax - mov ecx,[ebx+APPDATA.heap_top] - mov [edx+APPDATA.heap_top], ecx + mov ecx,[ebx+APPDATA.heap_top] + mov [edx+APPDATA.heap_top], ecx - mov eax,[ebx+APPDATA.mem_size] - mov [edx+APPDATA.mem_size], eax + mov eax,[ebx+APPDATA.mem_size] + mov [edx+APPDATA.mem_size], eax - mov ecx,[ebx+APPDATA.dir_table] - mov [edx+APPDATA.dir_table],ecx ;copy page directory + mov ecx,[ebx+APPDATA.dir_table] + mov [edx+APPDATA.dir_table],ecx ;copy page directory - lea eax, [app_cmdline] - stdcall set_app_params ,[slot],eax,dword 0,\ - dword 0,dword 0 + lea eax, [app_cmdline] + stdcall set_app_params ,[slot],eax,dword 0,\ + dword 0,dword 0 - ;mov esi,new_process_running - ;call sys_msg_board_str ;output information about succefull startup + ;mov esi,new_process_running + ;call sys_msg_board_str ;output information about succefull startup - mov [application_table_status],0 ;unlock application_table_status mutex - mov eax,[process_number] ;set result - ret + mov [application_table_status],0 ;unlock application_table_status mutex + mov eax,[process_number] ;set result + ret .failed: - mov [application_table_status],0 - mov eax,-1 - ret + mov [application_table_status],0 + mov eax,-1 + ret endp ; param @@ -919,19 +919,19 @@ endp align 4 wait_mutex: ;;Maxis use atomic bts for mutex 4.4.2009 - push eax - push ebx + push eax + push ebx .do_wait: bts dword [ebx],0 jnc .locked - call change_task - jmp .do_wait + call change_task + jmp .do_wait .locked: - pop ebx - pop eax - ret + pop ebx + pop eax + ret -EFL_IF equ 0x0200 +EFL_IF equ 0x0200 EFL_IOPL1 equ 0x1000 EFL_IOPL2 equ 0x2000 EFL_IOPL3 equ 0x3000 @@ -939,166 +939,166 @@ EFL_IOPL3 equ 0x3000 align 4 proc set_app_params stdcall,slot:dword, params:dword,\ - cmd_line:dword, app_path:dword, flags:dword + cmd_line:dword, app_path:dword, flags:dword - locals - pl0_stack dd ? - endl + locals + pl0_stack dd ? + endl - stdcall kernel_alloc, RING0_STACK_SIZE+512 - mov [pl0_stack], eax + stdcall kernel_alloc, RING0_STACK_SIZE+512 + mov [pl0_stack], eax - lea edi, [eax+RING0_STACK_SIZE] + lea edi, [eax+RING0_STACK_SIZE] - mov eax, [slot] - mov ebx, eax + mov eax, [slot] + mov ebx, eax - shl eax, 8 - mov [eax+SLOT_BASE+APPDATA.fpu_state], edi - mov [eax+SLOT_BASE+APPDATA.fpu_handler], 0 - mov [eax+SLOT_BASE+APPDATA.sse_handler], 0 + shl eax, 8 + mov [eax+SLOT_BASE+APPDATA.fpu_state], edi + mov [eax+SLOT_BASE+APPDATA.exc_handler], 0 + mov [eax+SLOT_BASE+APPDATA.except_mask], 0 ;set default io permission map - mov [eax+SLOT_BASE+APPDATA.io_map],\ - (tss._io_map_0-OS_BASE+PG_MAP) - mov [eax+SLOT_BASE+APPDATA.io_map+4],\ - (tss._io_map_1-OS_BASE+PG_MAP) + mov [eax+SLOT_BASE+APPDATA.io_map],\ + (tss._io_map_0-OS_BASE+PG_MAP) + mov [eax+SLOT_BASE+APPDATA.io_map+4],\ + (tss._io_map_1-OS_BASE+PG_MAP) - mov esi, fpu_data - mov ecx, 512/4 - rep movsd + mov esi, fpu_data + mov ecx, 512/4 + rep movsd - cmp ebx,[TASK_COUNT] - jle .noinc - inc dword [TASK_COUNT] ;update number of processes + cmp ebx,[TASK_COUNT] + jle .noinc + inc dword [TASK_COUNT] ;update number of processes .noinc: - shl ebx,8 - lea edx, [ebx+SLOT_BASE+APP_EV_OFFSET] - mov [SLOT_BASE+APPDATA.fd_ev+ebx],edx - mov [SLOT_BASE+APPDATA.bk_ev+ebx],edx + shl ebx,8 + lea edx, [ebx+SLOT_BASE+APP_EV_OFFSET] + mov [SLOT_BASE+APPDATA.fd_ev+ebx],edx + mov [SLOT_BASE+APPDATA.bk_ev+ebx],edx - add edx, APP_OBJ_OFFSET-APP_EV_OFFSET - mov [SLOT_BASE+APPDATA.fd_obj+ebx],edx - mov [SLOT_BASE+APPDATA.bk_obj+ebx],edx + add edx, APP_OBJ_OFFSET-APP_EV_OFFSET + mov [SLOT_BASE+APPDATA.fd_obj+ebx],edx + mov [SLOT_BASE+APPDATA.bk_obj+ebx],edx - mov ecx, [def_cursor] - mov [SLOT_BASE+APPDATA.cursor+ebx],ecx - mov eax, [pl0_stack] - mov [SLOT_BASE+APPDATA.pl0_stack+ebx],eax - add eax, RING0_STACK_SIZE - mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax + mov ecx, [def_cursor] + mov [SLOT_BASE+APPDATA.cursor+ebx],ecx + mov eax, [pl0_stack] + mov [SLOT_BASE+APPDATA.pl0_stack+ebx],eax + add eax, RING0_STACK_SIZE + mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax - push ebx - stdcall kernel_alloc, 0x1000 - pop ebx - mov esi,[current_slot] - mov esi,[esi+APPDATA.cur_dir] - mov ecx,0x1000/4 - mov edi,eax - mov [ebx+SLOT_BASE+APPDATA.cur_dir],eax - rep movsd + push ebx + stdcall kernel_alloc, 0x1000 + pop ebx + mov esi,[current_slot] + mov esi,[esi+APPDATA.cur_dir] + mov ecx,0x1000/4 + mov edi,eax + mov [ebx+SLOT_BASE+APPDATA.cur_dir],eax + rep movsd - shr ebx,3 - mov eax, new_app_base - mov dword [CURRENT_TASK+ebx+0x10],eax + shr ebx,3 + mov eax, new_app_base + mov dword [CURRENT_TASK+ebx+0x10],eax .add_command_line: - mov edx,[params] - mov edx,[edx] ;app_cmdline - test edx,edx - jz @f ;application doesn't need parameters + mov edx,[params] + mov edx,[edx] ;app_cmdline + test edx,edx + jz @f ;application doesn't need parameters - mov eax, edx - add eax, 256 - jc @f + mov eax, edx + add eax, 256 + jc @f - cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] - ja @f + cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] + ja @f - mov byte [edx], 0 ;force empty string if no cmdline given - mov eax, [cmd_line] - test eax, eax - jz @f - stdcall strncpy, edx, eax, 256 + mov byte [edx], 0 ;force empty string if no cmdline given + mov eax, [cmd_line] + test eax, eax + jz @f + stdcall strncpy, edx, eax, 256 @@: - mov edx,[params] - mov edx, [edx+4] ;app_path - test edx,edx - jz @F ;application don't need path of file - mov eax, edx - add eax, 1024 - jc @f - cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] - ja @f - stdcall strncpy, edx, [app_path], 1024 + mov edx,[params] + mov edx, [edx+4] ;app_path + test edx,edx + jz @F ;application don't need path of file + mov eax, edx + add eax, 1024 + jc @f + cmp eax, [SLOT_BASE+APPDATA.mem_size+ebx*8] + ja @f + stdcall strncpy, edx, [app_path], 1024 @@: - mov ebx,[slot] - mov eax,ebx - shl ebx,5 - lea ecx,[draw_data+ebx] ;ecx - pointer to draw data + 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 - add ebx,CURRENT_TASK ;ebx - pointer to information about process - mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot + mov [ebx+window_data+WDATA.fl_wstate], WSTATE_NORMAL + mov [ebx+window_data+WDATA.fl_redraw], 1 + add ebx,CURRENT_TASK ;ebx - pointer to information about process + mov [ebx+TASKDATA.wnd_number],al;set window number on screen = process slot - mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) + mov [ebx+TASKDATA.event_mask],dword 1+2+4 ;set default event flags (see 40 function) - inc dword [process_number] - mov eax,[process_number] - mov [ebx+4],eax ;set PID + inc dword [process_number] + mov eax,[process_number] + mov [ebx+4],eax ;set PID ;set draw data to full screen - mov [ecx+0],dword 0 - mov [ecx+4],dword 0 - mov eax,[Screen_Max_X] - mov [ecx+8],eax - mov eax,[Screen_Max_Y] - mov [ecx+12],eax + mov [ecx+0],dword 0 + mov [ecx+4],dword 0 + mov eax,[Screen_Max_X] + mov [ecx+8],eax + mov eax,[Screen_Max_Y] + mov [ecx+12],eax - mov ebx, [pl0_stack] - mov esi,[params] - lea ecx, [ebx+REG_EIP] - xor eax, eax + mov ebx, [pl0_stack] + mov esi,[params] + lea ecx, [ebx+REG_EIP] + xor eax, eax - 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_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 eax, [esi+0x08] ;app_eip - mov [ebx+REG_EIP], eax ;app_entry - mov [ebx+REG_CS], dword app_code - mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF + 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 EFL_IOPL1+EFL_IF - mov eax, [esi+0x0C] ;app_esp - mov [ebx+REG_APP_ESP], eax ;app_stack - mov [ebx+REG_SS], dword app_data + 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, 5 - mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx + lea ecx, [ebx+REG_RET] + mov ebx, [slot] + shl ebx, 5 + mov [ebx*8+SLOT_BASE+APPDATA.saved_esp], ecx - xor ecx, ecx ; process state - running + xor ecx, ecx ; process state - running ; set if debuggee - test byte [flags], 1 - jz .no_debug - inc ecx ; process state - suspended - mov eax,[CURRENT_TASK] - mov [SLOT_BASE+ebx*8+APPDATA.debugger_slot],eax + test byte [flags], 1 + jz .no_debug + inc ecx ; process state - suspended + mov eax,[CURRENT_TASK] + mov [SLOT_BASE+ebx*8+APPDATA.debugger_slot],eax .no_debug: - mov [CURRENT_TASK+ebx+TASKDATA.state], cl - ;mov esi,new_process_running - ;call sys_msg_board_str ;output information about succefull startup - ret + mov [CURRENT_TASK+ebx+TASKDATA.state], cl + ;mov esi,new_process_running + ;call sys_msg_board_str ;output information about succefull startup + ret endp include "debug.inc" diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index ea7edee3bc..5336fedf69 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -41,7 +41,7 @@ * esi = 0xXYRRGGBB - цвет заголовка * RR, GG, BB определяют сам цвет * Y=0 - обычное окно, Y=1 - неперемещаемое окно - * X определяет градиент заголовка: X=0 - нет градиента, + * X определяет градиент заголовка: X=0 - нет градиента, X=8 - обычный градиент, для окон типа II X=4 - негативный градиент * прочие значения X и Y зарезервированы @@ -665,7 +665,7 @@ * Узнать, какое окно является активным, можно вызовом подфункции 7. ====================================================================== - Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. + Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду. ====================================================================== Под пустыми тактами понимается время, в которое процессор простаивает в ожидании прерывания (в инструкции hlt). @@ -686,7 +686,7 @@ * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц) ====================================================================== - Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. + Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске. ====================================================================== Параметры: * eax = 18 - номер функции @@ -766,7 +766,7 @@ Замечания: * Минимизированное окно с точки зрения функции 9 сохраняет положение и размеры. - * Восстановление окна приложения происходит при активизировании + * Восстановление окна приложения происходит при активизировании подфункцией 3. * Обычно нет необходимости явно сворачивать/разворачивать своё окно: сворачивание окна осуществляется системой при нажатии на кнопку @@ -1029,7 +1029,7 @@ dd 638 * иначе eax = номер слота ====================================================================== - Функция 18, подфункция 22 - операции с окном другого процесса/потока. + Функция 18, подфункция 22 - операции с окном другого процесса/потока. ====================================================================== Параметры: * eax = 18 - номер функции @@ -1066,7 +1066,7 @@ dd 638 * eax = 0 - успешно * eax = 1 - не определён базовый порт Замечания: - * Предварительно должен быть определён базовый порт вызовом + * Предварительно должен быть определён базовый порт вызовом подфункции 1 функции 21. ====================================================================== @@ -1082,7 +1082,7 @@ dd 638 Замечания: * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF. * Установка базы нужна для работы функции 20. - * Получить установленный базовый порт можно вызовом + * Получить установленный базовый порт можно вызовом подфункции 1 функции 26. ====================================================================== @@ -1112,7 +1112,7 @@ dd 638 нормальная раскладка, после чего из кода вычитается 0x60; если не нажата ни одна из управляющих клавиш, то используется нормальная раскладка. - * Получить раскладки и идентификатор страны можно с помощью + * Получить раскладки и идентификатор страны можно с помощью подфункции 2 функции 26. * Идентификатор страны - глобальная системная переменная, которая самим ядром не используется; однако приложение @panel отображает @@ -1130,7 +1130,7 @@ dd 638 * eax = 0 Замечания: * База CD используется функцией 24. - * Получить установленную базу CD можно вызовом + * Получить установленную базу CD можно вызовом подфункции 3 функции 26. ====================================================================== @@ -1168,7 +1168,7 @@ dd 638 * Не следует изменять базу, когда какое-нибудь приложение работает с жёстким диском. Если не хотите глюков системы. * Получить установленную базу можно вызовом подфункции 7 функции 26. - * Следует также определить используемый раздел жёсткого диска + * Следует также определить используемый раздел жёсткого диска подфункцией 8. ====================================================================== @@ -1191,9 +1191,9 @@ dd 638 * Получить установленный раздел можно вызовом подфункции 8 функции 26. * Проверок на корректность не делается. - * Узнать число разделов на жёстком диске можно вызовом + * Узнать число разделов на жёстком диске можно вызовом подфункции 11 функции 18. - * Следует также определить используемую базу жёсткого диска + * Следует также определить используемую базу жёсткого диска подфункцией 7. ====================================================================== @@ -1279,13 +1279,13 @@ dd 638 * ebx = частота вертикальной развёртки (в Гц) * ecx = номер текущего видеорежима Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Если нужны только размеры экрана, целесообразней использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. ====================================================================== -= Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. += Функция 21, подфункция 13, подподфункция 3 - установить видеорежим. ====================================================================== Параметры: * eax = 21 - номер функции @@ -1298,7 +1298,7 @@ dd 638 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Номер видеорежима и частота должны быть в таблице, возвращаемой функцией драйвера 1. @@ -1317,7 +1317,7 @@ dd 638 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. ====================================================================== @@ -1337,7 +1337,7 @@ dd 638 * eax = 0 - успешно * ebx, ecx разрушаются Замечания: - * Драйвер предварительно должен быть инициализирован вызовом + * Драйвер предварительно должен быть инициализирован вызовом функции драйвера 1. * Функция влияет только на физический размер изображения на мониторе; логический размер (число пикселей) не меняется. @@ -1418,7 +1418,7 @@ dd 638 * eax = 0 - успешно * eax = 1 - не определена база CD Замечания: - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. * В секунде 75 фреймов, в минуте 60 секунд. * Функция асинхронна (возвращает управление, когда началось @@ -1439,7 +1439,7 @@ dd 638 * Формат таблицы с информацией о дорожках такой же, как и для ATAPI-CD команды 43h (READ TOC), обычной таблицы (подкоманда 00h). Адреса возвращаются в формате MSF. - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. * Функция возвращает информацию только о не более чем 100 первых дорожках. В большинстве случаев этого достаточно. @@ -1454,7 +1454,7 @@ dd 638 * eax = 0 - успешно * eax = 1 - не определена база CD Замечания: - * Предварительно нужно определить базовый порт CD вызовом + * Предварительно нужно определить базовый порт CD вызовом подфункции 3 функции 21. ====================================================================== @@ -1498,7 +1498,7 @@ dd 638 Возвращаемое значение: * eax = номер порта Замечания: - * Установить базовый порт можно вызовом + * Установить базовый порт можно вызовом подфункции 1 функции 21. ====================================================================== @@ -1531,7 +1531,7 @@ dd 638 нормальная раскладка, после чего из кода вычитается 0x60; если не нажата ни одна из управляющих клавиш, то используется нормальная раскладка. - * Установить раскладки и идентификатор страны можно с помощью + * Установить раскладки и идентификатор страны можно с помощью подфункции 2 функции 21. * Идентификатор страны - глобальная системная переменная, которая самим ядром не используется; однако приложение @panel отображает @@ -1626,7 +1626,7 @@ dd 638 * eax = 0/1 - запрещён/разрешён Замечания: * Используется при LBA-чтении (подфункция 8 функции 58). - * Установить текущее состояние можно вызовом + * Установить текущее состояние можно вызовом подфункции 11 функции 21. ====================================================================== @@ -1641,7 +1641,7 @@ dd 638 Замечания: * Используется при работе с шиной PCI (функция 62). * Текущая реализация использует только младший бит ecx. - * Установить текущее состояние можно вызовом + * Установить текущее состояние можно вызовом подфункции 12 функции 21. ====================================================================== @@ -1892,7 +1892,7 @@ dd 638 Возвращаемое значение: * eax = [ширина]*65536 + [высота] Замечания: - * Есть парная команда установки размеров фонового изображения - + * Есть парная команда установки размеров фонового изображения - подфункция 1 функции 15. После которой, разумеется, следует заново определить само изображение. @@ -1911,7 +1911,7 @@ dd 638 * Не следует полагаться на возвращаемое значение в случае неверного смещения, оно может измениться в следующих версиях ядра. * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3. - * Есть парная функция установки точки на фоновом изображении - + * Есть парная функция установки точки на фоновом изображении - подфункция 2 функции 15. ====================================================================== @@ -1924,7 +1924,7 @@ dd 638 * eax = 1 - замостить * eax = 2 - растянуть Замечания: - * Есть парная функция установки режима отрисовки фона - + * Есть парная функция установки режима отрисовки фона - подфункция 4 функции 15. ====================================================================== @@ -2067,7 +2067,7 @@ dd 638 все зарезервированные им IRQ. ====================================================================== -= Функция 46 - зарезервировать/освободить группу портов ввода/вывода. += Функция 46 - зарезервировать/освободить группу портов ввода/вывода. ====================================================================== К зарезервированным портам можно обращаться напрямую из приложения командами in/out (рекомендуемый способ) и вызовом функции 43 @@ -2162,7 +2162,7 @@ dd 638 Возвращаемое значение: * функция не возвращает значения Замечания: - * После вызова описываемой функции следует перерисовать экран + * После вызова описываемой функции следует перерисовать экран подфункцией 0. * Тип кнопок влияет только на их прорисовку функцией 8. @@ -2179,7 +2179,7 @@ dd 638 Возвращаемое значение: * функция не возвращает значения Замечания: - * После вызова описываемой функции следует перерисовать экран + * После вызова описываемой функции следует перерисовать экран подфункцией 0. * Таблица стандартных цветов влияет только на приложения, которые эту таблицу явным образом получают (подфункцией 3) и @@ -2218,11 +2218,11 @@ dword- Замечания: * Структура таблицы цветов описана в стандартном включаемом файле macros.inc под названием system_colors; например, можно писать: - sc system_colors ; объявление переменной - ... ; где-то надо вызвать - ; описываемую функцию с ecx=sc - mov ecx, [sc.work_button_text] ; читаем цвет текста - ; на кнопке в рабочей области + sc system_colors ; объявление переменной + ... ; где-то надо вызвать + ; описываемую функцию с ecx=sc + mov ecx, [sc.work_button_text] ; читаем цвет текста + ; на кнопке в рабочей области * Использование/неиспользование этих цветов - дело исключительно самой программы. Для использования нужно просто при вызове функций рисования указывать цвет, взятый из этой таблицы. @@ -2293,7 +2293,7 @@ dword- Аналогично по оси y. * Смотри также функцию 14, позволяющую определить размеры всего экрана. - * Есть парная функция получения рабочей области - + * Есть парная функция получения рабочей области - подфункция 5. * Эта функция автоматически перерисовывает экран, по ходу дела обновляет координаты и размеры максимизированных окон. @@ -2417,7 +2417,7 @@ dword- * иначе eax = TID - идентификатор потока ====================================================================== -= Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера. += Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера. ====================================================================== Параметры: * eax = 52 - номер функции @@ -2442,7 +2442,7 @@ dword- * Локальный IP-адрес устанавливается подфункцией 3. ====================================================================== - Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера. + Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера. ====================================================================== Параметры: * eax = 52 - номер функции @@ -2768,7 +2768,7 @@ dword- * ebx разрушается ====================================================================== - Функция 53, подфункция 255 - отладочная информация сетевого драйвера. + Функция 53, подфункция 255 - отладочная информация сетевого драйвера. ====================================================================== Параметры: * eax = 53 - номер функции @@ -3010,8 +3010,8 @@ dword- * Размер блока - 512 байт; читается один блок. * Не следует полагаться на возвращаемое значение, оно может измениться в следующих версиях. - * Требуется, чтобы был разрешён LBA-доступ к устройствам - подфункцией 11 функции 21. Узнать это можно вызовом + * Требуется, чтобы был разрешён LBA-доступ к устройствам + подфункцией 11 функции 21. Узнать это можно вызовом подфункцией 11 функции 26. * LBA-чтение дискеты не поддерживается. * Функция считывает данные физического жёсткого диска; @@ -3025,7 +3025,7 @@ dword- это будет считаться успехом (eax=0). ====================================================================== -= Функция 58, подфункция 15 - получить информацию о файловой системе. += Функция 58, подфункция 15 - получить информацию о файловой системе. ====================================================================== Параметры: * eax = 58 - номер функции @@ -3122,10 +3122,10 @@ IPC Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs: - mov eax, [gs:0] + mov eax, [gs:0] поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих). - mov [gs:0], eax + mov [gs:0], eax при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). @@ -3641,30 +3641,49 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); или подфункцией 20. ====================================================================== -===== Функция 68, подфункция 14 - ожидать извещения от драйвера. ===== +==================== Функция 68, подфункция 14 ======================= +===== Ожидать получения сигнала, от других приложений/драйверов. ===== ====================================================================== Параметры: * eax = 68 - номер функции * ebx = 14 - номер подфункции - * ecx = указатель на буфер для информации (8 байт) + * ecx = указатель на буфер для информации (24 байта) Возвращаемое значение: * буфер, на который указывает ecx, содержит следующую информацию: - * +0: dword: константа EV_INTR = 1 - * +4: dword: данные драйвера -Замечания: - * Текущая реализация во время ожидания требует довольно "тяжёлых" - операций переключения контекста. + * +0: dword: идентификатор последующих данных сигнала + * +4: данные принятого сигнала (20 байт), формат которых + определяется первым dword-ом ====================================================================== -== Функция 68, подфункция 15 - установить обработчик исключений FPU. = +==== Функция 68, подфункция 15 - установить обработчик исключений === ====================================================================== Параметры: * eax = 68 - номер функции * ebx = 15 - номер подфункции * ecx = адрес нового обработчика исключений + * edx = маска обрабатываемых исключений Возвращаемое значение: * eax = адрес старого обработчика исключений (0, если он не был установлен) + * ebx = маска старого обработчика исключений +Замечания: + * Номер бита в маске исключений соответствуют номеру исключения по + спецификации на процессор (Intel-PC). Так например, исключения FPU + имеют номер 16 (#MF), а SSE - 19 (#XF). + * В данной реализации игнорируется запрос на перехват исключения 7 + - система обрабатывает #NM самостоятельно. + * Пользовательский обработчик получает номер исключения параметром + в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат + при этом производится на команду, вызвавшую исключение. + * При передаче управления обработчику исключений, сбрасывается + соответствующий бит в маске исключений. Возникновение этого же + исключения в последствии - приведет к default-обработке такового. + А именно: к завершению работы приложения, или приостановке с + нотификацией отлаживающему приложению. + * После завершения критических действий в обработчике пользователя, + восстановление бита маски данного исключения можно сделать + подфункцией 18. Сброс флагов исключений в модулях FPU и XMM - + также возлагается на обработчик пользователя. ====================================================================== =========== Функция 68, подфункция 16 - загрузить драйвер. =========== @@ -3705,15 +3724,19 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); * Предварительно должен быть получен хэндл драйвера подфункцией 16. ====================================================================== -== Функция 68, подфункция 18 - установить обработчик исключений SSE. = += Функция 68, подфункция 18 - изменение состояния активности сигнала = ====================================================================== Параметры: * eax = 68 - номер функции * ebx = 18 - номер подфункции - * ecx = адрес нового обработчика исключений + * ecx = номер сигнала + * edx = значение устанавливаемой активности (0/1) Возвращаемое значение: - * eax = адрес старого обработчика исключений - (0, если он не был установлен) + * eax = старое значение активности сигнала (0/1) +Замечания: + * В текущей реализации изменяется только маска пользовательского + обработчика исключений, установленного подфункцией 15. При этом + номер сигнала соответствует номеру исключения. ====================================================================== ============= Функция 68, подфункция 19 - загрузить DLL. ============= @@ -3874,7 +3897,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки - neg [bufsize] + neg [bufsize] * Данные в буфере трактуются как массив элементов переменной длины - сообщений. Формат сообщения указан в общем описании. @@ -3985,7 +4008,7 @@ Architecture Software Developer's Manual, Volume 3, Appendix B); общем описании). ====================================================================== - Функция 69, подфункция 7 - записать в память отлаживаемого процесса. + Функция 69, подфункция 7 - записать в память отлаживаемого процесса. ====================================================================== Параметры: * eax = 69 - номер функции diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 5d548b3690..4a654aec6e 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -679,7 +679,7 @@ Returned value: * eax = clock rate (modulo 2^32 clock ticks = 4GHz) ====================================================================== - Function 18, subfunction 6 - save ramdisk to the file on hard drive. + Function 18, subfunction 6 - save ramdisk to the file on hard drive. ====================================================================== Parameters: * eax = 18 - function number @@ -761,7 +761,7 @@ Returned value: Remarks: * The minimized window from the point of view of function 9 keeps position and sizes. - * Restoring of an application window occurs at its activation by + * Restoring of an application window occurs at its activation by subfunction 3. * Usually there is no necessity to minimize/restire a window obviously: minimization of a window is carried out by the system @@ -771,7 +771,7 @@ Remarks: restore of a window is done by the application '@panel'. ====================================================================== - Function 18, subfunction 11 - get information on the disk subsystem. + Function 18, subfunction 11 - get information on the disk subsystem. ====================================================================== Parameters: * eax = 18 - function number @@ -1062,7 +1062,7 @@ Returned value (is the same for both subfunctions): * eax = 0 - success * eax = 1 - base port is not defined Remarks: - * Previously the base port must be defined by + * Previously the base port must be defined by subfunction 1 of function 21. ====================================================================== @@ -1106,7 +1106,7 @@ Remarks: if Alt and Shift are not pressed, but Ctrl is pressed, the normal layout is used and then from the code is subtracted 0x60; if no control key is pressed, the normal layout is used. - * To get layout and country identifier use + * To get layout and country identifier use subfunction 2 of function 26. * Country identifier is global system variable, which is not used by the kernel itself; however the application '@panel' displays @@ -1160,7 +1160,7 @@ Remarks: * Do not change base, when any application works with hard disk. If you do not want system bugs. * To get HD base use subfunction 7 of function 26. - * It is also necessary to define used partition of hard disk by + * It is also necessary to define used partition of hard disk by subfunction 8. ====================================================================== @@ -1182,12 +1182,12 @@ Remarks: If you do not want system bugs. * To get used partition use subfunction 8 of function 26. * There is no correctness checks. - * To get the number of partitions of a hard disk use + * To get the number of partitions of a hard disk use subfunction 11 of function 18. * It is also necessary to define used HD base by subfunction 7. ====================================================================== - Function 21, subfunction 11 - enable/disable low-level access to HD. + Function 21, subfunction 11 - enable/disable low-level access to HD. ====================================================================== Parameters: * eax = 21 - function number @@ -1201,7 +1201,7 @@ Remarks: * To get current status use subfunction 11 of function 26. ====================================================================== - Function 21, subfunction 12 - enable/disable low-level access to PCI. + Function 21, subfunction 12 - enable/disable low-level access to PCI. ====================================================================== Parameters: * eax = 21 - function number @@ -1268,7 +1268,7 @@ Returned value: * ebx = frequency of the vertical scanning (in Hz) * ecx = number of current videomode Remarks: - * Driver must be initialized by call to + * Driver must be initialized by call to driver function 1. * If only screen sizes are required, it is more expedient to use function 14 taking into account that it @@ -1403,7 +1403,7 @@ Returned value: * eax = 0 - success * eax = 1 - CD base is not defined Remarks: - * Previously CD base must be defined by the call to + * Previously CD base must be defined by the call to subfunction 3 of function 21. * One second includes 75 frames, one minute includes 60 seconds. * The function is asynchronous (returns control, when play begins). @@ -1423,7 +1423,7 @@ Remarks: * The format of the table with tracks information is the same as for ATAPI-CD command 43h (READ TOC), usual table (subcommand 00h). Function returns addresses in MSF. - * Previously CD base port must be set by call to + * Previously CD base port must be set by call to subfunction 3 of function 21. * Function returns information only about no more than 100 first tracks. In most cases it is enough. @@ -1438,7 +1438,7 @@ Returned value: * eax = 0 - success * eax = 1 - CD base is not defined Remarks: - * Previously CD base port must be defined by call to + * Previously CD base port must be defined by call to subfunction 3 of function 21. ====================================================================== @@ -1513,7 +1513,7 @@ Remarks: if Alt and Shift are not pressed, but Ctrl is pressed, the normal layout is used and then from the code is subtracted 0x60; if no control key is pressed, the normal layout is used. - * To set layout and country identifier use + * To set layout and country identifier use subfunction 2 of function 21. * Country identifier is global system variable, which is not used by the kernel itself; however the application '@panel' displays @@ -1888,7 +1888,7 @@ Remarks: changed in future kernel versions. * Offset for pixel with coordinates (x,y) is calculated as (x+y*xsize)*3. - * There is a pair function to set pixel on the background image - + * There is a pair function to set pixel on the background image - subfunction 2 of function 15. ====================================================================== @@ -1901,7 +1901,7 @@ Returned value: * eax = 1 - tile * eax = 2 - stretch Remarks: - * There is a pair function to set drawing mode - + * There is a pair function to set drawing mode - subfunction 4 of function 15. ====================================================================== @@ -2193,11 +2193,11 @@ Remarks: * Structure of the color table is described in the standard include file 'macros.inc' as 'system_colors'; for example, it is possible to write: - sc system_colors ; variable declaration - ... ; somewhere one must call - ; this function with ecx=sc - mov ecx, [sc.work_button_text] ; read text color on - ; buttin in working area + sc system_colors ; variable declaration + ... ; somewhere one must call + ; this function with ecx=sc + mov ecx, [sc.work_button_text] ; read text color on + ; buttin in working area * A program itself desides to use or not to use color table. For usage program must simply at calls to drawing functions select color taken from the table. @@ -2392,7 +2392,7 @@ Parameters: Returned value: * eax = -1 - error (there is too many threads) * otherwise eax = TID - thread identifier - + ====================================================================== === Function 52, subfunction 0 - get network driver configuration. === @@ -2470,7 +2470,7 @@ Remarks: performs no checks on correctness. ====================================================================== - Function 52, subfunction 8 - read data from the network output queue. + Function 52, subfunction 8 - read data from the network output queue. ====================================================================== Parameters: * eax = 52 - function number @@ -2747,7 +2747,7 @@ Returned value: * ebx destroyed ====================================================================== -= Function 53, subfunction 255 - debug information of network driver. += Function 53, subfunction 255 - debug information of network driver. ====================================================================== Parameters: * eax = 53 - function number @@ -2778,7 +2778,7 @@ Possible values for ecx: * 6: status of packet driver, 0=inactive, nonzero=active ====================================================================== - Function 55, subfunction 55 - begin to play data on built-in speaker. + Function 55, subfunction 55 - begin to play data on built-in speaker. ====================================================================== Parameters: * eax = 55 - function number @@ -2923,7 +2923,7 @@ Remarks: that he requested 1; * if one requests more than 14 blocks or starting block is not less than 14, function returns eax=5 (not found) ш ebx=-1; - * size of ramdisk root folder is 14 blocks, + * size of ramdisk root folder is 14 blocks, 0x1C00=7168 срщЄ; but function returns ebx=0 (except of the case of previous item); * strangely enough, it is possible to read 14th block (which @@ -2985,8 +2985,8 @@ Remarks: * Block size is 512 bytes; function reads one block. * Do not depend on returned value, it can be changed in future versions. - * Function requires that LBA-access to devices is enabled by - subfunction 11 of function 21. To check this one can use + * Function requires that LBA-access to devices is enabled by + subfunction 11 of function 21. To check this one can use subfunction 11 of function 26. * LBA-read of floppy is not supported. * Function reads data on physical hard drive; if for any reason @@ -3096,11 +3096,11 @@ Remarks: The data of the graphics screen (the memory area which displays screen contents) are accessible to a program directly, without any system calls, through the selector gs: - mov eax, [gs:0] + mov eax, [gs:0] places in eax the first dword of the buffer, which contains information on color of the left upper point (and, possibly, colors of several following). - mov [gs:0], eax + mov [gs:0], eax by work in VESA modes with LFB sets color of the left upper point (and, possibly, colors of several following). To interpret the data of graphics screen program needs to know @@ -3613,29 +3613,47 @@ Remarks: or subfunction 20. ====================================================================== -======== Function 68, subfunction 14 - wait for driver notify. ======= +===================== Function 68, subfunction 14 ==================== +====== Waiting delivering of signal from another program/driver ====== ====================================================================== Parameters: * eax = 68 - function number * ebx = 14 - subfunction number - * ecx = pointer to the buffer for information (8 bytes) + * ecx = pointer to the buffer for information (24 bytes) Returned value: * buffer pointed to by ecx contains the following information: - * +0: dword: constant EV_INTR = 1 - * +4: dword: driver data -Remarks: - * The current implementation at wait time uses "heavy" operations - of task switch. + * +0: dword: identifier for underlying data of signal + * +4: data of signal (20 bytes), format of which is defining by + first dword ====================================================================== -====== Function 68, subfunction 15 - set FPU exception handler. ====== +====== Function 68, subfunction 15 - set new exceptions handler ====== ====================================================================== Parameters: * eax = 68 - function number * ebx = 15 - subfunction number * ecx = address of the new exception handler + * edx = the mask of processing exceptions Returned value: * eax = address of the old exception handler (0, if it was not set) + * ebx = the old mask of exception handler +Remarks: + * Bit number in mask of exceptions is correspond to exception number + by CPU-specification (Intel-PC). For example, FPU-exception have + number 16 (#MF), and SSE-exception - 19 (#XF) + * The current implementation ignore the inquiry for hook of 7 + exception - system process #NM by one's own. + * User handler get exception number in stack parameter. So, correct + exit from handler is: RET 4. Return from handler is to the same + instruction, that was cause the exception + * When control is transfering to user handler, corresponding bit in + exception mask is clearing. Rising this exception in consequence + - reduce to default-handling. Exactly: terminating the application, + or suspending with debug-notify to owner. + * After completion of critical operations in user handler, it may be + rising corresponding bit in exception mask by using subfunction 18 + Clearing exceptions flags in FPU and/or XMM modules - is + responsibility of user handler too. ====================================================================== ============= Function 68, subfunction 16 - load driver. ============= @@ -3676,14 +3694,19 @@ Remarks: * Previously one must obtain driver handle by subfunction 16. ====================================================================== -====== Function 68, subfunction 18 - set SSE exception handler. ====== +==== Function 68, subfunction 18 - change state of signal activity === ====================================================================== Parameters: * eax = 68 - function number * ebx = 15 - subfunction number - * ecx = address of the new exception handler + * ecx = signal number + * edx = value of activity (0/1) Returned value: - * eax = address of the old exception handler (0, if it was not set) + * eax = value of old activity for this signal (0/1) +Remarks: + * In current implementation, it is changed only exception mask for + user exception handler, wich was previously set by subfunction 15. + At that, number of signal correspond to exception number. ====================================================================== =============== Function 68, subfunction 19 - load DLL. ============== @@ -3787,7 +3810,7 @@ Remarks: and at arrival of new message the system will wait. For synchronization frame all work with the buffer by operations lock/unlock - neg [bufsize] + neg [bufsize] * Data in the buffer are considered as array of items with variable length - messages. Format of a message is explained in general description. diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 2397355118..fde4cd5791 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -675,8 +675,8 @@ no_lib_load: xor eax, eax mov dword [SLOT_BASE+APPDATA.fpu_state], fpu_data - mov dword [SLOT_BASE+APPDATA.fpu_handler], eax - mov dword [SLOT_BASE+APPDATA.sse_handler], eax + mov dword [SLOT_BASE+APPDATA.exc_handler], eax + mov dword [SLOT_BASE+APPDATA.except_mask], eax ; name for OS/IDLE process @@ -697,8 +697,8 @@ no_lib_load: cld rep movsd - mov dword [SLOT_BASE+256+APPDATA.fpu_handler], eax - mov dword [SLOT_BASE+256+APPDATA.sse_handler], eax + 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 diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index d09f408ea2..b43b404635 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -122,8 +122,8 @@ struc APPDATA .fpu_state dd ? ;+16 .ev_count_ dd ? ;unused ;+20 - .fpu_handler dd ? ;+24 - .sse_handler dd ? ;+28 + .exc_handler dd ? ;+24 + .except_mask dd ? ;+28 .pl0_stack dd ? ;unused ;+32 .heap_base dd ? ;+36 .heap_top dd ? ;+40