mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-10 10:29:17 +02:00
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:
parent
961757934a
commit
a3a7285df4
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user