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);