Subject: bug#74805: 30.0.92; Trying to build scratch/igc on Cygwin

From: Ken Brown <[email-masked]>
Date: Thu, 12 Dec 2024 13:12:46 -0500

On 12/12/2024 1:09 AM, Eli Zaretskii wrote:
>> Date: Wed, 11 Dec 2024 17:50:40 -0500
>> From: Ken Brown <[email-masked]>
>>
>> I've made a first attempt to port mps to Cygwin.  If anyone else is
>> interested in seeing this or helping, you can find my work at
>>
>>     https://github.com/kbrow1i/mps-cygwin
>>
>> This is a fork of the mps git repo with two commits on top.
> 
> Thanks, good news!  Could you please post the patches here, so that
> they are recorded in our bug tracker?

Unfortunately, the approach I tried, which was suggested by one of the 
MPS developers, fails badly.  I already mentioned the test failures, but 
now I've tried to run Emacs interactively, and I can't even get a 
directory listing.  For the record, I'm attaching the patches I've 
accumulated so far, but I'll have to try a completely different 
approach.  This will probably take me a while.
> 
>> With the current attempt, I can build the scratch/igc branch, but there
>> are many test failures.  For example, when I run the process-tests, I
>> get 19 failures and 8 skipped tests.  But on the master branch I get no
>> failures and only 3 skipped.
>>
>> This probably means that my current attempt to port mps is no good, and
>> I have to go back to the drawing board.
> 
> Did you run the MPS test suite, and if you did, were there any
> failures?  My suggestion is to make sure the MPS test suite passes
> cleanly, including in several consecutive runs (when I ported MPS to
> 32-bit MinGW, I had intermittent failures which only happened once in
> several runs, until I fixed that).

There are lots of test failures.  Back to the drawing board.

Ken
From 30976ef9d2407092b44f2f6126dcddef717252ca Mon Sep 17 00:00:00 2001
From: Ken Brown <[email-masked]>
Date: Mon, 9 Dec 2024 13:29:04 -0500
Subject: [PATCH 1/4] Porting to Cygwin, first attempt

Add Cygwin as a recognized platform.  Mostly copy the FreeBSD case.

This builds but fails to work properly because of an mmap problem on
Cygwin: You can't remap without first unmapping.  See

  https://cygwin.com/pipermail/cygwin/2018-February/236044.html

It's probably possible to work around this by replacing mmap and
friends by direct calls to VirtualAlloc and friends.
---
 code/config.h   |  4 ++--
 code/cyi6gc.gmk | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 code/lockix.c   |  5 +++--
 code/mps.c      | 15 +++++++++++++
 code/mpstd.h    | 19 ++++++++++++++++
 code/prmccyi6.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++
 code/prmcix.c   |  4 ++--
 code/protix.c   |  5 +++--
 code/protsgix.c |  4 ++--
 code/pthrdext.c |  4 ++--
 code/testthr.h  |  3 ++-
 code/thix.c     |  4 ++--
 code/vmix.c     |  5 +++--
 13 files changed, 168 insertions(+), 17 deletions(-)
 create mode 100644 code/cyi6gc.gmk
 create mode 100644 code/prmccyi6.c

diff --git a/code/config.h b/code/config.h
index 02d335efec6f..5abf6c982596 100644
--- a/code/config.h
+++ b/code/config.h
@@ -543,7 +543,7 @@
  * <https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html>
  */
 
-#if defined(MPS_OS_LI)
+#if defined(MPS_OS_LI) || defined(MPS_OS_CY)
 
 #if defined(_XOPEN_SOURCE) && _XOPEN_SOURCE < 500
 #undef _XOPEN_SOURCE
@@ -616,7 +616,7 @@
 
 /* POSIX thread extensions configuration -- see <code/pthrdext.c> */
 
-#if defined(MPS_OS_LI) || defined(MPS_OS_FR)
+#if defined(MPS_OS_LI) || defined(MPS_OS_FR) || defined(MPS_OS_CY)
 
 /* PTHREADEXT_SIGSUSPEND -- signal used to suspend a thread
  * <design/pthreadext#.impl.signals>
diff --git a/code/cyi6gc.gmk b/code/cyi6gc.gmk
new file mode 100644
index 000000000000..98b863274bac
--- /dev/null
+++ b/code/cyi6gc.gmk
@@ -0,0 +1,55 @@
+# -*- makefile -*-
+#
+# cyi6gc.gmk: BUILD FOR CYGWIN/x64/GCC PLATFORM
+#
+# $Id$
+# Copyright (c) 2001-2020 Ravenbrook Limited.  See end of file for license.
+
+PFM = cyi6gc
+
+MPMPF = \
+    lockix.c \
+    prmcanan.c \
+    prmccyi6.c \
+    prmci6.c \
+    protix.c \
+    protsgix.c \
+    pthrdext.c \
+    span.c \
+    thix.c \
+    vmix.c
+
+LIBS = -lm -lpthread
+
+include gc.gmk
+include comm.gmk
+
+
+# C. COPYRIGHT AND LICENSE
+#
+# Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the
+#    distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/code/lockix.c b/code/lockix.c
index a6555f5bb360..3c4e1939c739 100644
--- a/code/lockix.c
+++ b/code/lockix.c
@@ -31,8 +31,9 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
-#error "lockix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
+  && !defined(MPS_OS_CY)
+#error "lockix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
 #endif
 
 #include "lock.h"
diff --git a/code/mps.c b/code/mps.c
index e7872b3c14a0..a2bb7f003f5d 100644
--- a/code/mps.c
+++ b/code/mps.c
@@ -256,6 +256,21 @@
 #include "spw3i6.c"     /* Windows on x86-64 stack probe */
 #include "mpsiw3.c"     /* Windows interface layer extras */
 
+/* Cygwin on x86-64 built with GCC */
+
+#elif defined(MPS_PF_CYI6GC)
+
+#include "lockix.c"     /* Posix locks */
+#include "thix.c"       /* Posix threading */
+#include "pthrdext.c"   /* Posix thread extensions */
+#include "vmix.c"       /* Posix virtual memory */
+#include "protix.c"     /* Posix protection */
+#include "protsgix.c"   /* Posix signal handling */
+#include "prmcanan.c"   /* generic architecture mutator context */
+#include "prmcix.c"     /* Posix mutator context */
+#include "prmccyi6.c"   /* x86-64 for Cygwin mutator context */
+#include "span.c"       /* generic stack probe */
+
 #else
 
 #error "Unknown platform -- can't determine platform specific parts."
diff --git a/code/mpstd.h b/code/mpstd.h
index 7df1c2a12f6d..d2c21d263064 100644
--- a/code/mpstd.h
+++ b/code/mpstd.h
@@ -392,6 +392,25 @@
 #define MPS_PF_ALIGN    8

+/* GCC 12.4.0, gcc -E -dM */
+
+#elif defined(__CYGWIN__) && defined(__x86_64__) && defined(__GNUC__) \
+      && !defined(__clang__)
+#if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_CYI6GC)
+#error "specified CONFIG_PF_... inconsistent with detected cyi6gc"
+#endif
+#define MPS_PF_CYI6GC
+#define MPS_PF_STRING   "cyi6gc"
+#define MPS_OS_CY
+#define MPS_ARCH_I6
+#define MPS_BUILD_GC
+#define MPS_T_WORD      unsigned long
+#define MPS_T_ULONGEST  unsigned long
+#define MPS_WORD_WIDTH  64
+#define MPS_WORD_SHIFT  6
+#define MPS_PF_ALIGN    8
+
+
 #else
 #error "The MPS Kit does not have a configuration for this platform out of the box; see manual/build.txt"
 #endif
diff --git a/code/prmccyi6.c b/code/prmccyi6.c
new file mode 100644
index 000000000000..e5085185b369
--- /dev/null
+++ b/code/prmccyi6.c
@@ -0,0 +1,58 @@
+/* prmccyi6.c: MUTATOR CONTEXT x64 (CYGWIN)
+ *
+ * $Id$
+ * Copyright (c) 2001-2020 Ravenbrook Limited.  See end of file for license.
+ *
+ * .purpose: Implement the mutator context module. <design/prmc>.
+ *
+ *
+ * ASSUMPTIONS
+ *
+ * .sp: The stack pointer in the context is RSP.
+ */
+
+#include "prmcix.h"
+#include "prmci6.h"
+
+SRCID(prmcfri6, "$Id$");
+
+#if !defined(MPS_OS_CY) || !defined(MPS_ARCH_I6)
+#error "prmccyi6.c is specific to MPS_OS_CY and MPS_ARCH_I6"
+#endif
+
+
+Addr MutatorContextSP(MutatorContext context)
+{
+  AVERT(MutatorContext, context);
+  return (Addr)context->ucontext->uc_mcontext.rsp;   /* .sp */
+}
+
+
+/* C. COPYRIGHT AND LICENSE
+ *
+ * Copyright (C) 2001-2020 Ravenbrook Limited <https://www.ravenbrook.com/>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
diff --git a/code/prmcix.c b/code/prmcix.c
index 8529405ae9c7..0af391eb45c7 100644
--- a/code/prmcix.c
+++ b/code/prmcix.c
@@ -14,8 +14,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
-#error "prmcix.c is specific to MPS_OS_FR or MPS_OS_LI"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
+#error "prmcix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
 #endif
 
 #include "prmcix.h"
diff --git a/code/protix.c b/code/protix.c
index fa6541913b71..18f29430e07d 100644
--- a/code/protix.c
+++ b/code/protix.c
@@ -35,8 +35,9 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
-#error "protix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
+  && !defined(MPS_OS_CY)
+#error "protix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
 #endif
 
 #include "vm.h"
diff --git a/code/protsgix.c b/code/protsgix.c
index 966569c92934..9540908300d8 100644
--- a/code/protsgix.c
+++ b/code/protsgix.c
@@ -22,8 +22,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
-#error "protsgix.c is specific to MPS_OS_FR or MPS_OS_LI"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
+#error "protsgix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
 #endif
 
 #include "prmcix.h"
diff --git a/code/pthrdext.c b/code/pthrdext.c
index 7619468a1872..c143b5cf4db2 100644
--- a/code/pthrdext.c
+++ b/code/pthrdext.c
@@ -16,8 +16,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
-#error "pthrdext.c is specific to MPS_OS_FR or MPS_OS_LI"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
+#error "pthrdext.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
 #endif
 
 #include "pthrdext.h"
diff --git a/code/testthr.h b/code/testthr.h
index a50dad1e5d09..13dcb3fc8924 100644
--- a/code/testthr.h
+++ b/code/testthr.h
@@ -45,7 +45,8 @@ typedef struct testthr_t {
   void *result;               /* result returned from start */
 } testthr_t;
 
-#elif defined(MPS_OS_FR) || defined(MPS_OS_LI) || defined(MPS_OS_XC)
+#elif defined(MPS_OS_FR) || defined(MPS_OS_LI) || defined(MPS_OS_XC) \
+  || defined(MPS_OS_CY)
 
 #include <pthread.h>
 
diff --git a/code/thix.c b/code/thix.c
index c47f82ad3b87..b89a6b4f43ab 100644
--- a/code/thix.c
+++ b/code/thix.c
@@ -34,8 +34,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
-#error "thix.c is specific to MPS_OS_FR or MPS_OS_LI"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
+#error "thix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
 #endif
 
 #include "prmcix.h"
diff --git a/code/vmix.c b/code/vmix.c
index 4bdd0caefadc..8fce9389e742 100644
--- a/code/vmix.c
+++ b/code/vmix.c
@@ -40,8 +40,9 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
-#error "vmix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
+  && !defined(MPS_OS_CY)
+#error "vmix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
 #endif
 
 #include "vm.h"
-- 
2.45.1

From 0c8c2d6f3168a56474b222c919b051641948b3bf Mon Sep 17 00:00:00 2001
From: Ken Brown <[email-masked]>
Date: Mon, 9 Dec 2024 17:41:47 -0500
Subject: [PATCH 2/4] Porting to Cygwin, second attempt

Use GCC with the Windows interface.  The MPS builds, but I don't know
yet if it works well in Emacs.
---
 code/config.h   |  2 +-
 code/lockix.c   |  5 ++---
 code/mps.c      | 32 ++++++++++++++++++++++----------
 code/mpstd.h    | 22 ++++++++++++++++++++--
 code/prmcix.c   |  4 ++--
 code/protix.c   |  5 ++---
 code/protsgix.c |  4 ++--
 code/pthrdext.c |  4 ++--
 code/spw3i6.c   |  5 +++++
 code/testlib.h  |  2 +-
 code/testthr.h  |  3 +--
 code/th.h       |  6 ++++++
 code/thix.c     |  4 ++--
 code/vmix.c     |  5 ++---
 14 files changed, 70 insertions(+), 33 deletions(-)

diff --git a/code/config.h b/code/config.h
index 5abf6c982596..0201094a0e15 100644
--- a/code/config.h
+++ b/code/config.h
@@ -616,7 +616,7 @@
 
 /* POSIX thread extensions configuration -- see <code/pthrdext.c> */
 
-#if defined(MPS_OS_LI) || defined(MPS_OS_FR) || defined(MPS_OS_CY)
+#if defined(MPS_OS_LI) || defined(MPS_OS_FR)
 
 /* PTHREADEXT_SIGSUSPEND -- signal used to suspend a thread
  * <design/pthreadext#.impl.signals>
diff --git a/code/lockix.c b/code/lockix.c
index 3c4e1939c739..a6555f5bb360 100644
--- a/code/lockix.c
+++ b/code/lockix.c
@@ -31,9 +31,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
-  && !defined(MPS_OS_CY)
-#error "lockix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
+#error "lockix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
 #endif
 
 #include "lock.h"
diff --git a/code/mps.c b/code/mps.c
index a2bb7f003f5d..2b4f13885001 100644
--- a/code/mps.c
+++ b/code/mps.c
@@ -260,16 +260,28 @@
 
 #elif defined(MPS_PF_CYI6GC)
 
-#include "lockix.c"     /* Posix locks */
-#include "thix.c"       /* Posix threading */
-#include "pthrdext.c"   /* Posix thread extensions */
-#include "vmix.c"       /* Posix virtual memory */
-#include "protix.c"     /* Posix protection */
-#include "protsgix.c"   /* Posix signal handling */
-#include "prmcanan.c"   /* generic architecture mutator context */
-#include "prmcix.c"     /* Posix mutator context */
-#include "prmccyi6.c"   /* x86-64 for Cygwin mutator context */
-#include "span.c"       /* generic stack probe */
+/* #include "lockix.c"     /\* Posix locks *\/ */
+/* #include "thix.c"       /\* Posix threading *\/ */
+/* #include "pthrdext.c"   /\* Posix thread extensions *\/ */
+/* #include "vmix.c"       /\* Posix virtual memory *\/ */
+/* #include "protix.c"     /\* Posix protection *\/ */
+/* #include "protsgix.c"   /\* Posix signal handling *\/ */
+/* #include "prmcanan.c"   /\* generic architecture mutator context *\/ */
+/* #include "prmcix.c"     /\* Posix mutator context *\/ */
+/* #include "prmccyi6.c"   /\* x86-64 for Cygwin mutator context *\/ */
+/* #include "span.c"       /\* generic stack probe *\/ */
+
+/* Use the Windows interface. */
+
+#include "lockw3.c"     /* Windows locks */
+#include "thw3.c"       /* Windows threading */
+#include "vmw3.c"       /* Windows virtual memory */
+#include "protw3.c"     /* Windows protection */
+#include "prmci6.c"     /* x86-64 mutator context */
+#include "prmcw3.c"     /* Windows mutator context */
+#include "prmcw3i6.c"   /* Windows on x86-64 mutator context */
+#include "spw3i6.c"     /* Windows on x86-64 stack probe */
+#include "mpsiw3.c"     /* Windows interface layer extras */
 
 #else
 
diff --git a/code/mpstd.h b/code/mpstd.h
index d2c21d263064..8730282abeb9 100644
--- a/code/mpstd.h
+++ b/code/mpstd.h
@@ -394,6 +394,24 @@
 
 /* GCC 12.4.0, gcc -E -dM */
 
+/* #elif defined(__CYGWIN__) && defined(__x86_64__) && defined(__GNUC__) \ */
+/*       && !defined(__clang__) */
+/* #if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_CYI6GC) */
+/* #error "specified CONFIG_PF_... inconsistent with detected cyi6gc" */
+/* #endif */
+/* #define MPS_PF_CYI6GC */
+/* #define MPS_PF_STRING   "cyi6gc" */
+/* #define MPS_OS_CY */
+/* #define MPS_ARCH_I6 */
+/* #define MPS_BUILD_GC */
+/* #define MPS_T_WORD      unsigned long */
+/* #define MPS_T_ULONGEST  unsigned long */
+/* #define MPS_WORD_WIDTH  64 */
+/* #define MPS_WORD_SHIFT  6 */
+/* #define MPS_PF_ALIGN    8 */
+
+/* Use Cygwin GCC on Windows interface. */
+
 #elif defined(__CYGWIN__) && defined(__x86_64__) && defined(__GNUC__) \
       && !defined(__clang__)
 #if defined(CONFIG_PF_STRING) && ! defined(CONFIG_PF_CYI6GC)
@@ -402,14 +420,14 @@
 #define MPS_PF_CYI6GC
 #define MPS_PF_STRING   "cyi6gc"
 #define MPS_OS_CY
+#define MPS_OS_W3
 #define MPS_ARCH_I6
 #define MPS_BUILD_GC
 #define MPS_T_WORD      unsigned long
 #define MPS_T_ULONGEST  unsigned long
 #define MPS_WORD_WIDTH  64
 #define MPS_WORD_SHIFT  6
-#define MPS_PF_ALIGN    8
-
+#define MPS_PF_ALIGN    16
 
 #else
 #error "The MPS Kit does not have a configuration for this platform out of the box; see manual/build.txt"
diff --git a/code/prmcix.c b/code/prmcix.c
index 0af391eb45c7..8529405ae9c7 100644
--- a/code/prmcix.c
+++ b/code/prmcix.c
@@ -14,8 +14,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
-#error "prmcix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
+#error "prmcix.c is specific to MPS_OS_FR or MPS_OS_LI"
 #endif
 
 #include "prmcix.h"
diff --git a/code/protix.c b/code/protix.c
index 18f29430e07d..fa6541913b71 100644
--- a/code/protix.c
+++ b/code/protix.c
@@ -35,9 +35,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
-  && !defined(MPS_OS_CY)
-#error "protix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
+#error "protix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
 #endif
 
 #include "vm.h"
diff --git a/code/protsgix.c b/code/protsgix.c
index 9540908300d8..966569c92934 100644
--- a/code/protsgix.c
+++ b/code/protsgix.c
@@ -22,8 +22,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
-#error "protsgix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
+#error "protsgix.c is specific to MPS_OS_FR or MPS_OS_LI"
 #endif
 
 #include "prmcix.h"
diff --git a/code/pthrdext.c b/code/pthrdext.c
index c143b5cf4db2..7619468a1872 100644
--- a/code/pthrdext.c
+++ b/code/pthrdext.c
@@ -16,8 +16,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
-#error "pthrdext.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
+#error "pthrdext.c is specific to MPS_OS_FR or MPS_OS_LI"
 #endif
 
 #include "pthrdext.h"
diff --git a/code/spw3i6.c b/code/spw3i6.c
index d06b4afcab03..ef2e49fb2a38 100644
--- a/code/spw3i6.c
+++ b/code/spw3i6.c
@@ -16,7 +16,12 @@
 #error "spw3i6.c is specific to MPS_OS_W3"
 #endif
 
+#ifndef MPS_OS_CY
 #include <stdlib.h> /* _alloca */
+#else
+#include <alloca.h>
+#define _alloca alloca
+#endif

 void StackProbe(Size depth)
diff --git a/code/testlib.h b/code/testlib.h
index 9a414f2b5dd0..085681e033ea 100644
--- a/code/testlib.h
+++ b/code/testlib.h
@@ -71,7 +71,7 @@
  * <https://docs.microsoft.com/en-gb/cpp/c-runtime-library/reference/alloca>
  */
 
-#if defined(MPS_OS_W3)
+#if defined(MPS_OS_W3) && !defined(MPS_OS_CY)
 
 #define alloca _alloca
 
diff --git a/code/testthr.h b/code/testthr.h
index 13dcb3fc8924..a50dad1e5d09 100644
--- a/code/testthr.h
+++ b/code/testthr.h
@@ -45,8 +45,7 @@ typedef struct testthr_t {
   void *result;               /* result returned from start */
 } testthr_t;
 
-#elif defined(MPS_OS_FR) || defined(MPS_OS_LI) || defined(MPS_OS_XC) \
-  || defined(MPS_OS_CY)
+#elif defined(MPS_OS_FR) || defined(MPS_OS_LI) || defined(MPS_OS_XC)
 
 #include <pthread.h>
 
diff --git a/code/th.h b/code/th.h
index 08e01d6cc3d3..c939e371bc39 100644
--- a/code/th.h
+++ b/code/th.h
@@ -68,9 +68,15 @@ extern Thread ThreadRingThread(Ring threadRing);
 
 extern Arena ThreadArena(Thread thread);
 
+#ifdef MP_OS_W3
 extern Res ThreadScan(ScanState ss, Thread thread, void *stackCold,
                       mps_area_scan_t scan_area,
                       void *closure);
+#else
+extern Res ThreadScan(ScanState ss, Thread thread, Word *stackCold,
+                      mps_area_scan_t scan_area,
+                      void *closure);
+#endif
 
 extern void ThreadSetup(void);
 
diff --git a/code/thix.c b/code/thix.c
index b89a6b4f43ab..c47f82ad3b87 100644
--- a/code/thix.c
+++ b/code/thix.c
@@ -34,8 +34,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_CY)
-#error "thix.c is specific to MPS_OS_FR, MPS_OS_LI, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI)
+#error "thix.c is specific to MPS_OS_FR or MPS_OS_LI"
 #endif
 
 #include "prmcix.h"
diff --git a/code/vmix.c b/code/vmix.c
index 8fce9389e742..4bdd0caefadc 100644
--- a/code/vmix.c
+++ b/code/vmix.c
@@ -40,9 +40,8 @@
 
 #include "mpm.h"
 
-#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC) \
-  && !defined(MPS_OS_CY)
-#error "vmix.c is specific to MPS_OS_FR, MPS_OS_LI, MPS_OS_XC, or MPS_OS_CY"
+#if !defined(MPS_OS_FR) && !defined(MPS_OS_LI) && !defined(MPS_OS_XC)
+#error "vmix.c is specific to MPS_OS_FR, MPS_OS_LI or MPS_OS_XC"
 #endif
 
 #include "vm.h"
-- 
2.45.1

From 14e2acf82387429bc05896c57d5114edea916479 Mon Sep 17 00:00:00 2001
From: Ken Brown <[email-masked]>
Date: Wed, 11 Dec 2024 15:51:45 -0500
Subject: [PATCH 3/4] Update Cygwin Makefile

---
 code/cyi6gc.gmk | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/code/cyi6gc.gmk b/code/cyi6gc.gmk
index 98b863274bac..7e707a291dc6 100644
--- a/code/cyi6gc.gmk
+++ b/code/cyi6gc.gmk
@@ -7,17 +7,28 @@
 
 PFM = cyi6gc
 
+# MPMPF = \
+#     lockix.c \
+#     prmcanan.c \
+#     prmccyi6.c \
+#     prmci6.c \
+#     protix.c \
+#     protsgix.c \
+#     pthrdext.c \
+#     span.c \
+#     thix.c \
+#     vmix.c
+
 MPMPF = \
-    lockix.c \
-    prmcanan.c \
-    prmccyi6.c \
+    lockw3.c \
+    thw3.c \
+    vmw3.c \
+    protw3.c \
     prmci6.c \
-    protix.c \
-    protsgix.c \
-    pthrdext.c \
-    span.c \
-    thix.c \
-    vmix.c
+    prmcw3.c \
+    prmcw3i6.c \
+    spw3i6.c \
+    mpsiw3.c
 
 LIBS = -lm -lpthread
 
-- 
2.45.1

From 6c6fae9c920e3db08219a3c8086a49f32056e96c Mon Sep 17 00:00:00 2001
From: Ken Brown <[email-masked]>
Date: Wed, 11 Dec 2024 16:06:02 -0500
Subject: [PATCH 4/4] Pacifying testsuite: don't use long long

---
 code/testlib.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/code/testlib.h b/code/testlib.h
index 085681e033ea..b2983d501490 100644
--- a/code/testlib.h
+++ b/code/testlib.h
@@ -112,7 +112,7 @@
 #error "How many beans make five?"
 #endif
 
-#if defined(MPS_OS_W3) && defined(MPS_ARCH_I6)
+#if defined(MPS_OS_W3) && defined(MPS_ARCH_I6) && !defined(MPS_OS_CY)
 #define PRIuLONGEST "llu"
 #define PRIdLONGEST "lld"
 #define SCNuLONGEST "llu"
-- 
2.45.1