<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/0001dbcec9188d9f1d4c0de4f3bf62bff985d3fd">https://github.com/macports/macports-legacy-support/commit/0001dbcec9188d9f1d4c0de4f3bf62bff985d3fd</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 0001dbcec9188d9f1d4c0de4f3bf62bff985d3fd
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Apr 25 21:28:42 2025 -0700

<span style='display:block; white-space:pre;color:#404040;'>    test_packet: Ignore errors caused by Rosetta 2 bug.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See comment for details.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'>    Now passes on all platforms, including with Rosetta 2.
</span>---
 test/test_packet.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 64 insertions(+), 2 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_packet.c b/test/test_packet.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 543736c..cc041dc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_packet.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_packet.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -160,6 +160,64 @@ mach2ns(uint64_t mach_time)
</span>   return (double) mach_time * mach_scale.numer / mach_scale.denom;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Rosetta 2 bug
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * There is a bug in all current versions of Rosetta 2 that badly screws up
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * mach-based packet times.  Rosetta 2 pretends to have a 1GHz mach clock,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * to be more like real x86 systems, and appropriately compensates for this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * in most clock computations.  But mach-based packet timestamps fail to do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * this, resulting in values that are off by a factor of the true mach-time
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ratio.  E.g., on the M1 (mach ratio 125/3), the packet time is underreported
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * by a factor of ~41.7.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Note that this is not a legacy-support bug, since it only applies to OS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * versions that don't use the legacy-support implementations of the clock
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * functions.  Nevertheless, the test is expected to pass on all OS versions,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * so we need to disable the failures in this case.  In the interests of full
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * disclosure, we don't disable the error messages; we only disable the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * failures.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Although it might be possible to compensate for the error, this would be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * an unnecessary complication for a test primarily intended to test the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * legacy-support code, not work around Apple's bugs.  It also might be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * nontrivial to obtain the true mach-time scale factor when running under
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Rosetta 2.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    && defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* sysctl to check whether we're running in Rosetta 2 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYSCTL_TRANSLATED "sysctl.proc_translated"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Test whether running under Rosetta */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* 0 no, 1 yes */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+check_rosetta(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int translated;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  size_t translated_sz = sizeof(translated);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (sysctlbyname(SYSCTL_TRANSLATED, &translated, &translated_sz,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   NULL, 0) < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    /* If sysctl failed, must be really native. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return translated ? 1 : 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else /* Not OS 11.x+ x86_64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int check_rosetta(void) { return 0;}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /* Not OS 11.x+ x86_64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Now back to our regularly scheduled packet tests */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* Data for tests */
 
 static const char sample[] = "The Quick Brown Fox";
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -346,7 +404,7 @@ static int
</span> test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
                int verbose)
 {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-  int ret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int ret = 0, rret = 0;
</span>   const char *tsname = ts_type_names[tstype];
   const char *err = NULL;
   times_t times;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -355,6 +413,7 @@ test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
</span>   struct cmsghdr *cmsg;
   int cmsglvl, cmsgtype, hdrlen, datalen, xdatalen;
   uint32_t *datap, *xdatap;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  int rosetta = check_rosetta();
</span> 
   if (verbose) printf("  Testing %s:\n", name);
   cbuflen = sizeof(cbuf);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -482,12 +541,15 @@ test_timestamp(const char *name, ts_type_t tstype, int sockopt, int scmtype,
</span>       if (tsval < tslow || tsval > tshigh) {
         printf("    %s %s value %llu is not between %llu and %llu\n",
                name, tsname, tsval, tslow, tshigh);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        ret = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (rosetta) rret = 1; else ret = 1;
</span>       }
     }
     if (verbose && !ret) printf("    %s value (ns) is %llu\n",
                                 tsname, tsvalns);
   }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (rret && !ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    printf("      Ignoring errors caused by Rosetta 2 bug\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span> 
   return ret;
 }
</pre><pre style='margin:0'>

</pre>