This commit is contained in:
Pavel 2023-02-21 11:12:32 +03:00
parent 5e726a9ebc
commit 6765db997e
6 changed files with 203 additions and 105 deletions

View File

@ -76,11 +76,11 @@ implementation
uses
ntapi,
systm,
md_psl,
_umtx,
kern_umtx,
kern_time,
kern_thread;
kern_thread,
vm_machdep;
const
max_pending_per_proc=128;
@ -808,10 +808,18 @@ var
__set:sigset_t;
begin
td:=curkthread;
if (td=nil) then Exit(EFAULT);
if (td=nil) then
begin
td^.td_retval[0]:=EFAULT;
Exit(0);
end;
Result:=copyin(oset,@__set,sizeof(sigset_t));
if (Result<>0) then Exit(EFAULT);
if (Result<>0) then
begin
td^.td_retval[0]:=EFAULT;
Exit(0);
end;
Result:=kern_sigtimedwait(td,__set,@ksi,nil);
if (Result<>0) then
@ -820,10 +828,13 @@ begin
begin
Result:=ERESTART;
end;
Exit;
td^.td_retval[0]:=Result;
Exit(0);
end;
Result:=copyout(@ksi.ksi_info.si_signo,sig,sizeof(Integer));
td^.td_retval[0]:=Result;
Result:=0;
end;
Function sys_sigtimedwait(oset:p_sigset_t;info:p_siginfo_t;timeout:ptimespec):Integer;
@ -834,28 +845,28 @@ var
__set:sigset_t;
begin
td:=curkthread;
if (td=nil) then Exit(-EFAULT);
if (td=nil) then Exit(-1);
if (timeout<>nil) then
begin
Result:=copyin(timeout,@ts,sizeof(timespec));
if (Result<>0) then Exit(-EFAULT);
if (Result<>0) then Exit;
timeout:=@ts;
end;
Result:=copyin(oset,@__set,sizeof(sigset_t));
if (Result<>0) then Exit(-EFAULT);
if (Result<>0) then Exit;
Result:=kern_sigtimedwait(td,__set,@ksi,timeout);
if (Result<>0) then Exit(-Result);
if (Result<>0) then Exit;
if (info<>nil) then
begin
Result:=copyout(@ksi.ksi_info,info,sizeof(siginfo_t));
if (Result<>0) then Exit(-EFAULT);
if (Result<>0) then Exit;
end;
Result:=ksi.ksi_info.si_signo;
td^.td_retval[0]:=ksi.ksi_info.si_signo;
end;
Function sys_sigwaitinfo(oset:p_sigset_t;info:p_siginfo_t):Integer;
@ -865,48 +876,21 @@ var
__set:sigset_t;
begin
td:=curkthread;
if (td=nil) then Exit(-EFAULT);
if (td=nil) then Exit(-1);
Result:=copyin(oset,@__set,sizeof(sigset_t));
if (Result<>0) then Exit(-EFAULT);
if (Result<>0) then Exit;
Result:=kern_sigtimedwait(td,__set,@ksi,nil);
if (Result<>0) then Exit(-Result);
if (Result<>0) then Exit;
if (info<>nil) then
begin
Result:=copyout(@ksi.ksi_info,info,sizeof(siginfo_t));
if (Result<>0) then Exit(-EFAULT);
if (Result<>0) then Exit;
end;
Result:=ksi.ksi_info.si_signo;
end;
procedure cpu_set_syscall_retval(td:p_kthread;error:Integer);
begin
Case error of
0:With td^.td_frame^ do
begin
tf_rax:=td^.td_retval[0];
tf_rdx:=td^.td_retval[1];
tf_rflags:=tf_rflags and (not PSL_C);
end;
ERESTART:
With td^.td_frame^ do
begin
//tf_err = size of syscall cmd
tf_rip:=tf_rip-td^.td_frame^.tf_err;
tf_r10:=tf_rcx;
//set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
end;
EJUSTRETURN:;
else
With td^.td_frame^ do
begin
tf_rax:=error;
tf_rflags:=tf_rflags or PSL_C;
end;
end;
td^.td_retval[0]:=ksi.ksi_info.si_signo;
end;
function postsig(sig:Integer):Integer; forward;
@ -945,7 +929,8 @@ begin
Result:=EJUSTRETURN;
end;
//TODO check td_errno,td_oldsigmask,td_retval
function postsig(sig:Integer):Integer;
begin

View File

@ -227,6 +227,7 @@ implementation
uses
hamt,
systm,
vm_machdep,
kern_rwlock,
kern_umtx,
_umtx,
@ -285,10 +286,7 @@ begin
data:=data+SizeOf(kthread);
Result^.td_frame:=data;
data:=VirtualAlloc(nil,16*1024,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
data:=data+16*1024;
Result^.td_kstack:=data;
cpu_thread_alloc(Result);
//Result^.td_state:=TDS_INACTIVE;
Result^.td_lend_user_pri:=PRI_MAX;
@ -298,14 +296,11 @@ begin
end;
procedure thread_free(td:p_kthread);
var
data:Pointer;
begin
umtx_thread_fini(td);
//
data:=td^.td_kstack;
data:=data-16*1024;
VirtualFree(data,0,MEM_RELEASE);
cpu_thread_free(td);
//
FreeMem(td);
end;
@ -403,21 +398,6 @@ begin
end;
end;
function cpuset_setaffinity(td:p_kthread;new:Ptruint):Integer;
begin
td^.td_cpuset:=new;
Result:=NtSetInformationThread(td^.td_handle,ThreadAffinityMask,@new,SizeOf(Ptruint));
end;
procedure cpu_set_user_tls(td:p_kthread;base:Pointer);
var
ptls:PPointer;
begin
ptls:=td^.td_teb+$708;
ptls^:=base;
end;
function BaseQueryInfo(td:p_kthread):Integer;
var
TBI:THREAD_BASIC_INFORMATION;
@ -817,22 +797,9 @@ begin
td^.td_pri_class:=_class;
end;
function sched_priority(td:p_kthread;prio:Integer):Integer;
function sched_priority(td:p_kthread;prio:Integer):Integer; inline;
begin
td^.td_priority:=prio;
Case prio of
0..255:prio:= 16;
256..496:prio:= 2;
497..526:prio:= 1;
527..556:prio:= 0;
557..586:prio:=-1;
587..767:prio:=-2;
else
prio:=-16;
end;
Result:=NtSetInformationThread(td^.td_handle,ThreadBasePriority,@prio,SizeOf(Integer));
Result:=cpu_set_priority(td,prio);
end;
procedure sched_prio(td:p_kthread;prio:Integer); inline;

View File

@ -85,6 +85,10 @@
<Filename Value="..\md_psl.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="..\vm_machdep.pas"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -57,12 +57,12 @@ begin
repeat
//Writeln('before: sptr:',HexStr(sptr));
//asm
// Movq trap_test,%rax
// call fast_syscall
//end;
//Writeln('after: sptr:',HexStr(sptr));
//Writeln('before: sptr:',HexStr(sptr));
//asm
// Movq trap_test,%rax
// call fast_syscall
//end;
//Writeln('after: sptr:',HexStr(sptr));
//e:=_umtx_op(@mtx,{UMTX_OP_MUTEX_LOCK} UMTX_OP_LOCK,td.td_tid,nil,nil);
//e:=_umtx_op(@mtx,UMTX_OP_MUTEX_LOCK,td^.td_tid,nil,nil);

View File

@ -91,27 +91,40 @@ procedure fast_syscall;
implementation
uses
vm_machdep;
type
tsyscall=function(rdi,rsi,rdx,rcx,r8,r9:QWORD):Integer;
procedure amd64_syscall;
var
td:p_kthread;
td_frame:p_trapframe;
error:Integer;
begin
//Call directly to the address or make an ID table?
td_frame:=curkthread^.td_frame;
td_frame^.tf_rax:=tsyscall(td_frame^.tf_rax)
(td_frame^.tf_rdi,
td_frame^.tf_rsi,
td_frame^.tf_rdx,
td_frame^.tf_rcx,
td_frame^.tf_r8,
td_frame^.tf_r9);
td:=curkthread;
td_frame:=td^.td_frame;
error:=tsyscall(td_frame^.tf_rax)
(td_frame^.tf_rdi,
td_frame^.tf_rsi,
td_frame^.tf_rdx,
td_frame^.tf_rcx,
td_frame^.tf_r8,
td_frame^.tf_r9);
if ((td^.td_pflags and TDP_NERRNO)=0) then
begin
td^.td_errno:=error;
end;
cpu_set_syscall_retval(td,error);
end;
procedure fast_syscall; assembler; nostackframe;
label
rip;
asm
//prolog (debugger)
pushq %rbp
@ -129,15 +142,12 @@ asm
movqq %r8 ,trapframe.tf_r8 (%rax)
movqq %r9 ,trapframe.tf_r9 (%rax)
movqq %rbx,trapframe.tf_rbx(%rax)
movqq %rbp,trapframe.tf_rbp(%rax)
movqq %r10,trapframe.tf_r10(%rax)
movqq %r11,trapframe.tf_r11(%rax)
movqq %r12,trapframe.tf_r12(%rax)
movqq %r13,trapframe.tf_r13(%rax)
movqq %r14,trapframe.tf_r14(%rax)
movqq %r15,trapframe.tf_r15(%rax)
movqq %rsp,trapframe.tf_rsp(%rax)
movqq $rip,trapframe.tf_rip(%rax) //save caller addr
movqw %fs,trapframe.tf_fs(%rax)
movqw %gs,trapframe.tf_gs(%rax)
@ -149,7 +159,17 @@ asm
movqq $0,trapframe.tf_trapno(%rax)
movqq $0,trapframe.tf_addr (%rax)
movqq $1,trapframe.tf_flags (%rax)
movqq $0,trapframe.tf_err (%rax)
movqq $5,trapframe.tf_err (%rax) //sizeof(call $32)
movqq (%rsp),%r11 //get prev rbp
movqq %r11,trapframe.tf_rbp(%rax)
movqq %rsp,%r11
lea 16(%r11),%r11 //get prev rsp
movqq %r11,trapframe.tf_rsp(%rax)
movqq 8(%rsp),%r11 //get prev rip
movqq %r11,trapframe.tf_rip(%rax)
movqq -16(%rsp),%r11 //get rax
movqq %r11,trapframe.tf_rax(%rax)
@ -164,7 +184,6 @@ asm
andq $-32,%rsp //align stack
call amd64_syscall
rip:
//Restore preserved registers.
movqq %gs:(0x700),%rax //curkthread
@ -181,7 +200,6 @@ asm
movqq trapframe.tf_r8 (%rax),%r8
movqq trapframe.tf_r9 (%rax),%r9
movqq trapframe.tf_rbx(%rax),%rbx
movqq trapframe.tf_rbp(%rax),%rbp
movqq trapframe.tf_r10(%rax),%r10
movqq trapframe.tf_r11(%rax),%r11
movqq trapframe.tf_r12(%rax),%r12
@ -190,6 +208,8 @@ asm
movqq trapframe.tf_r15(%rax),%r15
movqq trapframe.tf_rsp(%rax),%rsp
lea -16(%rsp),%rsp //restore rsp
movqq trapframe.tf_rax(%rax),%rax //restore rax
//epilog (debugger)

122
sys/vm_machdep.pas Normal file
View File

@ -0,0 +1,122 @@
unit vm_machdep;
{$mode ObjFPC}{$H+}
interface
uses
ntapi,
windows,
md_psl,
sys_kernel,
kern_thread;
function cpu_thread_alloc(td:p_kthread):Integer;
function cpu_thread_free(td:p_kthread):Integer;
procedure cpu_set_syscall_retval(td:p_kthread;error:Integer);
function cpuset_setaffinity(td:p_kthread;new:Ptruint):Integer;
procedure cpu_set_user_tls(td:p_kthread;base:Pointer);
function cpu_set_priority(td:p_kthread;prio:Integer):Integer;
implementation
function cpu_thread_alloc(td:p_kthread):Integer;
var
data:Pointer;
size:ULONG_PTR;
begin
data:=nil;
size:=16*1024;
Result:=NtAllocateVirtualMemory(
NtCurrentProcess,
@data,
0,
@size,
MEM_COMMIT or MEM_RESERVE,
PAGE_READWRITE
);
data:=data+16*1024;
td^.td_kstack:=data;
end;
function cpu_thread_free(td:p_kthread):Integer;
var
data:Pointer;
size:ULONG_PTR;
begin
data:=td^.td_kstack;
data:=data-16*1024;
size:=0;
Result:=NtFreeVirtualMemory(
NtCurrentProcess,
@data,
@size,
MEM_RELEASE
);
end;
procedure cpu_set_syscall_retval(td:p_kthread;error:Integer);
begin
Case error of
0:With td^.td_frame^ do
begin
tf_rax:=td^.td_retval[0];
tf_rdx:=td^.td_retval[1];
tf_rflags:=tf_rflags and (not PSL_C);
end;
ERESTART:
With td^.td_frame^ do
begin
//tf_err = size of syscall cmd
tf_rip:=tf_rip-td^.td_frame^.tf_err;
tf_r10:=tf_rcx;
//set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
end;
EJUSTRETURN:;
else
With td^.td_frame^ do
begin
tf_rax:=error;
tf_rflags:=tf_rflags or PSL_C;
end;
end;
end;
function cpuset_setaffinity(td:p_kthread;new:Ptruint):Integer;
begin
td^.td_cpuset:=new;
Result:=NtSetInformationThread(td^.td_handle,ThreadAffinityMask,@new,SizeOf(Ptruint));
end;
procedure cpu_set_user_tls(td:p_kthread;base:Pointer);
var
ptls:PPointer;
begin
ptls:=td^.td_teb+$708;
ptls^:=base;
end;
function cpu_set_priority(td:p_kthread;prio:Integer):Integer;
begin
td^.td_priority:=prio;
Case prio of
0..255:prio:= 16;
256..496:prio:= 2;
497..526:prio:= 1;
527..556:prio:= 0;
557..586:prio:=-1;
587..767:prio:=-2;
else
prio:=-16;
end;
Result:=NtSetInformationThread(td^.td_handle,ThreadBasePriority,@prio,SizeOf(Integer));
end;
end.