mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-02 23:58:26 +02:00
+ Add modify_ldt to linux unit
+ Add sched_yield to linux unit - Remove clone for m68k from linux unit (unimplemented assembler section) + Add fpsigtimedwait to baseunix unit git-svn-id: trunk@15602 -
This commit is contained in:
parent
99a75c56fc
commit
1009a84e25
@ -50,6 +50,16 @@ begin
|
||||
FPsigsuspend:= do_syscall(syscall_nr_sigsuspend,TSysParam(@sigmask));
|
||||
end;
|
||||
|
||||
function fpsigtimedwait(const sigset:TSigSet;info:Psiginfo;timeout:Ptimespec):cint;
|
||||
|
||||
begin
|
||||
FpSigTimedWait:=do_syscall(syscall_nr_sigtimedwait,
|
||||
Tsysparam(@sigset),
|
||||
Tsysparam(info),
|
||||
Tsysparam(timeout));
|
||||
end;
|
||||
|
||||
|
||||
Type // implementation side for now. Should move to BSD unit.
|
||||
ITimerVal= Record
|
||||
It_Interval,
|
||||
|
@ -205,6 +205,7 @@ syscall_nr_getdirentries =196;
|
||||
syscall_nr_sigaction =342;
|
||||
syscall_nr_sigpending =343;
|
||||
syscall_nr_sigreturn =344;
|
||||
syscall_nr_sigtimedwait =345;
|
||||
syscall_nr___acl_get_file =347;
|
||||
syscall_nr___acl_set_file =348;
|
||||
syscall_nr___acl_get_fd =349;
|
||||
@ -305,6 +306,7 @@ syscall_nr_getdirentries =196;
|
||||
syscall_nr_sigpending = 343;
|
||||
syscall_nr_sigprocmask = 340;
|
||||
syscall_nr_sigsuspend = 341;
|
||||
syscall_nr_sigtimedwait = 345;
|
||||
syscall_nr_socket = 97;
|
||||
syscall_nr_socketpair = 135;
|
||||
syscall_nr_stat = 188;
|
||||
|
@ -50,6 +50,19 @@ begin
|
||||
fpsigsuspend:= do_syscall(syscall_nr_rt_sigsuspend,TSysParam(@sigmask),TSysParam(8));
|
||||
end;
|
||||
|
||||
function fpsigtimedwait(const sigset:TSigSet;info:Psiginfo;timeout:Ptimespec):cint;
|
||||
|
||||
begin
|
||||
{Sizeof(Tsigset)=16 for Free Pascal, but the Linux kernel has a different idea,
|
||||
it wants a Tsigset of 8 bytes. So we have to hardcode :( }
|
||||
FpSigTimedWait:=do_syscall(syscall_nr_rt_sigtimedwait,
|
||||
Tsysparam(@sigset),
|
||||
Tsysparam(info),
|
||||
Tsysparam(timeout),
|
||||
Tsysparam(8 {sizeof(Tsigset)}));
|
||||
end;
|
||||
|
||||
|
||||
Type
|
||||
ITimerVal= Record
|
||||
It_Interval,
|
||||
|
@ -186,9 +186,6 @@ type
|
||||
{$ifdef cpui386}
|
||||
{$define clone_implemented}
|
||||
{$endif}
|
||||
{$ifdef cpum68k}
|
||||
{$define clone_implemented}
|
||||
{$endif}
|
||||
|
||||
{$ifdef clone_implemented}
|
||||
function clone(func:TCloneFunc;sp:pointer;flags:longint;args:pointer):longint; {$ifdef FPC_USE_LIBC} cdecl; external name 'clone'; {$endif}
|
||||
@ -221,6 +218,9 @@ type
|
||||
TUser_Desc = user_desc;
|
||||
PUser_Desc = ^user_desc;
|
||||
|
||||
function modify_ldt(func:cint;p:pointer;bytecount:culong):cint; {$ifdef FPC_USE_LIBC} cdecl; external name 'modify_ldt'; {$endif}
|
||||
|
||||
procedure sched_yield; {$ifdef FPC_USE_LIBC} cdecl; external name 'sched_yield'; {$endif}
|
||||
|
||||
type
|
||||
EPoll_Data = record
|
||||
@ -367,7 +367,7 @@ begin
|
||||
{ Do the system call }
|
||||
pushl %ebx
|
||||
movl flags,%ebx
|
||||
movl SysCall_nr_clone,%eax
|
||||
movl syscall_nr_clone,%eax
|
||||
int $0x80
|
||||
popl %ebx
|
||||
test %eax,%eax
|
||||
@ -378,53 +378,30 @@ begin
|
||||
call *%ebx
|
||||
{ exit process }
|
||||
movl %eax,%ebx
|
||||
movl $1,%eax
|
||||
movl syscall_nr_exit,%eax
|
||||
int $0x80
|
||||
|
||||
.Lclone_end:
|
||||
movl %eax,__RESULT
|
||||
end;
|
||||
{$endif cpui386}
|
||||
{$ifdef cpum68k}
|
||||
{ No yet translated, my m68k assembler is too weak for such things PM }
|
||||
(*
|
||||
asm
|
||||
{ Insert the argument onto the new stack. }
|
||||
movl sp,%ecx
|
||||
subl $8,%ecx
|
||||
movl args,%eax
|
||||
movl %eax,4(%ecx)
|
||||
|
||||
{ Save the function pointer as the zeroth argument.
|
||||
It will be popped off in the child in the ebx frobbing below. }
|
||||
movl func,%eax
|
||||
movl %eax,0(%ecx)
|
||||
|
||||
{ Do the system call }
|
||||
pushl %ebx
|
||||
movl flags,%ebx
|
||||
movl SysCall_nr_clone,%eax
|
||||
int $0x80
|
||||
popl %ebx
|
||||
test %eax,%eax
|
||||
jnz .Lclone_end
|
||||
|
||||
{ We're in the new thread }
|
||||
subl %ebp,%ebp { terminate the stack frame }
|
||||
call *%ebx
|
||||
{ exit process }
|
||||
movl %eax,%ebx
|
||||
movl $1,%eax
|
||||
int $0x80
|
||||
|
||||
.Lclone_end:
|
||||
movl %eax,__RESULT
|
||||
end;
|
||||
*)
|
||||
{$endif cpum68k}
|
||||
end;
|
||||
{$endif}
|
||||
|
||||
function modify_ldt(func:cint;p:pointer;bytecount:culong):cint;
|
||||
|
||||
begin
|
||||
modify_ldt:=do_syscall(syscall_nr_modify_ldt,Tsysparam(func),
|
||||
Tsysparam(p),
|
||||
Tsysparam(bytecount));
|
||||
end;
|
||||
|
||||
procedure sched_yield;
|
||||
|
||||
begin
|
||||
do_syscall(syscall_nr_sched_yield);
|
||||
end;
|
||||
|
||||
function epoll_create(size: cint): cint;
|
||||
begin
|
||||
epoll_create := do_syscall(syscall_nr_epoll_create,tsysparam(size));
|
||||
|
@ -20,10 +20,11 @@ Type TGrpArr = Array [0..0] of TGid; { C style array workarounds}
|
||||
|
||||
// if you are looking for macro definitions or non C template overloaded versions, they are moved to bunxovlh.inc
|
||||
|
||||
Function FpSigProcMask(how : cInt; nset : pSigSet; oset : pSigSet): cInt; external name 'FPC_SYSC_SIGPROCMASK';
|
||||
Function FpSigProcMask(how : cInt; Const nset : TSigSet; var oset : TSigSet): cInt; external name 'FPC_SYSC_SIGPROCMASK';
|
||||
Function FpSigPending (var nset : TSigSet): cInt;
|
||||
Function FpSigSuspend (Const sigmask : TSigSet): cInt;
|
||||
Function FpSigProcMask (how : cInt; nset : pSigSet; oset : pSigSet): cInt; external name 'FPC_SYSC_SIGPROCMASK';
|
||||
Function FpSigProcMask (how : cInt; Const nset : TSigSet; var oset : TSigSet): cInt; external name 'FPC_SYSC_SIGPROCMASK';
|
||||
Function FpSigPending (var nset : TSigSet): cInt;
|
||||
Function FpSigSuspend (Const sigmask : TSigSet): cInt;
|
||||
Function FpSigTimedWait (Const sigset : TSigSet; info : Psiginfo; timeout:Ptimespec): cInt;
|
||||
|
||||
Function FpUmask (cmask : TMode): TMode;
|
||||
Function FpLink (existing : pChar; newone : pChar): cInt;
|
||||
|
@ -65,6 +65,8 @@ const
|
||||
Function FpGetcwd (path:pChar; siz:TSize):pChar; cdecl; external clib name 'getcwd';
|
||||
function FPSigProcMask(how:cint;nset : psigset;oset : psigset):cint;cdecl; external clib name 'sigprocmask';
|
||||
function FPSigProcMask(how:cint;const nset : sigset;var oset : sigset):cint;cdecl; external clib name 'sigprocmask';
|
||||
Function FpSigTimedWait (Const sigset : TSigSet; info : Psiginfo; timeout:Ptimespec): cInt; cdecl; external clib name 'sigtimedwait';
|
||||
Function FpSigTimedWait (Const sigset : TSigSet; info : Psiginfo; var timeout:Ttimespec): cInt; cdecl; external clib name 'sigtimedwait';
|
||||
function FpTime (tloc:ptime_t): time_t; cdecl; external clib name 'time';
|
||||
Function FpTime (var tloc : Time_t): Time_t; cdecl; external clib name 'time';
|
||||
function FpTimes (var buffer : tms): TClock; cdecl; external clib name 'times';
|
||||
|
Loading…
Reference in New Issue
Block a user