mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 19:29:26 +02:00
* disabled Clone syscall in linux.pp, it was completly wrong (I will replace it)
* added ldt record and constants to linux.pp git-svn-id: trunk@6750 -
This commit is contained in:
parent
645b0d2cb1
commit
fc0f2f3de6
@ -24,7 +24,7 @@ interface
|
||||
uses
|
||||
ctypes;
|
||||
|
||||
Type
|
||||
type
|
||||
TSysinfo = packed record
|
||||
uptime : longint;
|
||||
loads : array[1..3] of longint;
|
||||
@ -39,9 +39,9 @@ Type
|
||||
end;
|
||||
PSysInfo = ^TSysInfo;
|
||||
|
||||
Function Sysinfo(var Info:TSysinfo):Boolean; {$ifdef FPC_USE_LIBC} cdecl; external name 'sysinfo'; {$endif}
|
||||
function Sysinfo(var Info:TSysinfo):Boolean; {$ifdef FPC_USE_LIBC} cdecl; external name 'sysinfo'; {$endif}
|
||||
|
||||
Const
|
||||
const
|
||||
CSIGNAL = $000000ff; // signal mask to be sent at exit
|
||||
CLONE_VM = $00000100; // set if VM shared between processes
|
||||
CLONE_FS = $00000200; // set if fs info shared between processes
|
||||
@ -94,7 +94,7 @@ Const
|
||||
if (oldval CMP CMPARG)
|
||||
wake UADDR2; }
|
||||
|
||||
function FUTEX_OP(op, oparg, cmp, cmparg: cint): cint; {inline;}
|
||||
function FUTEX_OP(op, oparg, cmp, cmparg: cint): cint; {$ifdef SYSTEMINLINE}inline;{$endif}
|
||||
|
||||
const
|
||||
EPOLLIN = $01; { The associated file is available for read(2) operations. }
|
||||
@ -160,10 +160,39 @@ const
|
||||
KD_TEXT0 = 2; {obsolete}
|
||||
KD_TEXT1 = 3; {obsolete}
|
||||
|
||||
type
|
||||
TCloneFunc = function(args:pointer):longint;cdecl;
|
||||
|
||||
//function Clone(func:TCloneFunc;sp:pointer;flags:longint;args:pointer):longint; {$ifdef FPC_USE_LIBC} cdecl; external name 'clone'; {$endif}
|
||||
|
||||
const
|
||||
(* Maximum number of LDT entries supported. *)
|
||||
LDT_ENTRIES = 8192;
|
||||
(* The size of each LDT entry. *)
|
||||
LDT_ENTRY_SIZE = 8;
|
||||
|
||||
MODIFY_LDT_CONTENTS_DATA = 0;
|
||||
MODIFY_LDT_CONTENTS_STACK = 1;
|
||||
MODIFY_LDT_CONTENTS_CODE = 2;
|
||||
|
||||
type
|
||||
TCloneFunc=function(args:pointer):longint;cdecl;
|
||||
user_desc = record
|
||||
entry_number : cuint;
|
||||
base_addr : cuint;
|
||||
limit : cuint;
|
||||
flags : cuint8;
|
||||
|
||||
{ unsigned int seg_32bit:1;
|
||||
unsigned int contents:2;
|
||||
unsigned int read_exec_only:1;
|
||||
unsigned int limit_in_pages:1;
|
||||
unsigned int seg_not_present:1;
|
||||
unsigned int useable:1;}
|
||||
end;
|
||||
|
||||
type
|
||||
TUser_Desc = user_desc;
|
||||
PUser_Desc = ^user_desc;
|
||||
|
||||
EPoll_Data = record
|
||||
case integer of
|
||||
@ -172,6 +201,7 @@ type
|
||||
2: (u32: cuint);
|
||||
3: (u64: cuint64);
|
||||
end;
|
||||
|
||||
TEPoll_Data = Epoll_Data;
|
||||
PEPoll_Data = ^Epoll_Data;
|
||||
|
||||
@ -179,11 +209,10 @@ type
|
||||
Events: cuint32;
|
||||
Data : TEpoll_Data;
|
||||
end;
|
||||
|
||||
TEPoll_Event = Epoll_Event;
|
||||
PEpoll_Event = ^Epoll_Event;
|
||||
|
||||
function Clone(func:TCloneFunc;sp:pointer;flags:longint;args:pointer):longint; {$ifdef FPC_USE_LIBC} cdecl; external name 'clone'; {$endif}
|
||||
|
||||
{ open an epoll file descriptor }
|
||||
function epoll_create(size: cint): cint; {$ifdef FPC_USE_LIBC} cdecl; external name 'epoll_create'; {$endif}
|
||||
{ control interface for an epoll descriptor }
|
||||
@ -194,96 +223,14 @@ function epoll_wait(epfd: cint; events: pepoll_event; maxevents, timeout: cint):
|
||||
implementation
|
||||
|
||||
{$ifndef FPC_USE_LIBC}
|
||||
Uses Syscall;
|
||||
|
||||
Function Sysinfo(var Info:TSysinfo):Boolean;
|
||||
{
|
||||
Get system info
|
||||
}
|
||||
Begin
|
||||
Sysinfo:=do_SysCall(SysCall_nr_Sysinfo,TSysParam(@info))=0;
|
||||
End;
|
||||
|
||||
function Clone(func:TCloneFunc;sp:pointer;flags:longint;args:pointer):longint;
|
||||
uses Syscall;
|
||||
|
||||
function Sysinfo(var Info: TSysinfo): Boolean;
|
||||
begin
|
||||
if (pointer(func)=nil) or (sp=nil) then
|
||||
exit(-1); // give an error result
|
||||
{$ifdef cpui386}
|
||||
{$ASMMODE ATT}
|
||||
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 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}
|
||||
Sysinfo := do_SysCall(SysCall_nr_Sysinfo,TSysParam(@info))=0;
|
||||
end;
|
||||
|
||||
function FUTEX_OP(op, oparg, cmp, cmparg: cint): cint;
|
||||
function FUTEX_OP(op, oparg, cmp, cmparg: cint): cint; {$ifdef SYSTEMINLINE}inline;{$endif}
|
||||
begin
|
||||
FUTEX_OP := ((op and $F) shl 28) or ((cmp and $F) shl 24) or ((oparg and $FFF) shl 12) or (cmparg and $FFF);
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user