diff --git a/sys/kern/kern_thr.pas b/sys/kern/kern_thr.pas index 1a3f3c45..1b36c950 100644 --- a/sys/kern/kern_thr.pas +++ b/sys/kern/kern_thr.pas @@ -165,6 +165,7 @@ type pcb_fsbase :Pointer; pcb_gsbase :Pointer; td_retval :array[0..1] of QWORD; + td_ksttop :Pointer; td_kstack :Pointer; // td_sleepqueue :Pointer; diff --git a/sys/kern/md_thread.pas b/sys/kern/md_thread.pas index 00f5b315..6cdde11b 100644 --- a/sys/kern/md_thread.pas +++ b/sys/kern/md_thread.pas @@ -53,6 +53,8 @@ begin PAGE_READWRITE ); + td^.td_ksttop:=data; + data:=data+SYS_STACK_SIZE; td^.td_kstack:=data; end; diff --git a/sys/kern/vm_machdep.pas b/sys/kern/vm_machdep.pas index afbdc660..4cac375e 100644 --- a/sys/kern/vm_machdep.pas +++ b/sys/kern/vm_machdep.pas @@ -147,16 +147,10 @@ begin end; end; -function alloca(size:qword):Pointer; sysv_abi_default; assembler; nostackframe; -asm - movqq %rsp,%rax - subq %rdi,%rax - lea -8(%rax),%rax - andq $-32,%rax - movqq (%rsp),%rdi - movqq %rax,%rsp - lea -32(%rsp),%rsp - jmp %rdi +function get_top_mem_td(td:p_kthread;size,align:qword):Pointer; +begin + Result:=System.Align(td^.td_ksttop,align); + if ((Result+size)>=SPtr) then Exit(nil); end; procedure ipi_sigreturn; @@ -164,6 +158,7 @@ var td:p_kthread; Context:PCONTEXT; regs:p_trapframe; + save:Pointer; begin td:=curkthread; regs:=td^.td_frame; @@ -171,12 +166,14 @@ begin if ((regs^.tf_flags and TF_HASFPXSTATE)<>0) then begin //xmm,ymm - Context:=alloca(GetContextSize(CONTEXT_ALLX)); + Context:=get_top_mem_td(td,GetContextSize(CONTEXT_ALLX),16); + Assert(Context<>nil); Context:=InitializeContextExtended(Context,CONTEXT_ALLX); end else begin //simple - Context:=alloca(SizeOf(TCONTEXT)+15); + Context:=get_top_mem_td(td,SizeOf(TCONTEXT),16); + Assert(Context<>nil); Context^:=Default(TCONTEXT); Context^.ContextFlags:=CONTEXT_INTEGER or CONTEXT_CONTROL; end; @@ -268,8 +265,8 @@ begin goto resume; end; - Context:=alloca(GetContextSize(CONTEXT_ALLX)); - + Context:=get_top_mem_td(td,GetContextSize(CONTEXT_ALLX),16); + Assert(Context<>nil); Context:=InitializeContextExtended(Context,CONTEXT_ALLX); if (NtGetContextThread(td_handle,Context)<>STATUS_SUCCESS) then diff --git a/sys/test/project1.lpi b/sys/test/project1.lpi index 1a05cfd5..3a157d66 100644 --- a/sys/test/project1.lpi +++ b/sys/test/project1.lpi @@ -563,10 +563,18 @@ + + + + + + + + diff --git a/sys/test/project1.lpr b/sys/test/project1.lpr index 88658fd5..31d6dc26 100644 --- a/sys/test/project1.lpr +++ b/sys/test/project1.lpr @@ -444,12 +444,12 @@ begin if (tid<>curkthread^.td_tid) then begin - //test_files; - //Writeln('[--test_dirs--]'); - //test_dirs('','/',1); - //Writeln('[--test_dirs--]'); - // - //readln; + test_files; + Writeln('[--test_dirs--]'); + test_dirs('','/',1); + Writeln('[--test_dirs--]'); + + readln; tid2:=curkthread^.td_tid; @@ -1104,18 +1104,18 @@ begin //test_map; sys_init; - Writeln(get_proc_prio()); - Writeln(set_proc_prio(14)); - Writeln(get_proc_prio()); + //Writeln(get_proc_prio()); + //Writeln(set_proc_prio(14)); + //Writeln(get_proc_prio()); - Writeln(sys_getrusage(RUSAGE_SELF,@ru)); - Writeln(sys_getrusage(RUSAGE_THREAD,@ru)); + //Writeln(sys_getrusage(RUSAGE_SELF,@ru)); + //Writeln(sys_getrusage(RUSAGE_THREAD,@ru)); e:=_umtx_op(nil,UMTX_OP_RW_WRLOCK,0,nil,nil); Writeln('me=',e,' _errno:',__error^); - kern_clock_gettime_unit(CLOCK_PROCTIME,@_time); - writeln(_time/10000000:0:3); + //kern_clock_gettime_unit(CLOCK_PROCTIME,@_time); + //writeln(_time/10000000:0:3); sys_adjtime(nil,@_tv); writeln(_tv.tv_sec,',',_tv.tv_usec); @@ -1192,7 +1192,7 @@ begin readln; } - //BeginThread(@_thread); + BeginThread(@_thread); //BeginThread(@_thread); //BeginThread(@_thread);