Forráskód Böngészése

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 -
Károly Balogh 7 éve
szülő
commit
a3a7285df4

+ 2 - 3
rtl/linux/arm/sysnr.inc

@@ -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;
-

+ 16 - 21
rtl/linux/bunxsysc.inc

@@ -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 }
-    {$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}
+  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}
    );
-{$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

+ 2 - 3
rtl/linux/i386/sysnr.inc

@@ -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;
-

+ 2 - 3
rtl/linux/m68k/sysnr.inc

@@ -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;
-

+ 0 - 3
rtl/linux/mips/sysnr.inc

@@ -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;
 

+ 8 - 1
rtl/linux/ossysc.inc

@@ -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

+ 2 - 6
rtl/linux/powerpc/sysnr.inc

@@ -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;
-

+ 2 - 9
rtl/linux/sparcgen/sysnr.inc

@@ -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;
-