Rev 9710 | Rev 9794 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9710 | Rev 9715 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2021. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2022. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License. ;; |
4 | ;; Distributed under terms of the GNU General Public License. ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 9710 $ |
8 | $Revision: 9715 $ |
Line 9... | Line 9... | ||
9 | 9 | ||
Line 125... | Line 125... | ||
125 | mov esi, -TASKMAN_ERROR_TOO_MANY_PROCESSES |
125 | mov esi, -TASKMAN_ERROR_TOO_MANY_PROCESSES |
126 | test eax, eax |
126 | test eax, eax |
127 | jz .err_0 |
127 | jz .err_0 |
Line 128... | Line 128... | ||
128 | 128 | ||
129 | mov [slot], eax |
129 | mov [slot], eax |
130 | shl eax, 8 |
130 | shl eax, BSF sizeof.APPDATA |
131 | lea edi, [SLOT_BASE+eax] |
131 | lea edi, [SLOT_BASE + eax] |
132 | mov [slot_base], edi |
132 | mov [slot_base], edi |
133 | ; clean extended information about process |
133 | ; clean extended information about process |
134 | mov ecx, sizeof.APPDATA/4 |
134 | mov ecx, sizeof.APPDATA/4 |
135 | xor eax, eax |
135 | xor eax, eax |
Line 167... | Line 167... | ||
167 | mov esi, -TASKMAN_ERROR_OUT_OF_MEMORY |
167 | mov esi, -TASKMAN_ERROR_OUT_OF_MEMORY |
168 | test eax, eax |
168 | test eax, eax |
169 | jz .err_hdr |
169 | jz .err_hdr |
Line 170... | Line 170... | ||
170 | 170 | ||
171 | ; add new process to the list |
171 | ; add new process to the list |
172 | mov ebx, [sys_proc+LHEAD.prev] |
172 | mov ebx, [sys_proc + LHEAD.prev] |
173 | __list_add eax, ebx, sys_proc |
173 | __list_add eax, ebx, sys_proc |
174 | ; fill the structure fields: |
174 | ; fill the structure fields: |
175 | mov ebx, [hdr_emem] |
175 | mov ebx, [hdr_emem] |
Line 176... | Line 176... | ||
176 | mov [eax+PROC.mem_used], ebx |
176 | mov [eax + PROC.mem_used], ebx |
177 | 177 | ||
178 | ; write that main thread of app belongs to new process |
178 | ; write that main thread of app belongs to new process |
Line 179... | Line 179... | ||
179 | mov ebx, [slot_base] |
179 | mov ebx, [slot_base] |
180 | mov [ebx+APPDATA.process], eax |
180 | mov [ebx + APPDATA.process], eax |
181 | 181 | ||
182 | ; initialize the thread list of process: at this moment it consists only of one main thread |
182 | ; initialize the thread list of process: at this moment it consists only of one main thread |
Line 183... | Line 183... | ||
183 | lea edx, [ebx+APPDATA.list] |
183 | lea edx, [ebx + APPDATA.list] |
184 | lea ecx, [eax+PROC.thr_list] |
184 | lea ecx, [eax + PROC.thr_list] |
185 | list_add_tail edx, ecx |
185 | list_add_tail edx, ecx |
186 | 186 | ||
187 | ; allocate space and copy app header data locals and cmdline string there, put pointer to exec_params of new thread |
187 | ; allocate space and copy app header data locals and cmdline string there, put pointer to exec_params of new thread |
188 | mov eax, [cmdline_size] |
188 | mov eax, [cmdline_size] |
189 | add eax, sizeof.APP_HDR |
189 | add eax, sizeof.APP_HDR |
190 | stdcall kernel_alloc, eax |
190 | stdcall kernel_alloc, eax |
191 | mov [ebx+APPDATA.exec_params], eax |
191 | mov [ebx + APPDATA.exec_params], eax |
192 | mov edi, eax |
192 | mov edi, eax |
Line 229... | Line 229... | ||
229 | 229 | ||
230 | cmp [eax+6], word '00' |
230 | cmp [eax+6], word '00' |
Line 231... | Line 231... | ||
231 | jne .check_01_header |
231 | jne .check_01_header |
232 | 232 | ||
233 | mov ecx, [APP_HEADER_00.start] |
233 | mov ecx, [APP_HEADER_00.start] |
234 | mov [ebx+APP_HDR.eip], ecx |
234 | mov [ebx + APP_HDR.eip], ecx |
235 | mov edx, [APP_HEADER_00.mem_size] |
235 | mov edx, [APP_HEADER_00.mem_size] |
236 | mov [ebx+APP_HDR._emem], edx |
236 | mov [ebx + APP_HDR._emem], edx |
237 | shr edx, 1 |
237 | shr edx, 1 |
238 | sub edx, 0x10 |
238 | sub edx, 0x10 |
239 | mov [ebx+APP_HDR.esp], edx |
239 | mov [ebx + APP_HDR.esp], edx |
240 | mov ecx, [APP_HEADER_00.i_param] |
240 | mov ecx, [APP_HEADER_00.i_param] |
241 | mov [ebx+APP_HDR.cmdline], ecx |
241 | mov [ebx + APP_HDR.cmdline], ecx |
242 | mov [ebx+APP_HDR.path], 0 |
242 | mov [ebx + APP_HDR.path], 0 |
243 | mov edx, [APP_HEADER_00.i_end] |
243 | mov edx, [APP_HEADER_00.i_end] |
Line 244... | Line 244... | ||
244 | mov [ebx+APP_HDR._edata], edx |
244 | mov [ebx + APP_HDR._edata], edx |
Line 245... | Line 245... | ||
245 | ret |
245 | ret |
246 | 246 | ||
247 | .check_01_header: |
247 | .check_01_header: |
248 | 248 | ||
249 | cmp [eax+6], word '01' |
249 | cmp [eax+6], word '01' |
250 | je @f |
250 | je @f |
251 | cmp [eax+6], word '02' |
251 | cmp [eax+6], word '02' |
252 | jne .fail |
252 | jne .fail |
Line 253... | Line 253... | ||
253 | @@: |
253 | @@: |
254 | mov ecx, [APP_HEADER_01.start] |
254 | mov ecx, [APP_HEADER_01.start] |
255 | mov [ebx+0x08], ecx |
255 | mov [ebx + 0x08], ecx |
256 | mov edx, [APP_HEADER_01.mem_size] |
256 | mov edx, [APP_HEADER_01.mem_size] |
257 | 257 | ||
258 | ; \begin{diamond}[20.08.2006] |
258 | ; \begin{diamond}[20.08.2006] |
Line 259... | Line 259... | ||
259 | ; sanity check (functions 19,58 load app_i_end bytes and that must |
259 | ; sanity check (functions 19,58 load app_i_end bytes and that must |
260 | ; fit in allocated memory to prevent kernel faults) |
260 | ; fit in allocated memory to prevent kernel faults) |
261 | cmp edx, [APP_HEADER_01.i_end] |
261 | cmp edx, [APP_HEADER_01.i_end] |
262 | jb .fail |
262 | jb .fail |
263 | ; \end{diamond}[20.08.2006] |
263 | ; \end{diamond}[20.08.2006] |
264 | 264 | ||
265 | mov [ebx+APP_HDR._emem], edx |
265 | mov [ebx + APP_HDR._emem], edx |
266 | mov ecx, [APP_HEADER_01.stack_top] |
266 | mov ecx, [APP_HEADER_01.stack_top] |
267 | mov [ebx+APP_HDR.esp], ecx |
267 | mov [ebx + APP_HDR.esp], ecx |
268 | mov edx, [APP_HEADER_01.i_param] |
268 | mov edx, [APP_HEADER_01.i_param] |
269 | mov [ebx+APP_HDR.cmdline], edx |
269 | mov [ebx + APP_HDR.cmdline], edx |
270 | mov ecx, [APP_HEADER_01.i_icon] |
270 | mov ecx, [APP_HEADER_01.i_icon] |
271 | mov [ebx+APP_HDR.path], ecx |
271 | mov [ebx + APP_HDR.path], ecx |
Line 292... | Line 292... | ||
292 | cli |
292 | cli |
293 | .l1: |
293 | .l1: |
294 | bsf eax, [edx] |
294 | bsf eax, [edx] |
295 | jnz .found |
295 | jnz .found |
296 | add edx, 4 |
296 | add edx, 4 |
297 | cmp edx, thr_slot_map+32 |
297 | cmp edx, thr_slot_map + 32 |
298 | jb .l1 |
298 | jb .l1 |
Line 299... | Line 299... | ||
299 | 299 | ||
300 | popfd |
300 | popfd |
301 | xor eax, eax |
301 | xor eax, eax |
302 | ret |
302 | ret |
303 | .found: |
303 | .found: |
304 | btr [edx], eax |
304 | btr [edx], eax |
305 | sub edx, thr_slot_map |
305 | sub edx, thr_slot_map |
306 | lea eax, [eax+edx*8] |
306 | lea eax, [eax + edx*8] |
307 | popfd |
307 | popfd |
Line 308... | Line 308... | ||
308 | ret |
308 | ret |
309 | 309 | ||
Line 329... | Line 329... | ||
329 | stdcall kernel_alloc, 0x2000 |
329 | stdcall kernel_alloc, 0x2000 |
330 | test eax, eax |
330 | test eax, eax |
331 | jz .fail |
331 | jz .fail |
332 | mov [process], eax |
332 | mov [process], eax |
Line 333... | Line 333... | ||
333 | 333 | ||
334 | lea edi, [eax+PROC.heap_lock] |
334 | lea edi, [eax + PROC.heap_lock] |
Line 335... | Line 335... | ||
335 | mov ecx, (PROC.ht_free-PROC.heap_lock)/4 |
335 | mov ecx, (PROC.ht_free - PROC.heap_lock)/4 |
336 | 336 | ||
337 | list_init eax |
337 | list_init eax |
Line 353... | Line 353... | ||
353 | cmp eax, ecx |
353 | cmp eax, ecx |
354 | jbe @B |
354 | jbe @B |
Line 355... | Line 355... | ||
355 | 355 | ||
356 | mov eax, edi |
356 | mov eax, edi |
357 | call get_pg_addr |
357 | call get_pg_addr |
Line 358... | Line 358... | ||
358 | mov [edi-4096+PROC.pdt_0_phys], eax |
358 | mov [edi - 4096 + PROC.pdt_0_phys], eax |
359 | 359 | ||
360 | mov ecx, (OS_BASE shr 20)/4 |
360 | mov ecx, (OS_BASE shr 20)/4 |
Line 361... | Line 361... | ||
361 | xor eax, eax |
361 | xor eax, eax |
362 | rep stosd |
362 | rep stosd |
363 | 363 | ||
Line 364... | Line 364... | ||
364 | mov ecx, (OS_BASE shr 20)/4 |
364 | mov ecx, (OS_BASE shr 20)/4 |
365 | mov esi, sys_proc+PROC.pdt_0+(OS_BASE shr 20) |
365 | mov esi, sys_proc + PROC.pdt_0 + (OS_BASE shr 20) |
366 | rep movsd |
366 | rep movsd |
Line 367... | Line 367... | ||
367 | 367 | ||
368 | mov eax, [edi-8192+PROC.pdt_0_phys] |
368 | mov eax, [edi - 8192 + PROC.pdt_0_phys] |
Line 369... | Line 369... | ||
369 | or eax, PG_SWR |
369 | or eax, PG_SWR |
Line 445... | Line 445... | ||
445 | push ecx |
445 | push ecx |
Line 446... | Line 446... | ||
446 | 446 | ||
447 | mov esi, ecx |
447 | mov esi, ecx |
Line 448... | Line 448... | ||
448 | list_del esi |
448 | list_del esi |
449 | 449 | ||
Line 450... | Line 450... | ||
450 | mov esi, [esi+PROC.dlls_list_ptr] |
450 | mov esi, [esi + PROC.dlls_list_ptr] |
451 | call destroy_all_hdlls |
451 | call destroy_all_hdlls |
452 | 452 | ||
Line 473... | Line 473... | ||
473 | ret |
473 | ret |
Line 474... | Line 474... | ||
474 | 474 | ||
475 | align 4 |
475 | align 4 |
476 | get_pid: |
476 | get_pid: |
477 | mov eax, [current_slot] |
477 | mov eax, [current_slot] |
478 | mov eax, [eax+APPDATA.tid] |
478 | mov eax, [eax + APPDATA.tid] |
Line 479... | Line 479... | ||
479 | ret |
479 | ret |
480 | 480 | ||
481 | pid_to_slot: |
481 | pid_to_slot: |
Line 486... | Line 486... | ||
486 | ;Search process by PID. |
486 | ;Search process by PID. |
487 | push ebx |
487 | push ebx |
488 | push ecx |
488 | push ecx |
489 | mov ebx, [thread_count] |
489 | mov ebx, [thread_count] |
490 | shl ebx, BSF sizeof.APPDATA ; multiply by size |
490 | shl ebx, BSF sizeof.APPDATA ; multiply by size |
491 | ; add 2*32 cause: |
- | |
492 | ; [TASK_TABLE; TASK_TABLE + 32) isnt a task actually |
- | |
493 | ; skip first process in the task table |
491 | ; skip first process in the task table |
494 | ;mov ecx, 2*32 ;sizeof.TASKDATA |
- | |
495 | mov ecx, sizeof.APPDATA |
492 | mov ecx, sizeof.APPDATA |
Line 496... | Line 493... | ||
496 | 493 | ||
497 | .loop: |
494 | .loop: |
498 | ;ecx = offset of current process info entry |
495 | ;ecx = offset of current process info entry |
499 | ;ebx = maximum permitted offset |
496 | ;ebx = maximum permitted offset |
500 | cmp [SLOT_BASE + ecx + APPDATA.state], TSTATE_FREE |
497 | cmp [SLOT_BASE + ecx + APPDATA.state], TSTATE_FREE |
501 | jz .endloop ;skip empty slots |
498 | jz .endloop ;skip empty slots |
502 | cmp [ecx + SLOT_BASE + APPDATA.tid], eax;check PID |
499 | cmp [SLOT_BASE + ecx + APPDATA.tid], eax |
503 | jz .pid_found |
500 | jz .pid_found |
504 | .endloop: |
501 | .endloop: |
505 | add ecx, sizeof.APPDATA |
502 | add ecx, sizeof.APPDATA |
506 | cmp ecx, ebx |
503 | cmp ecx, ebx |
Line 696... | Line 693... | ||
696 | 693 | ||
697 | mov esi, [current_slot] |
694 | mov esi, [current_slot] |
Line 698... | Line 695... | ||
698 | mov ebx, esi ;ebx=esi - pointer to extended information about current thread |
695 | mov ebx, esi ;ebx=esi - pointer to extended information about current thread |
699 | 696 | ||
700 | mov edi, eax |
697 | mov edi, eax |
701 | shl edi, 8 |
698 | shl edi, BSF sizeof.APPDATA |
702 | add edi, SLOT_BASE |
699 | add edi, SLOT_BASE |
703 | mov edx, edi ;edx=edi - pointer to extended infomation about new thread |
700 | mov edx, edi ;edx=edi - pointer to extended infomation about new thread |
704 | mov ecx, sizeof.APPDATA/4 |
701 | mov ecx, sizeof.APPDATA/4 |
Line 709... | Line 706... | ||
709 | mov edi, edx |
706 | mov edi, edx |
710 | mov ecx, 11 |
707 | mov ecx, 11 |
711 | rep movsb ;copy process name |
708 | rep movsb ;copy process name |
Line 712... | Line 709... | ||
712 | 709 | ||
713 | 710 | ||
714 | mov eax, [ebx+APPDATA.tls_base] |
711 | mov eax, [ebx + APPDATA.tls_base] |
Line 715... | Line 712... | ||
715 | test eax, eax |
712 | test eax, eax |
716 | jz @F |
713 | jz @F |
717 | 714 | ||
718 | push edx |
715 | push edx |
719 | stdcall user_alloc, 4096 |
716 | stdcall user_alloc, 4096 |
720 | pop edx |
717 | pop edx |
721 | test eax, eax |
718 | test eax, eax |
Line 722... | Line 719... | ||
722 | jz .failed1;eax=0 |
719 | jz .failed1;eax=0 |
723 | @@: |
720 | @@: |
Line 724... | Line 721... | ||
724 | mov [edx+APPDATA.tls_base], eax |
721 | mov [edx + APPDATA.tls_base], eax |
725 | 722 | ||
726 | mov eax, [ebx+APPDATA.process] |
723 | mov eax, [ebx + APPDATA.process] |
Line 727... | Line 724... | ||
727 | mov [edx+APPDATA.process], eax |
724 | mov [edx + APPDATA.process], eax |
728 | 725 | ||
Line 794... | Line 791... | ||
794 | endp |
791 | endp |
Line 795... | Line 792... | ||
795 | 792 | ||
796 | align 4 |
793 | align 4 |
797 | common_app_entry: |
794 | common_app_entry: |
798 | mov ebp, [current_slot] |
795 | mov ebp, [current_slot] |
799 | mov ebp, [ebp+APPDATA.exec_params] |
796 | mov ebp, [ebp + APPDATA.exec_params] |
800 | test ebp, ebp |
797 | test ebp, ebp |
801 | jz .exit |
798 | jz .exit |
802 | ; APPDATA.exec_params have first thread only, |
799 | ; APPDATA.exec_params have first thread only, |
803 | ; so second and next threads don't get here (they jump to .exit) |
800 | ; so second and next threads don't get here (they jump to .exit) |
804 | stdcall map_process_image, [ebp+APP_HDR._emem],\ |
801 | stdcall map_process_image, [ebp + APP_HDR._emem],\ |
805 | [ebp+APP_HDR.img_base], [ebp+APP_HDR.img_size] |
802 | [ebp + APP_HDR.img_base], [ebp + APP_HDR.img_size] |
806 | mov esi, [ebp+APP_HDR.path_string] |
803 | mov esi, [ebp + APP_HDR.path_string] |
807 | mov edi, [ebp+APP_HDR.path] |
804 | mov edi, [ebp + APP_HDR.path] |
808 | mov ecx, [ebp+APP_HDR.filename_size] |
805 | mov ecx, [ebp + APP_HDR.filename_size] |
809 | cmp ecx, 1023 |
806 | cmp ecx, 1023 |
810 | jc @f |
807 | jc @f |
811 | mov ecx, 1022 |
808 | mov ecx, 1022 |
812 | @@: |
809 | @@: |
813 | push esi |
810 | push esi |
814 | test edi, edi |
811 | test edi, edi |
815 | jz @f |
812 | jz @f |
816 | stdcall is_region_userspace, edi, [ebp+APP_HDR.filename_size] |
813 | stdcall is_region_userspace, edi, [ebp + APP_HDR.filename_size] |
817 | jnz @f |
814 | jnz @f |
818 | mov al, '/' |
815 | mov al, '/' |
819 | stosb |
816 | stosb |
820 | rep movsb |
817 | rep movsb |
821 | mov byte [edi], 0 |
818 | mov byte [edi], 0 |
822 | @@: |
819 | @@: |
823 | call kernel_free |
820 | call kernel_free |
824 | mov edi, [ebp+APP_HDR.cmdline] |
821 | mov edi, [ebp + APP_HDR.cmdline] |
825 | test edi, edi |
822 | test edi, edi |
826 | jz .check_tls_header |
823 | jz .check_tls_header |
827 | lea esi, [ebp+sizeof.APP_HDR] |
824 | lea esi, [ebp + sizeof.APP_HDR] |
828 | mov ecx, [ebp+APP_HDR.cmdline_size] |
825 | mov ecx, [ebp + APP_HDR.cmdline_size] |
829 | cmp ecx, 256 |
826 | cmp ecx, 256 |
830 | jb .copy_cmdline |
827 | jb .copy_cmdline |
831 | mov edi, [ebp+APP_HDR._emem] |
828 | mov edi, [ebp + APP_HDR._emem] |
832 | add edi, 4095 |
829 | add edi, 4095 |
833 | and edi, -4096 |
830 | and edi, -4096 |
834 | sub edi, ecx |
831 | sub edi, ecx |
835 | dec edi |
832 | dec edi |
Line 850... | Line 847... | ||
850 | cmp word [6], '02' |
847 | cmp word [6], '02' |
851 | jne .try_load_dll ;.cleanup |
848 | jne .try_load_dll ;.cleanup |
852 | call init_heap |
849 | call init_heap |
853 | stdcall user_alloc, 4096 |
850 | stdcall user_alloc, 4096 |
854 | mov edx, [current_slot] |
851 | mov edx, [current_slot] |
855 | mov [edx+APPDATA.tls_base], eax |
852 | mov [edx + APPDATA.tls_base], eax |
856 | mov [tls_data_l+2], ax |
853 | mov [tls_data_l+2], ax |
857 | shr eax, 16 |
854 | shr eax, 16 |
858 | mov [tls_data_l+4], al |
855 | mov [tls_data_l+4], al |
859 | mov [tls_data_l+7], ah |
856 | mov [tls_data_l+7], ah |
860 | mov dx, app_tls |
857 | mov dx, app_tls |
861 | mov fs, dx |
858 | mov fs, dx |
862 | ; { Patch by Coldy, For DLL autoload |
859 | ; { Patch by Coldy, For DLL autoload |
863 | .try_load_dll: |
860 | .try_load_dll: |
864 | ; Test app header version |
861 | ; Test app header version |
865 | mov ecx, dword[ebp+APP_HDR.img_base] |
862 | mov ecx, dword[ebp + APP_HDR.img_base] |
866 | cmp dword[ecx+8], 2 |
863 | cmp dword[ecx+8], 2 |
867 | jne .cleanup |
864 | jne .cleanup |
868 | ;if APP_HEADER.version = 2 => load lib/dll.obj & change eip to APP_STARTUP_THUNK |
865 | ;if APP_HEADER.version = 2 => load lib/dll.obj & change eip to APP_STARTUP_THUNK |
869 | DEBUGF 1, 'K : App header version 2\n' |
866 | DEBUGF 1, 'K : App header version 2\n' |
870 | stdcall load_library, dll_lib_path, 0 |
867 | stdcall load_library, dll_lib_path, 0 |
Line 885... | Line 882... | ||
885 | sub eax, 4 |
882 | sub eax, 4 |
886 | mov eax, [eax] |
883 | mov eax, [eax] |
Line 887... | Line 884... | ||
887 | 884 | ||
888 | ;.change_eip: |
885 | ;.change_eip: |
889 | mov ecx, [current_slot] |
886 | mov ecx, [current_slot] |
890 | mov ecx, [ecx+APPDATA.pl0_stack] |
887 | mov ecx, [ecx + APPDATA.pl0_stack] |
Line 891... | Line 888... | ||
891 | mov [ecx+REG_EIP], eax |
888 | mov [ecx+REG_EIP], eax |
892 | 889 | ||
893 | ; } End patch by Coldy, For DLL autoload |
890 | ; } End patch by Coldy, For DLL autoload |
894 | .cleanup: |
891 | .cleanup: |
895 | stdcall free_kernel_space, [ebp+APP_HDR.img_base] |
892 | stdcall free_kernel_space, [ebp+APP_HDR.img_base] |
896 | stdcall kernel_free, ebp |
893 | stdcall kernel_free, ebp |
897 | mov ebx, [current_slot] |
894 | mov ebx, [current_slot] |
898 | cmp [ebx+APPDATA.debugger_slot], 0 |
895 | cmp [ebx + APPDATA.debugger_slot], 0 |
899 | je .exit |
896 | je .exit |
900 | mov [ebx+APPDATA.state], TSTATE_RUN_SUSPENDED |
897 | mov [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED |
901 | mov [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED |
898 | mov [ebx + APPDATA.state], TSTATE_RUN_SUSPENDED |
902 | call change_task |
899 | call change_task |
903 | .exit: |
900 | .exit: |
Line 925... | Line 922... | ||
925 | 922 | ||
926 | mov eax, [slot] |
923 | mov eax, [slot] |
Line 927... | Line 924... | ||
927 | mov ebx, eax |
924 | mov ebx, eax |
928 | 925 | ||
929 | shl eax, BSF sizeof.APPDATA |
926 | shl eax, BSF sizeof.APPDATA |
930 | mov [eax+SLOT_BASE+APPDATA.fpu_state], edi |
927 | mov [SLOT_BASE + eax + APPDATA.fpu_state], edi |
931 | mov [eax+SLOT_BASE+APPDATA.exc_handler], 0 |
928 | mov [SLOT_BASE + eax + APPDATA.exc_handler], 0 |
Line 932... | Line 929... | ||
932 | mov [eax+SLOT_BASE+APPDATA.except_mask], 0 |
929 | mov [SLOT_BASE + eax + APPDATA.except_mask], 0 |
933 | mov [eax+SLOT_BASE+APPDATA.terminate_protection], 80000001h |
930 | mov [SLOT_BASE + eax + APPDATA.terminate_protection], 80000001h |
934 | 931 | ||
935 | ;set default io permission map |
932 | ;set default io permission map |
936 | mov ecx, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map] |
933 | mov ecx, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map] |
Line 937... | Line 934... | ||
937 | mov [eax+SLOT_BASE+APPDATA.io_map], ecx |
934 | mov [SLOT_BASE + eax + APPDATA.io_map], ecx |
938 | mov ecx, [SLOT_BASE+sizeof.APPDATA+APPDATA.io_map+4] |
935 | mov ecx, [SLOT_BASE + sizeof.APPDATA + APPDATA.io_map + 4] |
939 | mov [eax+SLOT_BASE+APPDATA.io_map+4], ecx |
936 | mov [SLOT_BASE + eax + APPDATA.io_map + 4], ecx |
940 | 937 | ||
941 | mov esi, fpu_data |
938 | mov esi, fpu_data |
Line 942... | Line 939... | ||
942 | mov ecx, [xsave_area_size] |
939 | mov ecx, [xsave_area_size] |
943 | add ecx, 3 |
940 | add ecx, 3 |
944 | shr ecx, 2 |
941 | shr ecx, 2 |
945 | rep movsd |
942 | rep movsd |
946 | 943 | ||
947 | cmp [thread_count], ebx |
944 | cmp [thread_count], ebx |
948 | adc [thread_count], 0 ; update number of processes |
945 | adc [thread_count], 0 ; update number of processes |
949 | shl ebx, BSF sizeof.APPDATA |
946 | shl ebx, BSF sizeof.APPDATA |
950 | lea edx, [ebx+SLOT_BASE+APP_EV_OFFSET] |
947 | lea edx, [SLOT_BASE + ebx + APP_EV_OFFSET] |
951 | mov [SLOT_BASE+APPDATA.fd_ev+ebx], edx |
948 | mov [SLOT_BASE + ebx + APPDATA.fd_ev], edx |
Line 952... | Line 949... | ||
952 | mov [SLOT_BASE+APPDATA.bk_ev+ebx], edx |
949 | mov [SLOT_BASE + ebx + APPDATA.bk_ev], edx |
953 | 950 | ||
954 | add edx, APP_OBJ_OFFSET-APP_EV_OFFSET |
951 | add edx, APP_OBJ_OFFSET - APP_EV_OFFSET |
955 | mov [SLOT_BASE+APPDATA.fd_obj+ebx], edx |
952 | mov [SLOT_BASE + ebx + APPDATA.fd_obj], edx |
956 | mov [SLOT_BASE+APPDATA.bk_obj+ebx], edx |
953 | mov [SLOT_BASE + ebx + APPDATA.bk_obj], edx |
957 | 954 | ||
Line 958... | Line 955... | ||
958 | mov ecx, [def_cursor] |
955 | mov ecx, [def_cursor] |
959 | mov [SLOT_BASE+APPDATA.cursor+ebx], ecx |
956 | mov [SLOT_BASE + ebx + APPDATA.cursor], ecx |
960 | mov eax, [pl0_stack] |
957 | mov eax, [pl0_stack] |
961 | mov [SLOT_BASE+APPDATA.pl0_stack+ebx], eax |
958 | mov [SLOT_BASE + ebx + APPDATA.pl0_stack], eax |
962 | add eax, RING0_STACK_SIZE |
959 | add eax, RING0_STACK_SIZE |
963 | mov [SLOT_BASE+APPDATA.saved_esp0+ebx], eax |
960 | mov [SLOT_BASE + ebx + APPDATA.saved_esp0], eax |
964 | 961 | ||
965 | push ebx |
962 | push ebx |
966 | stdcall kernel_alloc, maxPathLength |
963 | stdcall kernel_alloc, maxPathLength |
Line 967... | Line 964... | ||
967 | pop ebx |
964 | pop ebx |
968 | mov esi, [current_slot] |
965 | mov esi, [current_slot] |
969 | mov esi, [esi+APPDATA.cur_dir] |
966 | mov esi, [esi + APPDATA.cur_dir] |
970 | mov ecx, maxPathLength/4 |
967 | mov ecx, maxPathLength/4 |
Line 971... | Line 968... | ||
971 | mov edi, eax |
968 | mov edi, eax |
972 | mov [ebx+SLOT_BASE+APPDATA.cur_dir], eax |
969 | mov [SLOT_BASE + ebx + APPDATA.cur_dir], eax |
973 | rep movsd |
970 | rep movsd |
974 | 971 | ||
975 | mov [ebx+SLOT_BASE+APPDATA.event_mask], dword 1+2+4;set default event flags (see 40 function) |
972 | mov [SLOT_BASE + ebx + APPDATA.event_mask], dword 1+2+4;set default event flags (see 40 function) |
Line 976... | Line 973... | ||
976 | inc dword [process_number] |
973 | inc dword [process_number] |
977 | mov eax, [process_number] |
974 | mov eax, [process_number] |
978 | mov [ebx+SLOT_BASE+APPDATA.tid], eax ;set TID |
975 | mov [SLOT_BASE + ebx + APPDATA.tid], eax ;set TID |
Line 979... | Line 976... | ||
979 | 976 | ||
980 | mov eax, [slot] |
977 | mov eax, [slot] |
981 | mov [ebx+SLOT_BASE+APPDATA.wnd_number], al |
978 | mov [SLOT_BASE + ebx + APPDATA.wnd_number], al |
982 | mov ebx, eax |
979 | mov ebx, eax |
Line 996... | Line 993... | ||
996 | mov eax, [screen_workarea.bottom] |
993 | mov eax, [screen_workarea.bottom] |
997 | mov [ecx+12], eax |
994 | mov [ecx+12], eax |
Line 998... | Line 995... | ||
998 | 995 | ||
999 | mov ebx, [pl0_stack] |
996 | mov ebx, [pl0_stack] |
1000 | mov esi, [params] |
997 | mov esi, [params] |
1001 | lea ecx, [ebx+REG_EIP] |
998 | lea ecx, [ebx + REG_EIP] |
Line 1002... | Line 999... | ||
1002 | xor eax, eax |
999 | xor eax, eax |
1003 | 1000 | ||
1004 | mov [ebx+REG_RET], dword common_app_entry |
1001 | mov [ebx + REG_RET], dword common_app_entry |
1005 | mov [ebx+REG_EDI], eax |
1002 | mov [ebx + REG_EDI], eax |
1006 | mov [ebx+REG_ESI], eax |
1003 | mov [ebx + REG_ESI], eax |
1007 | mov [ebx+REG_EBP], eax |
1004 | mov [ebx + REG_EBP], eax |
1008 | mov [ebx+REG_ESP], ecx;ebx+REG_EIP |
1005 | mov [ebx + REG_ESP], ecx;ebx+REG_EIP |
1009 | mov [ebx+REG_EBX], eax |
1006 | mov [ebx + REG_EBX], eax |
1010 | mov [ebx+REG_EDX], eax |
1007 | mov [ebx + REG_EDX], eax |
1011 | mov [ebx+REG_ECX], eax |
1008 | mov [ebx + REG_ECX], eax |
1012 | mov [ebx+REG_EAX], eax |
1009 | mov [ebx + REG_EAX], eax |
1013 | 1010 | ||
1014 | mov eax, [esi+APP_HDR.eip] |
1011 | mov eax, [esi + APP_HDR.eip] |
1015 | mov [ebx+REG_EIP], eax |
1012 | mov [ebx + REG_EIP], eax |
Line 1016... | Line 1013... | ||
1016 | mov [ebx+REG_CS], dword app_code |
1013 | mov [ebx + REG_CS], dword app_code |
1017 | mov ecx, USER_PRIORITY |
1014 | mov ecx, USER_PRIORITY |
Line 1018... | Line 1015... | ||
1018 | 1015 | ||
1019 | test byte [flags], 2 |
1016 | test byte [flags], 2 |
1020 | jz @F |
1017 | jz @F |
1021 | 1018 | ||
Line 1022... | Line 1019... | ||
1022 | mov [ebx+REG_CS], dword os_code ; kernel thread |
1019 | mov [ebx + REG_CS], dword os_code ; kernel thread |
1023 | mov ecx, MAX_PRIORITY |
1020 | mov ecx, MAX_PRIORITY |
1024 | @@: |
1021 | @@: |
Line 1025... | Line 1022... | ||
1025 | mov [ebx+REG_EFLAGS], dword EFL_IOPL1+EFL_IF |
1022 | mov [ebx + REG_EFLAGS], dword EFL_IOPL1+EFL_IF |
1026 | 1023 | ||
1027 | mov eax, [esi+APP_HDR.esp] |
1024 | mov eax, [esi + APP_HDR.esp] |
1028 | mov [ebx+REG_APP_ESP], eax |
1025 | mov [ebx + REG_APP_ESP], eax |
Line 1029... | Line 1026... | ||
1029 | mov [ebx+REG_SS], dword app_data |
1026 | mov [ebx + REG_SS], dword app_data |
1030 | 1027 | ||
1031 | lea edx, [ebx+REG_RET] |
1028 | lea edx, [ebx + REG_RET] |
1032 | mov ebx, [slot] |
1029 | mov ebx, [slot] |
1033 | shl ebx, BSF sizeof.APPDATA |
1030 | shl ebx, BSF sizeof.APPDATA |
1034 | mov [ebx+SLOT_BASE+APPDATA.saved_esp], edx |
1031 | mov [SLOT_BASE + ebx + APPDATA.saved_esp], edx |
1035 | 1032 | ||
1036 | xor edx, edx; process state - running |
1033 | xor edx, edx; process state - running |
1037 | ; set if debuggee |
1034 | ; set if debuggee |
1038 | test byte [flags], 1 |
1035 | test byte [flags], 1 |
1039 | jz .no_debug |
1036 | jz .no_debug |
1040 | mov eax, [current_slot_idx] |
1037 | mov eax, [current_slot_idx] |
Line 1041... | Line 1038... | ||
1041 | mov [SLOT_BASE+ebx+APPDATA.debugger_slot], eax |
1038 | mov [SLOT_BASE + ebx + APPDATA.debugger_slot], eax |
1042 | .no_debug: |
1039 | .no_debug: |
1043 | mov [SLOT_BASE + ebx + APPDATA.state], dl |
1040 | mov [SLOT_BASE + ebx + APPDATA.state], dl |
1044 | lea edx, [SLOT_BASE+ebx] |
1041 | lea edx, [SLOT_BASE + ebx] |
1045 | call scheduler_add_thread |
1042 | call scheduler_add_thread |
Line 1046... | Line 1043... | ||
1046 | ret |
1043 | ret |