DARWIN: correct size of fstrace ICL_TYPE_LONG and ICL_TYPE_POINTER 58/14558/4
authorMark Vitale <mvitale@sinenomine.net>
Wed, 10 Mar 2021 04:12:50 +0000 (23:12 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 1 Jul 2021 20:03:13 +0000 (16:03 -0400)
Commit 248da50aa56f19bdc8b2b322f5e17b3d2a363dce 'icl 64 bit platform
rationalization' introduced support for 64-bit ICL_TYPE_POINTER and
ICL_TYPE_LONG for fstrace running on DARWIN kernels.  However, it
neglected to make the matching change in the fstrace utility itself,
which reads and reports these trace entries.  The result is that all
fstrace records which contain 64-bit pointers or longs are misreported
as 32-bit values.  Furthermore, any subsequent values in the same
fstrace record are also misreported because the offsets are now
incorrect.

Move the definition of ICL_LONG from afs_icl.c to icl.h so fstrace.c may
share the ICL_LONG logic and value.

Modify fstrace to use logic similar to the recording logic in afs_icl.c
so that the correct size and offsets are maintained while decoding the
contents of each fstrace record.

We can use the build-time value of ICL_LONG (rather than the runtime
value of afs_sizeofLong) because the difference only matters for SGI62
32-bit kernels.  It is unknown whether the existing code works correctly
for SGI62 32-bit mode, but this commit should not affect that support
either way.

Change-Id: I240f76fed4618822b774451c5184b1160f17221d
Reviewed-on: https://gerrit.openafs.org/14558
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/afs/afs_icl.c
src/config/icl.h
src/venus/fstrace.c

index dd77f36..f3af040 100644 (file)
 struct afs_icl_set *afs_iclSetp = (struct afs_icl_set *)0;
 struct afs_icl_set *afs_iclLongTermSetp = (struct afs_icl_set *)0;
 
-/* Matches below where ICL_APPENDLONG is 2 INT32s */
-#if (defined(AFS_SGI61_ENV) && (_MIPS_SZLONG==64)) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL)) || defined(AFS_DARWIN_ENV) && defined(__amd64__)
-#define ICL_LONG 2
-#else
-#define ICL_LONG 1
-#endif
-
 int afs_icl_sizeofLong = ICL_LONG;
 
 int afs_icl_inited = 0;
index 7bf8cc8..3189855 100644 (file)
 typedef struct Lock afs_lock_t;
 #endif
 
+#if (defined(AFS_SGI61_ENV) && (_MIPS_SZLONG==64)) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL)) || (defined(AFS_DARWIN_ENV) && defined(__amd64__))
+#define ICL_LONG 2
+#else
+#define ICL_LONG 1
+#endif
+
 #define ICL_LOGSPERSET         8       /* max logs per set */
 #define ICL_DEFAULTEVENTS      1024    /* default events per event set */
 #define ICL_DEFAULT_LOGSIZE    60*1024 /* number of words in default log size */
index 45be05e..f82ad2b 100644 (file)
 #include <afs/vice.h>
 #include <afs/sys_prototypes.h>
 
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
 /* For SGI 6.2, this is changed to 1 if it's a 32 bit kernel. */
-int afs_icl_sizeofLong = 2;
-#else
-int afs_icl_sizeofLong = 1;
-#endif
+int afs_icl_sizeofLong = ICL_LONG;
 
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
 int afs_64bit_kernel = 1;      /* Default for 6.2+, and always for 6.1 */
-extern int afs_icl_sizeofLong; /* Used in ICL_SIZEHACK() */
 #ifdef AFS_SGI62_ENV
 
 /* If _SC_KERN_POINTERS not in sysconf, then we can assume a 32 bit abi. */
@@ -54,7 +49,7 @@ set_kernel_sizeof_long(void)
 }
 
 #endif /* AFS_SGI62_ENV */
-#endif /* AFS_SGI61_ENV */
+#endif /* ICL_LONG == 2 */
 
 int afs_syscall(long call, long parm0, long parm1, long parm2, long parm3,
                long parm4, long parm5, long parm6);
@@ -90,7 +85,7 @@ icl_GetSize(afs_int32 type, char *addr)
  * by typesp.  Also watch for prematurely running out of parameters
  * before the string is gone.
  */
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
 static int
 CheckTypes(char *bufferp, int *typesp, int typeCount, char *outMsgBuffer)
 {
@@ -165,7 +160,7 @@ CheckTypes(char *bufferp, int *typesp, int typeCount, char *outMsgBuffer)
     }
     /* not reached */
 }
-#else /* AFS_SGI61_ENV */
+#else /* ICL_LONG == 2 */
 static int
 CheckTypes(char *bufferp, int *typesp, int typeCount)
 {
@@ -210,7 +205,7 @@ CheckTypes(char *bufferp, int *typesp, int typeCount)
     }
     /* not reached */
 }
-#endif /* AFS_SGI61_ENV */
+#endif /* ICL_LONG == 2 */
 
 /* display a single record.
  * alp points at the first word in the array to be interpreted
@@ -223,14 +218,14 @@ static void
 DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
 {
     char msgBuffer[1024];
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
     char outMsgBuffer[1024];
     uint64_t tempParam;
     uint64_t printfParms[ICL_MAXEXPANSION * /* max parms */ 4];
     char *printfStrings[ICL_MAXEXPANSION * /* max parms */ 4];
-#else /* AFS_SGI61_ENV */
+#else
     long printfParms[ICL_MAXEXPANSION * /* max parms */ 4];
-#endif /* AFS_SGI61_ENV */
+#endif
     int printfTypes[ICL_MAXEXPANSION * 4];
     int i;
     afs_int32 done = 0;
@@ -270,14 +265,14 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
        case ICL_TYPE_LONG:
        case ICL_TYPE_POINTER:
            printfTypes[pftix++] = 0;
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
            printfParms[pfpix] = alp[pix];
            printfParms[pfpix] &= 0xffffffff;
            if (afs_64bit_kernel) {
                printfParms[pfpix] <<= 32;
                printfParms[pfpix] |= alp[pix + 1];
            }
-#else /* !AFS_SGI61_ENV */
+#else
            printfParms[pfpix] = alp[pix];
 #endif
            pfpix++;
@@ -305,15 +300,11 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
            break;
        case ICL_TYPE_STRING:
            printfTypes[pftix++] = 1;
-#ifdef AFS_SGI64_ENV
-           printfStrings[pfpix++] = (char *)&alp[pix];
-#else /* AFS_SGI64_ENV */
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
            printfStrings[pfpix++] = (char *)&alp[pix];
-#else /* AFS_SGI61_ENV */
+#else
            printfParms[pfpix++] = (long)&alp[pix];
-#endif /* AFS_SGI61_ENV */
-#endif /* AFS_SGI64_ENV */
+#endif
            break;
        case ICL_TYPE_UNIXDATE:
            tmv = alp[pix];
@@ -338,7 +329,7 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
      */
     printed = 0;
     if (status == 0) {
-#if defined(AFS_SGI61_ENV) || (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL))
+#if ICL_LONG == 2
        if (CheckTypes(msgBuffer, printfTypes, pftix, outMsgBuffer)) {
            /* we have a string to use, but it ends "(dfs / zcm)",
             * so we remove the extra gunk.
@@ -386,7 +377,7 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
            fprintf(outFilep, "\n");
            printed = 1;
        }
-#else /* AFS_SGI61_ENV */
+#else /* ICL_LONG == 2 */
        if (CheckTypes(msgBuffer, printfTypes, pftix)) {
            /* we have a string to use, but it ends "(dfs / zcm)",
             * so we remove the extra gunk.
@@ -405,7 +396,7 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
            fprintf(outFilep, "\n");
            printed = 1;
        }
-#endif /* AFS_SGI61_ENV */
+#endif /* ICL_LONG == 2 */
        else {
            fprintf(outFilep, "Type mismatch, using raw print.\n");
            fprintf(outFilep, "%s", msgBuffer);
@@ -432,24 +423,24 @@ DisplayRecord(FILE *outFilep, afs_int32 *alp, afs_int32 rsize)
                    fprintf(outFilep, "p%d:%d ", i, alp[pix]);
                    break;
                case ICL_TYPE_LONG:
-#ifdef AFS_SGI61_ENV
+#if ICL_LONG == 2
                    tempParam = alp[pix];
                    tempParam <<= 32;
                    tempParam |= alp[pix + 1];
                    fprintf(outFilep, "p%d:%" AFS_INT64_FMT " ", i, tempParam);
-#else /* AFS_SGI61_ENV */
+#else
                    fprintf(outFilep, "p%d:%d ", i, alp[pix]);
-#endif /* AFS_SGI61_ENV */
+#endif
                    break;
                case ICL_TYPE_POINTER:
-#ifdef AFS_SGI61_ENV
+#if ICL_LONG == 2
                    tempParam = alp[pix];
                    tempParam <<= 32;
                    tempParam |= alp[pix + 1];
                    fprintf(outFilep, "p%d:0x%llx ", i, tempParam);
-#else /* AFS_SGI61_ENV */
+#else
                    fprintf(outFilep, "p%d:0x%x ", i, alp[pix]);
-#endif /* AFS_SGI61_ENV */
+#endif
                    break;
                case ICL_TYPE_HYPER:
                case ICL_TYPE_INT64: