macos 10.6 64 bit support
[openafs.git] / src / afs / afs_syscall.c
index c14c84e..e4db706 100644 (file)
@@ -45,7 +45,11 @@ afs_ioctl32_to_afs_ioctl(const struct afs_ioctl32 *src, struct afs_ioctl *dst)
  */
 
 int
+#ifdef AFS_DARWIN100_ENV
+copyin_afs_ioctl(user_addr_t cmarg, struct afs_ioctl *dst)
+#else
 copyin_afs_ioctl(caddr_t cmarg, struct afs_ioctl *dst)
+#endif
 {
     int code;
 #if defined(AFS_DARWIN100_ENV)
@@ -318,10 +322,10 @@ Afs_syscall(struct afsargs *uap, rval_t * rvp)
 #else /* AFS_SGI_ENV */
 
 struct iparam {
-    long param1;
-    long param2;
-    long param3;
-    long param4;
+    iparmtype param1;
+    iparmtype param2;
+    iparmtype param3;
+    iparmtype param4;
 };
 
 struct iparam32 {
@@ -346,6 +350,9 @@ iparam32_to_iparam(const struct iparam32 *src, struct iparam *dst)
 /*
  * If you need to change copyin_iparam(), you may also need to change
  * copyin_afs_ioctl().
+ *
+ * This function is needed only for icreate, meaning, only on platforms
+ * providing the inode fileserver.
  */
 
 static int
@@ -353,16 +360,6 @@ copyin_iparam(caddr_t cmarg, struct iparam *dst)
 {
     int code;
 
-#if defined(AFS_DARWIN100_ENV)
-    struct iparam32 dst32;
-    
-    if (!proc_is64bit(current_proc())) {
-       AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code);
-       if (!code)
-           iparam32_to_iparam(&dst32, dst);
-       return code;
-    }
-#endif
 #if defined(AFS_HPUX_64BIT_ENV)
     struct iparam32 dst32;
 
@@ -464,7 +461,31 @@ Afs_syscall(register struct afssysa *uap, rval_t * rvp)
 {
     int *retval = &rvp->r_val1;
 #else /* AFS_SUN5_ENV */
-#if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+#ifdef AFS_DARWIN100_ENV
+struct afssysa {
+    afs_int32 syscall;
+    afs_int32 parm1;
+    afs_int32 parm2;
+    afs_int32 parm3;
+    afs_int32 parm4;
+    afs_int32 parm5;
+    afs_int32 parm6;
+};
+struct afssysa64 {
+    afs_int64 parm1;
+    afs_int64 parm2;
+    afs_int64 parm3;
+    afs_int64 parm4;
+    afs_int64 parm5;
+    afs_int64 parm6;
+    afs_int32 syscall;
+};
+int
+afs3_syscall(struct proc *p, void *args, unsigned int *retval)
+{
+    struct afssysa64 *uap64 = NULL;
+    struct afssysa *uap = NULL;
+#elif  defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
 int
 afs3_syscall(p, args, retval)
 #ifdef AFS_FBSD50_ENV
@@ -599,6 +620,37 @@ Afs_syscall()
 #if defined(AFS_DARWIN80_ENV)
     get_vfs_context();
     osi_Assert(*retval == 0);
+#ifdef AFS_DARWIN100_ENV
+    if (proc_is64bit(p)) {
+       uap64 = (struct afssysa64 *)args;
+       if (uap64->syscall == AFSCALL_CALL) {
+           code =
+               afs_syscall64_call(uap64->parm1, uap64->parm2, uap64->parm3,
+                                  uap64->parm4, uap64->parm5, uap64->parm6);
+       } else if (uap64->syscall == AFSCALL_SETPAG) {
+           AFS_GLOCK();
+           code = afs_setpag(p, args, retval);
+           AFS_GUNLOCK();
+       } else if (uap64->syscall == AFSCALL_PIOCTL) {
+           AFS_GLOCK();
+           code =
+               afs_syscall64_pioctl(uap64->parm1, (unsigned int)uap64->parm2,
+                                    uap64->parm3, (int)uap64->parm4,
+                                    kauth_cred_get());
+           AFS_GUNLOCK();
+       } else if (uap64->syscall == AFSCALL_ICL) {
+           AFS_GLOCK();
+           code =
+               Afscall64_icl(uap64->parm1, uap64->parm2, uap64->parm3,
+                           uap64->parm4, uap64->parm5, retval);
+           AFS_GUNLOCK();
+       } else
+           code = EINVAL;
+       if (uap64->syscall != AFSCALL_CALL)
+           put_vfs_context();
+    } else { /* and the default case for 32 bit procs */
+#endif
+       uap = (struct afssysa *)args;
 #endif
 #if defined(AFS_HPUX_ENV)
     /*
@@ -607,134 +659,137 @@ Afs_syscall()
      * duplication to handle the case of a dynamically loaded kernel
      * module?
      */
-    osi_InitGlock();
+       osi_InitGlock();
 #endif
-    if (uap->syscall == AFSCALL_CALL) {
-       code =
-           afs_syscall_call(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                            uap->parm5, uap->parm6);
-    } else if (uap->syscall == AFSCALL_SETPAG) {
+       if (uap->syscall == AFSCALL_CALL) {
+           code =
+               afs_syscall_call(uap->parm1, uap->parm2, uap->parm3,
+                                uap->parm4, uap->parm5, uap->parm6);
+       } else if (uap->syscall == AFSCALL_SETPAG) {
 #ifdef AFS_SUN5_ENV
-       register proc_t *procp;
+           register proc_t *procp;
 
-       procp = ttoproc(curthread);
-       AFS_GLOCK();
-       code = afs_setpag(&procp->p_cred);
-       AFS_GUNLOCK();
+           procp = ttoproc(curthread);
+           AFS_GLOCK();
+           code = afs_setpag(&procp->p_cred);
+           AFS_GUNLOCK();
 #else
-       AFS_GLOCK();
+           AFS_GLOCK();
 #if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-       code = afs_setpag(p, args, retval);
+           code = afs_setpag(p, args, retval);
 #else /* AFS_OSF_ENV */
-       code = afs_setpag();
+           code = afs_setpag();
 #endif
-       AFS_GUNLOCK();
+           AFS_GUNLOCK();
 #endif
-    } else if (uap->syscall == AFSCALL_PIOCTL) {
-       AFS_GLOCK();
+       } else if (uap->syscall == AFSCALL_PIOCTL) {
+           AFS_GLOCK();
 #if defined(AFS_SUN5_ENV)
-       code =
-           afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                              rvp, CRED());
+           code =
+               afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+                                  uap->parm4, rvp, CRED());
 #elif defined(AFS_FBSD50_ENV)
-       code =
-           afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                              p->td_ucred);
+           code =
+               afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+                                  uap->parm4, p->td_ucred);
 #elif defined(AFS_DARWIN80_ENV)
-       code =
-           afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                              kauth_cred_get());
+           code =
+               afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+                                  uap->parm4, kauth_cred_get());
 #elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-       code =
-           afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                              p->p_cred->pc_ucred);
+           code =
+               afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+                                  uap->parm4, p->p_cred->pc_ucred);
 #else
-       code =
-           afs_syscall_pioctl((char *)uap->parm1, (unsigned int)uap->parm2, (caddr_t)uap->parm3,
-                              (int) uap->parm4);
+           code =
+               afs_syscall_pioctl((char *)uap->parm1,
+                                  (unsigned int)uap->parm2,
+                                  (caddr_t)uap->parm3,
+                                  (int) uap->parm4);
 #endif
-       AFS_GUNLOCK();
-    } else if (uap->syscall == AFSCALL_ICREATE) {
-       struct iparam iparams;
+           AFS_GUNLOCK();
+       } else if (uap->syscall == AFSCALL_ICREATE) {
+           struct iparam iparams;
 
-       code = copyin_iparam((char *)uap->parm3, &iparams);
-       if (code) {
+           code = copyin_iparam((char *)uap->parm3, &iparams);
+           if (code) {
 #if defined(KERNEL_HAVE_UERROR)
-           setuerror(code);
+               setuerror(code);
 #endif
-       } else
+           } else {
 #ifdef AFS_SUN5_ENV
-           code =
-               afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
-                                   iparams.param2, iparams.param3,
-                                   iparams.param4, rvp, CRED());
+               code =
+                   afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
+                                       iparams.param2, iparams.param3,
+                                       iparams.param4, rvp, CRED());
 #else
-           code =
-               afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
-                                   iparams.param2,
+               code =
+                   afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
+                                       iparams.param2, iparams.param3,
+                                       iparams.param4
 #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-                                   iparams.param3, iparams.param4, retval);
-#else
-                                   iparams.param3, iparams.param4);
+                                       , retval
 #endif
+                       );
 #endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_IOPEN) {
+           }
+       } else if (uap->syscall == AFSCALL_IOPEN) {
 #ifdef AFS_SUN5_ENV
-       code =
-           afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp,
-                             CRED());
+           code =
+               afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp,
+                                 CRED());
 #else
+           code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3
 #if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-       code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, retval);
-#else
-       code = afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3);
+                                    , retval
 #endif
+               );
 #endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_IDEC) {
+       } else if (uap->syscall == AFSCALL_IDEC) {
+           code =
+               afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1
 #ifdef AFS_SUN5_ENV
-       code =
-           afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1, rvp,
-                               CRED());
-#else
-       code = afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1);
-#endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_IINC) {
+                                   , rvp, CRED()
+#endif
+                   );
+       } else if (uap->syscall == AFSCALL_IINC) {
+           code =
+               afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1
 #ifdef AFS_SUN5_ENV
-       code =
-           afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1, rvp,
-                               CRED());
-#else
-       code = afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, 1);
-#endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_ICL) {
-       AFS_GLOCK();
-       code =
-           Afscall_icl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                       uap->parm5, retval);
-       AFS_GUNLOCK();
+                                   , rvp, CRED()
+#endif
+                   );
+       } else if (uap->syscall == AFSCALL_ICL) {
+           AFS_GLOCK();
+           code =
+               Afscall_icl(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
+                           uap->parm5, retval);
+           AFS_GUNLOCK();
 #ifdef AFS_LINUX20_ENV
-       if (!code) {
-           /* ICL commands can return values. */
-           code = -linux_ret;  /* Gets negated again at exit below */
-       }
+           if (!code) {
+               /* ICL commands can return values. */
+               code = -linux_ret;      /* Gets negated again at exit below */
+           }
 #else
-       if (code) {
+           if (code) {
 #if defined(KERNEL_HAVE_UERROR)
-           setuerror(code);
+               setuerror(code);
 #endif
-       }
+           }
 #endif /* !AFS_LINUX20_ENV */
-    } else {
+       } else {
 #if defined(KERNEL_HAVE_UERROR)
-       setuerror(EINVAL);
+           setuerror(EINVAL);
 #else
-       code = EINVAL;
+           code = EINVAL;
 #endif
-    }
-
+       }
 #if defined(AFS_DARWIN80_ENV)
-    if (uap->syscall != AFSCALL_CALL)
-       put_vfs_context();
+       if (uap->syscall != AFSCALL_CALL)
+           put_vfs_context();
+#ifdef AFS_DARWIN100_ENV
+    } /* 32 bit procs */
+#endif
 #endif
 #ifdef AFS_LINUX20_ENV
     code = -code;
@@ -743,4 +798,4 @@ Afs_syscall()
     return code;
 }
 #endif /* AFS_SGI_ENV */
-#endif /* !AFS_AIX32_ENV       */
+#endif /* !AFS_AIX32_ENV */