mirror of https://github.com/red-prig/fpPS4.git
84 lines
1.2 KiB
Plaintext
84 lines
1.2 KiB
Plaintext
unit pthread_md;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
{$CALLING SysV_ABI_CDecl}
|
|
|
|
interface
|
|
|
|
uses
|
|
thr,
|
|
kern_thr,
|
|
thr_private;
|
|
|
|
const
|
|
DTV_OFFSET=8;
|
|
|
|
type
|
|
p_tcb=^tcb;
|
|
tcb=packed record
|
|
tcb_self :p_tcb;
|
|
tcb_dtv :Pointer;
|
|
tcb_thread:p_pthread;
|
|
tcb_spare :Pointer;
|
|
end;
|
|
|
|
procedure CPU_SPINWAIT;
|
|
|
|
procedure _tcb_set(tcb:p_tcb);
|
|
function _tcb_get:p_tcb;
|
|
function _get_curthread:p_pthread;
|
|
|
|
function _tcb_ctor(thread:Pointer;initial:Integer):p_tcb;
|
|
procedure _tcb_dtor(tcb:p_tcb);
|
|
|
|
implementation
|
|
|
|
procedure CPU_SPINWAIT; assembler; nostackframe;
|
|
asm
|
|
pause
|
|
end;
|
|
|
|
function TCB_GET64:p_tcb; assembler; nostackframe;
|
|
asm
|
|
movqq %gs:teb.fsbase,Result
|
|
end;
|
|
|
|
procedure _tcb_set(tcb:p_tcb); inline;
|
|
begin
|
|
amd64_set_fsbase(tcb);
|
|
end;
|
|
|
|
function _tcb_get:p_tcb; inline;
|
|
begin
|
|
Result:=TCB_GET64;
|
|
end;
|
|
|
|
function _get_curthread:p_pthread; inline;
|
|
begin
|
|
Result:=TCB_GET64^.tcb_thread;
|
|
end;
|
|
|
|
function _tcb_ctor(thread:Pointer;initial:Integer):p_tcb;
|
|
begin
|
|
if (initial<>0) then
|
|
begin
|
|
Result:=TCB_GET64;
|
|
end else
|
|
begin
|
|
//Result:=_rtld_allocate_tls(nil,sizeof(tcb),16);
|
|
end;
|
|
if (Result<>nil) then
|
|
begin
|
|
Result^.tcb_thread:=thread;
|
|
end;
|
|
end;
|
|
|
|
procedure _tcb_dtor(tcb:p_tcb);
|
|
begin
|
|
//_rtld_free_tls(tcb,sizeof(tcb),16);
|
|
end;
|
|
|
|
|
|
end.
|
|
|