FPPS4/kernel/libthr/pthread_md.pas

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.