<pre style='margin:0'>
Herby Gillot (herbygillot) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/d1f240affd993dd3204f8b70c6d28195959df797">https://github.com/macports/macports-ports/commit/d1f240affd993dd3204f8b70c6d28195959df797</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new d1f240affd9 sbcl: pin as 2.3.5 for i386 and powerpc
</span>d1f240affd9 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit d1f240affd993dd3204f8b70c6d28195959df797
</span>Author: Kirill A. Korinsky <kirill@korins.ky>
AuthorDate: Sat Jun 10 02:16:15 2023 +0200

<span style='display:block; white-space:pre;color:#404040;'>    sbcl: pin as 2.3.5 for i386 and powerpc
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/29832
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/47288
</span>---
 lang/sbcl/Portfile                                 |  86 +--
 lang/sbcl/files/0005-Use-MacPorts-zstd.patch       |  43 --
 .../1001-x86-Darwin-Revert-x86-darwin-files.patch  | 697 +++++++++++++++++++++
 ...Revert-Perform-darwin-related-housekeepin.patch | 207 ++++++
 ...-x86-Darwin-Remove-mach-exception-handler.patch | 437 +++++++++++++
 ...win-disable-custom-nanosleep-before-10.6.patch} |  10 +-
 ...recovery-support-non-dispatch-semaphores.patch} |  25 +-
 ...win-mask-out-O_LARGEFILE-in-fcntl.1-test.patch} |   6 +-
 ...> 1007-x86-Darwin-revert-OS_THREAD_STACK.patch} |  10 +-
 ...x86-Darwin-fix-build-by-old-preprocessor.patch} |   4 +-
 ...6-Darwin-disable-failing-stat-mode-tests.patch} |   8 +-
 ...1010-x86-Darwin-add-missed-OS_CONTEXT_PC.patch} |   2 +-
 ...atch => 1011-x86-Darwin-fix-syntax-typos.patch} |  21 +-
 ...Revert-Delete-support-for-and-darwin-ppc.patch} | 116 ++--
 ...-ppc-Darwin-Config.ppc-follow-up-changes.patch} |  39 +-
 ...Darwin-make-config.sh-use-gcc-tls-for-ppc.patch |  26 -
 ...pc-assem.S-fix-wrong-assembler-code-chun.patch} |   6 +-
 ...ch => 1015-ppc-Darwin-Misc-fixes-for-PPC.patch} |  43 +-
 ...pc-assem-a-minor-fix-to-assembler-syntax.patch} |   4 +-
 ...-building-by-lisp-without-endian-features.patch |  33 +
 ...ement-os_tsd_get_direct-for-macOS-before-.patch |  85 +++
 21 files changed, 1639 insertions(+), 269 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/Portfile b/lang/sbcl/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index c252cad2935..c1d6f8b16e3 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3,6 +3,7 @@
</span> PortSystem      1.0
 
 PortGroup       legacysupport 1.1
<span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup       compiler_blacklist_versions 1.0
</span> 
 name            sbcl
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -41,42 +42,40 @@ checksums       rmd160  95a02d7a489137602ebba333b83bfc1d9eb794be \
</span>                 sha256  89c90720cf9d05dbcd90d690e381a2514c0f1807159e0d7222220c5a8c2d5186 \
                 size    7474392
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# NOTE: keep so-called legacy version of SBCL on everything before 10.7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Historically 2.2.5 was the last version with support x86/Darwin, and 2.2.2 was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# the last version with ppc/Darwin. We had backported support of ppc/Darwin to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# 2.2.5 and use it as baseline for legacy version.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-if {${os.platform} eq "darwin" && ${os.major} < 11} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    version     2.2.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    revision    1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    epoch       1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# NOTE: Historically, the last version to support x86/Darwin and ppc/Darwin was
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 2.2.5 and 2.2.2. Here, we have backported it to nearly the latest version. On
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# such platforms, we have a different epoch and versioning.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Please do not update it without testing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${os.platform} eq "darwin" && ${configure.build_arch} in [list ppc i386]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    version     2.3.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    revision    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    epoch       [ expr ${epoch} + 1 ]
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    checksums   rmd160  55225af6c20d39db1b158b7c07685ff6e3a8d5bf \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sha256  8584b541370fd6ad6e58d3f97982077dfcab240f30d4e9b18f15da91c2f13ed1 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                size    7029912
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    checksums   rmd160  95a02d7a489137602ebba333b83bfc1d9eb794be \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                sha256  89c90720cf9d05dbcd90d690e381a2514c0f1807159e0d7222220c5a8c2d5186 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                size    7474392
</span> 
     # See: https://github.com/catap/sbcl/tree/macports-legacy
     patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                1001-Darwin-disable-custom-nanosleep-before-10.6.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1002-Darwin-recovery-support-non-dispatch-semaphores.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1003-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1004-x86-Darwin-revert-OS_THREAD_STACK.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1005-x86-Darwin-fix-build-by-old-preprocessor.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1006-x86-Darwin-disable-failing-stat-mode-tests.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1007-x86-Darwin-add-missed-OS_CONTEXT_PC.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1008-x86-Darwin-fix-syntax-typos.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1009-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1010-ppc-Darwin-Config.ppc-use-right-compiler-and-deploym.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1011-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1012-ppc-Darwin-Misc-fixes-for-PPC.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1013-ppc-Darwin-make-config.sh-use-gcc-tls-for-ppc.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1014-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # NOTE: Mach exception handler was a pain and was removed since 2.2.9,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # let me disabled it anyway that makes things more consistent and allows to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # avoid issues by different SDK / XCode version for legacy systems.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # See: https://github.com/sbcl/sbcl/commit/7026bb841aa63c4d43339afb49d837a4497c468a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    build.post_args-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                --without-mach-exception-handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1001-x86-Darwin-Revert-x86-darwin-files.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1003-x86-Darwin-Remove-mach-exception-handler.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1004-Darwin-disable-custom-nanosleep-before-10.6.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1005-Darwin-recovery-support-non-dispatch-semaphores.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1006-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1007-x86-Darwin-revert-OS_THREAD_STACK.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1008-x86-Darwin-fix-build-by-old-preprocessor.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1009-x86-Darwin-disable-failing-stat-mode-tests.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1010-x86-Darwin-add-missed-OS_CONTEXT_PC.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1011-x86-Darwin-fix-syntax-typos.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1012-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1013-ppc-Darwin-Config.ppc-follow-up-changes.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1014-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1015-ppc-Darwin-Misc-fixes-for-PPC.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1016-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1017-Fix-building-by-lisp-without-endian-features.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                1018-Darwin-implement-os_tsd_get_direct-for-macOS-before-.patch
</span> }
 
 distfiles       ${name}-${version}-source${extract.suffix}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -84,6 +83,8 @@ worksrcdir      ${name}-${version}
</span> 
 depends_build-append \
                 port:sbcl-bootstrap
<span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_skip_archcheck-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                sbcl-bootstrap
</span> 
 # clock_gettime
 legacysupport.newest_darwin_requires_legacy 15
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -91,6 +92,11 @@ legacysupport.newest_darwin_requires_legacy 15
</span> patchfiles-append \
                 0003-Use-CLOCK_MONOTONIC-when-CLOCK_PROCESS_CPUTIME_ID-un.patch
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Uses: __attribute__((aligned(8)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# See: https://bugs.launchpad.net/sbcl/+bug/1991485
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compiler.blacklist-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                *gcc-3.* *gcc-4.*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> post-patch {
     reinplace "s|@@PREFIX@@|${prefix}|g" \
                 ${worksrcpath}/contrib/asdf/uiop.lisp
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -178,18 +184,12 @@ variant threads description {Enable multi-threaded runtime using the Mach pthrea
</span> 
 variant fancy conflicts threads description {Configure SBCL compilation with all available compatible options (including threading).} {
     build.args-append   --fancy
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Before 2.2.6 it ueses lz to compress core
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    depends_lib-append  port:zlib
</span>     # As of version 2.2.6, zstd is used for core compression.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[vercmp ${version} 2.2.6] >= 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-delete  port:zlib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        depends_lib-append  port:zstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        patchfiles-append   0005-Use-MacPorts-zstd.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        post-patch {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            reinplace -W ${worksrcpath} "s|@@PREFIX@@|${prefix}|g" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                {*}[glob ${worksrcpath}/src/runtime/Config.*-darwin]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib-append  port:zstd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        reinplace -W ${worksrcpath} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            "s|  OS_LIBS += -lzstd|  OS_LIBS += -L${prefix}/lib -lzstd\\\n  DEPEND_FLAGS += -I${prefix}/include\\\n  CFLAGS += -I${prefix}/include|g" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            {*}[glob ${worksrcpath}/src/runtime/Config.*-darwin]
</span>     }
 }
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/0005-Use-MacPorts-zstd.patch b/lang/sbcl/files/0005-Use-MacPorts-zstd.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 7c96e60b903..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/0005-Use-MacPorts-zstd.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,43 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 4a8c4ed98b62317b2e216ee21f67703a89b33634 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Tue, 6 Jun 2023 10:20:33 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Use MacPorts zstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.arm64-darwin  | 4 +++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.x86-64-darwin | 4 +++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 2 files changed, 6 insertions(+), 2 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/Config.arm64-darwin src/runtime/Config.arm64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0d3ed389a..d66bd6099 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/Config.arm64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.arm64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -18,7 +18,9 @@ ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   OS_LIBS += -lpthread
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ifdef LISP_FEATURE_SB_CORE_COMPRESSION
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  OS_LIBS += -lzstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  OS_LIBS += -L@@PREFIX@@/lib -lzstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  DEPEND_FLAGS += -I@@PREFIX@@/include
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  CFLAGS += -I@@PREFIX@@/include
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   LIBSBCL = libsbcl.a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/Config.x86-64-darwin src/runtime/Config.x86-64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2d9e7a669..5a4181f10 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/Config.x86-64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.x86-64-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -29,7 +29,9 @@ ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   OS_LIBS += -lpthread
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ifdef LISP_FEATURE_SB_CORE_COMPRESSION
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  OS_LIBS += -lzstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  OS_LIBS += -L@@PREFIX@@/lib -lzstd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  DEPEND_FLAGS += -I@@PREFIX@@/include
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  CFLAGS += -I@@PREFIX@@/include
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   LIBSBCL = libsbcl.a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.41.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1001-x86-Darwin-Revert-x86-darwin-files.patch b/lang/sbcl/files/1001-x86-Darwin-Revert-x86-darwin-files.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..46f4118c547
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1001-x86-Darwin-Revert-x86-darwin-files.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,697 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 1525b671d31cf0cda2a52959487dc2b37e17f271 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 6 Jun 2023 23:04:18 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] x86/Darwin: Revert x86-darwin files
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+See:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - https://github.com/sbcl/sbcl/commit/75a9f0dc55db87258a4cbafe6b8439709e306258
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ - https://github.com/sbcl/sbcl/commit/7bd2ec99c78875130d3b022479dbd0fe9a6c0e26
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ make-config.sh                |   4 -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/Config.x86-darwin |  45 +++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-darwin-os.c   | 529 ++++++++++++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-darwin-os.h   |  69 +++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 files changed, 643 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git make-config.sh make-config.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0be42f451..fde800457 100755
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- make-config.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ make-config.sh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -700,10 +700,6 @@ fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case "$sbcl_arch" in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   x86)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if [ "$sbcl_os" = "darwin" ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        echo "Unsupported configuration"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if [ "$sbcl_os" = "win32" ]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         # of course it doesn't provide dlopen, but there is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         # roughly-equivalent magic nevertheless.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/Config.x86-darwin src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000..ffc8e2d94
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,45 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# -*- makefile -*- for the C-level run-time support for SBCL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# This software is part of the SBCL system. See the README file for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# more information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# This software is derived from the CMU CL system, which was
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# written at Carnegie Mellon University and released into the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# public domain. The software is in the public domain and is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# provided with absolutely no warranty. See the COPYING and CREDITS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# files for more information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CFLAGS += -arch i386 -g -Wall -fdollars-in-identifiers -fno-omit-frame-pointer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LINKFLAGS += -arch i386
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ifdef SBCL_MACOSX_VERSION_MIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LINKFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ifdef LISP_FEATURE_DARWIN9_OR_BETTER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LINKFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    CFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    LINKFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++OS_SRC = bsd-os.c x86-bsd-os.c darwin-os.c x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++OS_LIBS = -lSystem -lc -ldl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  OS_LIBS += -lpthread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ifdef LISP_FEATURE_SB_CORE_COMPRESSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  OS_LIBS += -lzstd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  LIBSBCL = libsbcl.a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  USE_LIBSBCL = -Wl,-force_load libsbcl.a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ASSEM_SRC = x86-assem.S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ARCH_SRC = x86-arch.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-darwin-os.c src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000..d7ab566ea
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,529 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_init.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "thread.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "validate.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "runtime.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "interrupt.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "x86-darwin-os.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "genesis/fdefn.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "gc-internal.h" // for gencgc_handle_wp_violation
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_error.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/sync_policy.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/vm_region.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/machine/thread_state.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/machine/thread_status.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/_types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/ucontext.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <assert.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++pthread_mutex_t modify_ldt_lock = PTHREAD_MUTEX_INITIALIZER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void set_data_desc_size(data_desc_t* desc, unsigned long size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    desc->limit00 = (size - 1) & 0xffff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    desc->limit16 = ((size - 1) >> 16) &0xf;
</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;'>++void set_data_desc_addr(data_desc_t* desc, void* addr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    desc->base00 = (unsigned int)addr & 0xffff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    desc->base16 = ((unsigned int)addr & 0xff0000) >> 16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    desc->base24 = ((unsigned int)addr & 0xff000000) >> 24;
</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;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++arch_os_load_ldt(struct thread *thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sel_t sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sel.index = thread->tls_cookie;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sel.rpl = USER_PRIV;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sel.ti = SEL_LDT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    set_data_desc_addr(&ldt_entry, thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    set_data_desc_size(&ldt_entry, dynamic_values_bytes);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ignore_value(mutex_acquire(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    n = i386_set_ldt(LDT_AUTO_ALLOC, (union ldt_entry*) &ldt_entry, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (n < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        perror("i386_set_ldt");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        lose("unexpected i386_set_ldt(..) failure");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ignore_value(mutex_release(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread->tls_cookie=n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    arch_os_load_ldt(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mach_lisp_thread_init(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    stack_t sigstack;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Signal handlers are run on the control stack, so if it is exhausted
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * we had better use an alternate stack for whatever signal tells us
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * we've exhausted it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sigstack.ss_sp    = calc_altstack_base(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sigstack.ss_flags = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sigstack.ss_size  = calc_altstack_size(thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    sigaltstack(&sigstack,0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1;                  /* success */
</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;'>++int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(LISP_FEATURE_SB_THREAD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int n = thread->tls_cookie;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Set the %%fs register back to 0 and free the ldt by setting it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * to NULL.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ignore_value(mutex_acquire(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    i386_set_ldt(n, NULL, 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ignore_value(mutex_release(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return 1;                  /* success */
</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;'>++#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void memory_fault_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * emulation.  It is passed a context with the uc_mcontext field
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * pointing to a valid block of memory. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void build_fake_signal_context(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               x86_float_state32_t *float_state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_sigmask(0, NULL, &context->uc_sigmask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    context->uc_mcontext->SS = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    context->uc_mcontext->FS = *float_state;
</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;'>++/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * emulation.  It is effectively the inverse operation from above. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void update_thread_state_from_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                      os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *thread_state = context->uc_mcontext->SS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *float_state = context->uc_mcontext->FS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL);
</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;'>++/* Modify a context to push new data on its stack. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void push_context(uint32_t data, x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    stack_pointer = (uint32_t*) thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *(--stack_pointer) = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_state->ESP = (unsigned int) stack_pointer;
</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;'>++void align_context_stack(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* 16byte align the stack (provided that the stack is, as it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * should be, 4byte aligned. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    while (thread_state->ESP & 15) push_context(0, thread_state);
</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;'>++/* Stack allocation starts with a context that has a mod-4 ESP value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * and needs to leave a context with a mod-16 ESP that will restore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * the old ESP value and other register state when activated.  The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * first part of this is the recovery trampoline, which loads ESP from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * EBP, pops EBP, and returns. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++asm("_stack_allocation_recover: movl %ebp, %esp; popl %ebp; ret;");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void open_stack_allocation(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void stack_allocation_recover(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    push_context(thread_state->EBP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_state->EBP = thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_state->EIP = (unsigned int) stack_allocation_recover;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    align_context_stack(thread_state);
</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;'>++/* Stack allocation of data starts with a context with a mod-16 ESP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * value and reserves some space on it by manipulating the ESP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * register. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void *stack_allocate(x86_thread_state32_t *thread_state, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* round up size to 16byte multiple */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size = (size + 15) & -16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_state->ESP = ((uint32_t)thread_state->ESP) - size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (void *)thread_state->ESP;
</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;'>++/* Arranging to invoke a C function is tricky, as we have to assume
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * cdecl calling conventions (caller removes args) and x86/darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * alignment requirements.  The simplest way to arrange this,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * actually, is to open a new stack allocation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * WARNING!!! THIS DOES NOT PRESERVE REGISTERS! */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void call_c_function_in_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                void *function,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                int nargs,
</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;'>++    va_list ap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Set up to restore stack on exit. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    open_stack_allocation(thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Have to keep stack 16byte aligned on x86/darwin. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = (3 & -nargs); i; i--) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        push_context(0, thread_state);
</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;'>++    thread_state->ESP = ((uint32_t)thread_state->ESP) - nargs * 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    va_start(ap, nargs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < nargs; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        //push_context(va_arg(ap, uint32_t), thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        stack_pointer[i] = va_arg(ap, uint32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    va_end(ap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    thread_state->EIP = (unsigned int) function;
</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;'>++void signal_emulation_wrapper(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              int signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              void (*handler)(int, siginfo_t *, void *))
</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;'>++    os_context_t context;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    _STRUCT_MCONTEXT32 regs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    context.uc_mcontext = &regs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* when BSD signals are fired, they mask they signals in sa_mask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       which always seem to be the blockable_sigset, for us, so we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       need to:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       1) save the current sigmask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       2) block blockable signals
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       3) call the signal handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       4) restore the sigmask */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    build_fake_signal_context(&context, thread_state, float_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    block_blockable_signals(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    handler(signal, siginfo, &context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    update_thread_state_from_context(thread_state, float_state, &context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Trap to restore the signal context. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    asm volatile (".long 0xffff0b0f"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  : : "a" (thread_state), "c" (float_state));
</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;'>++/* Convenience wrapper for the above */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void call_handler_on_thread(mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            int signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                            void (*handler)(int, siginfo_t *, os_context_t *))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x86_thread_state32_t new_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x86_thread_state32_t *save_thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x86_float_state32_t *save_float_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    siginfo_t *save_siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    kern_return_t ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Initialize the new state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    new_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    open_stack_allocation(&new_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    stack_allocate(&new_state, 256);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Save old state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    *save_thread_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Save float state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    save_float_state = (x86_float_state32_t *)stack_allocate(&new_state, sizeof(*save_float_state));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    state_count = x86_FLOAT_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                (thread_state_t)save_float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Set up siginfo */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    save_siginfo = stack_allocate(&new_state, sizeof(*siginfo));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (siginfo == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        save_siginfo = siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        *save_siginfo = *siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Prepare to call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    call_c_function_in_context(&new_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               signal_emulation_wrapper,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               save_thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               save_float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               save_siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                               handler);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Update the thread state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                (thread_state_t)&new_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</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;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined DUMP_CONTEXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void dump_context(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("eax: %08lx  ecx: %08lx  edx: %08lx  ebx: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->EAX, thread_state->ECX, thread_state->EDX, thread_state->EAX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("esp: %08lx  ebp: %08lx  esi: %08lx  edi: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->ESP, thread_state->EBP, thread_state->ESI, thread_state->EDI);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("eip: %08lx  eflags: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->EIP, thread_state->EFLAGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    printf("cs: %04hx  ds: %04hx  es: %04hx  "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           "ss: %04hx  fs: %04hx  gs: %04hx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->CS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->DS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->ES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->SS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->FS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           thread_state->GS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < 48; i+=4) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        printf("%08x:  %08x %08x %08x %08x\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               thread_state->ESP + (i * 4),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               stack_pointer[i],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               stack_pointer[i+1],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               stack_pointer[i+2],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               stack_pointer[i+3]);
</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;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++control_stack_exhausted_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    extern void unblock_signals_in_context_and_maybe_warn(os_context_t*);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unblock_signals_in_context_and_maybe_warn(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
</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;'>++void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR));
</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;'>++kern_return_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++catch_exception_raise(mach_port_t exception_port,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      mach_port_t task,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      exception_type_t exception,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      exception_data_t code_vector,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      mach_msg_type_number_t code_count)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    x86_thread_state32_t thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void *addr = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int signal = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void (*handler)(int, siginfo_t *, os_context_t *) = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    siginfo_t siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    kern_return_t ret = KERN_SUCCESS, dealloc_ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct thread *th;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        != KERN_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        lose("Can't find the thread for an exception %u", exception_port);
</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;'>++    /* Get state and info */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                (thread_state_t)&thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    switch (exception) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case EXC_BAD_ACCESS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        signal = SIGBUS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Check if write protection fault */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if ((code_vector[0] & OS_VM_PROT_ALL) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addr = (void*)code_vector[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Just need to unprotect the page and do some bookkeeping, no need
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * to run it from the faulting thread.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * And because the GC uses signals to stop the world it might
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * interfere with that bookkeeping, because there's a window
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * before block_blockable_signals is performed. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (gencgc_handle_wp_violation(0, addr))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            goto do_not_handle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Undefined alien */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (os_trunc_to_page(addr) == undefined_alien_address) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            handler = undefined_alien_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* At stack guard */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            lower_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            handler = control_stack_exhausted_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Return from stack guard */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            reset_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Regular memory fault */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        handler = memory_fault_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case EXC_BAD_INSTRUCTION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Check if illegal instruction trap */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (code_vector[0] != EXC_I386_INVOP) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Check if UD2 instruction */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (*(unsigned short *)thread_state.EIP != 0x0b0f) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* KLUDGE: There are two ways we could get here:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             * 1) We're executing data and we've hit some truly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    illegal opcode, of which there are a few, see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    Intel 64 and IA-32 Architectures
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    Sofware Developer's Manual
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    Volume 3A page 5-34)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             * 2) The kernel started an unrelated signal handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    before we got a chance to run. The context that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    caused the exception is saved in a stack frame
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             *    somewhere down below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             * In either case we rely on the exception to retrigger,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             * eventually bailing out if we're spinning on case 2).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            static mach_port_t last_thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            static unsigned int last_eip;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (last_thread == thread && last_eip == thread_state.EIP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                ret = KERN_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            last_thread = thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            last_eip = thread_state.EIP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Skip the trap code */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thread_state.EIP += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Return from handler? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (*(unsigned short *)thread_state.EIP == 0xffff) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        (thread_state_t)thread_state.EAX,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        x86_THREAD_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                lose("thread_set_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        (thread_state_t)thread_state.ECX,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                        x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Trap call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case EXC_BREAKPOINT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (single_stepping) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* Clear TF or the signal emulation wrapper won't proceed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               with single stepping enabled. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            thread_state.EFLAGS &= ~0x100;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        } else if (*(unsigned char*)(thread_state.EIP-1) == 0xCC) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Call handler */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (handler != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      siginfo.si_signo = signal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      siginfo.si_addr = addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
</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;'>++  do_not_handle:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    dealloc_ret = mach_port_deallocate (mach_task_self(), thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_ret);
</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;'>++    dealloc_ret = mach_port_deallocate (mach_task_self(), task);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      lose("mach_port_deallocate (task) failed with return_code %d", dealloc_ret);
</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;'>++    return ret;
</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;'>++void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++os_restore_fp_control(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* KLUDGE: The x87 FPU control word is some nasty bitfield struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * thing.  Rather than deal with that, just grab it as a 16-bit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++     * integer. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned short fpu_control_word =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        *((unsigned short *)&context->uc_mcontext->FS.FPU_FCW);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* reset exception flags and restore control flags on x87 FPU */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    asm ("fldcw %0" : : "m" (fpu_control_word));
</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;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-darwin-os.h src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000..7ff303b96
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,69 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifndef _X86_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _X86_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "darwin-os.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef int os_context_register_t;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "arch-os-generic.inc"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void set_data_desc_size(data_desc_t* desc, unsigned long size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void set_data_desc_addr(data_desc_t* desc, void* addr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* On OS X 10.5, the field names for the thread state have changed and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * now are prepended with __. Use some #define hackery to deal with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * this.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->__ss.__##stem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EIP __eip
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ESP __esp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EBP __ebp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EAX __eax
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EBX __ebx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ECX __ecx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EDX __edx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ESI __esi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EDI __edi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EFLAGS __eflags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CS __cs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define DS __ds
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ES __es
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FS __fs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SS __ss
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define GS __gs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FPU_FCW __fpu_fcw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->ss.stem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EIP eip
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ESP esp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EBP ebp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EAX eax
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EBX ebx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ECX ecx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EDX edx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ESI esi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EDI edi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define EFLAGS eflags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define CS cs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define DS ds
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define ES es
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FS fs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SS ss
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define GS gs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define FPU_FCW fpu_fcw
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* __DARWIN_UNIX03 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define RESTORE_FP_CONTROL_FROM_CONTEXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void os_restore_fp_control(os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* _X86_DARWIN_OS_H */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.41.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch b/lang/sbcl/files/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..50334e7ba7a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,207 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 6928d6cf896af97596228e3bd1e30437c0b159a0 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 6 Jun 2023 23:40:14 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] x86/Darwin: Revert "Perform darwin-related housekeeping"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This reverts commit f5386462b3ad5548763bc7de21d71cb723352af7.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/interrupt.c  |  7 +++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-arch.c   |  2 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-assem.S  | 56 +++++++++++++++++++++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-bsd-os.c | 23 +++++++++++++++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 files changed, 85 insertions(+), 3 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/interrupt.c src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index af66f5839..477af6171 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1571,6 +1571,7 @@ extern int *os_context_flags_addr(os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern void post_signal_tramp(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern void call_into_lisp_tramp(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arrange_return_to_c_function(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1759,7 +1760,13 @@ arrange_return_to_c_function(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arrange_return_to_lisp_function(os_context_t *context, lispobj function)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    arrange_return_to_c_function(context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 (call_into_lisp_lookalike)call_into_lisp_tramp,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 function);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     arrange_return_to_c_function(context, call_into_lisp, function);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</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;'>+ // These have undefined_alien_function tramp in x-assem.S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-arch.c src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8969326d4..a662d758e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,6 +80,8 @@ os_context_flags_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return &context->uc_mcontext.mc_eflags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined __OpenBSD__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return &context->sc_eflags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return (int *)(&context->uc_mcontext->SS.EFLAGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined __NetBSD__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return &(context->uc_mcontext.__gregs[_REG_EFL]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined LISP_FEATURE_WIN32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-assem.S src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 974c1b10a..f92bde899 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,7 +62,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * that are defined to be no-ops on win32. Hopefully this still works on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * other platforms.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if !defined(LISP_FEATURE_WIN32)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(LISP_FEATURE_WIN32) && !defined(LISP_FEATURE_DARWIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define TYPE(name) .type name,@function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define SIZE(name) .size name,.-name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -614,6 +614,56 @@ GNAME(exception_handler_wrapper):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SIZE(GNAME(exception_handler_wrapper))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        .align align_16byte
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        .globl GNAME(call_into_lisp_tramp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        TYPE(GNAME(call_into_lisp_tramp))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++GNAME(call_into_lisp_tramp):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* 1. build the stack frame from the block that's pointed to by ECX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           2. free the block
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           3. set ECX to 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           4. call the function via call_into_lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   0(%ecx)          /* return address */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   %ebp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        movl    %esp, %ebp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   32(%ecx)         /* eflags */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   28(%ecx)         /* EAX */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   20(%ecx)         /* ECX */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   16(%ecx)         /* EDX */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   24(%ecx)         /* EBX */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   $0                /* popal is going to ignore esp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   %ebp              /* is this right?? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   12(%ecx)         /* ESI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   8(%ecx)          /* EDI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   $0                /* args for call_into_lisp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   $0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   4(%ecx)          /* function to call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* free our save block */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   %ecx              /* reserve sufficient space on stack for args */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        pushl   %ecx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        andl    $0xfffffff0, %esp  /* align stack */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        movl    $0x40, 4(%esp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        movl    %ecx, (%esp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        call    GNAME(os_alloc_gc_space)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* call call_into_lisp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        leal    -48(%ebp), %esp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        call    GNAME(call_into_lisp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Clean up our mess */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        leal    -36(%ebp), %esp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        popal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        popfl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        leave
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        SIZE(call_into_lisp_tramp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   .align  align_16byte,0x90
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   .globl  GNAME(post_signal_tramp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   TYPE(GNAME(post_signal_tramp))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -624,6 +674,10 @@ GNAME(post_signal_tramp):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   addl $12,%esp   /* clear call_into_lisp args from stack */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   popal           /* restore registers */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         popfl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* skip two padding words */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        addl $8,%esp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   leave
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SIZE(GNAME(post_signal_tramp))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-bsd-os.c src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d6ffafd9b..a1cd0b33d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6,8 +6,14 @@
</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;'>+ #ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_init.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <machine/segments.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <machine/sysarch.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* LISP_FEATURE_DARWIN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -28,7 +34,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * almost every line of code. It would be nice to find some way to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * factor out the commonality better; failing that, it might be best
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  * just to split this generic-BSD code into one variant for each BSD.
</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;'>++ * KLUDGE II: this split has begun with the addition of the Darwin BSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * flavour, with the cross-architecture complications that this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * entails; unfortunately, currently the situation is worse, not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * better, than in the above paragraph. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef LISP_FEATURE_NETBSD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define _REG_eax _REG_EAX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,7 +90,7 @@ os_context_fp_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return (int *)CONTEXT_ADDR_FROM_STEM(ebp);
</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(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(__DragonFly__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(LISP_FEATURE_DARWIN) || defined(__DragonFly__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_context_sp_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -107,6 +117,11 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length)
</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;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Note: the Darwin versions of arch_os_thread_init found in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(LISP_FEATURE_DARWIN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void set_data_desc_size(struct segment_descriptor* desc, unsigned long size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -121,6 +136,9 @@ void set_data_desc_addr(struct segment_descriptor* desc, void* addr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     desc->sd_hibase = ((unsigned int)addr & 0xff000000) >> 24;
</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;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ arch_os_load_ldt(struct thread *thread)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -184,6 +202,7 @@ int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 1;                  /* success */
</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;'>++#endif /* !LISP_FEATURE_DARWIN */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(LISP_FEATURE_FREEBSD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.41.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1003-x86-Darwin-Remove-mach-exception-handler.patch b/lang/sbcl/files/1003-x86-Darwin-Remove-mach-exception-handler.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..b3c09839c18
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1003-x86-Darwin-Remove-mach-exception-handler.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,437 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 7a1036b614df5e896caa41d105c52b3e37623554 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 6 Jun 2023 23:32:13 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] x86/Darwin: Remove mach-exception-handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+See https://github.com/sbcl/sbcl/commit/7026bb841aa63c4d43339afb49d837a4497c468a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-darwin-os.c | 406 +-----------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 405 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/x86-darwin-os.c src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d7ab566ea..133843238 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,9 +81,7 @@ int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     thread->tls_cookie=n;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     arch_os_load_ldt(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    mach_lisp_thread_init(thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     stack_t sigstack;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Signal handlers are run on the control stack, so if it is exhausted
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -112,408 +110,6 @@ int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 1;                  /* success */
</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;'>+-#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void memory_fault_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                          os_context_t *context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * emulation.  It is passed a context with the uc_mcontext field
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * pointing to a valid block of memory. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void build_fake_signal_context(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               x86_float_state32_t *float_state) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_sigmask(0, NULL, &context->uc_sigmask);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    context->uc_mcontext->SS = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    context->uc_mcontext->FS = *float_state;
</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;'>+-/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * emulation.  It is effectively the inverse operation from above. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void update_thread_state_from_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                      x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                      os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    *thread_state = context->uc_mcontext->SS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    *float_state = context->uc_mcontext->FS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL);
</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;'>+-/* Modify a context to push new data on its stack. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void push_context(uint32_t data, x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    stack_pointer = (uint32_t*) thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    *(--stack_pointer) = data;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_state->ESP = (unsigned int) stack_pointer;
</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;'>+-void align_context_stack(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* 16byte align the stack (provided that the stack is, as it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-     * should be, 4byte aligned. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    while (thread_state->ESP & 15) push_context(0, thread_state);
</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;'>+-/* Stack allocation starts with a context that has a mod-4 ESP value
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * and needs to leave a context with a mod-16 ESP that will restore
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * the old ESP value and other register state when activated.  The
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * first part of this is the recovery trampoline, which loads ESP from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * EBP, pops EBP, and returns. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-asm("_stack_allocation_recover: movl %ebp, %esp; popl %ebp; ret;");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void open_stack_allocation(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void stack_allocation_recover(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    push_context(thread_state->EBP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_state->EBP = thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_state->EIP = (unsigned int) stack_allocation_recover;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    align_context_stack(thread_state);
</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;'>+-/* Stack allocation of data starts with a context with a mod-16 ESP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * value and reserves some space on it by manipulating the ESP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * register. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void *stack_allocate(x86_thread_state32_t *thread_state, size_t size)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* round up size to 16byte multiple */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    size = (size + 15) & -16;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_state->ESP = ((uint32_t)thread_state->ESP) - size;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return (void *)thread_state->ESP;
</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;'>+-/* Arranging to invoke a C function is tricky, as we have to assume
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * cdecl calling conventions (caller removes args) and x86/darwin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * alignment requirements.  The simplest way to arrange this,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * actually, is to open a new stack allocation.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * WARNING!!! THIS DOES NOT PRESERVE REGISTERS! */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void call_c_function_in_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                void *function,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                int nargs,
</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;'>+-    va_list ap;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Set up to restore stack on exit. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    open_stack_allocation(thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Have to keep stack 16byte aligned on x86/darwin. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = (3 & -nargs); i; i--) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        push_context(0, thread_state);
</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;'>+-    thread_state->ESP = ((uint32_t)thread_state->ESP) - nargs * 4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    va_start(ap, nargs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = 0; i < nargs; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        //push_context(va_arg(ap, uint32_t), thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        stack_pointer[i] = va_arg(ap, uint32_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    va_end(ap);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thread_state->EIP = (unsigned int) function;
</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;'>+-void signal_emulation_wrapper(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              int signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              void (*handler)(int, siginfo_t *, void *))
</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;'>+-    os_context_t context;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    _STRUCT_MCONTEXT32 regs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    context.uc_mcontext = &regs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* when BSD signals are fired, they mask they signals in sa_mask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       which always seem to be the blockable_sigset, for us, so we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       need to:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       1) save the current sigmask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       2) block blockable signals
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       3) call the signal handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       4) restore the sigmask */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    build_fake_signal_context(&context, thread_state, float_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    block_blockable_signals(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    handler(signal, siginfo, &context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    update_thread_state_from_context(thread_state, float_state, &context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Trap to restore the signal context. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    asm volatile (".long 0xffff0b0f"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  : : "a" (thread_state), "c" (float_state));
</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;'>+-/* Convenience wrapper for the above */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void call_handler_on_thread(mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            int signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            void (*handler)(int, siginfo_t *, os_context_t *))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    x86_thread_state32_t new_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    x86_thread_state32_t *save_thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    x86_float_state32_t *save_float_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    siginfo_t *save_siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    kern_return_t ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Initialize the new state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    new_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    open_stack_allocation(&new_state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    stack_allocate(&new_state, 256);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Save old state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    *save_thread_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Save float state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    save_float_state = (x86_float_state32_t *)stack_allocate(&new_state, sizeof(*save_float_state));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    state_count = x86_FLOAT_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                (thread_state_t)save_float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Set up siginfo */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    save_siginfo = stack_allocate(&new_state, sizeof(*siginfo));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (siginfo == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        save_siginfo = siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        *save_siginfo = *siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Prepare to call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    call_c_function_in_context(&new_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               signal_emulation_wrapper,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               5,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               save_thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               save_float_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               signal,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               save_siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                               handler);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Update the thread state */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                (thread_state_t)&new_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</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;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined DUMP_CONTEXT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void dump_context(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    printf("eax: %08lx  ecx: %08lx  edx: %08lx  ebx: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->EAX, thread_state->ECX, thread_state->EDX, thread_state->EAX);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    printf("esp: %08lx  ebp: %08lx  esi: %08lx  edi: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->ESP, thread_state->EBP, thread_state->ESI, thread_state->EDI);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    printf("eip: %08lx  eflags: %08lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->EIP, thread_state->EFLAGS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    printf("cs: %04hx  ds: %04hx  es: %04hx  "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           "ss: %04hx  fs: %04hx  gs: %04hx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->CS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->DS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->ES,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->SS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->FS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           thread_state->GS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    for (i = 0; i < 48; i+=4) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        printf("%08x:  %08x %08x %08x %08x\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               thread_state->ESP + (i * 4),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               stack_pointer[i],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               stack_pointer[i+1],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               stack_pointer[i+2],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               stack_pointer[i+3]);
</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;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-control_stack_exhausted_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    extern void unblock_signals_in_context_and_maybe_warn(os_context_t*);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    unblock_signals_in_context_and_maybe_warn(context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
</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;'>+-void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR));
</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;'>+-kern_return_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-catch_exception_raise(mach_port_t exception_port,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      mach_port_t task,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      exception_type_t exception,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      exception_data_t code_vector,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                      mach_msg_type_number_t code_count)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    x86_thread_state32_t thread_state;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void *addr = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int signal = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    void (*handler)(int, siginfo_t *, os_context_t *) = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    siginfo_t siginfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    kern_return_t ret = KERN_SUCCESS, dealloc_ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    struct thread *th;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        != KERN_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        lose("Can't find the thread for an exception %u", exception_port);
</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;'>+-    /* Get state and info */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                (thread_state_t)&thread_state,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    switch (exception) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case EXC_BAD_ACCESS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        signal = SIGBUS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Check if write protection fault */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if ((code_vector[0] & OS_VM_PROT_ALL) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        addr = (void*)code_vector[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Just need to unprotect the page and do some bookkeeping, no need
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * to run it from the faulting thread.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * And because the GC uses signals to stop the world it might
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * interfere with that bookkeeping, because there's a window
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-         * before block_blockable_signals is performed. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (gencgc_handle_wp_violation(0, addr))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            goto do_not_handle;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Undefined alien */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (os_trunc_to_page(addr) == undefined_alien_address) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            handler = undefined_alien_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* At stack guard */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            lower_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            handler = control_stack_exhausted_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Return from stack guard */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            reset_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Regular memory fault */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        handler = memory_fault_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case EXC_BAD_INSTRUCTION:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Check if illegal instruction trap */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (code_vector[0] != EXC_I386_INVOP) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Check if UD2 instruction */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (*(unsigned short *)thread_state.EIP != 0x0b0f) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            /* KLUDGE: There are two ways we could get here:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             * 1) We're executing data and we've hit some truly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    illegal opcode, of which there are a few, see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    Intel 64 and IA-32 Architectures
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    Sofware Developer's Manual
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    Volume 3A page 5-34)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             * 2) The kernel started an unrelated signal handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    before we got a chance to run. The context that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    caused the exception is saved in a stack frame
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             *    somewhere down below.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             * In either case we rely on the exception to retrigger,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             * eventually bailing out if we're spinning on case 2).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            static mach_port_t last_thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            static unsigned int last_eip;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if (last_thread == thread && last_eip == thread_state.EIP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                ret = KERN_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            last_thread = thread;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            last_eip = thread_state.EIP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Skip the trap code */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        thread_state.EIP += 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Return from handler? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (*(unsigned short *)thread_state.EIP == 0xffff) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        (thread_state_t)thread_state.EAX,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        x86_THREAD_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                lose("thread_set_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        (thread_state_t)thread_state.ECX,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                        x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* Trap call */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    case EXC_BREAKPOINT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (single_stepping) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            /* Clear TF or the signal emulation wrapper won't proceed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               with single stepping enabled. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            thread_state.EFLAGS &= ~0x100;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        } else if (*(unsigned char*)(thread_state.EIP-1) == 0xCC) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    /* Call handler */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (handler != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      siginfo.si_signo = signal;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      siginfo.si_addr = addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
</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;'>+-  do_not_handle:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    dealloc_ret = mach_port_deallocate (mach_task_self(), thread);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_ret);
</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;'>+-    dealloc_ret = mach_port_deallocate (mach_task_self(), task);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      lose("mach_port_deallocate (task) failed with return_code %d", dealloc_ret);
</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;'>+-    return ret;
</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;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ os_restore_fp_control(os_context_t *context)
</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;'>+2.41.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1001-Darwin-disable-custom-nanosleep-before-10.6.patch b/lang/sbcl/files/1004-Darwin-disable-custom-nanosleep-before-10.6.patch
</span>similarity index 84%
rename from lang/sbcl/files/1001-Darwin-disable-custom-nanosleep-before-10.6.patch
rename to lang/sbcl/files/1004-Darwin-disable-custom-nanosleep-before-10.6.patch
<span style='display:block; white-space:pre;color:#808080;'>index 5d7ccc6f7a4..233527fedf8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1001-Darwin-disable-custom-nanosleep-before-10.6.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1004-Darwin-disable-custom-nanosleep-before-10.6.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From c50dd158d97de78834c2a0d1f9eb7bdbe0ffac89 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From dfe4b0e8dd8ecae05ea1fd5f115fafb38e02d64c Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 15:15:56 +0200
 Subject: [PATCH] Darwin: disable custom nanosleep before 10.6
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,11 +10,11 @@ See: https://github.com/sbcl/sbcl/commit/6d28b641b659b2be6ad7b329ae09cb592c1162a
</span>  2 files changed, 5 insertions(+), 1 deletion(-)
 
 diff --git src/runtime/darwin-os.c src/runtime/darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5a1d8dcd2..41760f5b4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6a1b29247..c3be53e05 100644
</span> --- src/runtime/darwin-os.c
 +++ src/runtime/darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -245,6 +245,8 @@ os_sem_destroy(os_sem_t *sem)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -165,6 +165,8 @@ futex_wake(int *lock_word, int n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span>  #endif
  
 +#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -22,7 +22,7 @@ index 5a1d8dcd2..41760f5b4 100644
</span>  /* nanosleep() is not re-entrant on some versions of Darwin,
   * reimplement it using the underlying syscalls. */
  int
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -302,3 +304,5 @@ sb_nanosleep(time_t sec, int nsec) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -222,3 +224,5 @@ sb_nanosleep(time_t sec, int nsec) {
</span>          }
      }
  }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1002-Darwin-recovery-support-non-dispatch-semaphores.patch b/lang/sbcl/files/1005-Darwin-recovery-support-non-dispatch-semaphores.patch
</span>similarity index 88%
rename from lang/sbcl/files/1002-Darwin-recovery-support-non-dispatch-semaphores.patch
rename to lang/sbcl/files/1005-Darwin-recovery-support-non-dispatch-semaphores.patch
<span style='display:block; white-space:pre;color:#808080;'>index 11fec10def8..e1556c99e68 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1002-Darwin-recovery-support-non-dispatch-semaphores.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1005-Darwin-recovery-support-non-dispatch-semaphores.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,21 +1,21 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 0c51715917e23f4a5e65b3bf6cca8868c2a1759f Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 075983a0dc8a5345c7a97fe5e9606474787a4c93 Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:28:45 +0200
 Subject: [PATCH] Darwin: recovery support non dispatch semaphores
 
 See: https://github.com/sbcl/sbcl/commit/160448fd0485daf69e81f9fe9eeb8515ed01db49
 ---
<span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/darwin-os.c | 55 ++++++++++++++++++++++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/darwin-os.c | 56 ++++++++++++++++++++++++++++++++++++++++-
</span>  src/runtime/darwin-os.h |  6 ++++-
  src/runtime/os-common.c |  2 +-
  src/runtime/os.h        |  2 +-
<span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 61 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 4 files changed, 62 insertions(+), 4 deletions(-)
</span> 
 diff --git src/runtime/darwin-os.c src/runtime/darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 41760f5b4..699400857 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c3be53e05..d5d4e1d8a 100644
</span> --- src/runtime/darwin-os.c
 +++ src/runtime/darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -216,7 +216,7 @@ void darwin_init(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -77,7 +77,7 @@ void darwin_init(void)
</span>  }
  
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -24,10 +24,11 @@ index 41760f5b4..699400857 100644
</span>  
  inline void
  os_sem_init(os_sem_t *sem, unsigned int value)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -243,6 +243,59 @@ os_sem_destroy(os_sem_t *sem)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     dispatch_release(*sem);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -163,6 +163,60 @@ futex_wake(int *lock_word, int n)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return 0;
</span>  }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +#elif defined LISP_FEATURE_SB_THREAD && defined CANNOT_USE_POSIX_SEM_T
 +
 +inline void
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -105,10 +106,10 @@ index f13669fb0..e4257e0ee 100644
</span>  
  #endif /* _DARWIN_OS_H */
 diff --git src/runtime/os-common.c src/runtime/os-common.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 34ede0769..32a81a8bd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index afc3ede69..36fe6406b 100644
</span> --- src/runtime/os-common.c
 +++ src/runtime/os-common.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -112,7 +112,7 @@ os_get_errno(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -117,7 +117,7 @@ os_get_errno(void)
</span>      return errno;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -118,10 +119,10 @@ index 34ede0769..32a81a8bd 100644
</span>  os_sem_init(os_sem_t *sem, unsigned int value)
  {
 diff --git src/runtime/os.h src/runtime/os.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index afae2d825..7a21caa9d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e29222d11..649f90256 100644
</span> --- src/runtime/os.h
 +++ src/runtime/os.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -226,7 +226,7 @@ extern char *os_get_runtime_executable_path();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -221,7 +221,7 @@ extern char *os_get_runtime_executable_path();
</span>  #define OS_VM_SIZE_FMTX PRIxPTR
  
  #if defined LISP_FEATURE_SB_THREAD && defined LISP_FEATURE_UNIX
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1003-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch b/lang/sbcl/files/1006-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
</span>similarity index 88%
rename from lang/sbcl/files/1003-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
rename to lang/sbcl/files/1006-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
<span style='display:block; white-space:pre;color:#808080;'>index 56ec8df5798..24d7c4ab0f3 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1003-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1006-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 26981717310f83f7e7c4c96ba58d28dbae00cc60 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 110ec00e4b96ef38a06a50bf6872bee72362667f Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:27:10 +0200
 Subject: [PATCH] x86/Darwin: mask out O_LARGEFILE in fcntl.1 test
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -12,10 +12,10 @@ See:
</span>  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git contrib/sb-posix/posix-tests.lisp contrib/sb-posix/posix-tests.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0a642bd5c..fc00f6aba 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b7fc49e47..4482f6941 100644
</span> --- contrib/sb-posix/posix-tests.lisp
 +++ contrib/sb-posix/posix-tests.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -421,7 +421,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -410,7 +410,7 @@
</span>  
  ;; O_LARGEFILE is always set on 64-bit *nix platforms even though the whole
  ;; flag makes no sense.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1004-x86-Darwin-revert-OS_THREAD_STACK.patch b/lang/sbcl/files/1007-x86-Darwin-revert-OS_THREAD_STACK.patch
</span>similarity index 78%
rename from lang/sbcl/files/1004-x86-Darwin-revert-OS_THREAD_STACK.patch
rename to lang/sbcl/files/1007-x86-Darwin-revert-OS_THREAD_STACK.patch
<span style='display:block; white-space:pre;color:#808080;'>index 2188eebe09e..7c9f34fc359 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1004-x86-Darwin-revert-OS_THREAD_STACK.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1007-x86-Darwin-revert-OS_THREAD_STACK.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 7d2b2b52dfe3e67d4302562c592d2c0945e17482 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 0b28e50803d95089cc7bbf76167766b747244beb Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:29:33 +0200
 Subject: [PATCH] x86/Darwin: revert OS_THREAD_STACK
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,13 +11,13 @@ See:
</span>  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git src/cold/shared.lisp src/cold/shared.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b8ce82702..484d8c17f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 695c168d6..ae707807e 100644
</span> --- src/cold/shared.lisp
 +++ src/cold/shared.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -288,7 +288,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -308,7 +308,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           (pushnew :immobile-code sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         (when (target-featurep :64-bit)
</span>            (push :compact-symbol sb-xc:*features*))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-         (when (target-featurep '(:and :sb-thread (:not :win32)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (push :pauseless-threadstart sb-xc:*features*))
</span> -        (when (target-featurep '(:and :sb-thread (:or :darwin :openbsd)))
 +        (when (target-featurep '(:and :sb-thread (:or (:and :darwin (:not :x86)) :openbsd)))
            (push :os-thread-stack sb-xc:*features*))
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1005-x86-Darwin-fix-build-by-old-preprocessor.patch b/lang/sbcl/files/1008-x86-Darwin-fix-build-by-old-preprocessor.patch
</span>similarity index 88%
rename from lang/sbcl/files/1005-x86-Darwin-fix-build-by-old-preprocessor.patch
rename to lang/sbcl/files/1008-x86-Darwin-fix-build-by-old-preprocessor.patch
<span style='display:block; white-space:pre;color:#808080;'>index 3bb31580083..8e51e554e80 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1005-x86-Darwin-fix-build-by-old-preprocessor.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1008-x86-Darwin-fix-build-by-old-preprocessor.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 7e47cffaea3593f03011a94853cf9f1b7b87a33c Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From ced6423375970d793e821d6780a977e6a02f2886 Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:30:39 +0200
 Subject: [PATCH] x86/Darwin: fix build by old preprocessor
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,7 +9,7 @@ See: https://github.com/sbcl/sbcl/commit/931a2dcfa20187ba5477d4df5d160fc15e605db
</span>  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git src/runtime/x86-assem.S src/runtime/x86-assem.S
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index df19ace80..cace4261c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f92bde899..0ae81e321 100644
</span> --- src/runtime/x86-assem.S
 +++ src/runtime/x86-assem.S
 @@ -705,7 +705,7 @@ GNAME(arch_scrub_control_stack):
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1006-x86-Darwin-disable-failing-stat-mode-tests.patch b/lang/sbcl/files/1009-x86-Darwin-disable-failing-stat-mode-tests.patch
</span>similarity index 84%
rename from lang/sbcl/files/1006-x86-Darwin-disable-failing-stat-mode-tests.patch
rename to lang/sbcl/files/1009-x86-Darwin-disable-failing-stat-mode-tests.patch
<span style='display:block; white-space:pre;color:#808080;'>index c4b9159593a..57af14e9b8f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1006-x86-Darwin-disable-failing-stat-mode-tests.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1009-x86-Darwin-disable-failing-stat-mode-tests.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From a6dccb448eabaf91eb2ecbde72e198f4fd7c6e0c Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 760a82e1d8c626ee01d8bf26d95973f571fd23f8 Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:31:20 +0200
 Subject: [PATCH] x86/Darwin: disable failing stat-mode tests
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,10 +8,10 @@ Subject: [PATCH] x86/Darwin: disable failing stat-mode tests
</span>  1 file changed, 2 insertions(+)
 
 diff --git contrib/sb-posix/posix-tests.lisp contrib/sb-posix/posix-tests.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index fc00f6aba..936f6c366 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4482f6941..557ad08a7 100644
</span> --- contrib/sb-posix/posix-tests.lisp
 +++ contrib/sb-posix/posix-tests.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -328,6 +328,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -316,6 +316,7 @@
</span>              (,mode (sb-posix::stat-mode ,stat)))
         ,@body)))
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,7 +19,7 @@ index fc00f6aba..936f6c366 100644
</span>  (deftest stat-mode.1
    (with-stat-mode (mode *test-directory*)
      (sb-posix:s-isreg mode))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -344,6 +345,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -332,6 +333,7 @@
</span>      (sb-posix:s-ischr mode))
    nil)
  
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1007-x86-Darwin-add-missed-OS_CONTEXT_PC.patch b/lang/sbcl/files/1010-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
</span>similarity index 94%
rename from lang/sbcl/files/1007-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
rename to lang/sbcl/files/1010-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
<span style='display:block; white-space:pre;color:#808080;'>index 35dee8b29ca..f2566aff255 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1007-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1010-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From aa9a60795e8f23b715a17630eefe70712abf2c6d Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 4d3a5f8f0ce73d3286167e83b7276fc756a6ad43 Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:31:51 +0200
 Subject: [PATCH] x86/Darwin: add missed OS_CONTEXT_PC
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1008-x86-Darwin-fix-syntax-typos.patch b/lang/sbcl/files/1011-x86-Darwin-fix-syntax-typos.patch
</span>similarity index 60%
rename from lang/sbcl/files/1008-x86-Darwin-fix-syntax-typos.patch
rename to lang/sbcl/files/1011-x86-Darwin-fix-syntax-typos.patch
<span style='display:block; white-space:pre;color:#808080;'>index e37742a5a5d..3d1dae14f9c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1008-x86-Darwin-fix-syntax-typos.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1011-x86-Darwin-fix-syntax-typos.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,17 +1,17 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 5bd3a25311bf971106c8a02c95ddf9e147950349 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 56589f747ac979aadef95772ba04e37befeb3309 Mon Sep 17 00:00:00 2001
</span> From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Tue, 6 Jun 2023 10:32:35 +0200
 Subject: [PATCH] x86/Darwin: fix syntax typos
 
 ---
<span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-darwin-os.c | 6 +++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 3 insertions(+), 3 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/x86-darwin-os.c | 4 +---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 3 deletions(-)
</span> 
 diff --git src/runtime/x86-darwin-os.c src/runtime/x86-darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index bba95e318..5ac13f970 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 133843238..2527ff808 100644
</span> --- src/runtime/x86-darwin-os.c
 +++ src/runtime/x86-darwin-os.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -91,7 +91,7 @@ int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -89,7 +89,7 @@ int arch_os_thread_init(struct thread *thread) {
</span>       * we've exhausted it */
      sigstack.ss_sp    = calc_altstack_base(thread);
      sigstack.ss_flags = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -20,16 +20,7 @@ index bba95e318..5ac13f970 100644
</span>      sigaltstack(&sigstack,0);
  #endif
      return 1;                  /* success */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -514,6 +514,8 @@ catch_exception_raise(mach_port_t exception_port,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- os_restore_fp_control(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -525,5 +527,3 @@ os_restore_fp_control(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -121,5 +121,3 @@ os_restore_fp_control(os_context_t *context)
</span>      /* reset exception flags and restore control flags on x87 FPU */
      asm ("fldcw %0" : : "m" (fpu_control_word));
  }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1009-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch b/lang/sbcl/files/1012-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
</span>similarity index 94%
rename from lang/sbcl/files/1009-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
rename to lang/sbcl/files/1012-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
<span style='display:block; white-space:pre;color:#808080;'>index 954d8d92f0a..2227e025e9c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1009-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1012-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 1e8e2859809ca3ab632b603491d74d0497d2db58 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 21632a4ed2b350a98adb6d3b5759b1244d6057cc Mon Sep 17 00:00:00 2001
</span> From: Sergey Fedorov <vital.had@gmail.com>
 Date: Mon, 5 Jun 2023 22:03:43 +0800
 Subject: [PATCH] ppc/Darwin: Revert "Delete support for #+(and darwin ppc)"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,9 +10,8 @@ This reverts commit 217791a738a5960092e38106e9931c424cd4ee98.
</span>  src/code/ppc-vm.lisp                      |   3 +-
  src/compiler/ppc/c-call.lisp              | 282 +++++++++++++++++++++-
  src/compiler/ppc/float.lisp               |  65 +++++
<span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc/parms.lisp               |  10 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/compiler/ppc/parms.lisp               |   3 +-
</span>  src/compiler/ppc/vm.lisp                  |  12 +-
<span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc64/parms.lisp             |   7 +
</span>  src/runtime/Config.ppc-darwin             |  41 ++++
  src/runtime/monitor.c                     |   4 +
  src/runtime/ppc-arch.c                    |   2 +
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -21,15 +20,16 @@ This reverts commit 217791a738a5960092e38106e9931c424cd4ee98.
</span>  src/runtime/ppc-darwin-os.h               |  29 +++
  src/runtime/ppc-lispregs.h                |  15 ++
  src/runtime/ppc64-lispregs.h              |  10 +
<span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/float.pure.lisp                     |   4 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/float.pure.lisp                     |   2 +
</span>  tests/foreign-stack-alignment.impure.lisp |   3 +-
<span style='display:block; white-space:pre;background:#ffe0e0;'>- 18 files changed, 787 insertions(+), 11 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ tests/test-funs.lisp                      |   2 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 18 files changed, 773 insertions(+), 11 deletions(-)
</span>  create mode 100644 src/runtime/Config.ppc-darwin
  create mode 100644 src/runtime/ppc-darwin-os.c
  create mode 100644 src/runtime/ppc-darwin-os.h
 
 diff --git src/code/alieneval.lisp src/code/alieneval.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ac6193366..cfc83d455 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4946312c4..3df3c6ac9 100644
</span> --- src/code/alieneval.lisp
 +++ src/code/alieneval.lisp
 @@ -25,7 +25,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -42,10 +42,10 @@ index ac6193366..cfc83d455 100644
</span>          ((> bits 8) 16)
          ((> bits 1) 8)
 diff --git src/code/float-trap.lisp src/code/float-trap.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ec78d4903..697618fe1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1a634d9f6..95355c0df 100644
</span> --- src/code/float-trap.lisp
 +++ src/code/float-trap.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -119,6 +119,8 @@ in effect."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -117,6 +117,8 @@ in effect."
</span>        (setf (ldb float-precision-control modes)
              (or (cdr (assoc precision +precision-mode-alist+))
                  (error "unknown precision mode: ~S" precision))))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -500,10 +500,10 @@ index 28a6d2e90..91ddfab72 100644
</span> +                (tn-byte-offset bits))))))))
 +
 diff --git src/compiler/ppc/parms.lisp src/compiler/ppc/parms.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 4a99d5054..42d21e340 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d2881fd5a..916c6e345 100644
</span> --- src/compiler/ppc/parms.lisp
 +++ src/compiler/ppc/parms.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -103,7 +103,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -90,7 +90,8 @@
</span>                       :dynamic-space-start
                       #+linux   #x4f000000
                       #+netbsd  #x4f000000
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -511,24 +511,10 @@ index 4a99d5054..42d21e340 100644
</span> +                     #+openbsd #x4f000000
 +                     #+darwin  #x10000000)
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant linkage-table-growth-direction :up)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant linkage-table-entry-size 16)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -135,6 +136,13 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (defparameter dynamic-0-space-start #x4f000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (defparameter dynamic-0-space-end   #x5cfff000)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#+darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-gencgc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (defparameter dynamic-0-space-start #x10000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (defparameter dynamic-0-space-end   #x3ffff000)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defenum (:start 8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   halt-trap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (defconstant alien-linkage-table-growth-direction :up)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (defconstant alien-linkage-table-entry-size 16)
</span> diff --git src/compiler/ppc/vm.lisp src/compiler/ppc/vm.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index af6cc1ea0..70579f47b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f85968b53..0163f16cd 100644
</span> --- src/compiler/ppc/vm.lisp
 +++ src/compiler/ppc/vm.lisp
 @@ -20,7 +20,8 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -557,24 +543,6 @@ index af6cc1ea0..70579f47b 100644
</span>    (defreg bsp 14)
    (defreg cfp 15)
    (defreg csp 16)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/compiler/ppc64/parms.lisp src/compiler/ppc64/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 2004cd4db..b38677c4d 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/compiler/ppc64/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/compiler/ppc64/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -124,6 +124,13 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (defparameter dynamic-0-space-start #x4f000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (defparameter dynamic-0-space-end   #x5cfff000)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#+darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-gencgc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (defparameter dynamic-0-space-start #x10000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (defparameter dynamic-0-space-end   #x3ffff000)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defenum (:start 8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   halt-trap
</span> diff --git src/runtime/Config.ppc-darwin src/runtime/Config.ppc-darwin
 new file mode 100644
 index 000000000..b34a07236
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -623,10 +591,10 @@ index 000000000..b34a07236
</span> +# Nothing to do.
 +after-grovel-headers:
 diff --git src/runtime/monitor.c src/runtime/monitor.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1ce9a9cfa..613ce0b01 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a768fe51e..1c9857db7 100644
</span> --- src/runtime/monitor.c
 +++ src/runtime/monitor.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -600,6 +600,10 @@ print_context(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -640,6 +640,10 @@ print_context(os_context_t *context)
</span>          brief_print((lispobj)(*os_context_register_addr(context,i)));
  
      }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -638,7 +606,7 @@ index 1ce9a9cfa..613ce0b01 100644
</span>      printf("PC:\t\t  0x%08lx\n", (unsigned long)os_context_pc(context));
  #endif
 diff --git src/runtime/ppc-arch.c src/runtime/ppc-arch.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1822d8a76..6dd6fb8e0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 757997f09..a7624c00c 100644
</span> --- src/runtime/ppc-arch.c
 +++ src/runtime/ppc-arch.c
 @@ -46,8 +46,10 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -653,7 +621,7 @@ index 1822d8a76..6dd6fb8e0 100644
</span>  #ifndef PT_DSISR
  #define PT_DSISR        42
 diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index eacb9704d..5179870bd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 342952dc0..982c4e7e9 100644
</span> --- src/runtime/ppc-assem.S
 +++ src/runtime/ppc-assem.S
 @@ -16,8 +16,20 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -848,7 +816,7 @@ index eacb9704d..5179870bd 100644
</span> @@ -198,6 +340,9 @@ x:
  
        /* Call out to obtain our TLS block. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        load(reg_NL0,CSYMBOL(specials))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   load(reg_NL0,CSYMBOL(current_thread))
</span> + /* This won't work on darwin: wrong fixup style.  And is it
 +       * supposed to be lis/ori or lis/addi?  Or does it differ
 +       * between darwin and everything else again? */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1144,32 +1112,23 @@ index e0c31f7cd..7fefc085e 100644
</span>  #define NREGS 32
  
 diff --git tests/float.pure.lisp tests/float.pure.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 9bc9670b7..fd2a7d22f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 8ed76998c..914d874c7 100644
</span> --- tests/float.pure.lisp
 +++ tests/float.pure.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -98,7 +98,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (assert (= 0.0d0 (scale-float 1.0d0 (1- most-negative-fixnum)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (with-test (:name (:scale-float-overflow :bug-372)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            :fails-on (or :arm64))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            :fails-on (or :arm64 (and :darwin :ppc)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (flet ((test (form)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (assert-error (funcall (checked-compile `(lambda () ,form)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                    :allow-style-warnings t))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -135,6 +135,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (with-test (:name (:addition-overflow :bug-372)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             :fails-on (or :arm64
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                         (and :ppc :openbsd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                        (and :ppc :darwin)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                         (and :x86 :netbsd)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -136,6 +136,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             :fails-on (or (and :arm64 (not :darwin))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           :arm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (and :ppc :openbsd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          (and :ppc :darwin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (and :x86 :netbsd)))
</span>    (assert-error
     (sb-sys:without-interrupts
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -155,6 +156,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (with-test (:name (:addition-overflow :bug-372 :take-2)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             :fails-on (or :arm64
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                         (and :ppc :openbsd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                        (and :ppc :darwin)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                         (and :x86 :netbsd)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -157,6 +158,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             :fails-on (or (and :arm64 (not :darwin))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           :arm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (and :ppc :openbsd)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                          (and :ppc :darwin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (and :x86 :netbsd)))
</span>    (assert-error
     (sb-sys:without-interrupts
 diff --git tests/foreign-stack-alignment.impure.lisp tests/foreign-stack-alignment.impure.lisp
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1186,6 +1145,19 @@ index bd505938d..23b431f3e 100644
</span>        #+(or arm64 x86 x86-64 riscv ppc64) 16
        #+sparc 8
        (error "Unknown platform")))
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git tests/test-funs.lisp tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 784c7815a..6bb6f7d0c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -37,7 +37,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         (start-time (get-internal-real-time)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (declare (special test-util::*deferred-test-forms*))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (makunbound 'test-util::*deferred-test-forms*)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    (let ((*features* (append *features* #+(and (or arm arm64) (not darwin))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (let ((*features* (append *features* #+(and (or arm arm64) (not (and darwin ppc)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          (unless (getf (sb-int:get-floating-point-modes) :traps)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                            '(:no-float-traps))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                          sb-impl:+internal-features+)))
</span> -- 
 2.41.0
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1010-ppc-Darwin-Config.ppc-use-right-compiler-and-deploym.patch b/lang/sbcl/files/1013-ppc-Darwin-Config.ppc-follow-up-changes.patch
</span>similarity index 52%
rename from lang/sbcl/files/1010-ppc-Darwin-Config.ppc-use-right-compiler-and-deploym.patch
rename to lang/sbcl/files/1013-ppc-Darwin-Config.ppc-follow-up-changes.patch
<span style='display:block; white-space:pre;color:#808080;'>index c03cb41a7f4..5b2faed900f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1010-ppc-Darwin-Config.ppc-use-right-compiler-and-deploym.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1013-ppc-Darwin-Config.ppc-follow-up-changes.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,24 +1,25 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 51d53157fb6af25c9085cfeff1e959742f5407bd Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 9deb1b90c8d923fdc786127044d8fdf3e0de7f25 Mon Sep 17 00:00:00 2001
</span> From: barracuda156 <vital.had@gmail.com>
 Date: Mon, 5 Jun 2023 22:29:05 +0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: Config.ppc: use right compiler and deployment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] ppc/Darwin: Config.ppc: follow up changes
</span> 
 ---
<span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.ppc-darwin | 18 ++++++++++++++----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 14 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/Config.ppc-darwin | 33 ++++++++++++++++++---------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 18 insertions(+), 15 deletions(-)
</span> 
 diff --git src/runtime/Config.ppc-darwin src/runtime/Config.ppc-darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b34a07236..34376a0a6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b34a07236..cb068de0c 100644
</span> --- src/runtime/Config.ppc-darwin
 +++ src/runtime/Config.ppc-darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -9,8 +9,20 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -9,33 +9,36 @@
</span>  # provided with absolutely no warranty. See the COPYING and CREDITS
  # files for more information.
  
 -CFLAGS = -g -Wall -O2 -fdollars-in-identifiers -mmacosx-version-min=10.4
 -LINKFLAGS += -mmacosx-version-min=10.4
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+CFLAGS = -g -Wall -O2 -fdollars-in-identifiers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++CFLAGS = -arch ppc -g -Wall -O2 -fdollars-in-identifiers -D_XOPEN_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DEPEND_FLAGS += -D_XOPEN_SOURCE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++LINKFLAGS = -arch ppc
</span> +
 +ifdef SBCL_MACOSX_VERSION_MIN
 +  CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -35,8 +36,10 @@ index b34a07236..34376a0a6 100644
</span>  
  OS_SRC = bsd-os.c darwin-os.c ppc-darwin-os.c
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -19,8 +31,6 @@ ifdef LISP_FEATURE_SB_CORE_COMPRESSION
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   OS_LIBS += -lz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ OS_LIBS = -lSystem -lc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifdef LISP_FEATURE_SB_CORE_COMPRESSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  OS_LIBS += -lz
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  OS_LIBS += -lzstd
</span>  endif
  
 -CC = gcc
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,6 +47,22 @@ index b34a07236..34376a0a6 100644
</span>  ASSEM_SRC = ppc-assem.S
  ARCH_SRC = ppc-arch.c
  
<span style='display:block; white-space:pre;background:#e0ffe0;'>+-CPPFLAGS += -no-cpp-precomp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-ifdef LISP_FEATURE_GENCGC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   LIBSBCL = libsbcl.a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   USE_LIBSBCL = -Wl,-force_load libsbcl.a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-.PHONY: after-grovel-headers
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-# Nothing to do.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-after-grovel-headers:
</span> -- 
 2.41.0
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1013-ppc-Darwin-make-config.sh-use-gcc-tls-for-ppc.patch b/lang/sbcl/files/1013-ppc-Darwin-make-config.sh-use-gcc-tls-for-ppc.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 18835ead851..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1013-ppc-Darwin-make-config.sh-use-gcc-tls-for-ppc.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,26 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 16661aa73e9b896939e8249ba3dd22a60729a5be Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Sergey Fedorov <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Tue, 6 Jun 2023 00:01:51 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: make-config.sh: use gcc-tls for ppc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-config.sh | 3 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 3 insertions(+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git make-config.sh make-config.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0d0f76dce..c225fde85 100755
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- make-config.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ make-config.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -568,6 +568,9 @@ case "$sbcl_os" in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if [ $sbcl_arch = "arm64" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             printf ' :darwin-jit :gcc-tls' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if [ $sbcl_arch = "ppc" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             printf ' :gcc-tls' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         link_or_copy $sbcl_arch-darwin-os.h target-arch-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         link_or_copy bsd-os.h target-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         link_or_copy Config.$sbcl_arch-darwin Config
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.41.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1011-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch b/lang/sbcl/files/1014-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
</span>similarity index 88%
rename from lang/sbcl/files/1011-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
rename to lang/sbcl/files/1014-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
<span style='display:block; white-space:pre;color:#808080;'>index 8ba90ec9780..e88b5e70185 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1011-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1014-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 17eb2d4786e4a3c1c966403fc1a8d971cd9f287d Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From f495aaffc057d039294e9afd4b68f42ebd82d724 Mon Sep 17 00:00:00 2001
</span> From: barracuda156 <vital.had@gmail.com>
 Date: Mon, 5 Jun 2023 22:30:34 +0800
 Subject: [PATCH] ppc/Darwin: ppc-assem.S: fix wrong assembler code chunk
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,13 +8,13 @@ Subject: [PATCH] ppc/Darwin: ppc-assem.S: fix wrong assembler code chunk
</span>  1 file changed, 7 insertions(+), 5 deletions(-)
 
 diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5179870bd..154e79d12 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 982c4e7e9..200e5d2d7 100644
</span> --- src/runtime/ppc-assem.S
 +++ src/runtime/ppc-assem.S
 @@ -340,11 +340,13 @@ x:
  
        /* Call out to obtain our TLS block. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        load(reg_NL0,CSYMBOL(specials))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   load(reg_NL0,CSYMBOL(current_thread))
</span> - /* This won't work on darwin: wrong fixup style.  And is it
 -       * supposed to be lis/ori or lis/addi?  Or does it differ
 -       * between darwin and everything else again? */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1012-ppc-Darwin-Misc-fixes-for-PPC.patch b/lang/sbcl/files/1015-ppc-Darwin-Misc-fixes-for-PPC.patch
</span>similarity index 68%
rename from lang/sbcl/files/1012-ppc-Darwin-Misc-fixes-for-PPC.patch
rename to lang/sbcl/files/1015-ppc-Darwin-Misc-fixes-for-PPC.patch
<span style='display:block; white-space:pre;color:#808080;'>index 80ed509d385..5393f95e157 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1012-ppc-Darwin-Misc-fixes-for-PPC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1015-ppc-Darwin-Misc-fixes-for-PPC.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 015cc3d0a5e438dde1a751343d56021a77fcc389 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From d34f8c9a5b31bb05b31ca905bb20a4965dfdb0d1 Mon Sep 17 00:00:00 2001
</span> From: Sergey Fedorov <vital.had@gmail.com>
 Date: Mon, 5 Jun 2023 22:51:40 +0800
 Subject: [PATCH] ppc/Darwin: Misc fixes for PPC
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -11,26 +11,26 @@ Subject: [PATCH] ppc/Darwin: Misc fixes for PPC
</span>  4 files changed, 19 insertions(+), 2 deletions(-)
 
 diff --git contrib/sb-grovel/def-to-lisp.lisp contrib/sb-grovel/def-to-lisp.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 90ab33ae3..00c489b79 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e556c133a..fc84afe4a 100644
</span> --- contrib/sb-grovel/def-to-lisp.lisp
 +++ contrib/sb-grovel/def-to-lisp.lisp
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -281,6 +281,11 @@ code:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ,(format nil "-mmacosx-version-min=~A"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                 (or (sb-ext:posix-getenv "SBCL_MACOSX_VERSION_MIN")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                      "10.4")))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      #+(and ppc darwin)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      `("-arch" "ppc"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                       ,(format nil "-mmacosx-version-min=~A"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (or (sb-ext:posix-getenv "SBCL_MACOSX_VERSION_MIN")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                     "10.4")))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                       #+(and x86-64 sunos) '("-m64")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                       (list "-o"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                             (namestring tmp-a-dot-out)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -205,6 +205,11 @@ code:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                  "-D_DARWIN_USE_64_BIT_INODE")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #+(and x86-64 darwin (not inode64))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        '("-arch" "x86_64" "-mmacosx-version-min=10.4")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       #+(and ppc darwin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       `("-arch" "ppc"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         ,(format nil "-mmacosx-version-min=~A"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                  (or (sb-ext:posix-getenv "SBCL_MACOSX_VERSION_MIN")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                      "10.4")))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #+(and x86-64 sunos) '("-m64")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        (list "-o" (namestring exefile) (namestring sourcefile)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       :search t
</span> diff --git make-config.sh make-config.sh
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b161690cf..0d0f76dce 100755
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fde800457..c47669713 100755
</span> --- make-config.sh
 +++ make-config.sh
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -651,8 +651,15 @@ case "$sbcl_arch" in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -739,8 +739,15 @@ case "$sbcl_arch" in
</span>   $GNUMAKE -C tools-for-build where-is-mcontext -I ../src/runtime
        tools-for-build/where-is-mcontext > src/runtime/ppc-linux-mcontext.h || (echo "error running where-is-mcontext"; exit 1)
      elif [ "$sbcl_os" = "darwin" ]; then
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -49,20 +49,17 @@ index b161690cf..0d0f76dce 100755
</span>      ;;
    ppc64)
 diff --git src/runtime/Config.ppc-darwin src/runtime/Config.ppc-darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 34376a0a6..f53b4d12b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index cb068de0c..5611dd376 100644
</span> --- src/runtime/Config.ppc-darwin
 +++ src/runtime/Config.ppc-darwin
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -45,6 +45,10 @@ ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,3 +42,7 @@ ifdef LISP_FEATURE_SB_LINKABLE_RUNTIME
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   LIBSBCL = libsbcl.a
</span>    USE_LIBSBCL = -Wl,-force_load libsbcl.a
  endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +ifdef LISP_FEATURE_SB_THREAD
 +  OS_LIBS += -lpthread
 +endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .PHONY: after-grovel-headers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Nothing to do.
</span> diff --git tests/run-compiler.sh tests/run-compiler.sh
 index 913e2c8a7..d157f6206 100755
 --- tests/run-compiler.sh
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1014-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch b/lang/sbcl/files/1016-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span>similarity index 90%
rename from lang/sbcl/files/1014-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
rename to lang/sbcl/files/1016-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
<span style='display:block; white-space:pre;color:#808080;'>index f4db0092ea9..fe6e65f0667 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1014-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1016-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 300c4b89883a7a0ec75b5fb498309b95d8c58f4d Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 8d2ed16e819e0de4159ecadc6c367a9e86adc7ef Mon Sep 17 00:00:00 2001
</span> From: barracuda156 <vital.had@gmail.com>
 Date: Tue, 6 Jun 2023 16:37:08 +0800
 Subject: [PATCH] ppc/Darwin: ppc-assem: a minor fix to assembler syntax
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,7 +8,7 @@ Subject: [PATCH] ppc/Darwin: ppc-assem: a minor fix to assembler syntax
</span>  1 file changed, 7 insertions(+)
 
 diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 154e79d12..f424d02fd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 200e5d2d7..d902d6e86 100644
</span> --- src/runtime/ppc-assem.S
 +++ src/runtime/ppc-assem.S
 @@ -302,9 +302,16 @@ x:
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1017-Fix-building-by-lisp-without-endian-features.patch b/lang/sbcl/files/1017-Fix-building-by-lisp-without-endian-features.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..5884dbb5d07
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1017-Fix-building-by-lisp-without-endian-features.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,33 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 4bc3a52b5ed2e977ca29ea5ac7c3e2bb6801cd41 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Thu, 8 Jun 2023 20:43:29 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix building by lisp without endian features
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Some lisp may not have little-endian or big-endian in features which
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+leads to trigger that asset that shouldn't happened because target
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+features contains it and it should downgrade to bvref-64/bvref-32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+instead of native-bvref-word.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This issue was introduced at 1ec9a7270aeb2f2b4d7d14919e323b44ee117be8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/cold/shebang.lisp | 4 +++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 3 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/cold/shebang.lisp src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 4edafcbf8..313036fc5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -34,7 +34,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (defun compatible-vector-raw-bits () ; T if the host and target match on word size and endianness
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   (flet ((endianness (features)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            (let ((result (intersection '(:little-endian :big-endian) features)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-             (assert (and result (not (cdr result))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             ;; some lisp implementation may not have little-endian / big-endian
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             ;; features which shouldn't trigger that assert
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++             (assert (or (not result) (and result (not (cdr result)))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+              (car result)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          (wordsize (features)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            (if (member :64-bit features) 64 32)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.41.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/sbcl/files/1018-Darwin-implement-os_tsd_get_direct-for-macOS-before-.patch b/lang/sbcl/files/1018-Darwin-implement-os_tsd_get_direct-for-macOS-before-.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..37df0c8f494
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/sbcl/files/1018-Darwin-implement-os_tsd_get_direct-for-macOS-before-.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,85 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 2dac0ee15c5f7c03b49ef9d11d3864e2dc348ab2 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sat, 10 Jun 2023 00:28:06 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Darwin: implement `os_tsd_get_direct` for macOS before 10.13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+macOS / Darwin can be run not only x86_64, arm64 and arm64. The old
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+logic uses arm64 way on everything else that leads to illegal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+instruction on runtime.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Here I've bring support for i386, ppc and ppc64, and added
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+compatimibilty for macOS before 10.13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Regression was introduced at 4ce2310cc5d9db835423168cac0d28ed8caff3eb
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ src/runtime/thread.c | 41 +++++++++++++++++++++++++++++++----------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 31 insertions(+), 10 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git src/runtime/thread.c src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d0f9f2dd6..79f215ac4 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -214,29 +214,50 @@ int sb_GetTID()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return getthrid();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-// follows is what the apple pthreads implementation does...
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#define __TSD_MACH_THREAD_SELF 3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// based on:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  - os/tsd.h from 10.13 and 10.9;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++//  - pthread_machdep.h from 10.5.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __LP64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _PTHREAD_TSD_OFFSET 0x60
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define _PTHREAD_TSD_OFFSET 0x48
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ __attribute__((always_inline)) static inline uintptr_t _os_tsd_get_direct(unsigned long slot) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__i386__) || defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         uintptr_t ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         __asm__ volatile ("mov %%gs:%1, %0" : "=r" (ret) : "m" (*(void **)(slot * sizeof(void *))));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#else // __x86_64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-__attribute__((always_inline)) static inline uintptr_t _os_tsd_get_direct(unsigned long slot) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__arm__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         uintptr_t *base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(__arm__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         __asm__("mrc p15, 0, %0, c13, c0, 3\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 "bic %0, %0, #0x3\n" : "=r" (base));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return base[slot];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(__arm64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        uintptr_t *base;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         __asm__ ("mrs %0, TPIDRRO_EL0" : "=r" (base));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return base[slot];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__ppc__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        void **__pthread_tsd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        __asm__ volatile("mfspr %0, 259" : "=r" (__pthread_tsd));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return __pthread_tsd[slot + (_PTHREAD_TSD_OFFSET / sizeof(void *))];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(__ppc64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        register void **__pthread_tsd __asm__ ("r13");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return __pthread_tsd[slot + (_PTHREAD_TSD_OFFSET / sizeof(void *))];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else // something else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#error no pthread_getspecific_direct nor _os_tsd_get_direct implementation for this arch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</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;'>+ uint32_t sb_GetTID(void) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         // actually a 32-bit id; truncation is harmless
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        return (uint32_t)_os_tsd_get_direct(__TSD_MACH_THREAD_SELF);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101300
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return (uint32_t)_os_tsd_get_direct(0); // __TSD_THREAD_SELF or _PTHREAD_TSD_SLOT_PTHREAD_SELF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return (uint32_t)_os_tsd_get_direct(3); // __TSD_MACH_THREAD_SELF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define sb_GetTID() 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.41.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>