]> granicus.if.org Git - strace/commitdiff
Fix off_t args on FreeBSD
authorJohn Hughes <john@Calva.COM>
Wed, 7 Mar 2001 13:21:24 +0000 (13:21 +0000)
committerJohn Hughes <john@Calva.COM>
Wed, 7 Mar 2001 13:21:24 +0000 (13:21 +0000)
ChangeLog
defs.h
file.c
freebsd/i386/syscall.h
freebsd/i386/syscallent.h
freebsd/syscalls.print
io.c
mem.c

index 87ad2d5698400cec94ab5577c2199c2dcc475df5..1785bd2e5d2afeee309812638a2b90dbe033500d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2001-03-07  John Hughes <john@Calva.COM>
+
+  * defs.h: add ALIGN64 macro to cope with FreeBSD's strange insistence
+    on alignment for off_t (64 bit) arguments.  Also simplify get64 so
+    we don't need to know endianness of long long.
+  * file.c: FreeBSD now uses 64 bit versions of lseek, truncate,
+    ftruncate, allows reduction in numvber of horrid #if's
+  * io.c: FreeBSD now uses 64 bit versions of pread, pwrite.
+  * mem.c: FreeBSD now uses 64 bit version of mmap.
+  * freebsd/syscalls.print: use 64 bit versions of various syscalls.
+  * freebsd/i386/syscall.h: use 64 bit versions of various syscalls.
+  * freebsd/i386/syscallent.h: use 64 bit versions of various syscalls.
+
 2001-03-06  John Hughes <john@Calva.COM>
 
   * file.c: Implement truncate64 and ftruncate64
diff --git a/defs.h b/defs.h
index ba65f84a6a623aeeb14fc1262013cc036f973a31..1b967ccc83b6ea7d42e62b1684bb4b899d284a8f 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -497,14 +497,38 @@ extern char *signalent2[];
 extern int nsignals2;
 #endif /* SUPPORTED_PERSONALITIES >= 3 */
 
-#if _LFS64_LARGEFILE
+#if FREEBSD
+/* ARRGH!  off_t args are aligned on 64 bit boundaries! */
+#define ALIGN64(tcp,arg)                                               \
+do {                                                                   \
+       if (arg % 2)                                                    \
+           memmove (&tcp->u_arg[arg], &tcp->u_arg[arg + 1],            \
+                    (tcp->u_nargs - arg - 1) * sizeof tcp->u_arg[0]);  \
+} while (0)
+#else
+#define ALIGN64(tcp,arg) do { } while (0)
+#endif
+
+#if _LFS64_LARGEFILE || FREEBSD
+
 /* _l refers to the lower numbered u_arg,
  * _h refers to the higher numbered u_arg
  */
-#if _LITTLE_ENDIAN || I386     /* FIXME! */
+
+#if 1
+/* This should work, assuming we can do non-aligned 64 bit fetches.
+ * if not we'll have to figure out how which of the other versions to use.
+ */
+
+#define get64(_l,_h) (*(long long *) &(_l))
+
+#else
+
+#if _LITTLE_ENDIAN
 #define get64(_l,_h) ((long long)((unsigned long long)(_l) | ((unsigned long long)(_h)<<32)))
 #else
 #define get64(_l,_h) ((long long)((unsigned long long)(_h) | ((unsigned long long)(_l)<<32)))
 #endif
 #endif
+#endif
 
diff --git a/file.c b/file.c
index 090d78d05d694db3e447a4be7f43e9f164290d73..d2eac9c50db34a6b27d2261dd4248486cacb7746 100644 (file)
--- a/file.c
+++ b/file.c
@@ -350,6 +350,7 @@ static struct xlat whence[] = {
        { 0,            NULL            },
 };
 
+#ifndef FREEBSD
 int
 sys_lseek(tcp)
 struct tcb *tcp;
@@ -359,30 +360,17 @@ struct tcb *tcp;
 
        if (entering(tcp)) {
                tprintf("%ld, ", tcp->u_arg[0]);
-#ifndef FREEBSD
                offset = tcp->u_arg[1];
                _whence = tcp->u_arg[2];
                if (_whence == SEEK_SET)
                        tprintf("%lu, ", offset);
                else
                        tprintf("%ld, ", offset);               
-#else /* FREEBSD */
-               offset = ((off_t) tcp->u_arg[1] << 32) +  tcp->u_arg[2];
-               _whence = tcp->u_arg[4];
-               if (_whence == SEEK_SET)
-                       tprintf("%llu, ", offset);
-               else
-                       tprintf("%lld, ", offset);              
-#endif         
                printxval(whence, _whence, "SEEK_???");
        } 
-#ifdef FREEBSD
-       else
-               if (!syserror(tcp))
-                       return RVAL_LUDECIMAL;
-#endif /* FREEBSD */
        return RVAL_UDECIMAL;
 }
+#endif
 
 #ifdef linux
 int
@@ -411,13 +399,15 @@ struct tcb *tcp;
 }
 #endif
 
-#if _LFS64_LARGEFILE
+#if _LFS64_LARGEFILE || FREEBSD
 int
 sys_lseek64 (tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
-               long long offset = get64(tcp->u_arg [1], tcp->u_arg[2]);
+               long long offset;
+               ALIGN64 (tcp, 1);       /* FreeBSD aligns off_t args */
+               offset = get64(tcp->u_arg [1], tcp->u_arg[2]);
                if (tcp->u_arg[3] == SEEK_SET)
                        tprintf("%ld, %llu, ", tcp->u_arg[0], offset);
                else
@@ -428,27 +418,26 @@ struct tcb *tcp;
 }
 #endif
 
+#ifndef FREEBSD
 int
 sys_truncate(tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
                printpath(tcp, tcp->u_arg[0]);
-#ifndef FREEBSD
                tprintf(", %lu", tcp->u_arg[1]);
-#else
-               tprintf(", %llu", ((off_t) tcp->u_arg[1] << 32) + tcp->u_arg[2]);
-#endif         
        }
        return 0;
 }
+#endif
 
-#if _LFS64_LARGEFILE
+#if _LFS64_LARGEFILE || FREEBSD
 int
 sys_truncate64(tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
+               ALIGN64 (tcp, 1);
                printpath(tcp, tcp->u_arg[0]);
                tprintf(", %llu", get64(tcp->u_arg[1],tcp->u_arg[2]));
        }
@@ -456,27 +445,25 @@ struct tcb *tcp;
 }
 #endif
 
+#ifndef FREEBSD
 int
 sys_ftruncate(tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
-#ifndef FREEBSD
                tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
-#else
-               tprintf("%ld, %llu", tcp->u_arg[0],
-                       ((off_t) tcp->u_arg[1] << 32) + tcp->u_arg[2]);
-#endif         
        }
        return 0;
 }
+#endif
 
-#if _LFS64_LARGEFILE
+#if _LFS64_LARGEFILE || FREEBSD
 int
 sys_ftruncate64(tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
+               ALIGN64 (tcp, 1);
                tprintf("%ld, %llu", tcp->u_arg[0],
                        get64(tcp->u_arg[1] ,tcp->u_arg[2]));
        }
index 244d01aedbdda3ba9c5492eea380becc005df0d3..2d7c50d2e5da55c66ac88df3a3d718af7cf1091c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Automatically generated by ./../syscalls.pl on Fri Sep  1 17:43:23 2000
+ * Automatically generated by ./../syscalls.pl on Wed Mar  7 12:22:58 2001
  */
 
 #define sys_syscall printargs
@@ -20,7 +20,7 @@ int sys_chmod();
 int sys_chown();
 #define sys_break printargs
 #define sys_getfsstat printargs
-int sys_lseek();
+int sys_lseek64();
 int sys_getpid();
 #define sys_mount printargs
 #define sys_unmount printargs
@@ -70,7 +70,7 @@ int sys_msync();
 int sys_vfork();
 int sys_sbrk();
 #define sys_sstk printargs
-int sys_mmap();
+int sys_mmap64();
 #define sys_vadvise printargs
 int sys_munmap();
 int sys_mprotect();
@@ -121,8 +121,8 @@ int sys_recvfrom();
 int sys_setreuid();
 int sys_setregid();
 int sys_rename();
-int sys_truncate();
-int sys_ftruncate();
+int sys_truncate64();
+int sys_ftruncate64();
 int sys_flock();
 int sys_mkfifo();
 int sys_sendto();
@@ -155,8 +155,8 @@ int sys_uname();
 #define sys_semsys printargs
 #define sys_msgsys printargs
 #define sys_shmsys printargs
-int sys_pread();
-int sys_pwrite();
+int sys_pread64();
+int sys_pwrite64();
 #define sys_ntp_adjtime printargs
 #define sys_setgid printargs
 #define sys_setegid printargs
@@ -169,11 +169,11 @@ int sys_fpathconf();
 int sys_getrlimit();
 int sys_setrlimit();
 int sys_getdirentries();
-int sys_mmap();
+int sys_mmap64();
 #define sys___syscall printargs
-int sys_lseek();
-int sys_truncate();
-int sys_ftruncate();
+int sys_lseek64();
+int sys_truncate64();
+int sys_ftruncate64();
 int sys___sysctl();
 #define sys_mlock printargs
 #define sys_munlock printargs
@@ -184,7 +184,6 @@ int sys_poll();
 #define sys___semctl printargs
 int sys_semget();
 int sys_semop();
-#define sys_semconfig printargs
 int sys_msgctl();
 int sys_msgget();
 int sys_msgsnd();
@@ -271,3 +270,5 @@ int sys_sigpending();
 #define sys_aio_waitcomplete printargs
 #define sys_getresuid printargs
 #define sys_getresgid printargs
+#define sys_kqueue printargs
+#define sys_kevent printargs
index 17f67bc70b186a14ebb25cf63a4cd289a7831297..f8b1e4e2fa6d41d4f5d30acdcb6004cfc94b75ac 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Automatically generated by ./../syscalls.pl on Fri Sep  1 17:43:23 2000
+ * Automatically generated by ./../syscalls.pl on Wed Mar  7 12:22:58 2001
  */
 
   { 1, 0,      sys_syscall,    "syscall"       }, /* 0 */
@@ -21,7 +21,7 @@
   { 3, TF,     sys_chown,      "chown" }, /* 16 */
   { 1, 0,      sys_break,      "break" }, /* 17 */
   { 3, 0,      sys_getfsstat,  "getfsstat"     }, /* 18 */
-  { 3, 0,      sys_lseek,      "lseek" }, /* 19 */
+  { 3, 0,      sys_lseek64,    "lseek" }, /* 19 */
   { 1, 0,      sys_getpid,     "getpid"        }, /* 20 */
   { 4, TF,     sys_mount,      "mount" }, /* 21 */
   { 2, TF,     sys_unmount,    "unmount"       }, /* 22 */
@@ -73,7 +73,7 @@
   { -1,        0,      printargs,      "SYS_68"        }, /* 68 */
   { 1, 0,      sys_sbrk,       "sbrk"  }, /* 69 */
   { 1, 0,      sys_sstk,       "sstk"  }, /* 70 */
-  { 6, 0,      sys_mmap,       "mmap"  }, /* 71 */
+  { 6, 0,      sys_mmap64,     "mmap"  }, /* 71 */
   { 1, 0,      sys_vadvise,    "vadvise"       }, /* 72 */
   { 2, 0,      sys_munmap,     "munmap"        }, /* 73 */
   { 3, 0,      sys_mprotect,   "mprotect"      }, /* 74 */
   { 2, 0,      sys_setreuid,   "setreuid"      }, /* 126 */
   { 2, 0,      sys_setregid,   "setregid"      }, /* 127 */
   { 2, TF,     sys_rename,     "rename"        }, /* 128 */
-  { 2, TF,     sys_truncate,   "truncate"      }, /* 129 */
-  { 2, 0,      sys_ftruncate,  "ftruncate"     }, /* 130 */
+  { 2, TF,     sys_truncate64, "truncate"      }, /* 129 */
+  { 2, 0,      sys_ftruncate64,        "ftruncate"     }, /* 130 */
   { 2, 0,      sys_flock,      "flock" }, /* 131 */
   { 2, 0,      sys_mkfifo,     "mkfifo"        }, /* 132 */
   { 6, TN,     sys_sendto,     "sendto"        }, /* 133 */
   { 6, TI,     sys_msgsys,     "msgsys"        }, /* 170 */
   { 4, TI,     sys_shmsys,     "shmsys"        }, /* 171 */
   { -1,        0,      printargs,      "SYS_172"       }, /* 172 */
-  { 5, TF,     sys_pread,      "pread" }, /* 173 */
-  { 5, TF,     sys_pwrite,     "pwrite"        }, /* 174 */
+  { 5, TF,     sys_pread64,    "pread" }, /* 173 */
+  { 5, TF,     sys_pwrite64,   "pwrite"        }, /* 174 */
   { -1,        0,      printargs,      "SYS_175"       }, /* 175 */
   { 1, 0,      sys_ntp_adjtime,        "ntp_adjtime"   }, /* 176 */
   { -1,        0,      printargs,      "SYS_177"       }, /* 177 */
   { 2, 0,      sys_getrlimit,  "getrlimit"     }, /* 194 */
   { 2, 0,      sys_setrlimit,  "setrlimit"     }, /* 195 */
   { 4, 0,      sys_getdirentries,      "getdirentries" }, /* 196 */
-  { 7, 0,      sys_mmap,       "mmap"  }, /* 197 */
+  { 7, 0,      sys_mmap64,     "mmap"  }, /* 197 */
   { 1, 0,      sys___syscall,  "__syscall"     }, /* 198 */
-  { 4, 0,      sys_lseek,      "lseek" }, /* 199 */
-  { 3, TF,     sys_truncate,   "truncate"      }, /* 200 */
-  { 3, 0,      sys_ftruncate,  "ftruncate"     }, /* 201 */
+  { 4, 0,      sys_lseek64,    "lseek" }, /* 199 */
+  { 3, TF,     sys_truncate64, "truncate"      }, /* 200 */
+  { 3, 0,      sys_ftruncate64,        "ftruncate"     }, /* 201 */
   { 6, 0,      sys___sysctl,   "__sysctl"      }, /* 202 */
   { 2, 0,      sys_mlock,      "mlock" }, /* 203 */
   { 2, 0,      sys_munlock,    "munlock"       }, /* 204 */
   { 4, 0,      sys___semctl,   "__semctl"      }, /* 220 */
   { 3, TI,     sys_semget,     "semget"        }, /* 221 */
   { 3, TI,     sys_semop,      "semop" }, /* 222 */
-  { 1, 0,      sys_semconfig,  "semconfig"     }, /* 223 */
+  { -1,        0,      printargs,      "SYS_223"       }, /* 223 */
   { 3, TI,     sys_msgctl,     "msgctl"        }, /* 224 */
   { 2, TI,     sys_msgget,     "msgget"        }, /* 225 */
   { 4, TI,     sys_msgsnd,     "msgsnd"        }, /* 226 */
   { 2, 0,      sys_aio_waitcomplete,   "aio_waitcomplete"      }, /* 359 */
   { 3, 0,      sys_getresuid,  "getresuid"     }, /* 360 */
   { 3, 0,      sys_getresgid,  "getresgid"     }, /* 361 */
+  { 1, 0,      sys_kqueue,     "kqueue"        }, /* 362 */
+  { 6, 0,      sys_kevent,     "kevent"        }, /* 363 */
index bc59a6f2ba47a13abe8281934c1cbbb461cb444e..3461f4371e1b842b2e761d28f428c8324b87d209 100644 (file)
@@ -67,7 +67,7 @@ fpathconf
 fstat
 fstatfs
 fsync
-ftruncate
+ftruncate      sys_ftruncate64
 getdents
 getdirentries
 getdomainname
@@ -96,13 +96,13 @@ kill
 killpg
 link
 listen
-lseek
+lseek          sys_lseek64
 lstat
 mincore
 mkdir
 mkfifo
 mknod
-mmap
+mmap           sys_mmap64
 mprotect
 msgctl
 msgget
@@ -116,9 +116,9 @@ open
 pathconf
 pipe
 poll
-pread
+pread          sys_pread64
 ptrace
-pwrite
+pwrite         sys_pwrite64
 quotactl
 read
 readlink
@@ -178,7 +178,7 @@ symlink
 sysctl
 time
 times
-truncate
+truncate       sys_truncate64
 umask
 uname
 unlink
diff --git a/io.c b/io.c
index 0fe8c3d5f1f82146c0ae4da3fdf158be0dbd182c..6bb986cbd2702ede0027e2459bb5a3fdea634240 100644 (file)
--- a/io.c
+++ b/io.c
@@ -130,7 +130,7 @@ struct tcb *tcp;
        return 0;
 }
 
-#if defined(SVR4) || defined(FREEBSD)
+#if defined(SVR4)
 
 int
 sys_pread(tcp)
@@ -147,14 +147,9 @@ struct tcb *tcp;
                /* off_t is signed int */
                tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);
 #else
-#ifndef FREEBSD
                tprintf(", %lu, %llu", tcp->u_arg[2],
                                (((unsigned long long) tcp->u_arg[4]) << 32
                                 | tcp->u_arg[3]));
-#else
-               tprintf(", %lu, %llu", tcp->u_arg[2], 
-                               (((off_t) tcp->u_arg[3]) << 32) +  tcp->u_arg[4]);
-#endif
 #endif
        }
        return 0;
@@ -171,19 +166,14 @@ struct tcb *tcp;
                /* off_t is signed int */
                tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);
 #else
-#ifndef FREEBSD
                tprintf(", %lu, %llu", tcp->u_arg[2],
                                (((unsigned long long) tcp->u_arg[4]) << 32
                                 | tcp->u_arg[3]));
-#else
-               tprintf(", %lu, %llu", tcp->u_arg[2],
-                               (((off_t) tcp->u_arg[3]) << 32) + tcp->u_arg[4]);
-#endif
 #endif
        }
        return 0;
 }
-#endif /* SVR4 || FREEBSD */
+#endif /* SVR4 */
 
 #ifdef FREEBSD
 #include <sys/types.h>
@@ -279,7 +269,7 @@ struct tcb *tcp;
 
 #endif /* LINUX */
 
-#if _LFS64_LARGEFILE
+#if _LFS64_LARGEFILE || FREEBSD
 int
 sys_pread64(tcp)
 struct tcb *tcp;
@@ -287,11 +277,13 @@ struct tcb *tcp;
        if (entering(tcp)) {
                tprintf("%ld, ", tcp->u_arg[0]);
        } else {
+               ALIGN64 (tcp, 3);
                if (syserror(tcp))
                        tprintf("%#lx", tcp->u_arg[1]);
                else
                        printstr(tcp, tcp->u_arg[1], tcp->u_rval);
-               tprintf(", %lu, %#llx", tcp->u_arg[2], get64(tcp->u_arg[3], tcp->u_arg[4]));
+               tprintf(", %lu, %#llx", tcp->u_arg[2],
+                       get64(tcp->u_arg[3], tcp->u_arg[4]));
        }
        return 0;
 }
@@ -301,9 +293,11 @@ sys_pwrite64(tcp)
 struct tcb *tcp;
 {
        if (entering(tcp)) {
+               ALIGN64 (tcp, 3);
                tprintf("%ld, ", tcp->u_arg[0]);
                printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
-               tprintf(", %lu, %#llx", tcp->u_arg[2], get64(tcp->u_arg[3], tcp->u_arg[4]));
+               tprintf(", %lu, %#llx", tcp->u_arg[2],
+                       get64(tcp->u_arg[3], tcp->u_arg[4]));
        }
        return 0;
 }
diff --git a/mem.c b/mem.c
index ec9b4414324d0f406cd02d360d5a036efa0abfe1..7278c537c24326614665b61ceb8fd5c30d167c0e 100644 (file)
--- a/mem.c
+++ b/mem.c
@@ -224,7 +224,7 @@ struct tcb *tcp;
     return print_mmap(tcp, tcp->u_arg);
 }
 
-#if _LFS64_LARGEFILE
+#if _LFS64_LARGEFILE || FREEBSD
 int
 sys_mmap64(tcp)
 struct tcb *tcp;
@@ -247,6 +247,7 @@ struct tcb *tcp;
                        return 0;
 #endif /* ALPHA */
 #endif /* linux */
+               ALIGN64 (tcp, 5);       /* FreeBSD wierdies */
 
                /* addr */
                tprintf("%#lx, ", u_arg[0]);
@@ -256,8 +257,12 @@ struct tcb *tcp;
                printflags(mmap_prot, u_arg[2]);
                tprintf(", ");
                /* flags */
+#ifdef MAP_TYPE
                printxval(mmap_flags, u_arg[3] & MAP_TYPE, "MAP_???");
                addflags(mmap_flags, u_arg[3] & ~MAP_TYPE);
+#else
+               printflags(mmap_flags, u_arg[3]);
+#endif
                /* fd */
                tprintf(", %ld, ", u_arg[4]);
                /* offset */