+ Linux/AArch64 RTL support (patch by Edmund Grimley Evans)

o uses new generic Linux syscall numbers, used for recent architectures

git-svn-id: trunk@30895 -
This commit is contained in:
Jonas Maebe 2015-05-23 21:04:08 +00:00
parent 3c8068ad0b
commit 4fa2edc638
22 changed files with 1331 additions and 14 deletions

12
.gitattributes vendored
View File

@ -8631,6 +8631,17 @@ rtl/jvm/setjump.inc svneol=native#text/plain
rtl/jvm/setjumph.inc svneol=native#text/plain
rtl/linux/Makefile svneol=native#text/plain
rtl/linux/Makefile.fpc svneol=native#text/plain
rtl/linux/aarch64/bsyscall.inc svneol=native#text/plain
rtl/linux/aarch64/cprt0.as svneol=native#text/plain
rtl/linux/aarch64/dllprt0.as svneol=native#text/plain
rtl/linux/aarch64/gprt0.as svneol=native#text/plain
rtl/linux/aarch64/prt0.as svneol=native#text/plain
rtl/linux/aarch64/sighnd.inc svneol=native#text/plain
rtl/linux/aarch64/sighndh.inc svneol=native#text/plain
rtl/linux/aarch64/stat.inc svneol=native#text/plain
rtl/linux/aarch64/syscall.inc svneol=native#text/plain
rtl/linux/aarch64/syscallh.inc svneol=native#text/plain
rtl/linux/aarch64/sysnr.inc svneol=native#text/plain
rtl/linux/arm/bsyscall.inc svneol=native#text/plain
rtl/linux/arm/cprt0.as svneol=native#text/plain
rtl/linux/arm/dllprt0.as svneol=native#text/plain
@ -8766,6 +8777,7 @@ rtl/linux/sparc/syscall.inc svneol=native#text/plain
rtl/linux/sparc/syscallh.inc svneol=native#text/plain
rtl/linux/sparc/sysnr.inc svneol=native#text/plain
rtl/linux/suuid.inc svneol=native#text/plain
rtl/linux/sysnr-gen.inc svneol=native#text/plain
rtl/linux/sysos.inc svneol=native#text/plain
rtl/linux/sysosh.inc svneol=native#text/plain
rtl/linux/system.pp svneol=native#text/plain

View File

@ -0,0 +1 @@
{ nothing }

View File

@ -0,0 +1,91 @@
/*
Start-up code for Free Pascal Compiler when linking with C library.
Written by Edmund Grimley Evans in 2015 and released into the public domain.
*/
.text
.align 2
.globl _start
.type _start,#function
_start:
/* Initialise FP to zero */
mov x29,#0
/* This is rtld_fini */
mov x5,x0
/* Get argc, argv, envp */
ldr x1,[sp]
add x2,sp,#8
add x11,x1,#1
add x11,x2,x11,lsl #3
/* Save argc, argv, envp, and initial stack pointer */
adrp x10,:got:operatingsystem_parameter_argc
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
str x1,[x10]
adrp x10,:got:operatingsystem_parameter_argv
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
str x2,[x10]
adrp x10,:got:operatingsystem_parameter_envp
ldr x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
str x11,[x10]
adrp x10,:got:__stkptr
ldr x10,[x10,#:got_lo12:__stkptr]
mov x6,sp
str x6,[x10]
/* __libc_start_main(main, argc, argv,
init, fini, rtld_fini, stack_end) */
adrp x0,:got:PASCALMAIN
ldr x0,[x0,#:got_lo12:PASCALMAIN]
adrp x3,:got:__libc_csu_init
ldr x3,[x3,#:got_lo12:__libc_csu_init]
adrp x4,:got:__libc_csu_fini
ldr x4,[x4,#:got_lo12:__libc_csu_fini]
bl __libc_start_main
/* This should never happen */
b abort
.globl _init
.type _init,#function
_init:
ret
.globl _fini
.type _fini,#function
_fini:
ret
.globl _haltproc
.type _haltproc,#function
_haltproc:
adrp x0,:got:operatingsystem_result
ldr x0,[x0,#:got_lo12:operatingsystem_result]
ldr w0,[x0]
mov w8,#94 // syscall_nr_exit_group
svc #0
b _haltproc
/* Define a symbol for the first piece of initialized data. */
.data
.align 3
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
.bss
.align 3
.comm __stkptr,8
.comm operatingsystem_parameter_envp,8
.comm operatingsystem_parameter_argc,8
.comm operatingsystem_parameter_argv,8
.section .note.GNU-stack,"",%progbits

View File

@ -0,0 +1,72 @@
/*
Start-up code for Free Pascal Compiler in a shared library,
not linking with C library.
Written by Edmund Grimley Evans in 2015 and released into the public domain.
*/
.text
.align 2
.globl _startlib
.type _startlib,#function
_startlib:
.globl FPC_SHARED_LIB_START
.type FPC_SHARED_LIB_START,#function
FPC_SHARED_LIB_START:
stp x29,x30,[sp,#-16]!
/* Save argc, argv and envp */
adrp x9,:got:operatingsystem_parameter_argc
ldr x9,[x9,#:got_lo12:operatingsystem_parameter_argc]
str x0,[x9]
adrp x9,:got:operatingsystem_parameter_argv
ldr x9,[x9,#:got_lo12:operatingsystem_parameter_argv]
str x1,[x9]
adrp x9,:got:operatingsystem_parameter_envp
ldr x9,[x9,#:got_lo12:operatingsystem_parameter_envp]
str x2,[x9]
/* Save initial stackpointer */
adrp x9,:got:__stkptr
ldr x9,[x9,#:got_lo12:__stkptr]
mov x10,sp
str x10,[x9]
/* Call main */
bl PASCALMAIN
/* Return */
ldp x29,x30,[sp],#16
ret
.globl _haltproc
.type _haltproc,#function
_haltproc:
adrp x0,:got:operatingsystem_result
ldr x0,[x0,#:got_lo12:operatingsystem_result]
ldr w0,[x0]
mov w8,#94 // syscall_nr_exit_group
svc #0
b _haltproc
/* Define a symbol for the first piece of initialized data. */
.data
.align 3
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
.bss
.align 3
.comm __dl_fini,8
.comm __stkptr,8
.comm operatingsystem_parameter_envp,8
.comm operatingsystem_parameter_argc,8
.comm operatingsystem_parameter_argv,8
.section .note.GNU-stack,"",%progbits

View File

@ -0,0 +1,10 @@
/*
Start-up code for Free Pascal Compiler when linking with C library
with profiling support.
Written by Edmund Grimley Evans in 2015 and released into the public domain.
*/
.text
.align 2
b xx_aarch64_gprt0_unimplemented

77
rtl/linux/aarch64/prt0.as Normal file
View File

@ -0,0 +1,77 @@
/*
Start-up code for Free Pascal Compiler, not in a shared library,
not linking with C library.
Written by Edmund Grimley Evans in 2015 and released into the public domain.
*/
.text
.align 2
.globl _dynamic_start
.type _dynamic_start,#function
_dynamic_start:
ldr x10,=__dl_fini
str x0,[x10]
b _start
.globl _start
.type _start,#function
_start:
/* Initialise FP to zero */
mov x29,#0
/* Get argc, argv, envp */
ldr x1,[sp]
add x2,sp,#8
add x11,x1,#1
add x11,x2,x11,lsl #3
/* Save argc, argv, envp, and initial stack pointer */
ldr x10,=operatingsystem_parameter_argc
str x1,[x10]
ldr x10,=operatingsystem_parameter_argv
str x2,[x10]
ldr x10,=operatingsystem_parameter_envp
str x11,[x10]
ldr x10,=__stkptr
mov x6,sp
str x6,[x10]
/* Call main */
bl PASCALMAIN
.globl _haltproc
.type _haltproc,#function
_haltproc:
ldr x10,=__dl_fini
ldr x0,[x10]
cbz x0,.Lexit
blr x0
.Lexit:
ldr x10,=operatingsystem_result
ldr w0,[x10]
mov w8,#94 // syscall_nr_exit_group
svc #0
b _haltproc
/* Define a symbol for the first piece of initialized data. */
.data
.align 3
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
.bss
.align 3
.comm __dl_fini,8
.comm __stkptr,8
.comm operatingsystem_parameter_envp,8
.comm operatingsystem_parameter_argc,8
.comm operatingsystem_parameter_argv,8
.section .note.GNU-stack,"",%progbits

View File

@ -0,0 +1,44 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by Michael Van Canneyt,
member of the Free Pascal development team.
Signal handler is arch dependant due to processor to language
exception conversion.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
procedure SignalToRunerror(Sig: longint; SigInfo: PSigInfo; UContext: PUContext); public name '_FPC_DEFAULTSIGHANDLER'; cdecl;
var
res : word;
begin
res:=0;
case sig of
SIGFPE:
res:=207;
SIGILL:
res:=216;
SIGSEGV :
res:=216;
SIGBUS:
res:=214;
SIGINT:
res:=217;
SIGQUIT:
res:=233;
end;
reenable_signal(sig);
{ give runtime error at the position where the signal was raised }
if res<>0 then
HandleErrorAddrFrame(res,
pointer(uContext^.uc_mcontext.pc),
pointer(uContext^.uc_mcontext.regs[29]));
end;

View File

@ -0,0 +1,47 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by Jonas Maebe,
member of the Free Pascal development team.
TSigContext and associated structures.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$packrecords C}
type
PSigContext = ^TSigContext;
TSigContext = record
fault_address : cULong;
regs : array[0..30] of cULong;
sp : cULong;
pc : cULong;
pstate : cULong;
__pad : cULong;
{ The following field should be 16-byte-aligned. Currently the
directive for specifying alignment is buggy, so the preceding
field was added so that the record has the right size. }
__reserved : array[0..4095] of cUChar;
end;
stack_t = record
ss_sp : pointer;
ss_flags : cInt;
ss_size : size_t;
end;
PUContext = ^TUContext;
TUContext = record
uc_flags : cULong;
uc_link : PUContext;
uc_stack : stack_t;
uc_mcontext : TSigContext;
uc_sigmask : sigset_t;
end;

View File

@ -0,0 +1,72 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by Jonas Maebe, (c) 2005 Thomas Schatzl,
members of the Free Pascal development team.
Contains the definition of the stat type for the PowerPC64 platform.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ This structure was adapted from
include/uapi/asm-generic/stat.h
in Linux 4.0. Note that the stat record is the same for direct
syscalls as for when linking to libc.
}
{$PACKRECORDS C}
stat = record
case integer of
0 : (
st_dev : cULong;
st_ino : cULong;
st_mode : cUInt;
st_nlink : cUInt;
st_uid : cUInt;
st_gid : cUInt;
st_rdev : cULong;
__pad1a : cULong;
st_size : cLong;
st_blksize : cInt;
__pad2a : cInt;
st_blocks : cLong;
st_atime : cLong;
st_atime_nsec : cULong;
st_mtime : cLong;
st_mtime_nsec : cULong;
st_ctime : cLong;
st_ctime_nsec : cULong;
__unused4a : cUInt;
__unused5a : cUInt;
);
1 : (
dev : cULong deprecated;
ino : cULong deprecated;
mode : cUInt deprecated;
nlink : cUInt deprecated;
uid : cUInt deprecated;
gid : cUInt deprecated;
rdev : cULong deprecated;
__pad1b : cULong deprecated;
size : cLong deprecated;
blksize : cInt deprecated;
__pad2b : cInt deprecated;
blocks : cLong deprecated;
atime : cLong deprecated;
atime_nsec : cULong deprecated;
mtime : cLong deprecated;
mtime_nsec : cULong deprecated;
ctime : cLong deprecated;
ctime_nsec : cULong deprecated;
__unused4b : cUInt deprecated;
__unused5b : cUInt deprecated;
);
end;

View File

@ -0,0 +1,127 @@
{
This file is part of the Free Pascal run time library.
Perform syscall with 0..6 arguments.
If syscall return value is negative, negate it, set errno, and return -1.
Written by Edmund Grimley Evans in 2015 and released into the public domain.
}
function FpSysCall(sysnr:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL0'];
asm
mov w8,w0
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL1'];
asm
mov w8,w0
mov x0,x1
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1,param2:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL2'];
asm
mov w8,w0
mov x0,x1
mov x1,x2
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1,param2,param3:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL3'];
asm
mov w8,w0
mov x0,x1
mov x1,x2
mov x2,x3
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL4'];
asm
mov w8,w0
mov x0,x1
mov x1,x2
mov x2,x3
mov x3,x4
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL5'];
asm
mov w8,w0
mov x0,x1
mov x1,x2
mov x2,x3
mov x3,x4
mov x4,x5
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;
function FpSysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult;
assembler; nostackframe; [public,alias:'FPC_SYSCALL6'];
asm
mov w8,w0
mov x0,x1
mov x1,x2
mov x2,x3
mov x3,x4
mov x4,x5
mov x5,x6
svc #0
tbz x0,#63,.Ldone
str x30,[sp,#-16]!
neg x0,x0
bl seterrno
ldr x30,[sp],#16
mov x0,#-1
.Ldone:
end;

View File

@ -0,0 +1,35 @@
{
Copyright (c) 2002 by Marco van de Voort
Header for syscalls in system unit.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
****************************************************************************
}
Type
TSysResult = Int64;
TSysParam = Int64;
function Do_SysCall(sysnr:TSysParam):TSysResult; external name 'FPC_SYSCALL0';
function Do_SysCall(sysnr,param1:TSysParam):TSysResult; external name 'FPC_SYSCALL1';
function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult; external name 'FPC_SYSCALL2';
function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; external name 'FPC_SYSCALL3';
function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; external name 'FPC_SYSCALL4';
function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; external name 'FPC_SYSCALL5';
function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; external name 'FPC_SYSCALL6';

View File

@ -0,0 +1 @@
{$i ../sysnr-gen.inc}

View File

@ -297,7 +297,11 @@ end;
function fpgetpgrp : pid_t;
begin
{$if defined(generic_linux_syscalls)}
fpgetpgrp:=do_syscall(syscall_nr_getpgid,0);
{$else}
fpgetpgrp:=do_syscall(syscall_nr_getpgrp);
{$endif}
end;
function fpsetsid : pid_t;
@ -327,29 +331,59 @@ Function fplink(existing:pchar;newone:pchar):cint;
In effect, new will be the same file as old.
}
begin
{$if defined(generic_linux_syscalls)}
fpLink:=Do_Syscall(syscall_nr_linkat,AT_FDCWD,TSysParam(existing),AT_FDCWD,TSysParam(newone),0);
{$else}
fpLink:=Do_Syscall(syscall_nr_link,TSysParam(existing),TSysParam(newone));
{$endif}
end;
Function fpmkfifo(path:pchar;mode:mode_t):cint;
begin
{$if defined(generic_linux_syscalls)}
fpmkfifo:=do_syscall(syscall_nr_mknodat,AT_FDCWD,TSysParam(path),TSysParam(mode or S_IFIFO),TSysParam(0));
{$else}
fpmkfifo:=do_syscall(syscall_nr_mknod,TSysParam(path),TSysParam(mode or S_IFIFO),TSysParam(0));
{$endif}
end;
Function fpchmod(path:pchar;mode:mode_t):cint;
begin
{$if defined(generic_linux_syscalls)}
fpchmod:=do_syscall(syscall_nr_fchmodat,AT_FDCWD,TSysParam(path),TSysParam(mode),0);
{$else}
fpchmod:=do_syscall(syscall_nr_chmod,TSysParam(path),TSysParam(mode));
{$endif}
end;
Function fpchown(path:pchar;owner:uid_t;group:gid_t):cint;
begin
{$if defined(generic_linux_syscalls)}
fpChOwn:=do_syscall(syscall_nr_fchownat,AT_FDCWD,TSysParam(path),TSysParam(owner),TSysParam(group),0);
{$else}
fpChOwn:=do_syscall(syscall_nr_chown,TSysParam(path),TSysParam(owner),TSysParam(group));
{$endif}
end;
{$ifndef NO_SYSCALL_UTIME}
{$if defined(generic_linux_syscalls)}
Function fpUtime(path:pchar;times:putimbuf):cint;
var
tsa: Array[0..1] of timespec;
begin
tsa[0].tv_sec := times^.actime;
tsa[0].tv_nsec := 0;
tsa[1].tv_sec := times^.modtime;
tsa[1].tv_nsec := 0;
fputime:=do_syscall(syscall_nr_utimensat,AT_FDCWD,TSysParam(path),
TSysParam(@tsa),0);
end;
{$elseif not defined(NO_SYSCALL_UTIME)}
Function fpUtime(path:pchar;times:putimbuf):cint;
@ -377,7 +411,11 @@ end;
Function fppipe(var fildes : tfildes):cint;
begin
{$if defined(generic_linux_syscalls)}
fppipe:=do_syscall(syscall_nr_pipe2,TSysParam(@fildes),0);
{$else}
fppipe:=do_syscall(syscall_nr_pipe,TSysParam(@fildes));
{$endif}
end;
{$endif FPC_BASEUNIX_HAS_FPPIPE}
@ -422,6 +460,18 @@ Function fpSelect(N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cin
Select checks whether the file descriptor sets in readfs/writefs/exceptfs
have changed.
}
{$if defined(generic_linux_syscalls)}
var ts : timespec;
begin
ts.tv_sec := timeout^.tv_sec;
ts.tv_nsec := timeout^.tv_usec * 1000;
fpSelect:=do_syscall(syscall_nr_pselect6,n,
tsysparam(readfds),tsysparam(writefds),
tsysparam(exceptfds),tsysparam(@ts),0);
end;
{$else}
begin
{$ifdef cpux86_64}
@ -436,10 +486,22 @@ begin
{$endif bunxfunc_fpselect_implemented}
end;
{$endif}
function fpPoll(fds: ppollfd; nfds: cuint; timeout: clong): cint;
{$if defined(generic_linux_syscalls)}
var ts : timespec;
begin
ts.tv_sec := timeout div 1000;
ts.tv_nsec := (timeout mod 1000) * 1000000;
fpPoll:=do_syscall(syscall_nr_ppoll,tsysparam(fds),tsysparam(nfds),
tsysparam(@ts),0);
end;
{$else}
begin
fpPoll:=do_syscall(syscall_nr_poll,tsysparam(fds),tsysparam(nfds),tsysparam(timeout));
end;
{$endif}
Function fpLstat(path:pchar;Info:pstat):cint;
{
@ -447,6 +509,9 @@ Function fpLstat(path:pchar;Info:pstat):cint;
}
begin
{$if defined(generic_linux_syscalls)}
fpLStat:=do_syscall(syscall_nr_fstatat,AT_FDCWD,TSysParam(path),TSysParam(info),0)
{$else}
fpLStat:=do_syscall(
{$ifdef cpu64}
syscall_nr_lstat,
@ -454,6 +519,7 @@ begin
syscall_nr_lstat64,
{$endif}
TSysParam(path),TSysParam(info));
{$endif}
end;
@ -465,12 +531,12 @@ function fpNice(N:cint):cint;
Doesn't exist in BSD. Linux emu uses setpriority in a construct as below:
}
{$ifdef cpux86_64}
{$if defined(generic_linux_syscalls) or defined(cpux86_64)}
var
oldprio : cint;
{$endif}
begin
{$ifdef cpux86_64}
{$if defined(generic_linux_syscalls) or defined(cpux86_64)}
oldprio:=fpGetPriority(Prio_Process,0);
fpNice:=fpSetPriority(Prio_Process,0,oldprio+N);
if fpNice=0 then
@ -536,7 +602,11 @@ Function fpSymlink(oldname,newname:pchar):cint;
}
begin
{$if defined(generic_linux_syscalls)}
fpsymlink:=do_syscall(syscall_nr_symlinkat,TSysParam(oldname),AT_FDCWD,TSysParam(newname));
{$else}
fpsymlink:=do_syscall(syscall_nr_symlink,TSysParam(oldname),TSysParam(newname));
{$endif}
end;
function Fppread(fd: cint; buf: pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PREAD'];

View File

@ -17,6 +17,8 @@
**********************************************************************}
unit Linux;
{$i osdefs.inc}
{$packrecords c}
{$ifdef FPC_USE_LIBC}
{$linklib rt} // for clock* functions
@ -527,7 +529,11 @@ end;
function epoll_create(size: cint): cint;
begin
{$if defined(generic_linux_syscalls)}
epoll_create := do_syscall(syscall_nr_epoll_create1,0)
{$else}
epoll_create := do_syscall(syscall_nr_epoll_create,tsysparam(size));
{$endif}
end;
function epoll_ctl(epfd, op, fd: cint; event: pepoll_event): cint;
@ -538,8 +544,13 @@ end;
function epoll_wait(epfd: cint; events: pepoll_event; maxevents, timeout: cint): cint;
begin
{$if defined(generic_linux_syscalls)}
epoll_wait := do_syscall(syscall_nr_epoll_pwait, tsysparam(epfd),
tsysparam(events), tsysparam(maxevents), tsysparam(timeout),0);
{$else}
epoll_wait := do_syscall(syscall_nr_epoll_wait, tsysparam(epfd),
tsysparam(events), tsysparam(maxevents), tsysparam(timeout));
{$endif}
end;
function capget(header:Puser_cap_header;data:Puser_cap_data):cint;
@ -695,7 +706,11 @@ end;
function inotify_init1(flags:cint):cint;
begin
{$if defined(generic_linux_syscalls)}
inotify_init1:=do_SysCall(syscall_nr_inotify_init1,tsysparam(flags));
{$else}
inotify_init1:=do_SysCall(syscall_nr_inotify_init,tsysparam(flags));
{$endif}
end;
function inotify_add_watch(fd:cint; name:Pchar; mask:cuint32):cint;

View File

@ -1924,9 +1924,16 @@ Function Sys_Mkdir(Filename:pchar;mode:longint):longint;
var
regs : SysCallregs;
begin
{$if defined(generic_linux_syscalls)}
regs.reg2:=AT_FDCWD;
regs.reg3:=longint(filename);
regs.reg4:=mode;
Sys_MkDir:=SysCall(SysCall_nr_mkdirat,regs);
{$else}
regs.reg2:=longint(filename);
regs.reg3:=mode;
Sys_MkDir:=SysCall(SysCall_nr_mkdir,regs);
{$endif}
end;
@ -1935,8 +1942,15 @@ Function Sys_Rmdir(Filename:pchar):longint;
var
regs : SysCallregs;
begin
{$if defined(generic_linux_syscalls)}
regs.reg2:=AT_FDCWD;
regs.reg3:=longint(filename);
regs.reg4:=AT_REMOVEDIR;
Sys_Rmdir:=SysCall(SysCall_nr_unlinkat,regs);
{$else}
regs.reg2:=longint(filename);
Sys_Rmdir:=SysCall(SysCall_nr_rmdir,regs);
{$endif}
end;
@ -2744,7 +2758,18 @@ var
begin
sr.reg2:=oldfile;
sr.reg3:=newfile;
{$if defined(generic_linux_syscalls)}
sr.reg4:=0;
if oldfile<>newfile then
SysCall(Syscall_nr_dup3,sr)
else
begin
sr.reg3:=F_GetFd;
SysCall(Syscall_nr_fcntl,sr);
end;
{$else}
SysCall(Syscall_nr_dup2,sr);
{$endif}
linuxerror:=errno;
Dup2:=(LinuxError=0);
end;
@ -2782,7 +2807,12 @@ var
regs : SysCallregs;
begin
regs.reg2:=longint(@pip);
{$if defined(generic_linux_syscalls)}
regs.reg3:=0;
SysCall(SysCall_nr_pipe2,regs);
{$else}
SysCall(SysCall_nr_pipe,regs);
{$endif}
pipe_in:=pip[1];
pipe_out:=pip[2];
linuxerror:=errno;

View File

@ -85,3 +85,7 @@
{$endif FPC_ABI_EABI}
{$endif cpuarm}
{$ifdef cpuaarch64}
{$define generic_linux_syscalls}
{$undef usestime}
{$endif cpuaarch64}

View File

@ -20,7 +20,7 @@
*****************************************************************************}
function Fptime(tloc:pTime_t): Time_t; [public, alias : 'FPC_SYSC_TIME'];
{$ifdef FPC_USEGETTIMEOFDAY}
{$if defined(generic_linux_syscalls) or defined(FPC_USEGETTIMEOFDAY)}
VAR tv : timeval;
tz : timezone;
retval : longint;
@ -49,7 +49,11 @@ end;
function Fpopen(path: pchar; flags : cint; mode: mode_t):cint; [public, alias : 'FPC_SYSC_OPEN'];
Begin
{$if defined(generic_linux_syscalls)}
Fpopen:=do_syscall(syscall_nr_openat,AT_FDCWD,TSysParam(path),TSysParam(flags or O_LARGEFILE),TSysParam(mode));
{$else}
Fpopen:=do_syscall(syscall_nr_open,TSysParam(path),TSysParam(flags or O_LARGEFILE),TSysParam(mode));
{$endif}
End;
function Fpclose(fd : cint): cint; [public, alias : 'FPC_SYSC_CLOSE'];
@ -98,20 +102,32 @@ end;
function Fpunlink(path: pchar): cint; [public, alias : 'FPC_SYSC_UNLINK'];
begin
{$if defined(generic_linux_syscalls)}
Fpunlink:=do_syscall(syscall_nr_unlinkat,AT_FDCWD,TSysParam(path),0);
{$else}
Fpunlink:=do_syscall(syscall_nr_unlink,TSysParam(path));
{$endif}
end;
function Fprename(old : pchar; newpath: pchar): cint; [public, alias : 'FPC_SYSC_RENAME'];
begin
{$if defined(generic_linux_syscalls)}
Fprename:=do_syscall(syscall_nr_renameat,AT_FDCWD,TSysParam(old),AT_FDCWD,TSysParam(newpath));
{$else}
Fprename:=do_syscall(syscall_nr_rename,TSysParam(old),TSysParam(newpath));
{$endif}
end;
function Fpstat(path: pchar; var buf: stat):cint; [public, alias : 'FPC_SYSC_STAT'];
begin
{$if defined(cpu64)}
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
{$if defined(generic_linux_syscalls)}
Fpstat:=do_syscall(syscall_nr_fstatat,AT_FDCWD,TSysParam(path),TSysParam(@buf),0);
{$else}
Fpstat:=do_syscall(syscall_nr_stat,TSysParam(path),TSysParam(@buf));
{$endif}
{$else}
Fpstat:=do_syscall(syscall_nr_stat64,TSysParam(path),TSysParam(@buf));
{$endif}
@ -130,13 +146,21 @@ end;
function Fpmkdir(path : pchar; mode: mode_t):cint; [public, alias : 'FPC_SYSC_MKDIR'];
begin
{$if defined(generic_linux_syscalls)}
Fpmkdir:=do_syscall(syscall_nr_mkdirat,AT_FDCWD,TSysParam(path),TSysParam(mode));
{$else}
Fpmkdir:=do_syscall(syscall_nr_mkdir,TSysParam(path),TSysParam(mode));
{$endif}
end;
function Fprmdir(path : pchar): cint; [public, alias : 'FPC_SYSC_RMDIR'];
begin
{$if defined(generic_linux_syscalls)}
Fprmdir:=do_syscall(syscall_nr_unlinkat,AT_FDCWD,TSysParam(path),AT_REMOVEDIR);
{$else}
Fprmdir:=do_syscall(syscall_nr_rmdir,TSysParam(path));
{$endif}
end;
function Fpopendir(dirname : pchar): pdir; [public, alias : 'FPC_SYSC_OPENDIR'];
@ -363,7 +387,11 @@ function Fpfstat(fd : cint; var sb : stat): cint; [public, alias : 'FPC_SYSC_FS
begin
{$if defined(cpu64)}
FpFStat:=do_SysCall(syscall_nr_fstat,TSysParam(fd),TSysParam(@sb));
{$if defined(generic_linux_syscalls)}
FpFStat:=do_SysCall(syscall_nr_fstat,TSysParam(fd),TSysParam(@sb));
{$else}
FpFStat:=do_SysCall(syscall_nr_fstat,TSysParam(fd),TSysParam(@sb));
{$endif}
{$else}
FpFStat:=do_SysCall(syscall_nr_fstat64,TSysParam(fd),TSysParam(@sb));
{$endif}
@ -380,9 +408,14 @@ function Fpfork : pid_t; [public, alias : 'FPC_SYSC_FORK'];
A negative value indicates that an error has occurred, the error is returned in
LinuxError.
}
var
pid : Int64;
Begin
{$if defined(generic_linux_syscalls)}
Fpfork:=Do_syscall(syscall_nr_clone,clone_flags_fork,0,0,0,TSysParam(@pid));
{$else}
Fpfork:=Do_syscall(SysCall_nr_fork);
{$endif}
End;
{$endif FPC_SYSTEM_HAS_FPFORK}
@ -425,7 +458,7 @@ function Fpwaitpid(pid : pid_t; stat_loc : pcint; options: cint): pid_t; [public
}
begin
{$ifdef WAIT4}
{$if defined(generic_linux_syscalls) or defined(WAIT4)}
FpWaitPID:=do_syscall(syscall_nr_Wait4,PID,TSysParam(Stat_loc),options,0);
{$else WAIT4}
FpWaitPID:=do_syscall(syscall_nr_WaitPID,PID,TSysParam(Stat_loc),options);
@ -447,7 +480,11 @@ function Fpaccess(pathname : pchar; amode : cint): cint; [public, alias : 'FPC_S
}
begin
{$if defined(generic_linux_syscalls)}
FpAccess:=do_syscall(syscall_nr_faccessat,AT_FDCWD,TSysParam(pathname),amode,0);
{$else}
FpAccess:=do_syscall(syscall_nr_access,TSysParam(pathname),amode);
{$endif}
end;
(* overloaded
@ -481,7 +518,16 @@ end;
Function FpDup2(fildes,fildes2:cint):cint; [public, alias : 'FPC_SYSC_DUP2'];
begin
{$if defined(generic_linux_syscalls)}
if fildes<>fildes2 then
Fpdup2:=do_syscall(syscall_nr_dup3,TSysParam(fildes),TSysParam(fildes2),0)
else if do_syscall(syscall_nr_fcntl,TSysParam(fildes),1)<>-1 then
Fpdup2:=fildes2
else
Fpdup2:=-1;
{$else}
Fpdup2:=do_syscall(syscall_nr_dup2,TSysParam(fildes),TSysParam(fildes2));
{$endif}
end;
@ -572,7 +618,11 @@ end;
Function FpReadLink(name,linkname:pchar;maxlen:size_t):cint; [public, alias : 'FPC_SYSC_READLINK'];
begin
{$if defined(generic_linux_syscalls)}
Fpreadlink:=do_syscall(syscall_nr_readlinkat,AT_FDCWD,TSysParam(name),TSysParam(linkname),maxlen);
{$else}
Fpreadlink:=do_syscall(syscall_nr_readlink, TSysParam(name),TSysParam(linkname),maxlen);
{$endif}
end;

View File

@ -290,7 +290,12 @@ CONST
{$endif not cpumips}
{$endif not cpusparc}
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k)}
AT_FDCWD = -100;
AT_REMOVEDIR = $200;
clone_flags_fork = $01200011;
{ SIGCHLD | CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID }
{$if defined(cpuarm) or defined(cpualpha) or defined(cpublackfin) or defined(cpum68k) or defined(aarch64)}
O_LARGEFILE = $20000;
{$endif}
{$if defined(cpusparc) or defined(cpusparc64)}

View File

@ -19,10 +19,12 @@
from the system unit interface; macro's have to be on at this point
because they're use to propagate the MUTEXTYPENAME here }
{$ifdef CPUMIPS}
{$if defined(CPUMIPS) or defined(cpuaarch64)}
{$define USE_PTHREAD_SIZEOF}
{$ifdef CPU64}
{$if defined(cpuaarch64)}
{$define __SIZEOF_PTHREAD_MUTEX_T := 48}
{$elseif defined(CPU64)}
{$define __SIZEOF_PTHREAD_MUTEX_T := 40}
{$else CPU64}
{$define __SIZEOF_PTHREAD_MUTEX_T := 24}

View File

@ -30,9 +30,19 @@ and all three 32-bit systems returned completely identical types too
introduction)
}
{$ifdef CPUMIPS}
{$if defined(CPUMIPS) or defined(cpuaarch64)}
{$define USE_PTHREAD_SIZEOF}
{$ifdef CPU64}
{$if defined(cpuaarch64)}
const
__SIZEOF_PTHREAD_ATTR_T = 64;
__SIZEOF_PTHREAD_MUTEXATTR_T = 8;
__SIZEOF_PTHREAD_COND_T = 48;
__SIZEOF_PTHREAD_CONDATTR_T = 8;
__SIZEOF_PTHREAD_RWLOCK_T = 56;
__SIZEOF_PTHREAD_RWLOCKATTR_T = 8;
__SIZEOF_PTHREAD_BARRIER_T = 32;
__SIZEOF_PTHREAD_BARRIERATTR_T = 8;
{$elseif defined(CPU64)}
const
__SIZEOF_PTHREAD_ATTR_T = 56;
__SIZEOF_PTHREAD_MUTEXATTR_T = 4;
@ -53,7 +63,7 @@ const
__SIZEOF_PTHREAD_BARRIER_T = 20;
__SIZEOF_PTHREAD_BARRIERATTR_T = 4;
{$endif CPU32}
{$endif MIPS}
{$endif}
{$I ctypes.inc}
{$packrecords c}

277
rtl/linux/sysnr-gen.inc Normal file
View File

@ -0,0 +1,277 @@
{
System call numbers taken from include/uapi/asm-generic/unistd.h
in a 4.0 Linux kernel. They are therefore architecture-independent,
though only the newest architectures use this generic list.
}
Const
syscall_nr_io_setup = 0;
syscall_nr_io_destroy = 1;
syscall_nr_io_submit = 2;
syscall_nr_io_cancel = 3;
syscall_nr_io_getevents = 4;
syscall_nr_setxattr = 5;
syscall_nr_lsetxattr = 6;
syscall_nr_fsetxattr = 7;
syscall_nr_getxattr = 8;
syscall_nr_lgetxattr = 9;
syscall_nr_fgetxattr = 10;
syscall_nr_listxattr = 11;
syscall_nr_llistxattr = 12;
syscall_nr_flistxattr = 13;
syscall_nr_removexattr = 14;
syscall_nr_lremovexattr = 15;
syscall_nr_fremovexattr = 16;
syscall_nr_getcwd = 17;
syscall_nr_lookup_dcookie = 18;
syscall_nr_eventfd2 = 19;
syscall_nr_epoll_create1 = 20;
syscall_nr_epoll_ctl = 21;
syscall_nr_epoll_pwait = 22;
syscall_nr_dup = 23;
syscall_nr_dup3 = 24;
syscall_nr_fcntl = 25;
syscall_nr_inotify_init1 = 26;
syscall_nr_inotify_add_watch = 27;
syscall_nr_inotify_rm_watch = 28;
syscall_nr_ioctl = 29;
syscall_nr_ioprio_set = 30;
syscall_nr_ioprio_get = 31;
syscall_nr_flock = 32;
syscall_nr_mknodat = 33;
syscall_nr_mkdirat = 34;
syscall_nr_unlinkat = 35;
syscall_nr_symlinkat = 36;
syscall_nr_linkat = 37;
syscall_nr_renameat = 38;
syscall_nr_umount2 = 39;
syscall_nr_mount = 40;
syscall_nr_pivot_root = 41;
syscall_nr_nfsservctl = 42;
syscall_nr_statfs = 43;
syscall_nr_fstatfs = 44;
syscall_nr_truncate = 45;
syscall_nr_ftruncate = 46;
syscall_nr_fallocate = 47;
syscall_nr_faccessat = 48;
syscall_nr_chdir = 49;
syscall_nr_fchdir = 50;
syscall_nr_chroot = 51;
syscall_nr_fchmod = 52;
syscall_nr_fchmodat = 53;
syscall_nr_fchownat = 54;
syscall_nr_fchown = 55;
syscall_nr_openat = 56;
syscall_nr_close = 57;
syscall_nr_vhangup = 58;
syscall_nr_pipe2 = 59;
syscall_nr_quotactl = 60;
syscall_nr_getdents64 = 61;
syscall_nr_lseek = 62;
syscall_nr_read = 63;
syscall_nr_write = 64;
syscall_nr_readv = 65;
syscall_nr_writev = 66;
syscall_nr_pread64 = 67;
syscall_nr_pwrite64 = 68;
syscall_nr_preadv = 69;
syscall_nr_pwritev = 70;
syscall_nr_sendfile = 71;
syscall_nr_pselect6 = 72;
syscall_nr_ppoll = 73;
syscall_nr_signalfd4 = 74;
syscall_nr_vmsplice = 75;
syscall_nr_splice = 76;
syscall_nr_tee = 77;
syscall_nr_readlinkat = 78;
syscall_nr_fstatat = 79;
syscall_nr_fstat = 80;
syscall_nr_sync = 81;
syscall_nr_fsync = 82;
syscall_nr_fdatasync = 83;
syscall_nr_sync_file_range = 84;
syscall_nr_timerfd_create = 85;
syscall_nr_timerfd_settime = 86;
syscall_nr_timerfd_gettime = 87;
syscall_nr_utimensat = 88;
syscall_nr_acct = 89;
syscall_nr_capget = 90;
syscall_nr_capset = 91;
syscall_nr_personality = 92;
syscall_nr_exit = 93;
syscall_nr_exit_group = 94;
syscall_nr_waitid = 95;
syscall_nr_set_tid_address = 96;
syscall_nr_unshare = 97;
syscall_nr_futex = 98;
syscall_nr_set_robust_list = 99;
syscall_nr_get_robust_list = 100;
syscall_nr_nanosleep = 101;
syscall_nr_getitimer = 102;
syscall_nr_setitimer = 103;
syscall_nr_kexec_load = 104;
syscall_nr_init_module = 105;
syscall_nr_delete_module = 106;
syscall_nr_timer_create = 107;
syscall_nr_timer_gettime = 108;
syscall_nr_timer_getoverrun = 109;
syscall_nr_timer_settime = 110;
syscall_nr_timer_delete = 111;
syscall_nr_clock_settime = 112;
syscall_nr_clock_gettime = 113;
syscall_nr_clock_getres = 114;
syscall_nr_clock_nanosleep = 115;
syscall_nr_syslog = 116;
syscall_nr_ptrace = 117;
syscall_nr_sched_setparam = 118;
syscall_nr_sched_setscheduler = 119;
syscall_nr_sched_getscheduler = 120;
syscall_nr_sched_getparam = 121;
syscall_nr_sched_setaffinity = 122;
syscall_nr_sched_getaffinity = 123;
syscall_nr_sched_yield = 124;
syscall_nr_sched_get_priority_max = 125;
syscall_nr_sched_get_priority_min = 126;
syscall_nr_sched_rr_get_interval = 127;
syscall_nr_restart_syscall = 128;
syscall_nr_kill = 129;
syscall_nr_tkill = 130;
syscall_nr_tgkill = 131;
syscall_nr_sigaltstack = 132;
syscall_nr_rt_sigsuspend = 133;
syscall_nr_rt_sigaction = 134;
syscall_nr_rt_sigprocmask = 135;
syscall_nr_rt_sigpending = 136;
syscall_nr_rt_sigtimedwait = 137;
syscall_nr_rt_sigqueueinfo = 138;
syscall_nr_rt_sigreturn = 139;
syscall_nr_setpriority = 140;
syscall_nr_getpriority = 141;
syscall_nr_reboot = 142;
syscall_nr_setregid = 143;
syscall_nr_setgid = 144;
syscall_nr_setreuid = 145;
syscall_nr_setuid = 146;
syscall_nr_setresuid = 147;
syscall_nr_getresuid = 148;
syscall_nr_setresgid = 149;
syscall_nr_getresgid = 150;
syscall_nr_setfsuid = 151;
syscall_nr_setfsgid = 152;
syscall_nr_times = 153;
syscall_nr_setpgid = 154;
syscall_nr_getpgid = 155;
syscall_nr_getsid = 156;
syscall_nr_setsid = 157;
syscall_nr_getgroups = 158;
syscall_nr_setgroups = 159;
syscall_nr_uname = 160;
syscall_nr_sethostname = 161;
syscall_nr_setdomainname = 162;
syscall_nr_getrlimit = 163;
syscall_nr_setrlimit = 164;
syscall_nr_getrusage = 165;
syscall_nr_umask = 166;
syscall_nr_prctl = 167;
syscall_nr_getcpu = 168;
syscall_nr_gettimeofday = 169;
syscall_nr_settimeofday = 170;
syscall_nr_adjtimex = 171;
syscall_nr_getpid = 172;
syscall_nr_getppid = 173;
syscall_nr_getuid = 174;
syscall_nr_geteuid = 175;
syscall_nr_getgid = 176;
syscall_nr_getegid = 177;
syscall_nr_gettid = 178;
syscall_nr_sysinfo = 179;
syscall_nr_mq_open = 180;
syscall_nr_mq_unlink = 181;
syscall_nr_mq_timedsend = 182;
syscall_nr_mq_timedreceive = 183;
syscall_nr_mq_notify = 184;
syscall_nr_mq_getsetattr = 185;
syscall_nr_msgget = 186;
syscall_nr_msgctl = 187;
syscall_nr_msgrcv = 188;
syscall_nr_msgsnd = 189;
syscall_nr_semget = 190;
syscall_nr_semctl = 191;
syscall_nr_semtimedop = 192;
syscall_nr_semop = 193;
syscall_nr_shmget = 194;
syscall_nr_shmctl = 195;
syscall_nr_shmat = 196;
syscall_nr_shmdt = 197;
syscall_nr_socket = 198;
syscall_nr_socketpair = 199;
syscall_nr_bind = 200;
syscall_nr_listen = 201;
syscall_nr_accept = 202;
syscall_nr_connect = 203;
syscall_nr_getsockname = 204;
syscall_nr_getpeername = 205;
syscall_nr_sendto = 206;
syscall_nr_recvfrom = 207;
syscall_nr_setsockopt = 208;
syscall_nr_getsockopt = 209;
syscall_nr_shutdown = 210;
syscall_nr_sendmsg = 211;
syscall_nr_recvmsg = 212;
syscall_nr_readahead = 213;
syscall_nr_brk = 214;
syscall_nr_munmap = 215;
syscall_nr_mremap = 216;
syscall_nr_add_key = 217;
syscall_nr_request_key = 218;
syscall_nr_keyctl = 219;
syscall_nr_clone = 220;
syscall_nr_execve = 221;
syscall_nr_mmap = 222;
syscall_nr_fadvise64 = 223;
syscall_nr_swapon = 224;
syscall_nr_swapoff = 225;
syscall_nr_mprotect = 226;
syscall_nr_msync = 227;
syscall_nr_mlock = 228;
syscall_nr_munlock = 229;
syscall_nr_mlockall = 230;
syscall_nr_munlockall = 231;
syscall_nr_mincore = 232;
syscall_nr_madvise = 233;
syscall_nr_remap_file_pages = 234;
syscall_nr_mbind = 235;
syscall_nr_get_mempolicy = 236;
syscall_nr_set_mempolicy = 237;
syscall_nr_migrate_pages = 238;
syscall_nr_move_pages = 239;
syscall_nr_rt_tgsigqueueinfo = 240;
syscall_nr_perf_event_open = 241;
syscall_nr_accept4 = 242;
syscall_nr_recvmmsg = 243;
syscall_nr_arch_specific_syscall = 244;
syscall_nr_wait4 = 260;
syscall_nr_prlimit64 = 261;
syscall_nr_fanotify_init = 262;
syscall_nr_fanotify_mark = 263;
syscall_nr_name_to_handle_at = 264;
syscall_nr_open_by_handle_at = 265;
syscall_nr_clock_adjtime = 266;
syscall_nr_syncfs = 267;
syscall_nr_setns = 268;
syscall_nr_sendmmsg = 269;
syscall_nr_process_vm_readv = 270;
syscall_nr_process_vm_writev = 271;
syscall_nr_kcmp = 272;
syscall_nr_finit_module = 273;
syscall_nr_sched_setattr = 274;
syscall_nr_sched_getattr = 275;
syscall_nr_renameat2 = 276;
syscall_nr_seccomp = 277;
syscall_nr_getrandom = 278;
syscall_nr_memfd_create = 279;
syscall_nr_bpf = 280;
syscall_nr_execveat = 281;
syscall_nr_syscalls = 282;

View File

@ -22,6 +22,271 @@ Const
NCCS = 32;
NCC = 8;
{$ifdef cpuaarch64}
{ from Linux 4.0, include/uapi/asm-generic/ioctls.h }
{ For Terminal handling }
TCGETS = $5401;
TCSETS = $5402;
TCSETSW = $5403;
TCSETSF = $5404;
TCGETA = $5405;
TCSETA = $5406;
TCSETAW = $5407;
TCSETAF = $5408;
TCSBRK = $5409;
TCXONC = $540A;
TCFLSH = $540B;
TIOCEXCL = $540C;
TIOCNXCL = $540D;
TIOCSCTTY = $540E;
TIOCGPGRP = $540F;
TIOCSPGRP = $5410;
TIOCOUTQ = $5411;
TIOCSTI = $5412;
TIOCGWINSZ = $5413;
TIOCSWINSZ = $5414;
TIOCMGET = $5415;
TIOCMBIS = $5416;
TIOCMBIC = $5417;
TIOCMSET = $5418;
TIOCGSOFTCAR = $5419;
TIOCSSOFTCAR = $541A;
FIONREAD = $541B;
TIOCINQ = FIONREAD;
TIOCLINUX = $541C;
TIOCCONS = $541D;
TIOCGSERIAL = $541E;
TIOCSSERIAL = $541F;
TIOCPKT = $5420;
FIONBIO = $5421;
TIOCNOTTY = $5422;
TIOCSETD = $5423;
TIOCGETD = $5424;
TCSBRKP = $5425;
TIOCSBRK = $5427;
TIOCCBRK = $5428;
TIOCGSID = $5429;
TIOCGRS485 = $542E;
TIOCSRS485 = $542F;
TCGETX = $5432;
TCSETX = $5433;
TCSETXF = $5434;
TCSETXW = $5435;
TIOCVHANGUP = $5437;
FIONCLEX = $5450;
FIOCLEX = $5451;
FIOASYNC = $5452;
TIOCSERCONFIG = $5453;
TIOCSERGWILD = $5454;
TIOCSERSWILD = $5455;
TIOCGLCKTRMIOS = $5456;
TIOCSLCKTRMIOS = $5457;
TIOCSERGSTRUCT = $5458;
TIOCSERGETLSR = $5459;
TIOCSERGETMULTI = $545A;
TIOCSERSETMULTI = $545B;
TIOCMIWAIT = $545C;
TIOCGICOUNT = $545D;
FIOQSIZE = $5460;
TIOCPKT_DATA = 0;
TIOCPKT_FLUSHREAD = 1;
TIOCPKT_FLUSHWRITE = 2;
TIOCPKT_STOP = 4;
TIOCPKT_START = 8;
TIOCPKT_NOSTOP = 16;
TIOCPKT_DOSTOP = 32;
TIOCPKT_IOCTL = 64;
TIOCSER_TEMT = $01;
{ from Linux 4.0, include/uapi/asm-generic/termbits.h }
{ c_cc characters }
VINTR = 0;
VQUIT = 1;
VERASE = 2;
VKILL = 3;
VEOF = 4;
VTIME = 5;
VMIN = 6;
VSWTC = 7;
VSTART = 8;
VSTOP = 9;
VSUSP = 10;
VEOL = 11;
VREPRINT = 12;
VDISCARD = 13;
VWERASE = 14;
VLNEXT = 15;
VEOL2 = 16;
{ c_iflag bits }
IGNBRK = &0000001;
BRKINT = &0000002;
IGNPAR = &0000004;
PARMRK = &0000010;
INPCK = &0000020;
ISTRIP = &0000040;
INLCR = &0000100;
IGNCR = &0000200;
ICRNL = &0000400;
IUCLC = &0001000;
IXON = &0002000;
IXANY = &0004000;
IXOFF = &0010000;
IMAXBEL = &0020000;
IUTF8 = &0040000;
{ c_oflag bits }
OPOST = &0000001;
OLCUC = &0000002;
ONLCR = &0000004;
OCRNL = &0000010;
ONOCR = &0000020;
ONLRET = &0000040;
OFILL = &0000100;
OFDEL = &0000200;
NLDLY = &0000400;
NL0 = &0000000;
NL1 = &0000400;
CRDLY = &0003000;
CR0 = &0000000;
CR1 = &0001000;
CR2 = &0002000;
CR3 = &0003000;
TABDLY = &0014000;
TAB0 = &0000000;
TAB1 = &0004000;
TAB2 = &0010000;
TAB3 = &0014000;
XTABS = &0014000;
BSDLY = &0020000;
BS0 = &0000000;
BS1 = &0020000;
VTDLY = &0040000;
VT0 = &0000000;
VT1 = &0040000;
FFDLY = &0100000;
FF0 = &0000000;
FF1 = &0100000;
{ c_cflag bits }
CBAUD = &0010017;
B0 = &0000000;
B50 = &0000001;
B75 = &0000002;
B110 = &0000003;
B134 = &0000004;
B150 = &0000005;
B200 = &0000006;
B300 = &0000007;
B600 = &0000010;
B1200 = &0000011;
B1800 = &0000012;
B2400 = &0000013;
B4800 = &0000014;
B9600 = &0000015;
B19200 = &0000016;
B38400 = &0000017;
EXTA = B19200;
EXTB = B38400;
CSIZE = &0000060;
CS5 = &0000000;
CS6 = &0000020;
CS7 = &0000040;
CS8 = &0000060;
CSTOPB = &0000100;
CREAD = &0000200;
PARENB = &0000400;
PARODD = &0001000;
HUPCL = &0002000;
CLOCAL = &0004000;
CBAUDEX = &0010000;
BOTHER = &0010000;
B57600 = &0010001;
B115200 = &0010002;
B230400 = &0010003;
B460800 = &0010004;
B500000 = &0010005;
B576000 = &0010006;
B921600 = &0010007;
B1000000 = &0010010;
B1152000 = &0010011;
B1500000 = &0010012;
B2000000 = &0010013;
B2500000 = &0010014;
B3000000 = &0010015;
B3500000 = &0010016;
B4000000 = &0010017;
CIBAUD = &002003600000;
CMSPAR = &010000000000;
CRTSCTS = &020000000000;
IBSHIFT = 16;
{ c_lflag bits }
ISIG = &0000001;
ICANON = &0000002;
XCASE = &0000004;
ECHO = &0000010;
ECHOE = &0000020;
ECHOK = &0000040;
ECHONL = &0000100;
NOFLSH = &0000200;
TOSTOP = &0000400;
ECHOCTL = &0001000;
ECHOPRT = &0002000;
ECHOKE = &0004000;
FLUSHO = &0010000;
PENDIN = &0040000;
IEXTEN = &0100000;
EXTPROC = &0200000;
{ TCFlow }
TCOOFF = 0;
TCOON = 1;
TCIOFF = 2;
TCION = 3;
{ TCFlush }
TCIFLUSH = 0;
TCOFLUSH = 1;
TCIOFLUSH = 2;
{ TCSetAttr }
TCSANOW = 0;
TCSADRAIN = 1;
TCSAFLUSH = 2;
{ from Linux 4.0, include/uapi/asm-generic/termios.h }
{ c_line bits }
TIOCM_LE = $001;
TIOCM_DTR = $002;
TIOCM_RTS = $004;
TIOCM_ST = $008;
TIOCM_SR = $010;
TIOCM_CTS = $020;
TIOCM_CAR = $040;
TIOCM_RNG = $080;
TIOCM_DSR = $100;
TIOCM_CD = TIOCM_CAR;
TIOCM_RI = TIOCM_RNG;
TIOCM_OUT1 = $2000;
TIOCM_OUT2 = $4000;
TIOCM_LOOP = $8000;
{$endif cpuaarch64}
{$ifdef cpupowerpc}
TCGETS = $402c7413;
TCSETS = $802c7414;