]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
macos 10.6 64 bit support
authorDerrick Brashear <shadow@dementia.org>
Wed, 26 Aug 2009 21:34:50 +0000 (17:34 -0400)
committerDerrick Brashear <shadow|account-1000005@unknown>
Fri, 28 Aug 2009 04:59:43 +0000 (21:59 -0700)
support 64 bit userland with 32 bit kernel, and
32 and 64 bit userland with 64 kit kernel

Reviewed-on: http://gerrit.openafs.org/343
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 81099c479e148a103dcf9f4def125b28e989107c)
Reviewed-on: http://gerrit.openafs.org/362

33 files changed:
src/afs/AIX/osi_machdep.h
src/afs/DARWIN/osi_groups.c
src/afs/DARWIN/osi_machdep.h
src/afs/DARWIN/osi_misc.c
src/afs/DARWIN/osi_prototypes.h
src/afs/DARWIN/osi_vm.c
src/afs/DARWIN/osi_vnodeops.c
src/afs/FBSD/osi_machdep.h
src/afs/HPUX/osi_machdep.h
src/afs/IRIX/osi_machdep.h
src/afs/LINUX/osi_machdep.h
src/afs/LINUX/osi_misc.c
src/afs/NBSD/osi_machdep.h
src/afs/OBSD/osi_machdep.h
src/afs/SOLARIS/osi_machdep.h
src/afs/UKERNEL/osi_machdep.h
src/afs/afs.h
src/afs/afs_call.c
src/afs/afs_osi.h
src/afs/afs_osi_pag.c
src/afs/afs_pioctl.c
src/afs/afs_prototypes.h
src/afs/afs_vcache.c
src/afsd/afsd.c
src/cf/osconf.m4
src/config/afs_args.h
src/libafs/MakefileProto.DARWIN.in
src/rx/rx_clock.h
src/shlibafsauthent/Makefile.in
src/sys/afssyscalls.c
src/sys/glue.c
src/sys/setpag.c
src/vlserver/vlprocs.c

index 9033fd1a4062227eaf3d8394626e1556bd69bca1..a1658db144c404378c31e6654076d00914b72e8d 100644 (file)
@@ -41,6 +41,10 @@ extern long time;
 #define        gop_lookupname(fnamep,segflg,followlink,compvpp) \
        lookupvp((fnamep), (followlink), (compvpp), &afs_osi_cred)
 
+#undef gop_lookupname_user
+#define        gop_lookupname_user(fnamep,segflg,followlink,compvpp) \
+       lookupvp((fnamep), (followlink), (compvpp), &afs_osi_cred)
+
 #undef afs_suser
 
 #undef setuerror
index 4f656fce14fa58c62c9ea823197aa21425c86869..11e65e37874c10f5ab6e713fe7e45cb653f66350 100644 (file)
@@ -16,6 +16,9 @@
  */
 #include <afsconfig.h>
 #include "afs/param.h"
+#include "afs/sysincludes.h"
+#include "afsincludes.h"
+#include "afs/afs_stats.h"     /* statistics */
 
 /* We should be doing something better anyway */
 #ifdef AFS_DARWIN80_ENV
@@ -27,12 +30,9 @@ setpag(proc, cred, pagvalue, newpag, change_parent)
      afs_uint32 *newpag;
      afs_uint32 change_parent;
 { 
-  return -1;
+    return EINVAL;
 }
 #else
-#include "afs/sysincludes.h"
-#include "afsincludes.h"
-#include "afs/afs_stats.h"     /* statistics */
 
 static int
   afs_getgroups(struct ucred *cred, int ngroups, gid_t * gidset);
index fc13adeeb26bfd2b731827976c38763ddc868302..d13760c695971bdfd4dc3bb118fe9bfc6b077925 100644 (file)
@@ -57,6 +57,8 @@ typedef unsigned short etap_event_t;
 #endif
 #undef gop_lookupname
 #define gop_lookupname osi_lookupname
+#undef gop_lookupname_user
+#define gop_lookupname_user osi_lookupname_user
 
 #define FTRUNC 0
 
@@ -101,9 +103,17 @@ enum vcexcl { EXCL, NONEXCL };
 
 #define crref kauth_cred_get_with_ref
 #define crhold kauth_cred_ref
+#ifdef AFS_DARWIN100_ENV
+#define crfree(X) kauth_cred_unref(&X)
+#else
 #define crfree kauth_cred_rele
+#endif
 #define crdup kauth_cred_dup
-
+#ifdef AFS_DARWIN100_ENV
+#define ubc_msync_range(X,Y,Z,A) ubc_msync(X,Y,Z,NULL,A)
+#else
+#define ubc_msync_range(X,Y,Z,A) ubc_sync_range(X,Y,Z,A)
+#endif
 extern vfs_context_t afs_osi_ctxtp;
 extern int afs_osi_ctxtp_initialized;
 #endif
index ac46fc434273a214f3f13a15b725b5a5181d1a57..076d567949c6243a0d4990560f794a28df3fcdc3 100644 (file)
 
 #ifdef AFS_DARWIN80_ENV
 int
-osi_lookupname(char *aname, enum uio_seg seg, int followlink,
-              struct vnode **vpp) {
-    vfs_context_t ctx;
+osi_lookupname_user(user_addr_t aname, enum uio_seg seg, int followlink,
+                   struct vnode **vpp) {
     char tname[PATHBUFLEN];
-    int code, flags;
     size_t len;
-    
+    int code;
+
     if (seg == AFS_UIOUSER) { /* XXX 64bit */
        AFS_COPYINSTR(aname, tname, sizeof(tname), &len, code);
        if (code)
            return code;
-       aname=tname;
-    }
+       return osi_lookupname(tname, seg, followlink, vpp);
+    } else
+       return osi_lookupname(CAST_DOWN(char *, aname), seg, followlink, vpp);
+
+}
+
+int
+osi_lookupname(char *aname, enum uio_seg seg, int followlink,
+              struct vnode **vpp) {
+    vfs_context_t ctx;
+    int code, flags;
+
     flags = 0;
     if (!followlink)
        flags |= VNODE_LOOKUP_NOFOLLOW;
@@ -94,136 +103,143 @@ afs_suser(void *credp)
 }
 
 #ifdef AFS_DARWIN80_ENV
-uio_t afsio_darwin_partialcopy(uio_t auio, int size) {
-   uio_t res;
-   int i;
-   user_addr_t iovaddr;
-   user_size_t iovsize;
-
-   if (proc_is64bit(current_proc())) {
-       res = uio_create(uio_iovcnt(auio), uio_offset(auio),
-                       uio_isuserspace(auio) ? UIO_USERSPACE64 : UIO_SYSSPACE32,
-                       uio_rw(auio));
-   } else {
-       res = uio_create(uio_iovcnt(auio), uio_offset(auio),
-                       uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32,
-                       uio_rw(auio));
-   }
-
-   for (i = 0;i < uio_iovcnt(auio) && size > 0;i++) {
-       if (uio_getiov(auio, i, &iovaddr, &iovsize))
-           break;
-       if (iovsize > size)
-          iovsize = size;
-       if (uio_addiov(res, iovaddr, iovsize))
-          break;
-       size -= iovsize;
-   }
-   return res;
+uio_t
+afsio_darwin_partialcopy(uio_t auio, int size)
+{
+    uio_t res;
+    int i;
+    user_addr_t iovaddr;
+    user_size_t iovsize;
+
+    if (proc_is64bit(current_proc())) {
+       res = uio_create(uio_iovcnt(auio), uio_offset(auio),
+                        uio_isuserspace(auio) ? UIO_USERSPACE64 : UIO_SYSSPACE32,
+                        uio_rw(auio));
+    } else {
+       res = uio_create(uio_iovcnt(auio), uio_offset(auio),
+                        uio_isuserspace(auio) ? UIO_USERSPACE32 : UIO_SYSSPACE32,
+                        uio_rw(auio));
+    }
+
+    for (i = 0;i < uio_iovcnt(auio) && size > 0;i++) {
+       if (uio_getiov(auio, i, &iovaddr, &iovsize))
+           break;
+       if (iovsize > size)
+           iovsize = size;
+       if (uio_addiov(res, iovaddr, iovsize))
+           break;
+       size -= iovsize;
+    }
+    return res;
 }
 
 vfs_context_t afs_osi_ctxtp;
 int afs_osi_ctxtp_initialized;
 static thread_t vfs_context_owner;
-#define RECURSIVE_VFS_CONTEXT 1
-#if RECURSIVE_VFS_CONTEXT
 static proc_t vfs_context_curproc;
 int vfs_context_ref;
-#else 
-#define vfs_context_ref 1
-#endif
-void get_vfs_context(void) {
-  int isglock = ISAFS_GLOCK();
 
-  if (!isglock)
-     AFS_GLOCK();
-  if (afs_osi_ctxtp_initialized) {
-     if (!isglock)
-        AFS_GUNLOCK();
-      return;
-  }
-  osi_Assert(vfs_context_owner != current_thread());
-#if RECURSIVE_VFS_CONTEXT
-  if (afs_osi_ctxtp && current_proc() == vfs_context_curproc) {
-     vfs_context_ref++;
-     vfs_context_owner = current_thread();
-     if (!isglock)
-        AFS_GUNLOCK();
-     return;
-  }
-#endif
-  while (afs_osi_ctxtp && vfs_context_ref) {
-     printf("[%d] waiting for afs_osi_ctxtp\n", proc_selfpid());
-     afs_osi_Sleep(&afs_osi_ctxtp);
-     if (afs_osi_ctxtp_initialized) {
-       printf("[%d] ok\n", proc_selfpid());
-       if (!isglock)
-          AFS_GUNLOCK();
-       return;
-     }
-     if (!afs_osi_ctxtp || !vfs_context_ref)
-        printf("[%d] ok\n", proc_selfpid());
-  }
-#if RECURSIVE_VFS_CONTEXT
-  vfs_context_rele(afs_osi_ctxtp);
-  vfs_context_ref=1;
-#else
-  osi_Assert(vfs_context_owner == (thread_t)0);
-#endif
-  afs_osi_ctxtp = vfs_context_create(NULL);
-  vfs_context_owner = current_thread();
-  vfs_context_curproc = current_proc();
-  if (!isglock)
-     AFS_GUNLOCK();
+void
+get_vfs_context(void)
+{
+    int isglock = ISAFS_GLOCK();
+
+    if (!isglock)
+       AFS_GLOCK();
+    if (afs_osi_ctxtp_initialized) {
+       if (!isglock)
+           AFS_GUNLOCK();
+       return;
+    }
+    osi_Assert(vfs_context_owner != current_thread());
+    if (afs_osi_ctxtp && current_proc() == vfs_context_curproc) {
+       vfs_context_ref++;
+       vfs_context_owner = current_thread();
+       if (!isglock)
+           AFS_GUNLOCK();
+       return;
+    }
+    while (afs_osi_ctxtp && vfs_context_ref) {
+       afs_osi_Sleep(&afs_osi_ctxtp);
+       if (afs_osi_ctxtp_initialized) {
+           if (!isglock)
+               AFS_GUNLOCK();
+           return;
+       }
+    }
+    vfs_context_rele(afs_osi_ctxtp);
+    vfs_context_ref=1;
+    afs_osi_ctxtp = vfs_context_create(NULL);
+    vfs_context_owner = current_thread();
+    vfs_context_curproc = current_proc();
+    if (!isglock)
+       AFS_GUNLOCK();
 }
 
-void put_vfs_context(void) {
-  int isglock = ISAFS_GLOCK();
-
-  if (!isglock)
-     AFS_GLOCK();
-  if (afs_osi_ctxtp_initialized) {
-     if (!isglock)
-        AFS_GUNLOCK();
-      return;
-  }
-#if RECURSIVE_VFS_CONTEXT
-  if (vfs_context_owner == current_thread())
-      vfs_context_owner = (thread_t)0;
-  vfs_context_ref--;
-#else
-  osi_Assert(vfs_context_owner == current_thread());
-  vfs_context_rele(afs_osi_ctxtp);
-  afs_osi_ctxtp = NULL;
-  vfs_context_owner = (thread_t)0;
-#endif
-  afs_osi_Wakeup(&afs_osi_ctxtp);
-     if (!isglock)
+void
+put_vfs_context(void)
+{
+    int isglock = ISAFS_GLOCK();
+
+    if (!isglock)
+       AFS_GLOCK();
+    if (afs_osi_ctxtp_initialized) {
+       if (!isglock)
+           AFS_GUNLOCK();
+       return;
+    }
+    if (vfs_context_owner == current_thread())
+       vfs_context_owner = (thread_t)0;
+    vfs_context_ref--;
+    afs_osi_Wakeup(&afs_osi_ctxtp);
+    if (!isglock)
         AFS_GUNLOCK();
 }
 
-extern int afs3_syscall();
-
-int afs_cdev_nop_openclose(dev_t dev, int flags, int devtype,struct proc *p) {
-  return 0;
+int
+afs_cdev_nop_openclose(dev_t dev, int flags, int devtype,struct proc *p)
+{
+    return 0;
 }
-extern int afs3_syscall(struct proc *p, void *data, unsigned long *retval);
+
+extern int afs3_syscall(struct proc *p, void *data, unsigned int *retval);
 
 int
 afs_cdev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct proc *p) {
-    unsigned long retval=0;
-    int code;
+    unsigned int retval=0;
+    int code, is64 = proc_is64bit(p);
     struct afssysargs *a = (struct afssysargs *)data;
-    
-    if (cmd != VIOC_SYSCALL) {
+    struct afssysargs64 *a64 = (struct afssysargs64 *)data;
+
+    if (((unsigned int)cmd != VIOC_SYSCALL) &&
+       ((unsigned int)cmd != VIOC_SYSCALL64))
+       return EINVAL;
+
+    if (((unsigned int)cmd == VIOC_SYSCALL64) && (is64 == 0))
+       return EINVAL;
+
+    if (((unsigned int)cmd == VIOC_SYSCALL) && (is64 != 0))
        return EINVAL;
-    }
     
     code=afs3_syscall(p, data, &retval);
     if (code)
        return code;
-    if (retval && a->syscall != AFSCALL_CALL && a->param1 != AFSOP_CACHEINODE) { printf("SSCall(%d,%d) is returning non-error value %d\n", a->syscall, a->param1, retval); }
-    a->retval = retval;
+
+    if ((!is64) && retval && a->syscall != AFSCALL_CALL
+       && a->param1 != AFSOP_CACHEINODE)
+    {
+       printf("SSCall(%d,%d) is returning non-error value %d\n", a->syscall, a->param1, retval);
+    }
+    if ((is64) && retval && a64->syscall != AFSCALL_CALL
+       && a64->param1 != AFSOP_CACHEINODE)
+    {
+       printf("SSCall(%d,%llx) is returning non-error value %d\n", a64->syscall, a64->param1, retval);
+    }
+
+    if (!is64)
+       a->retval = retval;
+    else
+       a64->retval = retval;
     return 0; 
 }
 
index a5a5ccdd7c19b3226642a50bd57f97cf5c9f474d..4a9b6b251837cb49c0e20ac6953317eac95bb813 100644 (file)
@@ -20,6 +20,8 @@ extern afs_rwlock_t afs_xosi;
 /* osi_misc.c */
 extern int osi_lookupname(char *aname, enum uio_seg seg, int followlink,
                          struct vnode **vpp);
+extern int osi_lookupname_user(user_addr_t aname, enum uio_seg seg,
+                              int followlink, struct vnode **vpp);
 extern int afs_suser(void *credp);
 extern void get_vfs_context(void);
 extern void put_vfs_context(void);
index a899d69f36f446a987e0e6aa80cba759f5ae096f..15a3e3fb212693aa68cdb07e34a4b213491c905d 100644 (file)
@@ -67,7 +67,7 @@ osi_VM_StoreAllSegments(struct vcache *avc)
     ReleaseWriteLock(&avc->lock);
     AFS_GUNLOCK();
 #ifdef AFS_DARWIN80_ENV
-    ubc_sync_range(vp, 0, ubc_getsize(vp), UBC_SYNC|UBC_PUSHDIRTY);
+    ubc_msync_range(vp, 0, ubc_getsize(vp), UBC_SYNC|UBC_PUSHDIRTY);
 #else
     if (UBCINFOEXISTS(vp)) {
        ubc_pushdirty(vp);
@@ -97,7 +97,7 @@ osi_VM_TryToSmush(struct vcache *avc, struct AFS_UCRED *acred, int sync)
     ReleaseWriteLock(&avc->lock);
     AFS_GUNLOCK();
 #ifdef AFS_DARWIN80_ENV
-    ubc_sync_range(vp, 0, ubc_getsize(vp), UBC_INVALIDATE);
+    ubc_msync_range(vp, 0, ubc_getsize(vp), UBC_INVALIDATE);
 #else
     if (UBCINFOEXISTS(vp)) {
        size = ubc_getsize(vp);
@@ -126,7 +126,7 @@ osi_VM_FlushPages(struct vcache *avc, struct AFS_UCRED *credp)
     off_t size;
 #ifdef AFS_DARWIN80_ENV
     size = ubc_getsize(vp);
-    ubc_sync_range(vp, 0, size, UBC_INVALIDATE);
+    ubc_msync_range(vp, 0, size, UBC_INVALIDATE);
        /* XXX what about when not CStatd */
     if (avc->states & CStatd && size != avc->m.Length)
        ubc_setsize(vp, avc->m.Length);
index 6098e645aafdb2ff3d03602e7bf6d69b26f444b8..2c96d7dad32f50c2843832aede77911aafa1e206 100644 (file)
@@ -745,7 +745,7 @@ afs_vop_read(ap)
     if (vnode_isdir(ap->a_vp)) 
        return EISDIR;
 #ifdef AFS_DARWIN80_ENV
-    ubc_sync_range(ap->a_vp, AFS_UIO_OFFSET(ap->a_uio), AFS_UIO_OFFSET(ap->a_uio) + AFS_UIO_RESID(ap->a_uio), UBC_PUSHDIRTY);
+    ubc_msync_range(ap->a_vp, AFS_UIO_OFFSET(ap->a_uio), AFS_UIO_OFFSET(ap->a_uio) + AFS_UIO_RESID(ap->a_uio), UBC_PUSHDIRTY);
 #else
     if (UBCINFOEXISTS(ap->a_vp)) {
        ubc_clean(ap->a_vp, 0);
@@ -886,7 +886,7 @@ afs_vop_write(ap)
     struct vcache *avc = VTOAFS(ap->a_vp);
     void *object;
 #ifdef AFS_DARWIN80_ENV
-    ubc_sync_range(ap->a_vp, AFS_UIO_OFFSET(ap->a_uio), AFS_UIO_OFFSET(ap->a_uio) + AFS_UIO_RESID(ap->a_uio), UBC_INVALIDATE);
+    ubc_msync_range(ap->a_vp, AFS_UIO_OFFSET(ap->a_uio), AFS_UIO_OFFSET(ap->a_uio) + AFS_UIO_RESID(ap->a_uio), UBC_INVALIDATE);
 #else
     if (UBCINFOEXISTS(ap->a_vp)) {
        ubc_clean(ap->a_vp, 1);
@@ -1095,7 +1095,7 @@ afs_vop_ioctl(ap)
     if (((ap->a_command >> 8) & 0xff) == 'V') {
        /* This is a VICEIOCTL call */
        AFS_GLOCK();
-       error = HandleIoctl(tvc, (struct file *)0 /*Not used */ ,
+       error = HandleIoctl(tvc, 
                            ap->a_command, ap->a_data);
        AFS_GUNLOCK();
        return (error);
index bd305cf25a75be3e6c954f32bfcef300f94836d8..95ec9d2e8555c2dce554863cfdc43549135ae61c 100644 (file)
@@ -50,6 +50,9 @@
 #undef gop_lookupname
 #define gop_lookupname osi_lookupname
 
+#undef gop_lookupname_user
+#define gop_lookupname osi_lookupname_user
+
 #undef afs_suser
 
 #define afs_strcat(s1, s2)     strcat((s1), (s2))
index 36d73d19547f1872a5c61b865e81d372be831e4b..e8d154459edf20b5204f43dc70c38348848f3f3e 100644 (file)
@@ -32,6 +32,8 @@ extern struct timeval time;
   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(aresid),0)
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) \
   lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
+#define gop_lookupname_user(fnamep,segflg,followlink,compvpp) \
+  lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
 
 #undef afs_suser
 
index 196a7ac532ad5e017abe05192fe273980c00afd4..3cc7f79ce863ee898e946a4dcf04cfbb18e7b4fe 100644 (file)
@@ -32,6 +32,9 @@ extern time_t time;
 #undef gop_lookupname
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),NULL,(compvpp), NULL)
 
+#undef gop_lookupname_user
+#define gop_lookupname_user(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),NULL,(compvpp), NULL)
+
 #define osi_vnhold(avc, r)  do { VN_HOLD(AFSTOV(avc)); } while(0)
 
 #undef afs_osi_Alloc_NoSleep
index 11e70308ca04cd54839efcf01ac74e1e9b093c9a..c43a57dfdc838996f18ac6af1f482489c79b23ef 100644 (file)
@@ -103,6 +103,9 @@ static inline time_t osi_Time(void) {
 #undef gop_lookupname
 #define gop_lookupname osi_lookupname
 
+#undef gop_lookupname_user
+#define gop_lookupname_user osi_lookupname
+
 #define osi_vnhold(V, N) do { VN_HOLD(AFSTOV(V)); } while (0)
 #define VN_HOLD(V) osi_Assert(igrab((V)) == (V))
 #define VN_RELE(V) iput((V))
index 2c05b3eaa7498d166858a7aea8f5dc86982d70e2..77c6bc65b589d011aae5e43216f4b2a413e2106b 100644 (file)
@@ -64,9 +64,10 @@ osi_lookupname_internal(char *aname, int followlink, struct vfsmount **mnt,
     }
     return code;
 }
+
 int
 osi_lookupname(char *aname, uio_seg_t seg, int followlink, 
-                       struct dentry **dpp)
+              struct dentry **dpp)
 {
     int code;
     char *tname;
index f513d814974c06f5f2c4414aa7f79e911672e6c1..2ba9c45e8fd4d7d661fc07f324e8932b743458a0 100644 (file)
@@ -39,6 +39,8 @@ extern struct timeval time;
 
 #undef gop_lookupname
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
+#undef gop_lookupname_user
+#define gop_lookupname_user(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
 
 #define osi_vnhold(avc,r)  do { \
        if ((avc)->vrefCount) { VN_HOLD((struct vnode *)(avc)); } \
index f50241f5158beef72351ab8375cf31b32f5b4727..29a8339e936b295ed2dc1cc854d517dfa11f7909 100644 (file)
@@ -130,6 +130,10 @@ extern int afs_vget();
 #define        gop_lookupname(fnamep, segflg, followlink, compvpp) \
        afs_nbsd_lookupname((fnamep), (segflg), (followlink), (compvpp))
 
+#undef gop_lookupname_user
+#define        gop_lookupname_user(fnamep, segflg, followlink, compvpp) \
+       afs_nbsd_lookupname((fnamep), (segflg), (followlink), (compvpp))
+
 #ifdef AFS_OBSD39_ENV
 #define afs_osi_lockmgr(l, f, i, p) lockmgr((l), (f), (i))
 #else
index 373fe34cfa56061937e1b572961a727e7ab057eb..e7507323990a5c5c5903e41d033b1b978b02e7cd 100644 (file)
@@ -61,6 +61,8 @@ extern void *afs_osi_Alloc_NoSleep(size_t size);
   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(ioflag),(ulimit),(cr),(aresid))
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) \
   lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
+#define gop_lookupname_user(fnamep,segflg,followlink,compvpp) \
+  lookupname((fnamep),(segflg),(followlink),NULL,(compvpp))
 
 
 #if defined(AFS_SUN510_ENV)
index 19a25f55c83ccb10a8bb221b5214227fc0b59da4..21f7d79a8263bc9c907d52e1b51cca685067e68f 100644 (file)
@@ -38,6 +38,8 @@
 
 #undef gop_lookupname
 #define gop_lookupname(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),(compvpp))
+#undef gop_lookupname_user
+#define gop_lookupname_user(fnamep,segflg,followlink,compvpp) lookupname((fnamep),(segflg),(followlink),(compvpp))
 
 #define osi_vnhold(avc, r)  do { VN_HOLD(AFSTOV(avc)); } while(0)
 #define        afs_suser(x)        suser(x)
index 2224e5a18d67cd87025347bfdc734480ff0a7db0..635fa42cdc8cfee1212a3e17f27bd713a8666e15 100644 (file)
@@ -875,9 +875,15 @@ struct cm_initparams {
 #define        IFAnyPages      32
 #define        IFDiscarded     64      /* index entry in discardDCList */
 
+#ifdef AFS_DARWIN100_ENV
+typedef user_addr_t iparmtype; /* 64 bit */
+#else
+typedef char * iparmtype;
+#endif
+
 struct afs_ioctl {
-    char *in;                  /* input buffer */
-    char *out;                 /* output buffer */
+    iparmtype in;              /* input buffer */
+    iparmtype out;             /* output buffer */
     short in_size;             /* Size of input buffer <= 2K */
     short out_size;            /* Maximum size of output buffer, <= 2K */
 };
index 35f0db203f622f4da747771000e89b580e30be38..5330008db265ccac0ae0acf6e48f5c0e6550c9cc 100644 (file)
@@ -110,6 +110,10 @@ afs_int32 afs_rx_deadtime = AFS_RXDEADTIME;
 afs_int32 afs_rx_harddead = AFS_HARDDEADTIME;
 afs_int32 afs_rx_idledead = AFS_IDLEDEADTIME;
 
+#ifdef AFS_DARWIN100_ENV
+static int
+Afscall64_icl(int opcode, user_addr_t kp1, user_addr_t kp2, user_addr_t kp3, user_addr_t kp4, int *retval);
+#endif
 static int
   Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval);
 
@@ -516,11 +520,30 @@ wait_for_cachedefs(void) {
 #endif
 }
 
-/* leaving as is, probably will barf if we add prototypes here since it's likely being called
-with partial list */
+#ifdef AFS_DARWIN100_ENV
+#define AFSKPTR(X) k ## X
 int
-afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
-     long parm, parm2, parm3, parm4, parm5, parm6;
+afs_syscall_call(long parm, long parm2, long parm3,
+                long parm4, long parm5, long parm6)
+{
+    return afs_syscall64_call(CAST_USER_ADDR_T((parm)),
+                             CAST_USER_ADDR_T((parm2)),
+                             CAST_USER_ADDR_T((parm3)),
+                             CAST_USER_ADDR_T((parm4)),
+                             CAST_USER_ADDR_T((parm5)),
+                             CAST_USER_ADDR_T((parm6)));
+}
+#else
+#define AFSKPTR(X) ((caddr_t)X)
+#endif
+int
+#ifdef AFS_DARWIN100_ENV
+afs_syscall64_call(user_addr_t kparm, user_addr_t kparm2, user_addr_t kparm3,
+                user_addr_t kparm4, user_addr_t kparm5, user_addr_t kparm6)
+#else
+afs_syscall_call(long parm, long parm2, long parm3,
+                long parm4, long parm5, long parm6)
+#endif
 {
     afs_int32 code = 0;
 #if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
@@ -528,6 +551,15 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
 #else /* AFS_SGI61_ENV */
     u_int bufferSize;
 #endif /* AFS_SGI61_ENV */
+#ifdef AFS_DARWIN100_ENV
+    /* AFSKPTR macro relies on this name format/mapping */
+    afs_uint32 parm = (afs_uint32)kparm;
+    afs_uint32 parm2 = (afs_uint32)kparm2;
+    afs_uint32 parm3 = (afs_uint32)kparm3;
+    afs_uint32 parm4 = (afs_uint32)kparm4;
+    afs_uint32 parm5 = (afs_uint32)kparm5;
+    afs_uint32 parm6 = (afs_uint32)kparm6;
+#endif
 
     AFS_STATCNT(afs_syscall_call);
     if (
@@ -712,13 +744,13 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
         * home cell flag (0x1 bit) and the nosuid flag (0x2 bit) */
        struct afsop_cell *tcell = afs_osi_Alloc(sizeof(struct afsop_cell));
 
-       AFS_COPYIN((char *)parm2, (char *)tcell->hosts, sizeof(tcell->hosts),
+       AFS_COPYIN(AFSKPTR(parm2), (caddr_t)tcell->hosts, sizeof(tcell->hosts),
                   code);
        if (!code) {
            if (parm4 > sizeof(tcell->cellName))
                code = EFAULT;
            else {
-               AFS_COPYIN((char *)parm3, tcell->cellName, parm4, code);
+             AFS_COPYIN(AFSKPTR(parm3), (caddr_t)tcell->cellName, parm4, code);
                if (!code)
                    afs_NewCell(tcell->cellName, tcell->hosts, parm5, NULL, 0,
                                0, 0);
@@ -737,14 +769,14 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            afs_osi_Sleep(&afs_initState);
 #endif
 
-       AFS_COPYIN((char *)parm2, (char *)tcell->hosts, sizeof(tcell->hosts),
+       AFS_COPYIN(AFSKPTR(parm2), (caddr_t)tcell->hosts, sizeof(tcell->hosts),
                   code);
        if (!code) {
-           AFS_COPYINSTR((char *)parm3, tbuffer1, AFS_SMALLOCSIZ,
+           AFS_COPYINSTR(AFSKPTR(parm3), tbuffer1, AFS_SMALLOCSIZ,
                          &bufferSize, code);
            if (!code) {
                if (parm4 & 4) {
-                   AFS_COPYINSTR((char *)parm5, tbuffer, AFS_SMALLOCSIZ,
+                   AFS_COPYINSTR(AFSKPTR(parm5), tbuffer, AFS_SMALLOCSIZ,
                                  &bufferSize, code);
                    if (!code) {
                        lcnamep = tbuffer;
@@ -769,10 +801,10 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        char *aliasName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
        char *cellName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
 
-       AFS_COPYINSTR((char *)parm2, aliasName, AFS_SMALLOCSIZ, &bufferSize,
+       AFS_COPYINSTR(AFSKPTR(parm2), aliasName, AFS_SMALLOCSIZ, &bufferSize,
                      code);
        if (!code)
-           AFS_COPYINSTR((char *)parm3, cellName, AFS_SMALLOCSIZ,
+           AFS_COPYINSTR(AFSKPTR(parm3), cellName, AFS_SMALLOCSIZ,
                          &bufferSize, code);
        if (!code)
            afs_NewCellAlias(aliasName, cellName);
@@ -785,7 +817,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
         */
        char *cell = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
 
-       AFS_COPYINSTR((char *)parm2, cell, AFS_SMALLOCSIZ, &bufferSize, code);
+       AFS_COPYINSTR(AFSKPTR(parm2), cell, AFS_SMALLOCSIZ, &bufferSize, code);
        if (!code)
            afs_SetPrimaryCell(cell);
        osi_FreeSmallSpace(cell);
@@ -795,7 +827,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        if (afs_CacheInit_Done)
            goto out;
 
-       AFS_COPYIN((char *)parm2, (caddr_t) & cparms, sizeof(cparms), code);
+       AFS_COPYIN(AFSKPTR(parm2), (caddr_t) & cparms, sizeof(cparms), code);
        if (code) {
 #if defined(KERNEL_HAVE_UERROR)
            setuerror(code);
@@ -855,7 +887,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            afs_osi_Sleep(&afs_initState);
 
        if (parm2) {
-           AFS_COPYINSTR((char *)parm2, afs_rootVolumeName,
+           AFS_COPYINSTR(AFSKPTR(parm2), afs_rootVolumeName,
                          sizeof(afs_rootVolumeName), &bufferSize, code);
            afs_rootVolumeName[sizeof(afs_rootVolumeName) - 1] = 0;
        } else
@@ -866,7 +898,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        char *tbuffer = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
 
        code = 0;
-       AFS_COPYINSTR((char *)parm2, tbuffer, AFS_SMALLOCSIZ, &bufferSize,
+       AFS_COPYINSTR(AFSKPTR(parm2), tbuffer, AFS_SMALLOCSIZ, &bufferSize,
                      code);
        if (code) {
            osi_FreeSmallSpace(tbuffer);
@@ -974,39 +1006,43 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            count = AFS_MAX_INTERFACE_ADDR;
        }
 
-       AFS_COPYIN((char *)parm3, (char *)buffer, count * sizeof(afs_int32),
+       AFS_COPYIN(AFSKPTR(parm3), (caddr_t)buffer, count * sizeof(afs_int32),
                   code);
-       if (parm4)
-           AFS_COPYIN((char *)parm4, (char *)maskbuffer,
+       if (parm4 && !code)
+           AFS_COPYIN(AFSKPTR(parm4), (caddr_t)maskbuffer,
                       count * sizeof(afs_int32), code);
-       if (parm5)
-           AFS_COPYIN((char *)parm5, (char *)mtubuffer,
+       if (parm5 && !code)
+           AFS_COPYIN(AFSKPTR(parm5), (caddr_t)mtubuffer,
                       count * sizeof(afs_int32), code);
 
-       afs_cb_interface.numberOfInterfaces = count;
-       for (i = 0; i < count; i++) {
-           afs_cb_interface.addr_in[i] = buffer[i];
+       if (!code) {
+           afs_cb_interface.numberOfInterfaces = count;
+           for (i = 0; i < count; i++) {
+               afs_cb_interface.addr_in[i] = buffer[i];
 #ifdef AFS_USERSPACE_IP_ADDR
-           /* AFS_USERSPACE_IP_ADDR means we have no way of finding the
-            * machines IP addresses when in the kernel (the in_ifaddr
-            * struct is not available), so we pass the info in at
-            * startup. We also pass in the subnetmask and mtu size. The
-            * subnetmask is used when setting the rank:
-            * afsi_SetServerIPRank(); and the mtu size is used when
-            * finding the best mtu size. rxi_FindIfnet() is replaced
-            * with rxi_Findcbi().
-            */
-           afs_cb_interface.subnetmask[i] =
-               (parm4 ? maskbuffer[i] : 0xffffffff);
-           afs_cb_interface.mtu[i] = (parm5 ? mtubuffer[i] : htonl(1500));
+               /* AFS_USERSPACE_IP_ADDR means we have no way of finding the
+                * machines IP addresses when in the kernel (the in_ifaddr
+                * struct is not available), so we pass the info in at
+                * startup. We also pass in the subnetmask and mtu size. The
+                * subnetmask is used when setting the rank:
+                * afsi_SetServerIPRank(); and the mtu size is used when
+                * finding the best mtu size. rxi_FindIfnet() is replaced
+                * with rxi_Findcbi().
+                */
+               afs_cb_interface.subnetmask[i] =
+                   (parm4 ? maskbuffer[i] : 0xffffffff);
+               afs_cb_interface.mtu[i] = (parm5 ? mtubuffer[i] : htonl(1500));
 #endif
-       }
-       rxi_setaddr(buffer[0]);
-       if (!refresh) {
-           if (rxbind)
-               rx_bindhost = buffer[0];
-           else
-               rx_bindhost = htonl(INADDR_ANY);
+           }
+           rxi_setaddr(buffer[0]);
+           if (!refresh) {
+               if (rxbind)
+                   rx_bindhost = buffer[0];
+               else
+                   rx_bindhost = htonl(INADDR_ANY);
+           }
+       } else {
+           refresh = 0;
        }
 
        afs_osi_Free(buffer, sizeof(afs_int32) * AFS_MAX_INTERFACE_ADDR);
@@ -1082,8 +1118,8 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #endif /* !AFS_SUN5_ENV */
        if (!code)
-           AFS_COPYOUT((caddr_t) & mtu, (caddr_t) parm3, sizeof(afs_int32),
-                       code);
+           AFS_COPYOUT((caddr_t) & mtu, AFSKPTR(parm3),
+                       sizeof(afs_int32), code);
 #ifdef AFS_AIX32_ENV
 /* this is disabled for now because I can't figure out how to get access
  * to these kernel variables.  It's only for supporting user-mode rx
@@ -1120,8 +1156,8 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
 #endif /* else AFS_USERSPACE_IP_ADDR */
 #endif /* !AFS_SUN5_ENV */
        if (!code)
-           AFS_COPYOUT((caddr_t) & mask, (caddr_t) parm3, sizeof(afs_int32),
-                       code);
+           AFS_COPYOUT((caddr_t) & mask, AFSKPTR(parm3),
+                       sizeof(afs_int32), code);
     }
 #ifdef AFS_AFSDB_ENV
     else if (parm == AFSOP_AFSDB_HANDLER) {
@@ -1134,8 +1170,8 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
 #ifndef UKERNEL
        afs_osi_MaskUserLoop();
 #endif
-       AFS_COPYIN((afs_int32 *) parm2, cellname, cellLen, code);
-       AFS_COPYIN((afs_int32 *) parm3, kmsg, kmsgLen, code);
+       AFS_COPYIN(AFSKPTR(parm2), cellname, cellLen, code);
+       AFS_COPYIN(AFSKPTR(parm3), kmsg, kmsgLen, code);
        if (!code) {
            code = afs_AFSDBHandler(cellname, cellLen, kmsg);
            if (*cellname == 1)
@@ -1146,7 +1182,7 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
            }
        }
        if (!code)
-           AFS_COPYOUT(cellname, (char *)parm2, cellLen, code);
+           AFS_COPYOUT(cellname, AFSKPTR(parm2), cellLen, code);
        afs_osi_Free(kmsg, kmsgLen);
        afs_osi_Free(cellname, cellLen);
     }
@@ -1162,9 +1198,10 @@ afs_syscall_call(parm, parm2, parm3, parm4, parm5, parm6)
        rx_extraPackets = parm2;
        afscall_set_rxpck_received = 1;
     } else if (parm == AFSOP_SET_RXMAXMTU) {
-    rx_MyMaxSendSize = rx_maxReceiveSizeUser = rx_maxReceiveSize = parm2;
-    } else
+       rx_MyMaxSendSize = rx_maxReceiveSizeUser = rx_maxReceiveSize = parm2;
+    } else {
        code = EINVAL;
+    }
 
   out:
     AFS_GUNLOCK();
@@ -1344,10 +1381,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 {
@@ -1372,6 +1409,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
@@ -1379,16 +1419,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;
 
@@ -1490,7 +1520,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
@@ -1624,148 +1678,171 @@ 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
-#if defined(AFS_HPUX_ENV)
-    /*
-     * There used to be code here (duplicated from osi_Init()) for
-     * initializing the semaphore used by AFS_GLOCK().  Was the
-     * duplication to handle the case of a dynamically loaded kernel
-     * module?
-     */
-    osi_InitGlock();
+       uap = (struct afssysa *)args;
 #endif
-    if (uap->syscall == AFSCALL_CALL) {
+#if defined(AFS_HPUX_ENV)
+       /*
+       * There used to be code here (duplicated from osi_Init()) for
+       * initializing the semaphore used by AFS_GLOCK().  Was the
+       * duplication to handle the case of a dynamically loaded kernel
+       * module?
+       */
+       osi_InitGlock();
+#endif
+       if (uap->syscall == AFSCALL_CALL) {
+          code =
+              afs_syscall_call(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
+                               uap->parm5, uap->parm6
 #ifdef AFS_SUN5_ENV
-       code =
-           afs_syscall_call(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                            uap->parm5, uap->parm6, rvp, CRED());
-#else
-       code =
-           afs_syscall_call(uap->parm1, uap->parm2, uap->parm3, uap->parm4,
-                            uap->parm5, uap->parm6);
+                               , rvp, CRED()
 #endif
-    } else if (uap->syscall == AFSCALL_SETPAG) {
+                  );
+       } else if (uap->syscall == AFSCALL_SETPAG) {
 #ifdef AFS_SUN5_ENV
-       register proc_t *procp;
-
-       procp = ttoproc(curthread);
-       AFS_GLOCK();
-       code = afs_setpag(&procp->p_cred);
-       AFS_GUNLOCK();
+          register proc_t *procp;
+          
+          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(uap->parm1, uap->parm2, uap->parm3,
-                              uap->parm4);
-#endif
-       AFS_GUNLOCK();
-    } else if (uap->syscall == AFSCALL_ICREATE) {
-       struct iparam iparams;
-
-       code = copyin_iparam((char *)uap->parm3, &iparams);
-       if (code) {
+          code =
+              afs_syscall_pioctl(uap->parm1, uap->parm2, uap->parm3,
+                                 uap->parm4);
+#endif
+          AFS_GUNLOCK();
+       } else if (uap->syscall == AFSCALL_ICREATE) {
+          struct iparam iparams;
+          
+          code = copyin_iparam((char *)uap->parm3, &iparams);
+          if (code) {
 #if defined(KERNEL_HAVE_UERROR)
-           setuerror(code);
-#endif
-       } else
+              setuerror(code);
+#endif
+          } else {
+              code =
+                  afs_syscall_icreate(uap->parm1, uap->parm2, iparams.param1,
+                                      iparams.param2, iparams.param3, 
+                                      iparams.param4
+#ifdef AFS_SUN5_ENV
+                                  , rvp, CRED()
+#elif defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+                                  , retval
+#endif
+                  );
+          }
+       } else if (uap->syscall == AFSCALL_IOPEN) {
+          code =
+              afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3
 #ifdef AFS_SUN5_ENV
-           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,
-#if defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-                                   iparams.param3, iparams.param4, retval);
-#else
-                                   iparams.param3, iparams.param4);
-#endif
-#endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_IOPEN) {
+                                , rvp, CRED()
+#elif defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+                                , retval
+#endif
+                  );
+       } else if (uap->syscall == AFSCALL_IDEC) {
+          code =
+              afs_syscall_iincdec(uap->parm1, uap->parm2, uap->parm3, -1
 #ifdef AFS_SUN5_ENV
-       code =
-           afs_syscall_iopen(uap->parm1, uap->parm2, uap->parm3, rvp,
-                             CRED());
-#else
-#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);
+                                  , rvp, CRED()
 #endif
-#endif /* AFS_SUN5_ENV */
-    } else if (uap->syscall == AFSCALL_IDEC) {
+                  );
+       } 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_IINC) {
-#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;
@@ -1980,8 +2057,28 @@ extern struct afs_icl_log *afs_icl_FindLog();
 extern struct afs_icl_set *afs_icl_FindSet();
 
 
+#ifdef AFS_DARWIN100_ENV
+#define AFSKPTR(X) k ## X
+static int
+Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
+{
+    return Afscall64_icl(opcode,
+                        CAST_USER_ADDR_T((p1)),
+                        CAST_USER_ADDR_T((p2)),
+                        CAST_USER_ADDR_T((p3)),
+                        CAST_USER_ADDR_T((p4)),
+                        retval);
+}
+#else
+#define AFSKPTR(X) ((caddr_t)X)
+#endif
+
 static int
+#ifdef AFS_DARWIN100_ENV
+Afscall64_icl(int opcode, user_addr_t kp1, user_addr_t kp2, user_addr_t kp3, user_addr_t kp4, int *retval)
+#else
 Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
+#endif
 {
     afs_int32 *lp, elts, flags;
     register afs_int32 code;
@@ -2000,6 +2097,12 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
     afs_int32 startCookie;
     afs_int32 allocated;
     struct afs_icl_log *tlp;
+#ifdef AFS_DARWIN100_ENV
+    afs_uint32 p1 = (afs_uint32)kp1;
+    afs_uint32 p2 = (afs_uint32)kp2;
+    afs_uint32 p3 = (afs_uint32)kp3;
+    afs_uint32 p4 = (afs_uint32)kp4;
+#endif
 
 #ifdef AFS_SUN5_ENV
     if (!afs_suser(CRED())) {  /* only root can run this code */
@@ -2023,10 +2126,10 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
         * updates cookie to updated start (not end) if we had to
         * skip some records.
         */
-       AFS_COPYINSTR((char *)p1, tname, sizeof(tname), &temp, code);
+       AFS_COPYINSTR(AFSKPTR(p1), tname, sizeof(tname), &temp, code);
        if (code)
            return code;
-       AFS_COPYIN((char *)p4, (char *)&startCookie, sizeof(afs_int32), code);
+       AFS_COPYIN(AFSKPTR(p4), (char *)&startCookie, sizeof(afs_int32), code);
        if (code)
            return code;
        logp = afs_icl_FindLog(tname);
@@ -2045,10 +2148,10 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
            osi_FreeLargeSpace((struct osi_buffer *)lp);
            break;
        }
-       AFS_COPYOUT((char *)lp, (char *)p2, elts * sizeof(afs_int32), code);
+       AFS_COPYOUT((char *)lp, AFSKPTR(p2), elts * sizeof(afs_int32), code);
        if (code)
            goto done;
-       AFS_COPYOUT((char *)&startCookie, (char *)p4, sizeof(afs_int32),
+       AFS_COPYOUT((char *)&startCookie, AFSKPTR(p4), sizeof(afs_int32),
                    code);
        if (code)
            goto done;
@@ -2076,9 +2179,9 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
        temp = strlen(tlp->name) + 1;
        if (temp > p3)
            return EINVAL;
-       AFS_COPYOUT(tlp->name, (char *)p2, temp, code);
+       AFS_COPYOUT(tlp->name, AFSKPTR(p2), temp, code);
        if (!code)              /* copy out size of log */
-           AFS_COPYOUT((char *)&tlp->logSize, (char *)p4, sizeof(afs_int32),
+           AFS_COPYOUT((char *)&tlp->logSize, AFSKPTR(p4), sizeof(afs_int32),
                        code);
        break;
 
@@ -2086,7 +2189,7 @@ Afscall_icl(long opcode, long p1, long p2, long p3, long p4, long *retval)
        /* enumerate logs: p1=setname, p2=index, p3=&name, p4=sizeof(name).
         * return 0 for success, otherwise error.
         */
-       AFS_COPYINSTR((char *)p1, tname, sizeof(tname), &temp, code);
+       AFS_COPYINSTR(AFSKPTR(p1), tname, sizeof(tname), &temp, code);
        if (code)
            return code;
        setp = afs_icl_FindSet(tname);
index 799caabd8461265df339fbe6d3093a3a52b12914..0eb0e8ae68239bf0162f860c6c163ac9031e42d1 100644 (file)
@@ -277,7 +277,7 @@ typedef struct timeval osi_timeval_t;
  * and kernel space. Call these to avoid taking page faults while
  * holding the global lock.
  */
-#ifdef CAST_USER_ADDR_T
+#if defined(CAST_USER_ADDR_T) && !defined(UKERNEL) && !defined(AFS_DARWIN100_ENV)
 #define __U(X) CAST_USER_ADDR_T((X))
 #else
 #define __U(X) (X)
@@ -289,7 +289,7 @@ typedef struct timeval osi_timeval_t;
            int haveGlock = ISAFS_GLOCK();                      \
            if (haveGlock)                                      \
                AFS_GUNLOCK();                                  \
-           CODE = copyin(__U((SRC)),(DST),(LEN));                      \
+           CODE = copyin(__U((SRC)),(DST),(LEN));      \
            if (haveGlock)                                      \
                AFS_GLOCK();                                    \
        } while(0)
index 69c50aff446443be13e96c5507973f59e57852e3..795f75aec4175ba3e7e50733dddf9420ac8b0caa 100644 (file)
@@ -254,13 +254,13 @@ afs_setpag(void)
     }
 #elif defined(AFS_DARWIN80_ENV)
     {
-       struct ucred *credp = kauth_cred_proc_ref(p);
+       struct AFS_UCRED *credp = kauth_cred_proc_ref(p);
        code = AddPag(p, genpag(), &credp);
-       kauth_cred_rele(credp);
+       crfree(credp);
     }
 #elif defined(AFS_DARWIN_ENV)
     {
-       struct ucred *credp = crdup(p->p_cred->pc_ucred);
+       struct AFS_UCRED *credp = crdup(p->p_cred->pc_ucred);
        code = AddPag(p, genpag(), &credp);
        crfree(credp);
     }
index 055a146d494ed9605c45af3276bb1f3fc7460bac..a72ec64eabef84d03247c5850487996af5b1a60e 100644 (file)
@@ -109,7 +109,7 @@ int HandleIoctl(register struct vcache *avc, register afs_int32 acom,
 int afs_HandlePioctl(struct vnode *avp, afs_int32 acom,
                     register struct afs_ioctl *ablob, int afollow,
                     struct AFS_UCRED **acred);
-static int Prefetch(char *apath, struct afs_ioctl *adata, int afollow,
+static int Prefetch(iparmtype apath, struct afs_ioctl *adata, int afollow,
                    struct AFS_UCRED *acred);
 
 
@@ -223,7 +223,11 @@ afs_ioctl32_to_afs_ioctl(const struct afs_ioctl32 *src, struct afs_ioctl *dst)
  */
 
 static 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)
@@ -387,7 +391,6 @@ HandleIoctl(register struct vcache *avc, register afs_int32 acom,
     return code;               /* so far, none implemented */
 }
 
-
 #ifdef AFS_AIX_ENV
 /* For aix we don't temporarily bypass ioctl(2) but rather do our
  * thing directly in the vnode layer call, VNOP_IOCTL; thus afs_ioctl
@@ -861,21 +864,18 @@ afs_pioctl(p, args, retval)
 
 int
 #ifdef AFS_SUN5_ENV
-afs_syscall_pioctl(path, com, cmarg, follow, rvp, credp)
-     rval_t *rvp;
-     struct AFS_UCRED *credp;
+afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg, int follow, rval_t *rvp, struct AFS_UCRED *credp)
 #else
-#if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
-afs_syscall_pioctl(path, com, cmarg, follow, credp)
-     struct AFS_UCRED *credp;
+#ifdef AFS_DARWIN100_ENV
+afs_syscall64_pioctl(user_addr_t path, unsigned int com, user_addr_t cmarg,
+                  int follow, struct AFS_UCRED *credp)
+#elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg, int follow, 
+                  struct AFS_UCRED *credp)
 #else
-afs_syscall_pioctl(path, com, cmarg, follow)
+afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg, int follow)
 #endif
 #endif
-     char *path;
-     unsigned int com;
-     caddr_t cmarg;
-     int follow;
 {
     struct afs_ioctl data;
 #ifdef AFS_NEED_CLIENTCONTEXT
@@ -977,11 +977,11 @@ afs_syscall_pioctl(path, com, cmarg, follow)
                       foreigncreds ? foreigncreds : credp);
 #else
 #ifdef AFS_LINUX22_ENV
-       code = gop_lookupname(path, AFS_UIOUSER, follow, &dp);
+       code = gop_lookupname_user(path, AFS_UIOUSER, follow, &dp);
        if (!code)
            vp = (struct vnode *)dp->d_inode;
 #else
-       code = gop_lookupname(path, AFS_UIOUSER, follow, &vp);
+       code = gop_lookupname_user(path, AFS_UIOUSER, follow, &vp);
 #endif /* AFS_LINUX22_ENV */
 #endif /* AFS_AIX41_ENV */
        AFS_GLOCK();
@@ -1090,6 +1090,17 @@ afs_syscall_pioctl(path, com, cmarg, follow)
 #endif
 }
 
+#ifdef AFS_DARWIN100_ENV
+int
+afs_syscall_pioctl(char * path, unsigned int com, caddr_t cmarg,
+                  int follow, struct AFS_UCRED *credp)
+{
+    return afs_syscall64_pioctl(CAST_USER_ADDR_T(path), com,
+                               CAST_USER_ADDR_T((unsigned int)cmarg), follow,
+                               credp);
+}
+#endif
+
 #define MAXPIOCTLTOKENLEN \
 (3*sizeof(afs_int32)+MAXKTCTICKETLEN+sizeof(struct ClearToken)+MAXKTCREALMLEN)
 
@@ -2087,7 +2098,7 @@ DECL_PIOCTL(PCheckAuth)
 }
 
 static int
-Prefetch(char *apath, struct afs_ioctl *adata, int afollow,
+Prefetch(iparmtype apath, struct afs_ioctl *adata, int afollow,
         struct AFS_UCRED *acred)
 {
     register char *tp;
index ed08a99df23df25754a0ec5126ad839cce6dcc2a..3a83f1782a888e4a294ac69793c8b2e222c814d6 100644 (file)
@@ -121,6 +121,13 @@ extern int afs_CheckInit(void);
 extern void afs_shutdown(void);
 extern void shutdown_afstest(void);
 extern void afs_shutdown_BKG(void);
+extern int afs_syscall_call(long parm, long parm2, long parm3,
+                           long parm4, long parm5, long parm6);
+#if defined(AFS_DARWIN100_ENV)
+extern int afs_syscall64_call(user_addr_t parm, user_addr_t parm2,
+                             user_addr_t parm3, user_addr_t parm4,
+                             user_addr_t parm5, user_addr_t parm6);
+#endif
 
 
 /* afs_callback.c */
@@ -364,6 +371,7 @@ extern int afs_DynrootVOPSymlink(struct vcache *avc, struct AFS_UCRED *acred,
 /* afs_exporter.c */
 extern struct afs_exporter *root_exported;
 extern struct afs_exporter *exporter_find(int type);
+extern void shutdown_exporter(void);
 
 /* afs_init.c */
 extern struct cm_initparams cm_initParams;
@@ -676,7 +684,24 @@ extern afs_int32 afs_waitForever;
 extern short afs_waitForeverCount;
 extern afs_int32 afs_showflags;
 extern int afs_defaultAsynchrony;
-extern int afs_syscall_pioctl();
+#if defined(AFS_DARWIN100_ENV)
+extern int afs_syscall64_pioctl(user_addr_t path, unsigned int com,
+                               user_addr_t cmarg, int follow, \
+                               struct AFS_UCRED *credp);
+#endif
+#ifdef AFS_SUN5_ENV
+extern int afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg, 
+                             int follow, rval_t *rvp, struct AFS_UCRED *credp);
+#elif defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
+extern int afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg, 
+                             int follow, struct AFS_UCRED *credp);
+#else
+extern int afs_syscall_pioctl(char *path, unsigned int com, caddr_t cmarg,
+                             int follow);
+#endif
+extern int HandleIoctl(register struct vcache *avc, register afs_int32 acom,
+                      struct afs_ioctl *adata);
+
 
 /* afs_segments.c */
 extern int afs_StoreMini(register struct vcache *avc, struct vrequest *areq);
@@ -755,7 +780,6 @@ extern void afs_GetCMStat(char **ptr, unsigned *size);
 extern void afs_AddToMean(struct afs_MeanStats *oldMean, afs_int32 newValue);
 #endif
 
-
 /* UKERNEL/afs_usrops.c */
 #ifdef UKERNEL
 extern void uafs_Shutdown(void);
index 2f1753239f5b1466b10562963f9c8ad8e208cd5f..f56ee03990e55c74ff68ba0b4ca859c775e4bc36 100644 (file)
@@ -1226,7 +1226,7 @@ afs_FlushActiveVcaches(register afs_int32 doflocks)
     register int i;
     register struct afs_conn *tc;
     register afs_int32 code;
-    register struct AFS_UCRED *cred = NULL;
+    struct AFS_UCRED *cred = NULL;
     struct vrequest treq, ureq;
     struct AFSVolSync tsync;
     int didCore;
index b469efc3aa5b822846fd0404cb933a3f5f35d108..cfd8730eb6fb535ed70094318e40717f26245668 100644 (file)
@@ -2584,9 +2584,9 @@ HandleMTab()
 }
 
 #if !defined(AFS_SGI_ENV) && !defined(AFS_AIX32_ENV)
-
-call_syscall(param1, param2, param3, param4, param5, param6, param7)
-     long param1, param2, param3, param4, param5, param6, param7;
+int
+call_syscall(long param1, long param2, long param3, long param4, long param5, 
+            long param6, long param7)
 {
     int error;
 #ifdef AFS_LINUX20_ENV
@@ -2615,22 +2615,50 @@ call_syscall(param1, param2, param3, param4, param5, param6, param7)
 #endif
 #ifdef AFS_DARWIN80_ENV
     struct afssysargs syscall_data;
+    void *ioctldata;
     int fd = open(SYSCALL_DEV_FNAME,O_RDWR);
-    syscall_data.syscall = AFSCALL_CALL;
-    syscall_data.param1 = param1;
-    syscall_data.param2 = param2;
-    syscall_data.param3 = param3;
-    syscall_data.param4 = param4;
-    syscall_data.param5 = param5;
-    syscall_data.param6 = param6;
+    int syscallnum, is64 = 0;
+#ifdef AFS_DARWIN100_ENV
+    struct afssysargs64 syscall64_data;
+    if (sizeof(param1) == 8) {
+       syscallnum = VIOC_SYSCALL64;
+       is64 = 1;
+       ioctldata = &syscall64_data;
+       syscall64_data.syscall = (int)AFSCALL_CALL;
+       syscall64_data.param1 = param1;
+       syscall64_data.param2 = param2;
+       syscall64_data.param3 = param3;
+       syscall64_data.param4 = param4;
+       syscall64_data.param5 = param5;
+       syscall64_data.param6 = param6;
+    } else {
+#endif
+       syscallnum = VIOC_SYSCALL;
+       ioctldata = &syscall_data;
+       syscall_data.syscall = AFSCALL_CALL;
+       syscall_data.param1 = param1;
+       syscall_data.param2 = param2;
+       syscall_data.param3 = param3;
+       syscall_data.param4 = param4;
+       syscall_data.param5 = param5;
+       syscall_data.param6 = param6;
+#ifdef AFS_DARWIN100_ENV
+    }
+#endif
     if(fd >= 0) {
-       error = ioctl(fd, VIOC_SYSCALL, &syscall_data);
-       close(fd);
+       error = ioctl(fd, syscallnum, ioctldata);
+       close(fd);
     } else {
-       error = -1;
+       error = -1;
+    }
+    if (!error) {
+#ifdef AFS_DARWIN100_ENV
+       if (is64)
+           error=syscall64_data.retval;
+       else
+#endif
+           error=syscall_data.retval;
     }
-    if (!error)
-      error=syscall_data.retval;
 #else
     error =
        syscall(AFS_SYSCALL, AFSCALL_CALL, param1, param2, param3, param4,
index 29d5649c409d67cb149f82c4a8c019bfa565d015..eb95bcb1c981ee90c8e96fb82bf908844e847668 100644 (file)
@@ -545,7 +545,7 @@ case $AFS_SYSNAME in
                EXTRA_VLIBOBJS="fstab.o"
                SHLIB_LINKER="${MT_CC} -dynamiclib"
                SHLIB_SUFFIX="dylib"
-               RANLIB="ranlib -c"
+               RANLIB="ranlib"
                ;;
 
        *_darwin_100)
index 1f8ca28c35f92f567326c80db07f2b55add9badc..c0b74d65b5da2abaf57dcb446279740281ac3dd8 100644 (file)
@@ -217,17 +217,30 @@ struct afsprocdata32 {
 
 #ifdef AFS_DARWIN80_ENV
 struct afssysargs {
-     unsigned long syscall;
-     unsigned long param1;
-     unsigned long param2;
-     unsigned long param3;
-     unsigned long param4;
-     unsigned long param5;
-     unsigned long param6;
-     unsigned long retval;
+    unsigned int syscall;
+    unsigned int param1;
+    unsigned int param2;
+    unsigned int param3;
+    unsigned int param4;
+    unsigned int param5;
+    unsigned int param6;
+    unsigned int retval;
+};
+
+/* args reordered to avoid alignment issues */
+struct afssysargs64 {
+    user_addr_t param1;
+    user_addr_t param2;
+    user_addr_t param3;
+    user_addr_t param4;
+    user_addr_t param5;
+    user_addr_t param6;
+    unsigned int syscall;
+    unsigned int retval;
 };
 #define VIOC_SYSCALL_TYPE 'C' 
 #define VIOC_SYSCALL _IOWR(VIOC_SYSCALL_TYPE,1,struct afssysargs)
+#define VIOC_SYSCALL64 _IOWR(VIOC_SYSCALL_TYPE,2,struct afssysargs64)
 #define SYSCALL_DEV_FNAME "/dev/openafs_ioctl"
 #endif
 
index 9d124d7da345eb95c31bd907a6ede3586d58b765..de3bee43bc0d974c757bb5e0cc94923a370c0c85 100644 (file)
@@ -37,19 +37,26 @@ KINCLUDES=-I${KROOT}/System/Library/Frameworks/Kernel.framework/Headers
 
 <ppc_darwin_80 x86_darwin_80>
 KOPTS_DBUG=-g
-<ppc_darwin_90 x86_darwin_90 x86_darwin_100>
+<ppc_darwin_90 x86_darwin_90
 KOPTS_DBUG=-ggdb
+< x86_darwin_100>
+KOPTS_DBUG=-gdwarf-2
 <ppc_darwin_80 x86_darwin_80 ppc_darwin_90 x86_darwin_90 x86_darwin_100>
 KOPTS_ppc=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch ppc -Dppc -DPPC -D__PPC__ -DPAGE_SIZE_FIXED -mcpu=750 -mmultiple -fschedule-insns -force_cpusubtype_ALL
 KOPTS_x86=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch i386 -Di386 -DI386 -D__I386__ -DPAGE_SIZE_FIXED -march=i686 -mpreferred-stack-boundary=2 -falign-functions=4
-KOPTS_amd64=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch x86_64 -Damd64 -DAMD64 -D__AMD64__ -DPAGE_SIZE_FIXED -march=x86-64 -mpreferred-stack-boundary=4 -falign-functions=4
+KOPTS_amd64=-static -nostdinc -nostdlib -fno-builtin -finline -fno-keep-inline-functions -msoft-float -mlong-branch -fsigned-bitfields -arch x86_64 -Damd64 -DAMD64 -D__AMD64__ -DPAGE_SIZE_FIXED -march=x86-64 -mpreferred-stack-boundary=4 -falign-functions=4 -m64 -mkernel -mno-red-zone
 ARCH_ppc=$(shell echo "${ARCHFLAGS}" | grep -q -w ppc && echo yes || echo ${ARCHFLAGS} | egrep -q -w -v 'ppc|i386|x86_64' && arch | grep -q -w ppc && echo yes)
 ARCH_x86=$(shell echo "${ARCHFLAGS}" | grep -q -w i386 && echo yes || echo ${ARCHFLAGS} | egrep -q -w -v 'ppc|i386|x86_64' && arch | grep -q -w i386 && echo yes)
 ARCH_amd64=$(shell echo "${ARCHFLAGS}" | grep -q -w x86_64 && echo yes || echo ${ARCHFLAGS} | egrep -q -w -v 'ppc|i386|x86_64' && arch | grep -q -w x86_64 && echo yes)
 OBJ_ppc=$(shell echo "${ARCH_ppc}" | grep -q -w yes && echo "$@.ppc")
 OBJ_x86=$(shell echo "${ARCH_x86}" | grep -q -w yes && echo "$@.x86")
 OBJ_amd64=$(shell echo "${ARCH_amd64}" | grep -q -w yes && echo "$@.amd64")
+
+<ppc_darwin_90 x86_darwin_90 x86_darwin_100>
+MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib $(ARCHFLAGS) -Xlinker -kext
+<all -ppc_darwin_90 -x86_darwin_90 -x86_darwin_100>
 MODLD=$(CC) -static $(KOPTS_DBUG) -nostdlib $(ARCHFLAGS)
+<all>
 
 CFLAGS_ppc=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_ppc) $(KOPTS_DBUG)
 CFLAGS_x86=${KINCLUDES} -I. -I.. -I${TOP_OBJDIR}/src/config $(DEFINES) $(KDEFS) $(KOPTS_x86) $(KOPTS_DBUG)
index 6b13f794c506f5e7146efaa9cc0e7be5b755ac7d..b0f11752321c1ae7f127d700ddb324e9597b79de 100644 (file)
@@ -90,7 +90,7 @@ extern int clock_nUpdates;
 #if defined(AFS_SGI61_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX_64BIT_KERNEL)
 #define clock_GetTime(cv) osi_GetTime((osi_timeval_t *)cv)
 #else
-#if defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL)
+#if (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL)) || (defined(AFS_DARWIN100_ENV) && defined(__amd64__))
 #define        clock_GetTime(cv)                               \
     BEGIN                                              \
        struct timeval tv;                              \
index f093dc4f2cb88e7dd5fa6c3293cd26a23ff138e5..c2a03a8995cd6a84679845e94d1e1a63d3f6da56 100644 (file)
@@ -28,7 +28,7 @@ RXKAD = ../rxkad
 PTSERVER = ../ptserver
 SYS = ../sys
 
-AUDITOBJS = audit.o audit-file.o audit-sysvmq.o
+AUDITOBJS = audit.o
 
 AUTHOBJS = \
        cellconfig.o \
index 68f0f3cfc0eec3e36eb3c1b30efd3446121ce983..852d5d2e1517b9fa1740279256326af42c1437e7 100644 (file)
@@ -305,33 +305,6 @@ iwrite(int dev, int inode, int inode_p1, unsigned int offset, char *cbuf,
 
 #endif /* AFS_NAMEI_ENV */
 
-#if defined(AFS_DARWIN80_ENV)
-int ioctl_afs_syscall(long syscall, long param1, long param2, long param3, 
-                    long param4, long param5, long param6, int *rval) {
-  struct afssysargs syscall_data;
-  int code;
-  int fd = open(SYSCALL_DEV_FNAME, O_RDWR);
-  if(fd < 0)
-    return -1;
-
-  syscall_data.syscall = syscall;
-  syscall_data.param1 = param1;
-  syscall_data.param2 = param2;
-  syscall_data.param3 = param3;
-  syscall_data.param4 = param4;
-  syscall_data.param5 = param5;
-  syscall_data.param6 = param6;
-
-  code = ioctl(fd, VIOC_SYSCALL, &syscall_data);
-
-  close(fd);
-  if (code)
-     return code;
-  *rval=syscall_data.retval;
-  return 0;
-}
-#endif
-
 int
 lpioctl(char *path, int cmd, char *cmarg, int follow)
 {
index f75e8f7dc474e8948fdc6ad0f084b942402b56ac..518b499363925eb9f049f7812b5e867c781fc5fa 100644 (file)
@@ -51,3 +51,55 @@ int proc_afs_syscall(long syscall, long param1, long param2, long param3,
   return 0;
 }
 #endif
+
+#if defined(AFS_DARWIN80_ENV)
+int ioctl_afs_syscall(long syscall, long param1, long param2, long param3, 
+                     long param4, long param5, long param6, int *rval) {
+    struct afssysargs syscall_data;
+    void *ioctldata;
+    int code;
+    int fd = open(SYSCALL_DEV_FNAME, O_RDWR);
+    int syscallnum;
+#ifdef AFS_DARWIN100_ENV
+    struct afssysargs64 syscall64_data;
+    if (sizeof(param1) == 8) {
+       syscallnum = VIOC_SYSCALL64;
+       ioctldata = &syscall64_data;
+       syscall64_data.syscall = (int)syscall;
+       syscall64_data.param1 = param1;
+       syscall64_data.param2 = param2;
+       syscall64_data.param3 = param3;
+       syscall64_data.param4 = param4;
+       syscall64_data.param5 = param5;
+       syscall64_data.param6 = param6;
+    } else {
+#endif
+       syscallnum = VIOC_SYSCALL;
+       ioctldata = &syscall_data;
+       syscall_data.syscall = syscall;
+       syscall_data.param1 = param1;
+       syscall_data.param2 = param2;
+       syscall_data.param3 = param3;
+       syscall_data.param4 = param4;
+       syscall_data.param5 = param5;
+       syscall_data.param6 = param6;
+#ifdef AFS_DARWIN100_ENV
+    }
+#endif
+    if(fd >= 0) {
+       code = ioctl(fd, syscallnum, ioctldata);
+       close(fd);
+    } else
+       code = -1;
+
+    if (code)
+       return code;
+#ifdef AFS_DARWIN100_ENV
+    if (sizeof(param1) == 8)
+       *rval=syscall64_data.retval;
+    else
+#endif
+       *rval=syscall_data.retval;
+    return 0;
+}
+#endif
index fdae289fa55917697450c5a8e54183476e656c9a..1f5773851c876539b834f41704245d6f592db4bf 100644 (file)
@@ -53,6 +53,8 @@ lsetpag(void)
     
     if(rval)
       errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG);
+#elif defined(AFS_DARWIN80_ENV)
+    errcode = ioctl_afs_syscall(AFSCALL_SETPAG,0,0,0,0,0,0,&errcode);
 #else
     errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG);
 #endif
index 211623cb863f11dc8a32c316a886e6ddb6df1634..de2e5d0798492558b3c0d4b44cdc0ce9153c14c5 100644 (file)
@@ -555,7 +555,7 @@ SVL_GetNewVolumeId(rxcall, Maxvolidbump, newvolumeid)
      afs_int32 Maxvolidbump;
      afs_int32 *newvolumeid;
 {
-    register afs_int32 errorcode, maxvolumeid;
+    afs_int32 errorcode, maxvolumeid;
     struct ubik_trans *trans;
 
     COUNT_REQ(VLGETNEWVOLUMEID);