mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
5e726a9ebc
commit
6765db997e
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
52
sys/trap.pas
52
sys/trap.pas
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
Loading…
Reference in New Issue