linux: an attempt to clean up and fix syscall calling conventions for ftruncate64, pread64 and pwrite64 on platforms which use aligned register pairs to pass the 64bit parameters

git-svn-id: trunk@37719 -
This commit is contained in:
Károly Balogh 2017-12-12 02:39:45 +00:00
parent 961757934a
commit a3a7285df4
8 changed files with 34 additions and 49 deletions

View File

@ -226,8 +226,8 @@ Const
syscall_nr_rt_sigtimedwait = syscall_nr_base+177;
syscall_nr_rt_sigqueueinfo = syscall_nr_base+178;
syscall_nr_rt_sigsuspend = syscall_nr_base+179;
syscall_nr_pread = syscall_nr_base+180;
syscall_nr_pwrite = syscall_nr_base+181;
syscall_nr_pread64 = syscall_nr_base+180;
syscall_nr_pwrite64 = syscall_nr_base+181;
syscall_nr_chown = syscall_nr_base+182;
syscall_nr_getcwd = syscall_nr_base+183;
syscall_nr_capget = syscall_nr_base+184;
@ -420,4 +420,3 @@ Const
__ARM_NR_usr26 = __ARM_NR_BASE+3;
__ARM_NR_usr32 = __ARM_NR_BASE+4;
__ARM_NR_set_tls = __ARM_NR_BASE+5;

View File

@ -647,24 +647,23 @@ begin
{$endif}
end;
{ this is used by the Fppread/Fppwrite below. for more information,
check the syscall() Linux man page (KB) }
{$if defined(FPC_ABI_EABI) or defined(CPUMIPS32) or defined(CPUMIPSEL32) or defined(CPUPOWERPC32)}
{$define FPC_ALIGN_DUMMY}
{$endif}
function Fppread(fd: cint; buf: pchar; nbytes : size_t; offset:Toff): ssize_t; [public, alias : 'FPC_SYSC_PREAD'];
begin
{$ifdef CPU64}
Fppread:=do_syscall(syscall_nr_pread64,Fd,TSysParam(buf),nbytes,TSysParam(OffSet));
{$else}
{$if defined(CPUMIPS32) or defined(CPUMIPSEL32)}
Fppread:=do_syscall(syscall_nr_pread64,Fd,TSysParam(buf),nbytes,0, { align parameters as required with dummy }
Fppread:=do_syscall(syscall_nr_pread64,Fd,TSysParam(buf),nbytes,
{$ifdef FPC_ALIGN_DUMMY} 0, {$endif FPC_ALIGN_DUMMY} { align parameters as required with dummy }
{$ifdef FPC_BIG_ENDIAN} hi(offset),lo(offset){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offset),hi(offset){$endif}
);
{$else CPUMIPS32}
Fppread:=do_syscall(syscall_nr_pread,Fd,TSysParam(buf),nbytes,
{$ifdef FPC_ABI_EABI} 0, { align parameters as required with dummy } {$endif FPC_ABI_EABI}
{$ifdef FPC_BIG_ENDIAN} hi(offset),lo(offset){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offset),hi(offset){$endif}
);
{$endif CPUMIPS32}
{$endif}
end;
@ -674,21 +673,17 @@ begin
{$ifdef CPU64}
Fppwrite:=do_syscall(syscall_nr_pwrite64,Fd,TSysParam(buf),nbytes,TSysParam(OffSet));
{$else}
{$if defined(CPUMIPS32) or defined(CPUMIPSEL32)}
Fppwrite:=do_syscall(syscall_nr_pwrite64,Fd,TSysParam(buf),nbytes,0, { align parameters as required with dummy }
{$ifdef FPC_BIG_ENDIAN} hi(offset),lo(offset){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offset),hi(offset){$endif}
);
{$else CPUMIPS32}
Fppwrite:=do_syscall(syscall_nr_pwrite,Fd,TSysParam(buf),nbytes,
{$ifdef FPC_ABI_EABI} 0, { align parameters as required with dummy } {$endif FPC_ABI_EABI}
{$ifdef FPC_BIG_ENDIAN} hi(offset),lo(offset){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offset),hi(offset){$endif}
);
{$endif CPUMIPS32}
Fppwrite:=do_syscall(syscall_nr_pwrite64,Fd,TSysParam(buf),nbytes,
{$ifdef FPC_ALIGN_DUMMY} 0, {$endif FPC_ALIGN_DUMMY} { align parameters as required with dummy }
{$ifdef FPC_BIG_ENDIAN} hi(offset),lo(offset){$endif}
{$ifdef FPC_LITTLE_ENDIAN} lo(offset),hi(offset){$endif}
);
{$endif}
end;
{$undef FPC_ALIGN_DUMMY}
function Fpreadv(fd: cint; const iov : piovec; iovcnt : cint):ssize_t; [public, alias : 'FPC_SYSC_READV'];
begin

View File

@ -199,8 +199,8 @@ Const
syscall_nr_rt_sigtimedwait = 177;
syscall_nr_rt_sigqueueinfo = 178;
syscall_nr_rt_sigsuspend = 179;
syscall_nr_pread = 180;
syscall_nr_pwrite = 181;
syscall_nr_pread64 = 180;
syscall_nr_pwrite64 = 181;
syscall_nr_chown = 182;
syscall_nr_getcwd = 183;
syscall_nr_capget = 184;
@ -339,4 +339,3 @@ Const
syscall_nr_move_pages = 317;
syscall_nr_getcpu = 318;
syscall_nr_epoll_pwait = 319;

View File

@ -200,8 +200,8 @@ Const
syscall_nr_rt_sigtimedwait = 177;
syscall_nr_rt_sigqueueinfo = 178;
syscall_nr_rt_sigsuspend = 179;
syscall_nr_pread = 180;
syscall_nr_pwrite = 181;
syscall_nr_pread64 = 180;
syscall_nr_pwrite64 = 181;
syscall_nr_chown = 182;
syscall_nr_getcwd = 183;
syscall_nr_capget = 184;
@ -342,4 +342,3 @@ Const
syscall_nr_timerfd = 318;
syscall_nr_eventfd = 319;
syscall_nr_fallocate = 320;

View File

@ -254,9 +254,6 @@ Const
syscall_nr_rt_sigqueueinfo = 4000+198;
syscall_nr_rt_sigsuspend = 4000+199;
// syscall_nr_pread = 4000+180;
// syscall_nr_pwrite = 4000+181;
syscall_nr_pread64 = 4000+200;
syscall_nr_pwrite64 = 4000+201;

View File

@ -360,6 +360,11 @@ begin
{$endif cpusparc}
end;
{ this is used by the FpFtruncate below. for more information,
check the syscall() Linux man page (KB) }
{$if defined(FPC_ABI_EABI) or defined(CPUMIPS32) or defined(CPUMIPSEL32) or defined(CPUPOWERPC32)}
{$define FPC_ALIGN_DUMMY}
{$endif}
function Fpftruncate(fd : cint; flength : off_t): cint; [public, alias : 'FPC_SYSC_FTRUNCATE'];
{ See notes lseek. This one is completely similar for the parameter (but
@ -370,13 +375,15 @@ begin
Fpftruncate:=Do_syscall(syscall_nr_ftruncate,TSysParam(fd),TSysParam(flength));
{$else}
Fpftruncate:=Do_syscall(syscall_nr_ftruncate64,TSysParam(fd),
{$ifdef FPC_ABI_EABI} 0, { align parameters as required with dummy } {$endif FPC_ABI_EABI}
{$ifdef FPC_ALIGN_DUMMY} 0, {$endif FPC_ALIGN_DUMMY} { align parameters as required with dummy }
{$ifdef FPC_BIG_ENDIAN} tsysparam(hi(flength)),tsysparam(lo(flength)){$endif}
{$ifdef FPC_LITTLE_ENDIAN} tsysparam(lo(flength)),tsysparam(hi(flength)){$endif}
);
{$endif}
end;
{$undef FPC_ALIGN_DUMMY}
function Fpfstat(fd : cint; var sb : stat): cint; [public, alias : 'FPC_SYSC_FSTAT'];
begin

View File

@ -195,8 +195,8 @@ const
syscall_nr_rt_sigtimedwait = 176;
syscall_nr_rt_sigqueueinfo = 177;
syscall_nr_rt_sigsuspend = 178;
syscall_nr_pread = 179;
syscall_nr_pwrite = 180;
syscall_nr_pread64 = 179;
syscall_nr_pwrite64 = 180;
syscall_nr_chown = 181;
syscall_nr_getcwd = 182;
syscall_nr_capget = 183;
@ -331,7 +331,3 @@ const
syscall_nr_timerfd = 307;
syscall_nr_eventfd = 308;
syscall_nr_sync_file_range2 = 309;
syscall_nr_pwrite64 = syscall_nr_pwrite;
syscall_nr_pread64 = syscall_nr_pread;

View File

@ -86,8 +86,8 @@ Const
syscall_nr_getpagesize = 64 ; // Common
syscall_nr_msync = 65 ; // Common in newer 1.3.x revs...
syscall_nr_vfork = 66 ; // Common
syscall_nr_pread = 67 ; // Linux Specific
syscall_nr_pwrite = 68 ; // Linux Specific
syscall_nr_pread64 = 67 ; // Linux Specific
syscall_nr_pwrite64 = 68 ; // Linux Specific
syscall_nr_geteuid32 = 69 ; // Linux sparc32, sbrk under SunOS
syscall_nr_getegid32 = 70 ; // Linux sparc32, sstk under SunOS
syscall_nr_mmap = 71 ; // Common
@ -381,10 +381,3 @@ Const
syscall_nr_preadv2 = 358;
syscall_nr_pwritev2 = 359;
syscall_nr_statx = 360;
{ aliases, not sure if they are correct (FPK) }
syscall_nr_pread64 = 67;
syscall_nr_pwrite64 = 68;