<pre style='margin:0'>
Perry E. Metzger (pmetzger) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/7194d31b14d809ecd579dbce8bacb77f585edcc9">https://github.com/macports/macports-ports/commit/7194d31b14d809ecd579dbce8bacb77f585edcc9</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 7194d31b14d809ecd579dbce8bacb77f585edcc9
</span>Author: Kirill A. Korinsky <kirill@korins.ky>
AuthorDate: Thu Sep 28 17:07:24 2023 +0200

<span style='display:block; white-space:pre;color:#404040;'>    sbcl: update to 2.3.9; fix build on macOS 14
</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/68271
</span>---
 lang/sbcl/Portfile                                 |   71 +-
 .../1001-x86-Darwin-Revert-x86-darwin-files.patch  |  697 ------------
 ...Revert-Perform-darwin-related-housekeepin.patch |  207 ----
 ...-x86-Darwin-Remove-mach-exception-handler.patch |  437 --------
 ...-recovery-support-non-dispatch-semaphores.patch |  164 ---
 ...rwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch |   29 -
 .../1006-x86-Darwin-revert-OS_THREAD_STACK.patch   |   28 -
 ...-x86-Darwin-fix-build-by-old-preprocessor.patch |   26 -
 ...86-Darwin-disable-failing-stat-mode-tests.patch |   32 -
 .../1009-x86-Darwin-add-missed-OS_CONTEXT_PC.patch |   37 -
 .../files/1010-x86-Darwin-fix-syntax-typos.patch   |   31 -
 ...-Revert-Delete-support-for-and-darwin-ppc.patch | 1162 --------------------
 ...2-ppc-Darwin-Config.ppc-follow-up-changes.patch |   68 --
 ...ppc-assem.S-fix-wrong-assembler-code-chun.patch |   35 -
 .../files/1014-ppc-Darwin-Misc-fixes-for-PPC.patch |   77 --
 ...ppc-assem-a-minor-fix-to-assembler-syntax.patch |   33 -
 ...-building-by-lisp-without-endian-features.patch |   33 -
 .../1017-ppc-Darwin-fix-threads-support.patch      |   89 --
 ...-fix-build-without-legacy-support-library.patch |  218 ----
 ...1019-Allow-bootstrap-by-SBCL-before-1.1.5.patch |   28 -
 ...20-ppc-Darwin-fix-build-on-32-bit-systems.patch |   43 -
 21 files changed, 23 insertions(+), 3522 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 50be65f0d12..8cb4cfaab2a 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;'>@@ -11,8 +11,9 @@ name            sbcl
</span> #
 # Please bump the revision of math/maxima (and when it exists
 # math/maxima-devel) and fricas when this port changes.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version         2.3.8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version         2.3.9
</span> revision        0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+epoch           1
</span> 
 categories      lang
 license         BSD
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -35,47 +36,9 @@ homepage        http://www.sbcl.org
</span> patchfiles      0001-fix-building-when-root-directory-contain-non-ASCII-c.patch \
                 0002-add-MacPorts-XDG_DATA_DIRS.patch
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums       rmd160  03daa7508f3e99af0515b748ee644ef47000a0af \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sha256  421571b2ac916e58be8ebcea5ef4abf8d7902863db6a1d0a5efa9500adca0d29 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                size    7562146
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# NOTE: Historically, the last version to support x86/Darwin and ppc/Darwin was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# 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:#ffe0e0;'>-# such platforms, we have a different epoch and versioning.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Please do not update it without testing.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-if {${os.platform} eq "darwin" && ${configure.build_arch} in [list ppc i386] && ${name} eq ${subport}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    version     2.3.8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    revision    0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    epoch       [ expr ${epoch} + 1 ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    checksums   rmd160  03daa7508f3e99af0515b748ee644ef47000a0af \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sha256  421571b2ac916e58be8ebcea5ef4abf8d7902863db6a1d0a5efa9500adca0d29 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                size    7562146
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # See: https://bugs.launchpad.net/sbcl/+bug/2033287
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    patchfiles-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1001-x86-Darwin-Revert-x86-darwin-files.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1003-x86-Darwin-Remove-mach-exception-handler.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1004-Darwin-recovery-support-non-dispatch-semaphores.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1005-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1006-x86-Darwin-revert-OS_THREAD_STACK.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1007-x86-Darwin-fix-build-by-old-preprocessor.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1008-x86-Darwin-disable-failing-stat-mode-tests.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1009-x86-Darwin-add-missed-OS_CONTEXT_PC.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1010-x86-Darwin-fix-syntax-typos.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1011-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1012-ppc-Darwin-Config.ppc-follow-up-changes.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1013-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1014-ppc-Darwin-Misc-fixes-for-PPC.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1015-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1016-Fix-building-by-lisp-without-endian-features.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1017-ppc-Darwin-fix-threads-support.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1018-Darwin-fix-build-without-legacy-support-library.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1019-Allow-bootstrap-by-SBCL-before-1.1.5.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                1020-ppc-Darwin-fix-build-on-32-bit-systems.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums       rmd160  99f0a5533c60887890775c4df4a6331a4359b432 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                sha256  7d289a91232022028bf0128900c32bf00e4c5430c32f28af0594c8a592a98654 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                size    7574665
</span> 
 if {${name} eq ${subport}} {
     master_sites \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -108,11 +71,6 @@ subport sbcl-devel {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_build-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                port:sbcl-bootstrap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_skip_archcheck-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                sbcl-bootstrap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> if {${name} eq ${subport}} {
     # clock_gettime
     legacysupport.newest_darwin_requires_legacy 15
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -172,8 +130,25 @@ use_parallel_build  no
</span> build.cmd       sh
 build.target    make.sh
 build.args-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                --prefix=${prefix} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                --prefix=${prefix}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# unfortunately sbcl-bootstrap doesn't support macOS Sonoma yet, use ECL instead
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# See: https://trac.macports.org/ticket/68271
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${os.major} >= 23} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_build-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                path:bin/ecl:ecl-devel
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    build.args-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                --xc-host=${prefix}/bin/ecl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+} else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_build-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                port:sbcl-bootstrap
</span><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><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    build.args-append \
</span>                 --xc-host=${prefix}/libexec/sbcl-bootstrap/bin/sbcl
<span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 if {${configure.build_arch} eq "i386"} {
     build.args-append \
<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>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 7ec4b9ac75b..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1001-x86-Darwin-Revert-x86-darwin-files.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,697 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 4682b3e9848dab6a918f43ab866dc06f54dba071 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 23:04:18 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: Revert x86-darwin files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/75a9f0dc55db87258a4cbafe6b8439709e306258
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/7bd2ec99c78875130d3b022479dbd0fe9a6c0e26
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-config.sh                |   4 -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.x86-darwin |  45 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-darwin-os.c   | 529 ++++++++++++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-darwin-os.h   |  69 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 643 insertions(+), 4 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/x86-darwin-os.h
</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 789015bd2..3820b73c0 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;'>-@@ -697,10 +697,6 @@ fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case "$sbcl_arch" in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   x86)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if [ "$sbcl_os" = "darwin" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        echo "Unsupported configuration"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        exit 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if [ "$sbcl_os" = "win32" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         # of course it doesn't provide dlopen, but there is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         # roughly-equivalent magic nevertheless.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/Config.x86-darwin src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..ffc8e2d94
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.x86-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,45 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# -*- makefile -*- for the C-level run-time support for SBCL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# This software is part of the SBCL system. See the README file for
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# This software is derived from the CMU CL system, which was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# written at Carnegie Mellon University and released into the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# public domain. The software is in the public domain and is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# provided with absolutely no warranty. See the COPYING and CREDITS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# files for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+CFLAGS += -arch i386 -g -Wall -fdollars-in-identifiers -fno-omit-frame-pointer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+LINKFLAGS += -arch i386
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ifdef SBCL_MACOSX_VERSION_MIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  LINKFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ifdef LISP_FEATURE_DARWIN9_OR_BETTER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    CFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    LINKFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    CFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    LINKFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  endif
</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;'>-+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:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+OS_LIBS = -lSystem -lc -ldl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+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;'>-+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;'>-+  USE_LIBSBCL = -Wl,-force_load libsbcl.a
</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;'>-+ASSEM_SRC = x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ARCH_SRC = x86-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-darwin-os.c src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..8605bf0b2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,529 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/mach_init.h>
</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;'>-+#include "thread.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "validate.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "runtime.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "interrupt.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "x86-darwin-os.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "genesis/fdefn.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "gc.h" // for gencgc_handle_wp_violation
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/mach.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/mach_error.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/mach_types.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/sync_policy.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/vm_region.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/machine/thread_state.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/machine/thread_status.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/_types.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/ucontext.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <pthread.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <assert.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+pthread_mutex_t modify_ldt_lock = PTHREAD_MUTEX_INITIALIZER;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void set_data_desc_size(data_desc_t* desc, unsigned long size)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    desc->limit00 = (size - 1) & 0xffff;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    desc->limit16 = ((size - 1) >> 16) &0xf;
</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;'>-+void set_data_desc_addr(data_desc_t* desc, void* addr)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    desc->base00 = (unsigned int)addr & 0xffff;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    desc->base16 = ((unsigned int)addr & 0xff0000) >> 16;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    desc->base24 = ((unsigned int)addr & 0xff000000) >> 24;
</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;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+arch_os_load_ldt(struct thread *thread)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sel_t sel;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sel.index = thread->tls_cookie;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sel.rpl = USER_PRIV;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sel.ti = SEL_LDT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    __asm__ __volatile__ ("mov %0, %%fs" : : "r"(sel));
</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;'>-+int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    int n;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    data_desc_t ldt_entry = { 0, 0, 0, DESC_DATA_WRITE,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              3, 1, 0, DESC_DATA_32B, DESC_GRAN_BYTE, 0 };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    set_data_desc_addr(&ldt_entry, thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    set_data_desc_size(&ldt_entry, dynamic_values_bytes);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ignore_value(mutex_acquire(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    n = i386_set_ldt(LDT_AUTO_ALLOC, (union ldt_entry*) &ldt_entry, 1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (n < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        perror("i386_set_ldt");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("unexpected i386_set_ldt(..) failure");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ignore_value(mutex_release(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread->tls_cookie=n;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    arch_os_load_ldt(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    mach_lisp_thread_init(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    stack_t sigstack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Signal handlers are run on the control stack, so if it is exhausted
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * we had better use an alternate stack for whatever signal tells us
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * we've exhausted it */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sigstack.ss_sp    = calc_altstack_base(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sigstack.ss_flags = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sigstack.ss_size  = calc_altstack_size(thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sigaltstack(&sigstack,0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return 1;                  /* success */
</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;'>-+int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(LISP_FEATURE_SB_THREAD)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    int n = thread->tls_cookie;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Set the %%fs register back to 0 and free the ldt by setting it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * to NULL.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    __asm__ __volatile__ ("mov %0, %%fs" : : "r"(0));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ignore_value(mutex_acquire(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    i386_set_ldt(n, NULL, 1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ignore_value(mutex_release(&modify_ldt_lock));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return 1;                  /* success */
</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;'>-+#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void memory_fault_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * emulation.  It is passed a context with the uc_mcontext field
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * pointing to a valid block of memory. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void build_fake_signal_context(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               x86_float_state32_t *float_state) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_sigmask(0, NULL, &context->uc_sigmask);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    context->uc_mcontext->SS = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    context->uc_mcontext->FS = *float_state;
</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;'>-+/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * emulation.  It is effectively the inverse operation from above. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void update_thread_state_from_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                      x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                      os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *thread_state = context->uc_mcontext->SS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *float_state = context->uc_mcontext->FS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL);
</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;'>-+/* Modify a context to push new data on its stack. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void push_context(uint32_t data, x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    stack_pointer = (uint32_t*) thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *(--stack_pointer) = data;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_state->ESP = (unsigned int) stack_pointer;
</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;'>-+void align_context_stack(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* 16byte align the stack (provided that the stack is, as it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * should be, 4byte aligned. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    while (thread_state->ESP & 15) push_context(0, thread_state);
</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;'>-+/* Stack allocation starts with a context that has a mod-4 ESP value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * and needs to leave a context with a mod-16 ESP that will restore
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * the old ESP value and other register state when activated.  The
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * first part of this is the recovery trampoline, which loads ESP from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * EBP, pops EBP, and returns. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+asm("_stack_allocation_recover: movl %ebp, %esp; popl %ebp; ret;");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void open_stack_allocation(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    void stack_allocation_recover(void);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    push_context(thread_state->EBP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_state->EBP = thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_state->EIP = (unsigned int) stack_allocation_recover;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    align_context_stack(thread_state);
</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;'>-+/* Stack allocation of data starts with a context with a mod-16 ESP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * value and reserves some space on it by manipulating the ESP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * register. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void *stack_allocate(x86_thread_state32_t *thread_state, size_t size)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* round up size to 16byte multiple */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    size = (size + 15) & -16;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_state->ESP = ((uint32_t)thread_state->ESP) - size;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return (void *)thread_state->ESP;
</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;'>-+/* Arranging to invoke a C function is tricky, as we have to assume
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * cdecl calling conventions (caller removes args) and x86/darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * alignment requirements.  The simplest way to arrange this,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * actually, is to open a new stack allocation.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * WARNING!!! THIS DOES NOT PRESERVE REGISTERS! */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void call_c_function_in_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                void *function,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                int nargs,
</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;'>-+    va_list ap;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Set up to restore stack on exit. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    open_stack_allocation(thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Have to keep stack 16byte aligned on x86/darwin. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    for (i = (3 & -nargs); i; i--) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        push_context(0, thread_state);
</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;'>-+    thread_state->ESP = ((uint32_t)thread_state->ESP) - nargs * 4;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    va_start(ap, nargs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    for (i = 0; i < nargs; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        //push_context(va_arg(ap, uint32_t), thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        stack_pointer[i] = va_arg(ap, uint32_t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    va_end(ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thread_state->EIP = (unsigned int) function;
</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;'>-+void signal_emulation_wrapper(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              int signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              void (*handler)(int, siginfo_t *, void *))
</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;'>-+    os_context_t context;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    _STRUCT_MCONTEXT32 regs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    context.uc_mcontext = &regs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* when BSD signals are fired, they mask they signals in sa_mask
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       which always seem to be the blockable_sigset, for us, so we
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       need to:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       1) save the current sigmask
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       2) block blockable signals
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       3) call the signal handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       4) restore the sigmask */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    build_fake_signal_context(&context, thread_state, float_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    block_blockable_signals(0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    handler(signal, siginfo, &context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    update_thread_state_from_context(thread_state, float_state, &context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Trap to restore the signal context. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    asm volatile (".long 0xffff0b0f"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  : : "a" (thread_state), "c" (float_state));
</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;'>-+/* Convenience wrapper for the above */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void call_handler_on_thread(mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            int signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            void (*handler)(int, siginfo_t *, os_context_t *))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    x86_thread_state32_t new_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    x86_thread_state32_t *save_thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    x86_float_state32_t *save_float_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    siginfo_t *save_siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    kern_return_t ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Initialize the new state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    new_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    open_stack_allocation(&new_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    stack_allocate(&new_state, 256);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Save old state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    *save_thread_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Save float state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    save_float_state = (x86_float_state32_t *)stack_allocate(&new_state, sizeof(*save_float_state));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    state_count = x86_FLOAT_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (thread_state_t)save_float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Set up siginfo */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    save_siginfo = stack_allocate(&new_state, sizeof(*siginfo));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (siginfo == NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        save_siginfo = siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        *save_siginfo = *siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Prepare to call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    call_c_function_in_context(&new_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               signal_emulation_wrapper,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               5,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               save_thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               save_float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               save_siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               handler);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Update the thread state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (thread_state_t)&new_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("thread_set_state (x86_FLOAT_STATE32) failed %d", 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;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined DUMP_CONTEXT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void dump_context(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("eax: %08lx  ecx: %08lx  edx: %08lx  ebx: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->EAX, thread_state->ECX, thread_state->EDX, thread_state->EAX);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("esp: %08lx  ebp: %08lx  esi: %08lx  edi: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->ESP, thread_state->EBP, thread_state->ESI, thread_state->EDI);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("eip: %08lx  eflags: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->EIP, thread_state->EFLAGS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("cs: %04hx  ds: %04hx  es: %04hx  "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           "ss: %04hx  fs: %04hx  gs: %04hx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->CS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->DS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->ES,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->SS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->FS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           thread_state->GS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    for (i = 0; i < 48; i+=4) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        printf("%08x:  %08x %08x %08x %08x\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               thread_state->ESP + (i * 4),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               stack_pointer[i],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               stack_pointer[i+1],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               stack_pointer[i+2],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               stack_pointer[i+3]);
</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;'>-+control_stack_exhausted_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    extern void unblock_signals_in_context_and_maybe_warn(os_context_t*);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    unblock_signals_in_context_and_maybe_warn(context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
</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;'>-+void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR));
</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;'>-+kern_return_t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+catch_exception_raise(mach_port_t exception_port,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      mach_port_t task,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      exception_type_t exception,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      exception_data_t code_vector,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      mach_msg_type_number_t code_count)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    x86_thread_state32_t thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    void *addr = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    int signal = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    void (*handler)(int, siginfo_t *, os_context_t *) = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    siginfo_t siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    kern_return_t ret = KERN_SUCCESS, dealloc_ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    struct thread *th;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        != KERN_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("Can't find the thread for an exception %u", exception_port);
</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;'>-+    /* Get state and info */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (thread_state_t)&thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    switch (exception) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case EXC_BAD_ACCESS:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        signal = SIGBUS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Check if write protection fault */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if ((code_vector[0] & OS_VM_PROT_ALL) == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        addr = (void*)code_vector[1];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Just need to unprotect the page and do some bookkeeping, no need
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * to run it from the faulting thread.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * And because the GC uses signals to stop the world it might
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * interfere with that bookkeeping, because there's a window
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * before block_blockable_signals is performed. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (gencgc_handle_wp_violation(0, addr))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            goto do_not_handle;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Undefined alien */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (os_trunc_to_page(addr) == undefined_alien_address) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            handler = undefined_alien_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* At stack guard */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            lower_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            handler = control_stack_exhausted_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Return from stack guard */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            reset_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Regular memory fault */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        handler = memory_fault_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case EXC_BAD_INSTRUCTION:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Check if illegal instruction trap */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (code_vector[0] != EXC_I386_INVOP) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Check if UD2 instruction */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (*(unsigned short *)thread_state.EIP != 0x0b0f) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            /* KLUDGE: There are two ways we could get here:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * 1) We're executing data and we've hit some truly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    illegal opcode, of which there are a few, see
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    Intel 64 and IA-32 Architectures
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    Sofware Developer's Manual
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    Volume 3A page 5-34)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * 2) The kernel started an unrelated signal handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    before we got a chance to run. The context that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    caused the exception is saved in a stack frame
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             *    somewhere down below.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * In either case we rely on the exception to retrigger,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             * eventually bailing out if we're spinning on case 2).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            static mach_port_t last_thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            static unsigned int last_eip;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            if (last_thread == thread && last_eip == thread_state.EIP)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ret = KERN_SUCCESS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            last_thread = thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            last_eip = thread_state.EIP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Skip the trap code */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        thread_state.EIP += 2;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Return from handler? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (*(unsigned short *)thread_state.EIP == 0xffff) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        (thread_state_t)thread_state.EAX,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        x86_THREAD_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                lose("thread_set_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        (thread_state_t)thread_state.ECX,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Trap call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case EXC_BREAKPOINT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (single_stepping) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            /* Clear TF or the signal emulation wrapper won't proceed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               with single stepping enabled. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            thread_state.EFLAGS &= ~0x100;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        } else if (*(unsigned char*)(thread_state.EIP-1) == 0xCC) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* Call handler */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (handler != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      siginfo.si_signo = signal;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      siginfo.si_addr = addr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
</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;'>-+  do_not_handle:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    dealloc_ret = mach_port_deallocate (mach_task_self(), thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_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;'>-+    dealloc_ret = mach_port_deallocate (mach_task_self(), task);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      lose("mach_port_deallocate (task) failed with return_code %d", dealloc_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;'>-+    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;'>-+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;'>-+    /* KLUDGE: The x87 FPU control word is some nasty bitfield struct
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * thing.  Rather than deal with that, just grab it as a 16-bit
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * integer. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    unsigned short fpu_control_word =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        *((unsigned short *)&context->uc_mcontext->FS.FPU_FCW);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* reset exception flags and restore control flags on x87 FPU */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    asm ("fldcw %0" : : "m" (fpu_control_word));
</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;'>-diff --git src/runtime/x86-darwin-os.h src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..7ff303b96
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,69 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef _X86_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define _X86_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "darwin-os.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+typedef int os_context_register_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "arch-os-generic.inc"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void set_data_desc_size(data_desc_t* desc, unsigned long size);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void set_data_desc_addr(data_desc_t* desc, void* addr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* On OS X 10.5, the field names for the thread state have changed and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * now are prepended with __. Use some #define hackery to deal with
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * this.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->__ss.__##stem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EIP __eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ESP __esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EBP __ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EAX __eax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EBX __ebx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ECX __ecx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EDX __edx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ESI __esi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EDI __edi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EFLAGS __eflags
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CS __cs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define DS __ds
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ES __es
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FS __fs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SS __ss
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define GS __gs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FPU_FCW __fpu_fcw
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->ss.stem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EIP eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ESP esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EBP ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EAX eax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EBX ebx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ECX ecx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EDX edx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ESI esi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EDI edi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define EFLAGS eflags
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CS cs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define DS ds
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define ES es
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FS fs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SS ss
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define GS gs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FPU_FCW fpu_fcw
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* __DARWIN_UNIX03 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define RESTORE_FP_CONTROL_FROM_CONTEXT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void 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;'>-+#endif /* _X86_DARWIN_OS_H */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch b/lang/sbcl/files/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 7b5a03e2d26..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1002-x86-Darwin-Revert-Perform-darwin-related-housekeepin.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,207 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From f053ac8ab288056da6ef6f6f178c362d074d9abd 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 23:40:14 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: Revert "Perform darwin-related housekeeping"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This reverts commit f5386462b3ad5548763bc7de21d71cb723352af7.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/interrupt.c  |  7 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-arch.c   |  2 ++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-assem.S  | 56 +++++++++++++++++++++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-bsd-os.c | 23 +++++++++++++++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 85 insertions(+), 3 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/interrupt.c src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 38fc3bf21..1d24a39aa 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/interrupt.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1551,6 +1551,7 @@ extern int *os_context_flags_addr(os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern lispobj call_into_lisp(lispobj fun, lispobj *args, int nargs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern void post_signal_tramp(void);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern void call_into_lisp_tramp(void);
</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;'>- arrange_return_to_c_function(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1737,7 +1738,13 @@ arrange_return_to_c_function(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- arrange_return_to_lisp_function(os_context_t *context, lispobj function)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_X86)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    arrange_return_to_c_function(context,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                 (call_into_lisp_lookalike)call_into_lisp_tramp,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                 function);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     arrange_return_to_c_function(context, call_into_lisp, function);
</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;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- // These have undefined_alien_function tramp in x-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-arch.c src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 706c149c5..64764a272 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -80,6 +80,8 @@ os_context_flags_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return &context->uc_mcontext.mc_eflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #elif defined __OpenBSD__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return &context->sc_eflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#elif defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return (int *)(&context->uc_mcontext->SS.EFLAGS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #elif defined __NetBSD__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return &(context->uc_mcontext.__gregs[_REG_EFL]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #elif defined LISP_FEATURE_WIN32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-assem.S src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 974c1b10a..f92bde899 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -62,7 +62,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * that are defined to be no-ops on win32. Hopefully this still works on
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * other platforms.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#if !defined(LISP_FEATURE_WIN32)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if !defined(LISP_FEATURE_WIN32) && !defined(LISP_FEATURE_DARWIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define TYPE(name) .type name,@function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define SIZE(name) .size name,.-name
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -614,6 +614,56 @@ GNAME(exception_handler_wrapper):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   SIZE(GNAME(exception_handler_wrapper))
</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;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        .align align_16byte
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        .globl GNAME(call_into_lisp_tramp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        TYPE(GNAME(call_into_lisp_tramp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+GNAME(call_into_lisp_tramp):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* 1. build the stack frame from the block that's pointed to by ECX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           2. free the block
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           3. set ECX to 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           4. call the function via call_into_lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   0(%ecx)          /* return address */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   %ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        movl    %esp, %ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   32(%ecx)         /* eflags */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   28(%ecx)         /* EAX */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   20(%ecx)         /* ECX */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   16(%ecx)         /* EDX */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   24(%ecx)         /* EBX */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   $0                /* popal is going to ignore esp */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   %ebp              /* is this right?? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   12(%ecx)         /* ESI */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   8(%ecx)          /* EDI */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   $0                /* args for call_into_lisp */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   $0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   4(%ecx)          /* function to call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* free our save block */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   %ecx              /* reserve sufficient space on stack for args */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pushl   %ecx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        andl    $0xfffffff0, %esp  /* align stack */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        movl    $0x40, 4(%esp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        movl    %ecx, (%esp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        call    GNAME(os_alloc_gc_space)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* call call_into_lisp */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        leal    -48(%ebp), %esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        call    GNAME(call_into_lisp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* Clean up our mess */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        leal    -36(%ebp), %esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        popal
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        popfl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        leave
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ret
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        SIZE(call_into_lisp_tramp)
</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;'>-   .align  align_16byte,0x90
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   .globl  GNAME(post_signal_tramp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   TYPE(GNAME(post_signal_tramp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -624,6 +674,10 @@ GNAME(post_signal_tramp):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   addl $12,%esp   /* clear call_into_lisp args from stack */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   popal           /* restore registers */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         popfl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* skip two padding words */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        addl $8,%esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   leave
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ret
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   SIZE(GNAME(post_signal_tramp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-bsd-os.c src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index a41ded7b5..aa51fd0ba 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-bsd-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -8,8 +8,14 @@
</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;'>- #ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <architecture/i386/table.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <i386/user_ldt.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/mach_init.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <machine/segments.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <machine/sysarch.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* LISP_FEATURE_DARWIN */
</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;'>- #if defined(LISP_FEATURE_FREEBSD) || defined(LISP_FEATURE_DRAGONFLY)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -30,7 +36,11 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * almost every line of code. It would be nice to find some way to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * factor out the commonality better; failing that, it might be best
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * just to split this generic-BSD code into one variant for each BSD.
</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;'>-+ * KLUDGE II: this split has begun with the addition of the Darwin BSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * flavour, with the cross-architecture complications that this
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * entails; unfortunately, currently the situation is worse, not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * better, than in the above paragraph. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef LISP_FEATURE_NETBSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define _REG_eax _REG_EAX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -82,7 +92,7 @@ os_context_fp_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return (int *)CONTEXT_ADDR_FROM_STEM(ebp);
</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;'>--#if defined(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(__DragonFly__)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(LISP_FEATURE_FREEBSD) || defined(__OpenBSD__) || defined(LISP_FEATURE_DARWIN) || defined(__DragonFly__)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- os_context_sp_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -109,6 +119,11 @@ os_flush_icache(os_vm_address_t address, os_vm_size_t length)
</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;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* Note: the Darwin versions of arch_os_thread_init found in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+*/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if !defined(LISP_FEATURE_DARWIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void set_data_desc_size(struct segment_descriptor* desc, unsigned long size)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -123,6 +138,9 @@ void set_data_desc_addr(struct segment_descriptor* desc, void* addr)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     desc->sd_hibase = ((unsigned int)addr & 0xff000000) >> 24;
</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;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- arch_os_load_ldt(struct thread *thread)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -187,6 +205,7 @@ int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;                  /* success */
</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 /* !LISP_FEATURE_DARWIN */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if defined(LISP_FEATURE_FREEBSD)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if defined(LISP_FEATURE_RESTORE_TLS_SEGMENT_REGISTER_FROM_CONTEXT)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1003-x86-Darwin-Remove-mach-exception-handler.patch b/lang/sbcl/files/1003-x86-Darwin-Remove-mach-exception-handler.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 34061d309e3..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1003-x86-Darwin-Remove-mach-exception-handler.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,437 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 5cbbb69eb6574252804b712bf9e202fa85860ee6 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 23:32:13 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: Remove mach-exception-handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</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;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-darwin-os.c | 406 +-----------------------------------
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+), 405 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/x86-darwin-os.c src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8605bf0b2..012302856 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -81,9 +81,7 @@ int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thread->tls_cookie=n;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     arch_os_load_ldt(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    mach_lisp_thread_init(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#elif defined(LISP_FEATURE_C_STACK_IS_CONTROL_STACK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_C_STACK_IS_CONTROL_STACK
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     stack_t sigstack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* Signal handlers are run on the control stack, so if it is exhausted
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -112,408 +110,6 @@ int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;                  /* success */
</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;'>--#ifdef LISP_FEATURE_MACH_EXCEPTION_HANDLER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void sigill_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void sigtrap_handler(int signal, siginfo_t *siginfo, os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void memory_fault_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                          os_context_t *context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * emulation.  It is passed a context with the uc_mcontext field
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * pointing to a valid block of memory. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void build_fake_signal_context(os_context_t *context,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               x86_float_state32_t *float_state) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_sigmask(0, NULL, &context->uc_sigmask);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    context->uc_mcontext->SS = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    context->uc_mcontext->FS = *float_state;
</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;'>--/* This executes in the faulting thread as part of the signal
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * emulation.  It is effectively the inverse operation from above. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void update_thread_state_from_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                      x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                      os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    *thread_state = context->uc_mcontext->SS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    *float_state = context->uc_mcontext->FS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_sigmask(SIG_SETMASK, &context->uc_sigmask, NULL);
</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;'>--/* Modify a context to push new data on its stack. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void push_context(uint32_t data, x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    stack_pointer = (uint32_t*) thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    *(--stack_pointer) = data;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_state->ESP = (unsigned int) stack_pointer;
</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;'>--void align_context_stack(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* 16byte align the stack (provided that the stack is, as it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--     * should be, 4byte aligned. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    while (thread_state->ESP & 15) push_context(0, thread_state);
</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;'>--/* Stack allocation starts with a context that has a mod-4 ESP value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * and needs to leave a context with a mod-16 ESP that will restore
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * the old ESP value and other register state when activated.  The
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * first part of this is the recovery trampoline, which loads ESP from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * EBP, pops EBP, and returns. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--asm("_stack_allocation_recover: movl %ebp, %esp; popl %ebp; ret;");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void open_stack_allocation(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    void stack_allocation_recover(void);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    push_context(thread_state->EBP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_state->EBP = thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_state->EIP = (unsigned int) stack_allocation_recover;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    align_context_stack(thread_state);
</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;'>--/* Stack allocation of data starts with a context with a mod-16 ESP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * value and reserves some space on it by manipulating the ESP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * register. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void *stack_allocate(x86_thread_state32_t *thread_state, size_t size)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* round up size to 16byte multiple */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    size = (size + 15) & -16;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_state->ESP = ((uint32_t)thread_state->ESP) - size;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    return (void *)thread_state->ESP;
</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;'>--/* Arranging to invoke a C function is tricky, as we have to assume
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * cdecl calling conventions (caller removes args) and x86/darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * alignment requirements.  The simplest way to arrange this,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * actually, is to open a new stack allocation.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * WARNING!!! THIS DOES NOT PRESERVE REGISTERS! */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void call_c_function_in_context(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                void *function,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                int nargs,
</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;'>--    va_list ap;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Set up to restore stack on exit. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    open_stack_allocation(thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Have to keep stack 16byte aligned on x86/darwin. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    for (i = (3 & -nargs); i; i--) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        push_context(0, thread_state);
</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;'>--    thread_state->ESP = ((uint32_t)thread_state->ESP) - nargs * 4;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    va_start(ap, nargs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    for (i = 0; i < nargs; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        //push_context(va_arg(ap, uint32_t), thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        stack_pointer[i] = va_arg(ap, uint32_t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    va_end(ap);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    push_context(thread_state->EIP, thread_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thread_state->EIP = (unsigned int) function;
</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;'>--void signal_emulation_wrapper(x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                              x86_float_state32_t *float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                              int signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                              siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                              void (*handler)(int, siginfo_t *, void *))
</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;'>--    os_context_t context;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    _STRUCT_MCONTEXT32 regs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    context.uc_mcontext = &regs;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* when BSD signals are fired, they mask they signals in sa_mask
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       which always seem to be the blockable_sigset, for us, so we
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       need to:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       1) save the current sigmask
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       2) block blockable signals
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       3) call the signal handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       4) restore the sigmask */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    build_fake_signal_context(&context, thread_state, float_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    block_blockable_signals(0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    handler(signal, siginfo, &context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    update_thread_state_from_context(thread_state, float_state, &context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Trap to restore the signal context. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    asm volatile (".long 0xffff0b0f"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  : : "a" (thread_state), "c" (float_state));
</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;'>--/* Convenience wrapper for the above */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void call_handler_on_thread(mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                            x86_thread_state32_t *thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                            int signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                            siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                            void (*handler)(int, siginfo_t *, os_context_t *))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    x86_thread_state32_t new_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    x86_thread_state32_t *save_thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    x86_float_state32_t *save_float_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    siginfo_t *save_siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    kern_return_t ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Initialize the new state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    new_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    open_stack_allocation(&new_state);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    stack_allocate(&new_state, 256);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Save old state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    save_thread_state = (x86_thread_state32_t *)stack_allocate(&new_state, sizeof(*save_thread_state));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    *save_thread_state = *thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Save float state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    save_float_state = (x86_float_state32_t *)stack_allocate(&new_state, sizeof(*save_float_state));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    state_count = x86_FLOAT_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                (thread_state_t)save_float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Set up siginfo */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    save_siginfo = stack_allocate(&new_state, sizeof(*siginfo));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (siginfo == NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        save_siginfo = siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        *save_siginfo = *siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Prepare to call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    call_c_function_in_context(&new_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               signal_emulation_wrapper,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               5,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               save_thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               save_float_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               signal,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               save_siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                               handler);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Update the thread state */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                (thread_state_t)&new_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        lose("thread_set_state (x86_FLOAT_STATE32) failed %d", 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;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#if defined DUMP_CONTEXT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--void dump_context(x86_thread_state32_t *thread_state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    uint32_t *stack_pointer;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    printf("eax: %08lx  ecx: %08lx  edx: %08lx  ebx: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->EAX, thread_state->ECX, thread_state->EDX, thread_state->EAX);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    printf("esp: %08lx  ebp: %08lx  esi: %08lx  edi: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->ESP, thread_state->EBP, thread_state->ESI, thread_state->EDI);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    printf("eip: %08lx  eflags: %08lx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->EIP, thread_state->EFLAGS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    printf("cs: %04hx  ds: %04hx  es: %04hx  "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           "ss: %04hx  fs: %04hx  gs: %04hx\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->CS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->DS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->ES,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->SS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->FS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--           thread_state->GS);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    stack_pointer = (uint32_t *)thread_state->ESP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    for (i = 0; i < 48; i+=4) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        printf("%08x:  %08x %08x %08x %08x\n",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               thread_state->ESP + (i * 4),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               stack_pointer[i],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               stack_pointer[i+1],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               stack_pointer[i+2],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               stack_pointer[i+3]);
</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;'>--control_stack_exhausted_handler(int signal, siginfo_t *siginfo,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    extern void unblock_signals_in_context_and_maybe_warn(os_context_t*);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    unblock_signals_in_context_and_maybe_warn(context);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        (context, StaticSymbolFunction(CONTROL_STACK_EXHAUSTED_ERROR));
</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;'>--void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--undefined_alien_handler(int signal, siginfo_t *siginfo, os_context_t *context) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    arrange_return_to_lisp_function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        (context, StaticSymbolFunction(UNDEFINED_ALIEN_VARIABLE_ERROR));
</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;'>--kern_return_t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--catch_exception_raise(mach_port_t exception_port,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      mach_port_t thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      mach_port_t task,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      exception_type_t exception,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      exception_data_t code_vector,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                      mach_msg_type_number_t code_count)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    x86_thread_state32_t thread_state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    mach_msg_type_number_t state_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    void *addr = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    int signal = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    void (*handler)(int, siginfo_t *, os_context_t *) = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    siginfo_t siginfo;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    kern_return_t ret = KERN_SUCCESS, dealloc_ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    struct thread *th;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    FSHOW((stderr,"/entering catch_exception_raise with exception: %d\n", exception));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (mach_port_get_context(mach_task_self(), exception_port, (mach_vm_address_t *)&th)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        != KERN_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        lose("Can't find the thread for an exception %u", exception_port);
</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;'>--    /* Get state and info */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    state_count = x86_THREAD_STATE32_COUNT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if ((ret = thread_get_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                (thread_state_t)&thread_state,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                &state_count)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        lose("thread_get_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    switch (exception) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    case EXC_BAD_ACCESS:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        signal = SIGBUS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Check if write protection fault */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if ((code_vector[0] & OS_VM_PROT_ALL) == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        addr = (void*)code_vector[1];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Just need to unprotect the page and do some bookkeeping, no need
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * to run it from the faulting thread.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * And because the GC uses signals to stop the world it might
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * interfere with that bookkeeping, because there's a window
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         * before block_blockable_signals is performed. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (gencgc_handle_wp_violation(0, addr))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            goto do_not_handle;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Undefined alien */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (os_trunc_to_page(addr) == undefined_alien_address) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            handler = undefined_alien_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* At stack guard */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (os_trunc_to_page(addr) == CONTROL_STACK_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            lower_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            handler = control_stack_exhausted_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Return from stack guard */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (os_trunc_to_page(addr) == CONTROL_STACK_RETURN_GUARD_PAGE(th)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            reset_thread_control_stack_guard_page(th);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Regular memory fault */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        handler = memory_fault_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    case EXC_BAD_INSTRUCTION:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Check if illegal instruction trap */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (code_vector[0] != EXC_I386_INVOP) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Check if UD2 instruction */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (*(unsigned short *)thread_state.EIP != 0x0b0f) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            /* KLUDGE: There are two ways we could get here:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * 1) We're executing data and we've hit some truly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    illegal opcode, of which there are a few, see
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    Intel 64 and IA-32 Architectures
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    Sofware Developer's Manual
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    Volume 3A page 5-34)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * 2) The kernel started an unrelated signal handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    before we got a chance to run. The context that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    caused the exception is saved in a stack frame
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             *    somewhere down below.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * In either case we rely on the exception to retrigger,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             * eventually bailing out if we're spinning on case 2).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            static mach_port_t last_thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            static unsigned int last_eip;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            if (last_thread == thread && last_eip == thread_state.EIP)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                ret = KERN_SUCCESS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            last_thread = thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            last_eip = thread_state.EIP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Skip the trap code */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        thread_state.EIP += 2;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Return from handler? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (*(unsigned short *)thread_state.EIP == 0xffff) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        x86_THREAD_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        (thread_state_t)thread_state.EAX,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        x86_THREAD_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                lose("thread_set_state (x86_THREAD_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            if ((ret = thread_set_state(thread,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        x86_FLOAT_STATE32,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        (thread_state_t)thread_state.ECX,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                                        x86_FLOAT_STATE32_COUNT)) != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                lose("thread_set_state (x86_FLOAT_STATE32) failed %d", ret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        /* Trap call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    case EXC_BREAKPOINT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (single_stepping) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            /* Clear TF or the signal emulation wrapper won't proceed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--               with single stepping enabled. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            thread_state.EFLAGS &= ~0x100;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        } else if (*(unsigned char*)(thread_state.EIP-1) == 0xCC) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            signal = SIGTRAP;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            handler = sigtrap_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        ret = KERN_INVALID_RIGHT;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    /* Call handler */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (handler != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      siginfo.si_signo = signal;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      siginfo.si_addr = addr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      call_handler_on_thread(thread, &thread_state, signal, &siginfo, handler);
</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;'>--  do_not_handle:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    dealloc_ret = mach_port_deallocate (mach_task_self(), thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      lose("mach_port_deallocate (thread) failed with return_code %d", dealloc_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;'>--    dealloc_ret = mach_port_deallocate (mach_task_self(), task);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    if (dealloc_ret) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      lose("mach_port_deallocate (task) failed with return_code %d", dealloc_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;'>--    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;'>- 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;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1004-Darwin-recovery-support-non-dispatch-semaphores.patch b/lang/sbcl/files/1004-Darwin-recovery-support-non-dispatch-semaphores.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index a8411a12169..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1004-Darwin-recovery-support-non-dispatch-semaphores.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,164 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From e999b5e713d94c764ada74020cbd3ce2e7162fff 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, 13 Jun 2023 23:05:33 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Darwin: recovery support non dispatch semaphores
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See: https://github.com/sbcl/sbcl/commit/160448fd0485daf69e81f9fe9eeb8515ed01db49
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-config.sh          |  8 ++++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-target-2-load.lisp |  2 ++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/darwin-os.c | 51 ++++++++++++++++++++++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/darwin-os.h |  6 ++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/os-common.c |  2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/os.h        |  2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 6 files changed, 64 insertions(+), 7 deletions(-)
</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 3820b73c0..40fff6c79 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;'>-@@ -629,10 +629,12 @@ case "$sbcl_os" in
</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;'>-         printf ' :unix :bsd :darwin :mach-o' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        darwin_version=`uname -r`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        darwin_version_major=${DARWIN_VERSION_MAJOR:-${darwin_version%%.*}}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (( 10 > $darwin_version_major )) || [ $sbcl_arch = "ppc" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            printf ' :use-darwin-posix-semaphores' >> $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 = "x86-64" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            darwin_version=`uname -r`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            darwin_version_major=${DARWIN_VERSION_MAJOR:-${darwin_version%%.*}}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             if (( 8 < $darwin_version_major )); then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           printf ' :inode64' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git make-target-2-load.lisp make-target-2-load.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0a10c6f67..be188f5e3 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- make-target-2-load.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ make-target-2-load.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,6 +55,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; The final batch of symbols is strictly for C. The LISP_FEATURE_
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; prefix on the corresponding #define is unfortunate.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           :GCC-TLS :USE-SYS-MMAP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;;; Enforce using of posix semaphores on Darwin instead of dispatch.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          :USE-DARWIN-POSIX-SEMAPHORES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; only for 'src/runtime/wrap.h'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           :OS-PROVIDES-BLKSIZE-T
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; only for src/runtime/run-program.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/darwin-os.c src/runtime/darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f417c8dd7..804dd9b9f 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,7 +55,7 @@ void darwin_init(void)
</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;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_SB_THREAD && defined USE_DARWIN_GCD_SEMAPHORES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- inline void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- os_sem_init(os_sem_t *sem, unsigned int value)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -141,4 +141,53 @@ futex_wake(int *lock_word, int n)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 0;
</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;'>-+#elif defined LISP_FEATURE_SB_THREAD && defined CANNOT_USE_POSIX_SEM_T
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+inline void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_sem_init(os_sem_t *sem, unsigned int value)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (KERN_SUCCESS!=semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, (int)value))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("os_sem_init(%p): %s", sem, strerror(errno));
</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;'>-+inline void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_sem_wait(os_sem_t *sem)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    kern_return_t ret;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  restart:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ret = semaphore_wait(*sem);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    switch (ret) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case KERN_SUCCESS:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* It is unclear just when we can get this, but a sufficiently
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * long wait seems to do that, at least sometimes.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * However, a wait that long is definitely abnormal for the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         * GC, so we complain before retrying.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case KERN_OPERATION_TIMED_OUT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        fprintf(stderr, "os_sem_wait(%p): %s", sem, strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* This is analogous to POSIX EINTR. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case KERN_ABORTED:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        goto restart;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("os_sem_wait(%p): %lu, %s", sem, (long unsigned)ret, strerror(errno));
</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;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_sem_post(os_sem_t *sem)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (KERN_SUCCESS!=semaphore_signal(*sem))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("os_sem_post(%p): %s", sem, strerror(errno));
</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;'>-+void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+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:#ffe0e0;'>-+    if (-1==semaphore_destroy(mach_task_self(), *sem))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("os_sem_destroy(%p): %s", sem, strerror(errno));
</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;'>-diff --git src/runtime/darwin-os.h src/runtime/darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f13669fb0..dfcc9e8ea 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -36,10 +36,14 @@ typedef ucontext_t os_context_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void darwin_init(void);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(LISP_FEATURE_SB_THREAD) && !defined(LISP_FEATURE_USE_DARWIN_POSIX_SEMAPHORES)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define USE_DARWIN_GCD_SEMAPHORES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <dispatch/dispatch.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- typedef dispatch_semaphore_t os_sem_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#elif defined LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CANNOT_USE_POSIX_SEM_T
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach/semaphore.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+typedef semaphore_t os_sem_t;
</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;'>- #endif /* _DARWIN_OS_H */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/os-common.c src/runtime/os-common.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8de5e89aa..b08f1ccc1 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/os-common.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/os-common.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -120,7 +120,7 @@ os_get_errno(void)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return errno;
</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;'>--#if defined LISP_FEATURE_SB_THREAD && defined LISP_FEATURE_UNIX && !defined USE_DARWIN_GCD_SEMAPHORES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_SB_THREAD && defined LISP_FEATURE_UNIX && !defined USE_DARWIN_GCD_SEMAPHORES && !defined CANNOT_USE_POSIX_SEM_T
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- os_sem_init(os_sem_t *sem, unsigned int value)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/os.h src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 262896562..55c5296ca 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -237,7 +237,7 @@ extern char *os_get_runtime_executable_path();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define OS_VM_SIZE_FMTX PRIxPTR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if defined LISP_FEATURE_SB_THREAD && defined LISP_FEATURE_UNIX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#  ifndef USE_DARWIN_GCD_SEMAPHORES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#  if !defined USE_DARWIN_GCD_SEMAPHORES && !defined CANNOT_USE_POSIX_SEM_T
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #    include <semaphore.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      typedef sem_t os_sem_t;
</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;'>-2.42.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/1005-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch b/lang/sbcl/files/1005-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 1fab5ab9fcc..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1005-x86-Darwin-mask-out-O_LARGEFILE-in-fcntl.1-test.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,29 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 2e4bee0f34ef4b6960935ecf05d423ebf1011d33 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:27:10 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: mask out O_LARGEFILE in fcntl.1 test
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/bebec0fb89ceefde0f1d584da439989bc12ad17d
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/cc425f4be3125c3ba48418cc76bc1d3d3260a431
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/306beeae30de474fb46c3efd31e8e2ea5acb65fb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- contrib/sb-posix/posix-tests.lisp | 2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git contrib/sb-posix/posix-tests.lisp contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0bb8f0bd0..3d4239211 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -410,7 +410,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;; O_LARGEFILE is always set on 64-bit *nix platforms even though the whole
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;; flag makes no sense.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#-win32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#-(or (and darwin x86) win32)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (deftest fcntl.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (let ((fd (sb-posix:open "/dev/null" sb-posix::o-nonblock)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       (logtest (sb-posix:fcntl fd sb-posix::f-getfl)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1006-x86-Darwin-revert-OS_THREAD_STACK.patch b/lang/sbcl/files/1006-x86-Darwin-revert-OS_THREAD_STACK.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index feaf9b2a389..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1006-x86-Darwin-revert-OS_THREAD_STACK.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,28 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 98677e0daab24f4cfffcfaa1516304aaea796afa 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:29:33 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: revert OS_THREAD_STACK
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/e3490371ab2207d5280084df0c76aee1a14879c2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- - https://github.com/sbcl/sbcl/commit/c7590d3d7e73a4da203b71493a9cb353d8280f1c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/cold/shared.lisp | 2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/cold/shared.lisp src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index e8545789d..884d39dba 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -310,7 +310,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (pushnew :immobile-code sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (when (target-featurep :64-bit)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (push :compact-symbol sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        (when (target-featurep '(:and :sb-thread (:or :darwin :openbsd)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (when (target-featurep '(:and :sb-thread (:or (:and :darwin (:not :x86)) :openbsd)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (push :os-thread-stack sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (when (target-featurep '(:and :x86 :int4-breakpoints))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; 0xCE is a perfectly good 32-bit instruction,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1007-x86-Darwin-fix-build-by-old-preprocessor.patch b/lang/sbcl/files/1007-x86-Darwin-fix-build-by-old-preprocessor.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 704a8eb43b2..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1007-x86-Darwin-fix-build-by-old-preprocessor.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 b93ef257e7e0507d18361de0f8ff89435b365d73 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:30:39 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: fix build by old preprocessor
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See: https://github.com/sbcl/sbcl/commit/931a2dcfa20187ba5477d4df5d160fc15e605db5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-assem.S | 2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-assem.S src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f92bde899..0ae81e321 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -705,7 +705,7 @@ GNAME(arch_scrub_control_stack):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    * guard page upper bound in ECX, and our hard guard
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    * page upper bound in EDX. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lea     -4(%esp), %eax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  mov     $BACKEND_PAGE_BYTES,%edx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mov     GNAME(os_vm_page_size),%edx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mov     %edx, %ecx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   add     8(%esp), %ecx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   add     12(%esp), %edx
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1008-x86-Darwin-disable-failing-stat-mode-tests.patch b/lang/sbcl/files/1008-x86-Darwin-disable-failing-stat-mode-tests.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 52f6a1d7449..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1008-x86-Darwin-disable-failing-stat-mode-tests.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,32 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 2d72626e7467937cc7710cf4b549535b4d8a667b 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:31:20 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: disable failing stat-mode tests
</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;'>- contrib/sb-posix/posix-tests.lisp | 2 ++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 2 insertions(+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git contrib/sb-posix/posix-tests.lisp contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 3d4239211..190033f4f 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ contrib/sb-posix/posix-tests.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -316,6 +316,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             (,mode (sb-posix::stat-mode ,stat)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ,@body)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#-(and darwin x86)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (deftest stat-mode.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (with-stat-mode (mode *test-directory*)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (sb-posix:s-isreg mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -332,6 +333,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (sb-posix:s-ischr mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   nil)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#-(and darwin x86)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (deftest stat-mode.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (with-stat-mode (mode *test-directory*)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (sb-posix:s-isblk mode))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1009-x86-Darwin-add-missed-OS_CONTEXT_PC.patch b/lang/sbcl/files/1009-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 4b3cf96d594..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1009-x86-Darwin-add-missed-OS_CONTEXT_PC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,37 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 6215f1f8675b399ab562e7a8725f1669b637ffa3 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:31:51 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: add missed OS_CONTEXT_PC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See: https://github.com/sbcl/sbcl/commit/3bf3c33f9e291f2edbdfe8ba7c57128586923e41
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/x86-darwin-os.h | 6 +++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 5 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/x86-darwin-os.h src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 7ff303b96..cf6487815 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -19,7 +19,9 @@ void set_data_desc_addr(data_desc_t* desc, void* addr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->__ss.__##stem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CONTEXT_ADDR_FROM_STEM(stem) (os_context_register_t*)&context->uc_mcontext->__ss.__##stem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define OS_CONTEXT_PC(context) context->uc_mcontext->__ss.__eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define EIP __eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ESP __esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define EBP __ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -42,6 +44,8 @@ void set_data_desc_addr(data_desc_t* desc, void* addr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define CONTEXT_ADDR_FROM_STEM(stem) &context->uc_mcontext->ss.stem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define OS_CONTEXT_PC(context) context->uc_mcontext->ss.eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define EIP eip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define ESP esp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define EBP ebp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1010-x86-Darwin-fix-syntax-typos.patch b/lang/sbcl/files/1010-x86-Darwin-fix-syntax-typos.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index e50242a51cf..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1010-x86-Darwin-fix-syntax-typos.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,31 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 1f0a1d56721a85779e22b0b5d3aff43a62f5277f 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:32:35 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] x86/Darwin: fix syntax typos
</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/x86-darwin-os.c | 4 +---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+), 3 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/x86-darwin-os.c src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 012302856..69585b179 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/x86-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -89,7 +89,7 @@ int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * we've exhausted it */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     sigstack.ss_sp    = calc_altstack_base(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     sigstack.ss_flags = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    sigstack.ss_size  = calc_altstack_size(thread;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sigstack.ss_size  = calc_altstack_size(thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     sigaltstack(&sigstack,0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;                  /* success */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -121,5 +121,3 @@ os_restore_fp_control(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* reset exception flags and restore control flags on x87 FPU */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     asm ("fldcw %0" : : "m" (fpu_control_word));
</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;'>-2.42.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-Revert-Delete-support-for-and-darwin-ppc.patch b/lang/sbcl/files/1011-ppc-Darwin-Revert-Delete-support-for-and-darwin-ppc.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 80f39156fef..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1011-ppc-Darwin-Revert-Delete-support-for-and-darwin-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,1162 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From f48e5f95c9410c8220b8812da88752e2210b8d39 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: Mon, 5 Jun 2023 22:03:43 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: Revert "Delete support for #+(and darwin ppc)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This reverts commit 217791a738a5960092e38106e9931c424cd4ee98.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/code/alieneval.lisp                   |   2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/code/float-trap.lisp                  |   2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/code/ppc-vm.lisp                      |   2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc/c-call.lisp              | 282 +++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc/float.lisp               |  65 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc/parms.lisp               |   3 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/compiler/ppc/vm.lisp                  |  12 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.ppc-darwin             |  41 ++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/monitor.c                     |   4 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-arch.c                    |   2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-assem.S                   | 165 +++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-darwin-os.c               | 142 +++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-darwin-os.h               |  29 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-lispregs.h                |  15 ++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc64-lispregs.h              |  10 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/float.pure.lisp                     |   2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/foreign-stack-alignment.impure.lisp |   3 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/test-funs.lisp                      |   2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 18 files changed, 772 insertions(+), 11 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 src/runtime/ppc-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/code/alieneval.lisp src/code/alieneval.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index ec19db814..cdccf5235 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/code/alieneval.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/code/alieneval.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -25,7 +25,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defun guess-alignment (bits)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (cond ((null bits) nil)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        #-(and x86 (not win32)) ((> bits 32) 64)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        #-(or (and x86 (not win32)) (and ppc darwin)) ((> bits 32) 64)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         ((> bits 16) 32)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         ((> bits 8) 16)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         ((> bits 1) 8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/code/float-trap.lisp src/code/float-trap.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 13970875d..042ea7e7e 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/code/float-trap.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/code/float-trap.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -117,6 +117,8 @@ in effect."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       (setf (ldb float-precision-control modes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             (or (cdr (assoc precision +precision-mode-alist+))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 (error "unknown precision mode: ~S" precision))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ;; FIXME: This apparently doesn't work on Darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    #-(and darwin ppc)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (setf (floating-point-modes) modes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (values))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/code/ppc-vm.lisp src/code/ppc-vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 4783c0d00..06aed54fd 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/code/ppc-vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/code/ppc-vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -46,7 +46,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; Given a signal context, return the floating point modes word in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; the same format as returned by FLOATING-POINT-MODES.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--;;; FIXME: surely this must be accessible somewhere under *BSD?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; FIXME: surely this must be accessible under some other operating systems?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #+linux
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (define-alien-routine ("os_context_fp_control" context-floating-point-modes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (unsigned 32)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/compiler/ppc/c-call.lisp src/compiler/ppc/c-call.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 464ce441e..b2bf4ecdb 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/compiler/ppc/c-call.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/compiler/ppc/c-call.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -19,14 +19,19 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant +stack-alignment-bytes+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;; Duh.  PPC Linux (and VxWorks) adhere to the EABI.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  7)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin 7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; But Darwin doesn't
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin 15)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defstruct arg-state
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (gpr-args 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (fpr-args 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;; SVR4 [a]abi wants two words on stack (callee saved lr,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;; backpointer).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  (stack-frame-size 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin (stack-frame-size 2)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; PowerOpen ABI wants 8 words on the stack corresponding to GPR3-10
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; in addition to the 6 words of link area (see number-stack-displacement)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin (stack-frame-size (+ 8 6)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defun int-arg (state prim-type reg-sc stack-sc)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (let ((reg-args (arg-state-gpr-args state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -57,6 +62,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;;   Excess floats stored on the stack are stored as floats.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; We follow gcc.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (define-alien-type-method (single-float :arg-tn) (type state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (let* ((fprs (arg-state-fpr-args state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -69,6 +75,31 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (setf (arg-state-stack-frame-size state) (+ stack-offset 1))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (make-wired-tn* 'single-float single-stack-sc-number stack-offset))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; If a single-float arg has to go on the stack, it's promoted to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; double.  That way, C programs can get subtle rounding errors when
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; unrelated arguments are introduced.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#+darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(define-alien-type-method (single-float :arg-tn) (type state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (let* ((fprs (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (gprs (arg-state-gpr-args state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (cond ((< gprs 8) ; and by implication also (< fprs 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (incf (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; Assign outgoing FPRs starting at FP1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (list (make-wired-tn* 'single-float single-reg-sc-number (1+ fprs))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (int-arg state 'signed-byte-32 signed-reg-sc-number signed-stack-sc-number)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ((< fprs 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; See comments below for double-float.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (incf (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (incf (arg-state-stack-frame-size state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (make-wired-tn* 'single-float single-reg-sc-number (1+ fprs)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; Pass on stack only
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (let ((stack-offset (arg-state-stack-frame-size state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (incf (arg-state-stack-frame-size state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (make-wired-tn* 'single-float single-stack-sc-number stack-offset))))))
</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;'>- (define-alien-type-method (double-float :arg-tn) (type state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (let* ((fprs (arg-state-fpr-args state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -83,6 +114,35 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (setf (arg-state-stack-frame-size state) (+ stack-offset 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (make-wired-tn* 'double-float double-stack-sc-number stack-offset))))))
</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;'>-+(define-alien-type-method (double-float :arg-tn) (type state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (let ((fprs (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (gprs (arg-state-gpr-args state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (cond ((< gprs 8) ; and by implication also (< fprs 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (incf (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; Assign outgoing FPRs starting at FP1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; The PowerOpen ABI says float values are stored in float
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; regs.  But if we're calling a varargs function, we also
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; need to put the float into some gprs.  We indicate this
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; to %alien-funcall ir2-convert by making a list of the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; TNs for the float reg and for the int regs.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (list (make-wired-tn* 'double-float double-reg-sc-number (1+ fprs))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (int-arg state 'signed-byte-32 signed-reg-sc-number signed-stack-sc-number)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (int-arg state 'unsigned-byte-32 unsigned-reg-sc-number unsigned-stack-sc-number)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ((< fprs 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (incf (arg-state-fpr-args state))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (list (make-wired-tn* 'double-float double-reg-sc-number (1+ fprs))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (int-arg state 'signed-byte-32 signed-reg-sc-number signed-stack-sc-number)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (int-arg state 'unsigned-byte-32 unsigned-reg-sc-number unsigned-stack-sc-number)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           ;; Pass on stack only
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (let ((stack-offset (arg-state-stack-frame-size state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (incf (arg-state-stack-frame-size state) 2)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (make-wired-tn* 'double-float double-stack-sc-number stack-offset))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; Result state handling
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defstruct result-state
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -93,6 +153,11 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (0 nl0-offset)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (1 nl1-offset)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; FIXME: These #-DARWIN methods should be adjusted to take a state
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; argument, firstly because that's our "official" API (see
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; src/code/host-alieneval) and secondly because that way we can
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;;; probably have less duplication of code.  -- CSR, 2003-07-29
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (define-alien-type-method (system-area-pointer :result-tn) (type state)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (let ((num-results (result-state-num-results state)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -143,6 +208,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; Sort out long longs, by splitting them up.  However, need to take
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; care about register/stack alignment and whether they will fully
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; fit into registers or must go on the stack.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (deftransform %alien-funcall ((function type &rest args))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (aver (sb-c:constant-lvar-p type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (let* ((type (sb-c:lvar-value type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -238,6 +304,67 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            ,@(new-args))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (sb-c::give-up-ir1-transform))))
</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;'>-+(deftransform %alien-funcall ((function type &rest args))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (aver (sb-c:constant-lvar-p type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (let* ((type (sb-c:lvar-value type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (arg-types (alien-fun-type-arg-types type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (result-type (alien-fun-type-result-type type)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (aver (= (length arg-types) (length args)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ;; We need to do something special for 64-bit integer arguments
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ;; and results.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (if (or (some #'(lambda (type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      (and (alien-integer-type-p type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                           (> (sb-alien::alien-integer-type-bits type) 32)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  arg-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            (and (alien-integer-type-p result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (> (sb-alien::alien-integer-type-bits result-type) 32)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (collect ((new-args) (lambda-vars) (new-arg-types))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (dolist (type arg-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   (let ((arg (gensym)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                     (lambda-vars arg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                     (cond ((and (alien-integer-type-p type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                 (> (sb-alien::alien-integer-type-bits type) 32))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            ;; 64-bit long long types are stored in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            ;; consecutive locations, most significant word
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            ;; first (big-endian).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (new-args `(ash ,arg -32))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (new-args `(logand ,arg #xffffffff))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (if (alien-integer-type-signed type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (new-arg-types (parse-alien-type '(signed 32) nil))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (new-arg-types (parse-alien-type '(unsigned 32) nil)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (new-arg-types (parse-alien-type '(unsigned 32) nil)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                           (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (new-args arg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (new-arg-types type)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (cond ((and (alien-integer-type-p result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                             (> (sb-alien::alien-integer-type-bits result-type) 32))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                        (let ((new-result-type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               (let ((sb-alien::*values-type-okay* t))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                 (parse-alien-type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  (if (alien-integer-type-signed result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                      '(values (signed 32) (unsigned 32))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                      '(values (unsigned 32) (unsigned 32)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  nil))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          `(lambda (function type ,@(lambda-vars))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (multiple-value-bind (high low)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (%alien-funcall function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                                ',(make-alien-fun-type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                                   :arg-types (new-arg-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                                   :result-type new-result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                                ,@(new-args))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              (logior low (ash high 32))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                       (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                        `(lambda (function type ,@(lambda-vars))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          (declare (ignore type))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                          (%alien-funcall function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                           ',(make-alien-fun-type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              :arg-types (new-arg-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              :result-type result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                           ,@(new-args))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (sb-c::give-up-ir1-transform))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (define-vop (foreign-symbol-sap)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (:translate foreign-symbol-sap)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (:policy :fast-safe)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -341,12 +468,20 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              `(deref (sap-alien (sap+ ,sap ,offset) (* ,type)))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;;; The "Mach-O Runtime Conventions" document for OS X almost
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;;; specifies the calling convention (it neglects to mention that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;;; the linkage area is 24 bytes).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (defconstant n-foreign-linkage-area-bytes 24)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;;; On linux only use 8 bytes for LR and Back chain.  JRXR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;;; 2006/11/10.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defconstant n-foreign-linkage-area-bytes 8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;;; Returns a vector in static space containing machine code for the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ;;; callback wrapper.  Linux version.  JRXR.  2006/11/13
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defun alien-callback-assembler-wrapper (index result-type argument-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (flet ((make-gpr (n)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (make-random-tn :kind :normal :sc (sc-or-lose 'any-reg) :offset n))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -561,4 +696,145 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                             unsigned-long))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            sap (length buffer))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           vector))))
</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;'>-+  ;;; Returns a vector in static space containing machine code for the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;;; callback wrapper
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (defun alien-callback-assembler-wrapper (index result-type argument-types)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (flet ((make-gpr (n)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (make-random-tn :kind :normal :sc (sc-or-lose 'any-reg) :offset n))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (make-fpr (n)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (make-random-tn :kind :normal :sc (sc-or-lose 'double-reg) :offset n)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      (let* ((segment (make-segment)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (assemble (segment)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; To save our arguments, we follow the algorithm sketched in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; "PowerPC Calling Conventions" section of that document.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; CLH: There are a couple problems here. First, we bail if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; we run out of registers. AIUI, we can just ignore the extra
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; args here and we will be ok...
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (let ((words-processed 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (gprs (mapcar #'make-gpr '(3 4 5 6 7 8 9 10)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (fprs (mapcar #'make-fpr '(1 2 3 4 5 6 7 8 9 10 11 12 13)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (stack-pointer (make-gpr 1)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            (labels ((save-arg (type words)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                       (let ((integerp (not (alien-float-type-p type)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                             (offset (+ (* words-processed n-word-bytes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                        n-foreign-linkage-area-bytes)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         (cond (integerp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (dotimes (k words)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  (let ((gpr (pop gprs)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (when gpr
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                      (inst stw gpr stack-pointer offset))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (incf words-processed)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (incf offset n-word-bytes))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               ;; The handling of floats is a little ugly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               ;; because we hard-code the number of words
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               ;; for single- and double-floats.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               ((alien-single-float-type-p type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (pop gprs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (let ((fpr (pop fprs)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  (when fpr
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (inst stfs fpr stack-pointer offset)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (incf words-processed))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               ((alien-double-float-type-p type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (setf gprs (cddr gprs))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (let ((fpr (pop fprs)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                  (when fpr
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                    (inst stfd fpr stack-pointer offset)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (incf words-processed 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                               (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                (bug "Unknown alien floating point type: ~S" type))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (mapc #'save-arg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    argument-types
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    (mapcar (lambda (arg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                              (ceiling (alien-type-bits arg) n-word-bits))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            argument-types))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; Set aside room for the return area just below sp, then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; actually call funcall3: funcall3 (call-alien-function,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; index, args, return-area)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; INDEX is fixnumized, ARGS and RETURN-AREA don't need to be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          ;; because they're word-aligned. Kinda gross, but hey ...
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (let* ((n-return-area-words
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  (ceiling (or (alien-type-bits result-type) 0) n-word-bits))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (n-return-area-bytes (* n-return-area-words n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 ;; FIXME: magic constant, and probably n-args-bytes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (args-size (* 3 n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 ;; FIXME: n-frame-bytes?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (frame-size (logandc2 (+ n-foreign-linkage-area-bytes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                          n-return-area-bytes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                          args-size
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                          +stack-alignment-bytes+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                       +stack-alignment-bytes+)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            (destructuring-bind (sp r0 arg1 arg2 arg3 arg4)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (mapcar #'make-gpr '(1 0 3 4 5 6))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;; FIXME: This is essentially the same code as LR in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;; insts.lisp, but attempting to use (INST LR ...) instead
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;; of this function results in callbacks not working.  Why?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;;   --njf, 2006-01-04
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (flet ((load-address-into (reg addr)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                       (let ((high (ldb (byte 16 16) addr))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                             (low (ldb (byte 16 0) addr)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         (inst lis reg high)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         (inst ori reg reg low))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; Setup the args
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (load-address-into arg1 (static-fdefn-fun-addr 'enter-alien-callback))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (loadw arg1 arg1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst li arg2 (fixnumize index))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst addi arg3 sp n-foreign-linkage-area-bytes)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; FIXME: This was (- (* RETURN-AREA-SIZE N-WORD-BYTES)), while
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; RETURN-AREA-SIZE was (* N-RETURN-AREA-WORDS N-WORD-BYTES):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; I assume the intention was (- N-RETURN-AREA-BYTES), but who knows?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; --NS 2005-06-11
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst addi arg4 sp (- n-return-area-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; FIXME! FIXME FIXME: What does this FIXME refer to?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; Save sp, setup the frame
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst mflr r0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst stw r0 sp (* 2 n-word-bytes)) ; FIXME: magic constant
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst stwu sp sp (- frame-size))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ;; Make the call
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (load-address-into r0 (foreign-symbol-address "funcall3"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst mtlr r0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (inst blrl))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;; We're back!  Restore sp and lr, load the return value from just
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              ;; under sp, and return.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (inst lwz sp sp 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (inst lwz r0 sp (* 2 n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (inst mtlr r0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (cond
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ((sb-alien::alien-single-float-type-p result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (let ((f1 (make-fpr 1)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   (inst lfs f1 sp (- (* n-return-area-words n-word-bytes)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ((sb-alien::alien-double-float-type-p result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (let ((f1 (make-fpr 1)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   (inst lfd f1 sp (- (* n-return-area-words n-word-bytes)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                ((sb-alien::alien-void-type-p result-type)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 ;; Nothing to do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (t
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 (loop with gprs = (mapcar #'make-gpr '(3 4))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    repeat n-return-area-words
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    for gpr = (pop gprs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    for offset from (- (* n-return-area-words n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    by n-word-bytes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      (unless gpr
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                        (bug "Out of return registers in alien-callback trampoline."))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                      (inst lwz gpr sp offset))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+              (inst blr))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (finalize-segment segment)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ;; Now that the segment is done, convert it to a static
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        ;; vector we can point foreign code to.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (let* ((buffer (sb-assem:segment-buffer segment))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               (vector (make-static-vector (length buffer)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                           :element-type '(unsigned-byte 8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                           :initial-contents buffer))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+               (sap (vector-sap vector)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (alien-funcall
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (extern-alien "ppc_flush_icache"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                         (function void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                   system-area-pointer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                                   unsigned-long))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           sap (length buffer))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          vector)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/compiler/ppc/float.lisp src/compiler/ppc/float.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 28a6d2e90..91ddfab72 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/compiler/ppc/float.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/compiler/ppc/float.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -849,3 +849,68 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (:translate imagpart)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (:note "complex double float imagpart")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (:variant :imag))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;; This vop and the next are intended to be used only for moving a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;; float to an integer arg location (register or stack) for C callout.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;; See %alien-funcall ir2convert in aliencomp.lisp.
</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;'>-+(define-vop (move-double-to-int-arg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:args (float :scs (double-reg)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:results (hi-bits :scs (signed-reg signed-stack))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            (lo-bits :scs (unsigned-reg unsigned-stack)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:temporary (:scs (double-stack)) stack-temp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:temporary (:scs (signed-reg)) temp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:arg-types double-float)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:result-types signed-num unsigned-num)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:policy :fast-safe)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:vop-var vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:generator 5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (sc-case float
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      (double-reg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       (inst stfd float (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (tn-byte-offset stack-temp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       (sc-case hi-bits
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (signed-reg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz hi-bits (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset stack-temp)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (signed-stack
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz temp (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset stack-temp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst stw temp nsp-tn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset hi-bits))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       (sc-case lo-bits
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (unsigned-reg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz lo-bits (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (* (1+ (tn-offset stack-temp)) n-word-bytes)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (unsigned-stack
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz temp (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (* (1+ (tn-offset stack-temp)) n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst stw temp nsp-tn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset lo-bits))))))))
</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;'>-+(define-vop (move-single-to-int-arg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:args (float :scs (single-reg)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:results (bits :scs (signed-reg signed-stack)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:temporary (:scs (double-stack)) stack-temp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:temporary (:scs (signed-reg)) temp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:arg-types single-float)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:result-types signed-num)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:policy :fast-safe)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:vop-var vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (:generator 5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (sc-case float
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      (single-reg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       (inst stfs float (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (tn-byte-offset stack-temp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+       (sc-case bits
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (signed-reg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz bits (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset stack-temp)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (signed-stack
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst lwz temp (current-nfp-tn vop)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset stack-temp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (inst stw temp nsp-tn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                (tn-byte-offset bits))))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/compiler/ppc/parms.lisp src/compiler/ppc/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 77538c922..aac3ff93d 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/compiler/ppc/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/compiler/ppc/parms.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -90,7 +90,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                      :dynamic-space-start
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                      #+linux   #x4f000000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                      #+netbsd  #x4f000000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                     #+openbsd #x4f000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                     #+openbsd #x4f000000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                     #+darwin  #x10000000)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant alien-linkage-table-growth-direction :up)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant alien-linkage-table-entry-size 16)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/compiler/ppc/vm.lisp src/compiler/ppc/vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f85968b53..0163f16cd 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/compiler/ppc/vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/compiler/ppc/vm.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -20,7 +20,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; work. This must be a power of 2 - see BYTES-REQUIRED-FOR-NUMBER-STACK.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defconstant number-stack-displacement
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  (* 2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (* #-darwin 2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     #+darwin 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      n-word-bytes))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;;; Define the registers
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -52,8 +53,13 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg nl6 9)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg fdefn 10)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg nargs 11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  (defreg nfp 12)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  (defreg cfunc 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; FIXME: some kind of comment here would be nice.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; FIXME II: this also reveals the need to autogenerate lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin  (defreg cfunc 12)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin  (defreg nfp 12)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+darwin  (defreg nfp 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-darwin  (defreg cfunc 13)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg bsp 14)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg cfp 15)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defreg csp 16)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/Config.ppc-darwin src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..b34a07236
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,41 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# -*- makefile -*- for the C-level run-time support for SBCL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# This software is part of the SBCL system. See the README file for
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# This software is derived from the CMU CL system, which was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# written at Carnegie Mellon University and released into the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# public domain. The software is in the public domain and is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# provided with absolutely no warranty. See the COPYING and CREDITS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# files for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+CFLAGS = -g -Wall -O2 -fdollars-in-identifiers -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+LINKFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+OS_SRC = bsd-os.c darwin-os.c ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+OS_LIBS = -lSystem -lc
</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 += -lz
</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;'>-+CC = gcc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ASSEM_SRC = ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ARCH_SRC = ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+CPPFLAGS += -no-cpp-precomp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ifdef LISP_FEATURE_GENCGC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  GC_SRC = fullcgc.c gencgc.c traceroot.c
</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;'>-+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;'>-+  USE_LIBSBCL = -Wl,-force_load libsbcl.a
</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;'>-+.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><span style='display:block; white-space:pre;background:#ffe0e0;'>-+after-grovel-headers:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/monitor.c src/runtime/monitor.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5362fff5f..c350284a0 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/monitor.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/monitor.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -708,6 +708,10 @@ print_context(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         brief_print((lispobj)(*os_context_register_addr(context,i)));
</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;'>-+#if defined(LISP_FEATURE_DARWIN) && defined(LISP_FEATURE_PPC)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("DAR:\t\t 0x%08lx\n", (unsigned long)(*os_context_register_addr(context, 41)));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    printf("DSISR:\t\t 0x%08lx\n", (unsigned long)(*os_context_register_addr(context, 42)));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef REG_PC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     printf("PC:\t\t  0x%08lx\n", (unsigned long)os_context_pc(context));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-arch.c src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 94d73c343..b0b48bb48 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -38,8 +38,10 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      Caveat callers.  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined (LISP_FEATURE_DARWIN) || defined(LISP_FEATURE_LINUX)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef PT_DAR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define PT_DAR          41
</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;'>- #ifndef PT_DSISR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define PT_DSISR        42
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index ee1b891f7..0c18afe4a 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -9,8 +9,20 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "genesis/static-symbols.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "genesis/thread.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define CSYMBOL(x) _ ## x
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define CSYMBOL(x) x
</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;'>-+#if defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FUNCDEF(x)        .text @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  .align 3 @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+_##x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define GFUNCDEF(x)       .globl _ ## x @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  FUNCDEF(x)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FUNCDEF(x)        .text ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   .align 3 ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   .type x,@function ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -18,23 +30,52 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define GFUNCDEF(x)       .globl x ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   FUNCDEF(x)
</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;'>-+#if defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SET_SIZE(x)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define SET_SIZE(x) .size x,.-x
</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;'>- /* Load a register from a global, using the register as an intermediary */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* The register will be a fixnum for one instruction, so this is gc-safe */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define load(reg,global) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg,ha16(global) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lwz reg,lo16(global)(reg) ; Comment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define store(reg,temp,global) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis temp,ha16(global) @\
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  stw reg,lo16(global)(temp) ; Comment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define load(reg,global) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg,global@ha; lwz reg,global@l(reg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define store(reg,temp,global) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis temp,global@ha; stw reg,global@l(temp)
</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;'>- #define   FIRST_SAVE_FPR  14      /* lowest-numbered non-volatile FPR */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define   FIRST_SAVE_GPR  13      /* lowest-numbered non-volatile GPR */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define NGPR_SAVE_BYTES(n) ((32-(n))*4)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FRAME_ARG_BYTES(n)  (((((n)+6)*4)+15)&~15)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define   FIRST_SAVE_GPR  14      /* lowest-numbered non-volatile GPR */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define NGPR_SAVE_BYTES(n) ((32-(~1&((n)+1)))*4)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FRAME_ARG_BYTES(n)  (((((n)+2)*4)+15)&~15)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define   NFPR_SAVE_BYTES(n) ((32-(n))*8)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FRAME_SIZE(first_g,first_f,out_arg_words,savecr) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(NFPR_SAVE_BYTES(first_f)+ NGPR_SAVE_BYTES(first_g)+ FRAME_ARG_BYTES(out_arg_words))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SAVE_FPR(n) stfd f##n,-8*(32- n)(r11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SAVE_GPR(n) stw r##n,-4*(32- n)(r11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FULL_FRAME_SIZE (FRAME_SIZE(FIRST_SAVE_GPR,FIRST_SAVE_FPR,8,1)+15&~15)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define RESTORE_FPR(n) lfd f##n,-8*(32- n)(r11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define RESTORE_GPR(n) lwz r##n,-4*(32- n)(r11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FRAME_SIZE(first_g,first_f,out_arg_words,savecr) \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (NFPR_SAVE_BYTES(first_f)+ NGPR_SAVE_BYTES(first_g)+ FRAME_ARG_BYTES(out_arg_words+savecr))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define SAVE_FPR(n) stfd n,-8*(32-(n))(11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -43,6 +84,105 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define RESTORE_FPR(n) lfd n,-8*(32-(n))(11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define RESTORE_GPR(n) lwz n,-4*(32-(n))(11)
</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;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define C_FULL_PROLOG \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  nop @\
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  nop @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mfcr REG(0) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  stw REG(0),4(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mflr REG(0) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  stw REG(0),8(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mr REG(11),REG(1) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  stwu REG(1),-FULL_FRAME_SIZE(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(14) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(15) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(16) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(17) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(18) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(19) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(20) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(21) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(22) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(23) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(24) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(25) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(26) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(27) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(28) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(29) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(30) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_FPR(31) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  la REG(11),-NFPR_SAVE_BYTES(FIRST_SAVE_FPR)(REG(11)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(13) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(14) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(15) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(16) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(17) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(18) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(19) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(20) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(21) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(22) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(23) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(24) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(25) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(26) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(27) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(28) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(29) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(30) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  SAVE_GPR(31)
</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;'>-+#define C_FULL_EPILOG \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  la REG(11),FULL_FRAME_SIZE-NFPR_SAVE_BYTES(FIRST_SAVE_FPR)(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(13) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(14) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(15) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(16) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(17) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(18) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(19) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(20) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(21) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(22) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(23) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(24) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(25) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(26) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(27) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(28) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(29) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(30) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_GPR(31) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  la REG(11),NFPR_SAVE_BYTES(FIRST_SAVE_FPR)(REG(11)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(14) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(15) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(16) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(17) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(18) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(19) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(20) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(21) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(22) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(23) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(24) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(25) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(26) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(27) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(28) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(29) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(30) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  RESTORE_FPR(31) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lwz REG(1),0(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lwz REG(0),4(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mtcr REG(0) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lwz REG(0),8(REG(1)) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mtlr REG(0) @ \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define C_FULL_PROLOG \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mflr 0 ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -134,6 +274,8 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lwz 0,4(1) ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mtlr 0 ; \
</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;'>- #define BEGIN_PSEUDO_ATOMIC stb reg_NULL,THREAD_PSEUDO_ATOMIC_BITS_OFFSET(reg_THREAD)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define END_PSEUDO_ATOMIC \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   stb reg_THREAD, THREAD_PSEUDO_ATOMIC_BITS_OFFSET(reg_THREAD) ; \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -191,6 +333,9 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Call out to obtain our TLS block. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   load(reg_NL0,CSYMBOL(current_thread))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  /* This won't work on darwin: wrong fixup style.  And is it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   * supposed to be lis/ori or lis/addi?  Or does it differ
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   * between darwin and everything else again? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg_CFUNC,CSYMBOL(pthread_getspecific)@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ori reg_CFUNC,reg_CFUNC,CSYMBOL(pthread_getspecific)@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mtctr reg_CFUNC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -221,8 +366,13 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   li reg_L1,0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   li reg_L2,0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   li reg_LIP,0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_NULL,hi16(NIL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ori reg_NULL,reg_NULL,lo16(NIL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg_NULL,NIL@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ori reg_NULL,reg_NULL,NIL@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Turn on pseudo-atomic */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   BEGIN_PSEUDO_ATOMIC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -251,8 +401,13 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lwz reg_A3,12(reg_CFP)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Calculate LRA */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_LRA,ha16(lra)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  addi reg_LRA,reg_LRA,lo16(lra)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg_LRA,lra@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ori reg_LRA,reg_LRA,lra@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   addi reg_LRA,reg_LRA,OTHER_POINTER_LOWTAG
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Function is an indirect closure */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -357,12 +512,22 @@ lra:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mr reg_NL3,reg_NARGS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  /* PowerOpen (i.e. OS X) requires the callee address in r12
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+           (a.k.a. CFUNC), so move it back there, too. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  mfctr reg_CFUNC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         /* Into C we go. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   bctrl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Re-establish NIL */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_NULL,hi16(NIL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ori reg_NULL,reg_NULL,lo16(NIL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg_NULL,NIL@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ori reg_NULL,reg_NULL,NIL@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* And reg_ZERO */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   li reg_ZERO,0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-darwin-os.c src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..9258e273b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,142 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This is the PowerPC/Darwin incarnation of arch-dependent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * OS-dependent routines. See also "bsdos.c".
</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;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This software is part of the SBCL system. See the README file for
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This software is derived from the CMU CL system, which was
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * written at Carnegie Mellon University and released into the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * public domain. The software is in the public domain and is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * provided with absolutely no warranty. See the COPYING and CREDITS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * files for more information.
</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;'>-+#include "sbcl.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "globals.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "runtime.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <signal.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <ucontext.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <limits.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <mach-o/dyld.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "arch.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "interr.h"                     /* for declaration of lose */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#error "Define threading support functions"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return 1;                   /* success */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return 1;                   /* success */
</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;'>-+os_context_register_t   *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_context_register_addr(os_context_t *context, int offset)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ppc_ss_struct_t *state = &context->uc_mcontext->PPC_DARWIN_REGIFY(ss);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    switch(offset) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 0:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r0);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 2:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r2);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 3:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r3);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 4:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r4);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 5:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r5);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 6:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r6);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 7:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r7);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 8:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r8);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 9:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r9);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 10:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r10);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 11:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r11);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 12:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r12);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 13:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r13);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 14:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r14);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 15:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r15);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 16:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r16);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 17:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r17);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 18:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r18);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 19:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r19);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 20:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r20);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 21:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r21);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 22:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r22);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 23:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r23);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 24:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r24);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 25:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r25);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 26:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r26);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 27:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r27);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 28:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r28);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 29:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r29);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 30:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r30);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 31:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &state->PPC_DARWIN_REGIFY(r31);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 41:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* PT_DAR */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &context->uc_mcontext->PPC_DARWIN_REGIFY(es).PPC_DARWIN_REGIFY(dar);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    case 42:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        /* PT_DSISR */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        return (os_context_register_t *) &context->uc_mcontext->PPC_DARWIN_REGIFY(es).PPC_DARWIN_REGIFY(dsisr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        lose("bad offset to os_context_register_addr");
</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;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_context_register_t *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_context_lr_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return (os_context_register_t *) &context->uc_mcontext->PPC_DARWIN_REGIFY(ss).PPC_DARWIN_REGIFY(lr);
</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;'>-+os_context_register_t *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_context_ctr_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return (os_context_register_t *) &context->uc_mcontext->PPC_DARWIN_REGIFY(ss).PPC_DARWIN_REGIFY(ctr);
</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;'>-+os_context_register_t *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_context_cr_addr(os_context_t *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return (os_context_register_t *) &context->uc_mcontext->PPC_DARWIN_REGIFY(ss).PPC_DARWIN_REGIFY(cr);
</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;'>-+void
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+os_flush_icache(os_vm_address_t address, os_vm_size_t length)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* see ppc-arch.c */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ppc_flush_icache(address,length);
</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;'>-diff --git src/runtime/ppc-darwin-os.h src/runtime/ppc-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-new file mode 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 000000000..36ec9d4d2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-darwin-os.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,29 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef _PPC_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define _PPC_DARWIN_OS_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "darwin-os.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+typedef unsigned int os_context_register_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "arch-os-generic.inc"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* On OS X 10.5, the field names for the thread state have changed and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * now are prepended with __. Use some #define hackery to deal with
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * this.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if __DARWIN_UNIX03
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define PPC_DARWIN_REGIFY(foo) __ ## foo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+typedef ppc_thread_state_t ppc_ss_struct_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define PPC_DARWIN_REGIFY(foo) foo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+typedef ppc_saved_state_t ppc_ss_struct_t;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* __DARWIN_UNIX03 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define OS_CONTEXT_PC(context) context->uc_mcontext->PPC_DARWIN_REGIFY(ss).PPC_DARWIN_REGIFY(srr0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* _PPC_DARWIN_OS_H */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-lispregs.h src/runtime/ppc-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 35815eedc..02074728d 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1,5 +1,15 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined __ASSEMBLER__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define REG(num) r##num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FREG(num) f##num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define REG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FREG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define REG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FREG(num) num
</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;'>- #define NREGS 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -15,8 +25,13 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_NL6       REG(9)    /* Last (7th) FF param */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_FDEFN     REG(10)   /* was NL7 until recently -dan */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_NARGS     REG(11)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define reg_CFUNC     REG(12)   /* Silly to blow a reg on FF-name */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define reg_NFP       REG(13)   /* Lisp may save around FF-call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_NFP       REG(12)   /* Lisp may save around FF-call */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_CFUNC     REG(13)   /* Silly to blow a reg on FF-name */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_BSP       REG(14)   /* Binding stack pointer */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_CFP       REG(15)   /* Control/value stack frame pointer */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define reg_CSP       REG(16)   /* Control/value stack top */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc64-lispregs.h src/runtime/ppc64-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index e0c31f7cd..7fefc085e 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc64-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc64-lispregs.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1,5 +1,15 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined __ASSEMBLER__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define REG(num) r##num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FREG(num) f##num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define REG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define FREG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define REG(num) num
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define FREG(num) num
</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;'>- #define NREGS 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git tests/float.pure.lisp tests/float.pure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 8ed76998c..914d874c7 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tests/float.pure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tests/float.pure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -136,6 +136,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             :fails-on (or (and :arm64 (not :darwin))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           :arm
</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:#ffe0e0;'>-   (assert-error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    (sb-sys:without-interrupts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -157,6 +158,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             :fails-on (or (and :arm64 (not :darwin))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           :arm
</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:#ffe0e0;'>-   (assert-error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    (sb-sys:without-interrupts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git tests/foreign-stack-alignment.impure.lisp tests/foreign-stack-alignment.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index bd505938d..23b431f3e 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tests/foreign-stack-alignment.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tests/foreign-stack-alignment.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -34,7 +34,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defvar *required-alignment*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (or #+arm 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       #+mips 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      #+ppc 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      #+(and ppc darwin) 16
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      #+(and ppc (not darwin)) 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       #+(or arm64 x86 x86-64 riscv ppc64) 16
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       #+sparc 8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       (error "Unknown platform")))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git tests/test-funs.lisp tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 784c7815a..6bb6f7d0c 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tests/test-funs.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -37,7 +37,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (start-time (get-internal-real-time)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (declare (special test-util::*deferred-test-forms*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (makunbound 'test-util::*deferred-test-forms*)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    (let ((*features* (append *features* #+(and (or arm arm64) (not darwin))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (let ((*features* (append *features* #+(and (or arm arm64) (not (and darwin ppc)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                          (unless (getf (sb-int:get-floating-point-modes) :traps)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            '(:no-float-traps))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                          sb-impl:+internal-features+)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1012-ppc-Darwin-Config.ppc-follow-up-changes.patch b/lang/sbcl/files/1012-ppc-Darwin-Config.ppc-follow-up-changes.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 8befee6dbe3..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1012-ppc-Darwin-Config.ppc-follow-up-changes.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,68 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 63b3fbb8970c10c818566784f0ad52a69a808a0d Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: barracuda156 <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Mon, 5 Jun 2023 22:29:05 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: Config.ppc: follow up changes
</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.ppc-darwin | 33 ++++++++++++++++++---------------
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 18 insertions(+), 15 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.ppc-darwin src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index b34a07236..cb068de0c 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -9,33 +9,36 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # provided with absolutely no warranty. See the COPYING and CREDITS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # files for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--CFLAGS = -g -Wall -O2 -fdollars-in-identifiers -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--LINKFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+CFLAGS = -arch ppc -g -Wall -O2 -fdollars-in-identifiers -D_XOPEN_SOURCE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+DEPEND_FLAGS += -D_XOPEN_SOURCE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+LINKFLAGS = -arch ppc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ifdef SBCL_MACOSX_VERSION_MIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  CFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  LINKFLAGS += -mmacosx-version-min=$(SBCL_MACOSX_VERSION_MIN)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ifdef LISP_FEATURE_DARWIN9_OR_BETTER
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    CFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    LINKFLAGS += -mmacosx-version-min=10.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    CFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    LINKFLAGS += -mmacosx-version-min=10.4
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  endif
</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;'>- OS_SRC = bsd-os.c darwin-os.c ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- OS_LIBS = -lSystem -lc
</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 += -lz
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  OS_LIBS += -lzstd
</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;'>--CC = gcc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ASSEM_SRC = ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ARCH_SRC = ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--CPPFLAGS += -no-cpp-precomp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--ifdef LISP_FEATURE_GENCGC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+GC_SRC = fullcgc.c gencgc.c traceroot.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</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;'>-   USE_LIBSBCL = -Wl,-force_load libsbcl.a
</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;'>--.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><span style='display:block; white-space:pre;background:#ffe0e0;'>--after-grovel-headers:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1013-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch b/lang/sbcl/files/1013-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index cab52329ada..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1013-ppc-Darwin-ppc-assem.S-fix-wrong-assembler-code-chun.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,35 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From ea2dcfbfb3903b5bcee2dfd8839d7ffbeeed0499 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: barracuda156 <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Mon, 5 Jun 2023 22:30:34 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: ppc-assem.S: fix wrong assembler code chunk
</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/ppc-assem.S | 12 +++++++-----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 7 insertions(+), 5 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/ppc-assem.S src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0c18afe4a..24bb70657 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -333,11 +333,13 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Call out to obtain our TLS block. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   load(reg_NL0,CSYMBOL(current_thread))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  /* This won't work on darwin: wrong fixup style.  And is it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--   * supposed to be lis/ori or lis/addi?  Or does it differ
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--   * between darwin and everything else again? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  lis reg_CFUNC,CSYMBOL(pthread_getspecific)@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  ori reg_CFUNC,reg_CFUNC,CSYMBOL(pthread_getspecific)@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN /* FIXME: should it be lis/ori or lis/addi? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_CFUNC,hi16(CSYMBOL(pthread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ori reg_CFUNC,reg_CFUNC,lo16(CSYMBOL(pthread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_CFUNC,CSYMBOL(pthread_getspecific)@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ori reg_CFUNC,reg_CFUNC,CSYMBOL(pthread_getspecific)@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mtctr reg_CFUNC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   bctrl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mr reg_THREAD, reg_NL0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1014-ppc-Darwin-Misc-fixes-for-PPC.patch b/lang/sbcl/files/1014-ppc-Darwin-Misc-fixes-for-PPC.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 93a9ac07c27..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1014-ppc-Darwin-Misc-fixes-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,77 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From eba446863d983e7615312882945885dafd16c762 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: Mon, 5 Jun 2023 22:51:40 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: Misc fixes 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;'>- contrib/sb-grovel/def-to-lisp.lisp |  5 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-config.sh                     | 11 +++++++++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/Config.ppc-darwin      |  4 ++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/run-compiler.sh              |  1 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 19 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 contrib/sb-grovel/def-to-lisp.lisp contrib/sb-grovel/def-to-lisp.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index e556c133a..fc84afe4a 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- contrib/sb-grovel/def-to-lisp.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ contrib/sb-grovel/def-to-lisp.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -205,6 +205,11 @@ code:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                  "-D_DARWIN_USE_64_BIT_INODE")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        #+(and x86-64 darwin (not inode64))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        '("-arch" "x86_64" "-mmacosx-version-min=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" (namestring exefile) (namestring sourcefile)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       :search t
</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 40fff6c79..0d177b93a 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;'>-@@ -738,8 +738,15 @@ case "$sbcl_arch" in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   $GNUMAKE -C tools-for-build where-is-mcontext -I ../src/runtime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   tools-for-build/where-is-mcontext > src/runtime/ppc-linux-mcontext.h || (echo "error running where-is-mcontext"; exit 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     elif [ "$sbcl_os" = "darwin" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  echo "Unsupported configuration"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  exit 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        # We provide a dlopen shim, so a little lie won't hurt
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  printf ' :os-provides-dlopen' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        # The default stack ulimit under darwin is too small to run PURIFY.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        # Best we can do is complain and exit at this stage
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if [ "`ulimit -s`" = "512" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            echo "Your stack size limit is too small to build SBCL."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            echo "See the limit(1) or ulimit(1) commands and the README file."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            exit 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ppc64)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/Config.ppc-darwin src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index cb068de0c..5611dd376 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/Config.ppc-darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -42,3 +42,7 @@ 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;'>-   USE_LIBSBCL = -Wl,-force_load libsbcl.a
</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;'>-+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;'>-diff --git tests/run-compiler.sh tests/run-compiler.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 913e2c8a7..d157f6206 100755
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tests/run-compiler.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tests/run-compiler.sh
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -14,6 +14,7 @@ args=
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case "$platform" in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     Darwin-X86-64) args="-arch x86_64" ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     Darwin-X86)    args="-arch i386" ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    Darwin-PowerPC) args="-arch ppc" ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     SunOS-X86-64)  args=-m64 ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     Linux-X86)     args="-m32" ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     Linux-PowerPC) args="-m32" ;;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1015-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch b/lang/sbcl/files/1015-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index a65bf7c6f8d..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1015-ppc-Darwin-ppc-assem-a-minor-fix-to-assembler-syntax.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,33 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From d62a80a75ded1892db99fa93e5334c6599f560af Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: barracuda156 <vital.had@gmail.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Tue, 6 Jun 2023 16:37:08 +0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: ppc-assem: a minor fix to assembler syntax
</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/ppc-assem.S | 7 +++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 7 insertions(+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 24bb70657..54e65aa5b 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -295,9 +295,16 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* store old SP and switch to new stack */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         lwz     REG(10),THREAD_ALIEN_STACK_START_OFFSET(REG(3))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN /* FIXME: is this correct? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        addis   REG(10),REG(10),ha16(ALIEN_STACK_SIZE)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if ALIEN_STACK_SIZE % 65536 != 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        addi    REG(10),REG(10),lo16(ALIEN_STACK_SIZE)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         addis   REG(10),REG(10),ALIEN_STACK_SIZE@ha
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if ALIEN_STACK_SIZE % 65536 != 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         addi    REG(10),REG(10),ALIEN_STACK_SIZE@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   stwu    REG(1),-16(REG(10))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   mr      REG(1),REG(10)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1016-Fix-building-by-lisp-without-endian-features.patch b/lang/sbcl/files/1016-Fix-building-by-lisp-without-endian-features.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index f4a3cfacc6a..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1016-Fix-building-by-lisp-without-endian-features.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,33 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From da3a5bce2c0aa3b2c7589390641b0ed01731c084 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: Thu, 8 Jun 2023 20:43:29 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Fix building by lisp without endian features
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Some lisp may not have little-endian or big-endian in features which
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-leads to trigger that asset that shouldn't happened because target
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-features contains it and it should downgrade to bvref-64/bvref-32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-instead of native-bvref-word.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This issue was introduced at 1ec9a7270aeb2f2b4d7d14919e323b44ee117be8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/cold/shebang.lisp | 4 +++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 3 insertions(+), 1 deletion(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/cold/shebang.lisp src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 4edafcbf8..313036fc5 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/cold/shebang.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -34,7 +34,9 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (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:#ffe0e0;'>-   (flet ((endianness (features)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (let ((result (intersection '(:little-endian :big-endian) features)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--             (assert (and result (not (cdr result))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             ;; some lisp implementation may not have little-endian / big-endian
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             ;; features which shouldn't trigger that assert
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+             (assert (or (not result) (and result (not (cdr result)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              (car result)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          (wordsize (features)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (if (member :64-bit features) 64 32)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1017-ppc-Darwin-fix-threads-support.patch b/lang/sbcl/files/1017-ppc-Darwin-fix-threads-support.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 1d0bf91a710..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1017-ppc-Darwin-fix-threads-support.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,89 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From e195abc4dd857526921b23ce35d1fbfe90a31524 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: Sun, 11 Jun 2023 12:14:51 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: fix threads support
</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/cold/shared.lisp        |  2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/arch.h          |  4 ++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-assem.S     |  6 +++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-darwin-os.c | 12 ++++++++----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 16 insertions(+), 8 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/cold/shared.lisp src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 884d39dba..f8cdfbacf 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/cold/shared.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -310,7 +310,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (pushnew :immobile-code sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (when (target-featurep :64-bit)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (push :compact-symbol sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        (when (target-featurep '(:and :sb-thread (:or (:and :darwin (:not :x86)) :openbsd)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (when (target-featurep '(:and :sb-thread (:or (:and :darwin (:not (:or :ppc :x86))) :openbsd)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (push :os-thread-stack sb-xc:*features*))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (when (target-featurep '(:and :x86 :int4-breakpoints))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; 0xCE is a perfectly good 32-bit instruction,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/arch.h src/runtime/arch.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f659d1248..753914c6a 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/arch.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/arch.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -42,6 +42,10 @@ extern int arch_os_thread_init(struct thread *thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if defined(LISP_FEATURE_X86) && defined(LISP_FEATURE_SB_THREAD)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern void arch_os_load_ldt(struct thread *thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(LISP_FEATURE_PPC) && defined(LISP_FEATURE_SB_THREAD)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* pthread_key_t is always unsigned long on PPC/Darwin */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern void *arch_os_thread_getspecific(unsigned long key);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern int arch_os_thread_cleanup(struct thread *thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern lispobj funcall0(lispobj function);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-assem.S src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 54e65aa5b..93fb16425 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-assem.S
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -340,9 +340,9 @@ x:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Call out to obtain our TLS block. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   load(reg_NL0,CSYMBOL(current_thread))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_DARWIN /* FIXME: should it be lis/ori or lis/addi? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  lis reg_CFUNC,hi16(CSYMBOL(pthread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  ori reg_CFUNC,reg_CFUNC,lo16(CSYMBOL(pthread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  lis reg_CFUNC,hi16(CSYMBOL(arch_os_thread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ori reg_CFUNC,reg_CFUNC,lo16(CSYMBOL(arch_os_thread_getspecific))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   lis reg_CFUNC,CSYMBOL(pthread_getspecific)@h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   ori reg_CFUNC,reg_CFUNC,CSYMBOL(pthread_getspecific)@l
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/ppc-darwin-os.c src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 9258e273b..781e65250 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-darwin-os.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -24,16 +24,20 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "arch.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "interr.h"                     /* for declaration of lose */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#error "Define threading support functions"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int arch_os_thread_init(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;                   /* success */
</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;'>-+#ifdef LISP_FEATURE_SB_THREAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* fix for "ld: absolute address to symbol _pthread_getspecific in a different linkage unit not supported" */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+void *arch_os_thread_getspecific(pthread_key_t key) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return pthread_getspecific(key);
</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;'>- int arch_os_thread_cleanup(struct thread *thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 1;                   /* success */
</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;'>- os_context_register_t   *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- os_context_register_addr(os_context_t *context, int offset)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1018-Darwin-fix-build-without-legacy-support-library.patch b/lang/sbcl/files/1018-Darwin-fix-build-without-legacy-support-library.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index d6696c44746..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1018-Darwin-fix-build-without-legacy-support-library.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,218 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 833b9d33bcf33b1ef4575ebc50448757feae7d6b 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: Sun, 30 Jul 2023 11:47:32 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Darwin: fix build without legacy support library
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-SBCL can be build on macOS 10.5 by avoiding two things:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-`pthread_setname_np` which is useless, and `clock_gettime` which
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-requires some works to be emulated on the right way.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- make-config.sh                   |  5 ++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/code/sunos-os.lisp           | 17 -----------------
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/code/unix.lisp               | 26 ++++++++++++++++++++++++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/cold/exports.lisp            |  4 ++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/runtime.c            |  7 +++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/thread.c             |  2 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tests/brothertree.impure.lisp    |  4 ++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tools-for-build/grovel-headers.c |  2 ++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 8 files changed, 44 insertions(+), 23 deletions(-)
</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 0d177b93a..6bf2c7ed9 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;'>-@@ -632,7 +632,10 @@ case "$sbcl_os" in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         darwin_version=`uname -r`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         darwin_version_major=${DARWIN_VERSION_MAJOR:-${darwin_version%%.*}}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if (( 10 > $darwin_version_major )) || [ $sbcl_arch = "ppc" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            printf ' :use-darwin-posix-semaphores' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            printf ' :use-darwin-posix-semaphores :avoid-pthread-setname-np' >> $ltf
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (( 15 > $darwin_version_major )); then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            printf ' :avoid-clock-gettime' >> $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 = "x86-64" ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             if (( 8 < $darwin_version_major )); then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/code/sunos-os.lisp src/code/sunos-os.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index bc096c0e6..96e0b4044 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/code/sunos-os.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/code/sunos-os.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -32,20 +32,3 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; support for CL:MACHINE-VERSION defined OAOO elsewhere
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defun get-machine-version ()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   nil)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--(in-package "SB-UNIX")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--;; SunOS defines CLOCK_PROCESS_CPUTIME_ID but you get EINVAL if you try to use it.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--(defun system-internal-run-time ()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  (multiple-value-bind (utime-sec utime-usec stime-sec stime-usec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      (with-alien ((usage (struct sb-unix::rusage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        (syscall* ("sb_getrusage" int (* (struct sb-unix::rusage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  (values (slot (slot usage 'sb-unix::ru-utime) 'sb-unix::tv-sec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                          (slot (slot usage 'sb-unix::ru-utime) 'sb-unix::tv-usec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                          (slot (slot usage 'sb-unix::ru-stime) 'sb-unix::tv-sec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                          (slot (slot usage 'sb-unix::ru-stime) 'sb-unix::tv-usec))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                  rusage_self (addr usage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    (+ (* (+ utime-sec stime-sec) internal-time-units-per-second)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--       (floor (+ utime-usec stime-usec
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                 (floor microseconds-per-internal-time-unit 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--              microseconds-per-internal-time-unit))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/code/unix.lisp src/code/unix.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 49777b896..3bbcd213f 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/code/unix.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/code/unix.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -987,7 +987,9 @@ avoiding atexit(3) hooks, etc. Otherwise exit(2) is called."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #-win32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (progn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (declaim (inline clock-gettime))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defun clock-gettime (clockid)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (declare (type (signed-byte 32) clockid))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (with-alien ((ts (struct timespec)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1022,7 +1024,10 @@ the UNIX epoch (January 1st 1970.)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; By scaling down we end up with far less resolution than clock-realtime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; offers, and COARSE is about twice as fast, so use that, but only for linux.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           ;; BSD has something similar.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           (clock-gettime #+linux clock-monotonic-coarse #-linux clock-monotonic)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          #+avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (multiple-value-bind (c-sec c-usec) (get-time-of-day) (values c-sec (* c-usec 1000)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         #+64-bit ;; I know that my math is valid for 64-bit.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (declare (optimize (sb-c::type-check 0)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1071,12 +1076,29 @@ the UNIX epoch (January 1st 1970.)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   current)))))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (declaim (inline system-internal-run-time))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  #-sunos ; defined in sunos-os
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; SunOS defines CLOCK_PROCESS_CPUTIME_ID but you get EINVAL if you try to use it,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  ;; also use the same trick when clock_gettime should be avoided.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-(or sunos avoid-clock-gettime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   (defun system-internal-run-time ()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     (multiple-value-bind (sec nsec) (clock-gettime clock-process-cputime-id)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       (+ (* sec internal-time-units-per-second)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          (floor (+ nsec (floor nanoseconds-per-internal-time-unit 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                nanoseconds-per-internal-time-unit)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                nanoseconds-per-internal-time-unit))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+(or sunos avoid-clock-gettime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (defun system-internal-run-time ()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    (multiple-value-bind (utime-sec utime-usec stime-sec stime-usec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        (with-alien ((usage (struct sb-unix::rusage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          (syscall* ("sb_getrusage" int (* (struct sb-unix::rusage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    (values (slot (slot usage 'sb-unix::ru-utime) 'sb-unix::tv-sec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (slot (slot usage 'sb-unix::ru-utime) 'sb-unix::tv-usec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (slot (slot usage 'sb-unix::ru-stime) 'sb-unix::tv-sec)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                            (slot (slot usage 'sb-unix::ru-stime) 'sb-unix::tv-usec))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    rusage_self (addr usage)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      (+ (* (+ utime-sec stime-sec) internal-time-units-per-second)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+         (floor (+ utime-usec stime-usec
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   (floor microseconds-per-internal-time-unit 2))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                microseconds-per-internal-time-unit)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; FIXME, KLUDGE: GET-TIME-OF-DAY used to be UNIX-GETTIMEOFDAY, and had a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ;;; primary return value indicating sucess, and also returned timezone
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/cold/exports.lisp src/cold/exports.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index efc5e9c70..906fb5710 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/cold/exports.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/cold/exports.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -86,6 +86,7 @@ interface stability.")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "ST-RDEV" "ST-SIZE" "ST-UID" "STAT" "TIME-T"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "TIMEVAL" "TIMEZONE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "TIOCGPGRP"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "CLOCK-GETTIME" "TV-SEC" "TV-USEC"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "TZ-DSTTIME" "TZ-MINUTESWEST" "UID-T" "UNIX-CLOSE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "UNIX-CLOSEDIR" "UNIX-DIRENT-NAME" "UNIX-DUP"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -104,8 +105,11 @@ interface stability.")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "W_OK" "X_OK"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "SC-NPROCESSORS-ONLN"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "VOID-SYSCALL"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "CLOCK-THREAD-CPUTIME-ID"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "CLOCK-PROCESS-CPUTIME-ID"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+   #-avoid-clock-gettime
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    "CLOCK-REALTIME"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ;; signals
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/runtime.c src/runtime/runtime.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 83cc284ee..e462a5aef 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/runtime.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/runtime.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -613,6 +613,12 @@ initialize_lisp(int argc, char *argv[], char *envp[])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct lisp_exception_frame exception_frame;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef LISP_FEATURE_UNIX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef LISP_FEATURE_AVOID_CLOCK_GETTIME
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    struct timeval tv;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    gettimeofday(&tv, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lisp_init_time.tv_sec = tv.tv_sec;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    lisp_init_time.tv_nsec = tv.tv_usec * 1000;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     clock_gettime(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef LISP_FEATURE_LINUX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         CLOCK_MONOTONIC_COARSE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -620,6 +626,7 @@ initialize_lisp(int argc, char *argv[], char *envp[])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         CLOCK_MONOTONIC
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         , &lisp_init_time);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</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;'>-     /* the name of the core file we're to execute. Note that this is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git src/runtime/thread.c src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index d262656a8..f99022600 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/thread.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -608,7 +608,7 @@ void sb_set_os_thread_name(char* name)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      * but my testing showed that 12.1 seems to accept any length */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_set_name_np(pthread_self(), name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_DARWIN
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined LISP_FEATURE_DARWIN && !defined LISP_FEATURE_AVOID_PTHREAD_SETNAME_NP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (vector_len(v) < 64) pthread_setname_np(name);
</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;'>-diff --git tests/brothertree.impure.lisp tests/brothertree.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index e163b7b13..13946a908 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tests/brothertree.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tests/brothertree.impure.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -158,9 +158,9 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         (assert (zerop n-unary-nodes)))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (defmacro microseconds-elapsed (form)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  #+win32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #+(or win32 avoid-clock-gettime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   `(values 0 ,form)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  #-win32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  #-(or win32 avoid-clock-gettime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   `(multiple-value-bind (sec0 nsec0) (sb-unix:clock-gettime sb-unix:clock-realtime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-      (let ((result ,form))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        (multiple-value-bind (sec1 nsec1) (sb-unix:clock-gettime sb-unix:clock-realtime)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git tools-for-build/grovel-headers.c tools-for-build/grovel-headers.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 472a5bc88..bacc90dc7 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tools-for-build/grovel-headers.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tools-for-build/grovel-headers.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -351,6 +351,7 @@ main(int argc, char __attribute__((unused)) *argv[])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif // !WIN32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     printf("\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if !defined(LISP_FEATURE_AVOID_CLOCK_GETTIME)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef LISP_FEATURE_UNIX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     DEFCONSTANT("clock-realtime", CLOCK_REALTIME);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     DEFCONSTANT("clock-monotonic", CLOCK_MONOTONIC);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -373,6 +374,7 @@ main(int argc, char __attribute__((unused)) *argv[])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     defconstant("clock-boottime-alarn", CLOCK_BOOTTIME_ALARM);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     DEFCONSTANT("clock-thread-cputime-id", CLOCK_THREAD_CPUTIME_ID);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     printf(";;; structures\n");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     DEFSTRUCT(timeval, struct timeval,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.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/1019-Allow-bootstrap-by-SBCL-before-1.1.5.patch b/lang/sbcl/files/1019-Allow-bootstrap-by-SBCL-before-1.1.5.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 231a69ec973..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1019-Allow-bootstrap-by-SBCL-before-1.1.5.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,28 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 324ee8931ad357415a85dc731aa72484d29c83e7 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, 29 Aug 2023 12:12:50 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Allow bootstrap by SBCL before 1.1.5
</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;'>- tools-for-build/canonicalize-whitespace.lisp | 5 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 5 insertions(+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git tools-for-build/canonicalize-whitespace.lisp tools-for-build/canonicalize-whitespace.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f30f80fa3..1776f4040 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- tools-for-build/canonicalize-whitespace.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ tools-for-build/canonicalize-whitespace.lisp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -15,6 +15,11 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #+ecl (ext:quit) ; avoids 'Unexpected end of file on #<input file "stdin">.'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;; The last available build of SBCL for PowerPC is 1.0.47
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+;; and sb-ext:map-directory were introduced at 1.1.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(if (not (apropos-list "map-directory" 'sb-ext))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  (quit))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #+sbcl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (progn
</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;'>-2.42.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/1020-ppc-Darwin-fix-build-on-32-bit-systems.patch b/lang/sbcl/files/1020-ppc-Darwin-fix-build-on-32-bit-systems.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 32f409f863e..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/sbcl/files/1020-ppc-Darwin-fix-build-on-32-bit-systems.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 4c8282d82278a06fcb5ae8616c47120683dabbfe 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, 29 Aug 2023 12:28:38 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ppc/Darwin: fix build on 32 bit systems
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Commit 2d4525a334c09a68fa1ba2202f280fdae685bff1 makes call
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-`gcbarrier_patch_code` mandatory and defines dummy version for
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-unsupported architectures.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-PPC contains `lose()` for 32 bit version which simple leads to double
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-symbols which may prevent linking with strict linker which doesn't allow
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-such behaviour like which is used at Darwin.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- src/runtime/ppc-arch.c | 6 ++----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 2 insertions(+), 4 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/ppc-arch.c src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index b0b48bb48..d87149508 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ src/runtime/ppc-arch.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -737,9 +737,9 @@ arch_write_linkage_table_entry(int index, void *target_addr, int datap)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   os_flush_icache((os_vm_address_t) reloc_addr, (char*) inst_ptr - reloc_addr);
</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;'>-+#ifdef LISP_FEATURE_64_BIT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void gcbarrier_patch_code(void* where, int nbits)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#ifdef LISP_FEATURE_64_BIT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     int m_operand = 64 - nbits;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // the M field has a kooky encoding
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     int m_encoded = ((m_operand & 0x1F) << 1) | (m_operand >> 5);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -748,7 +748,5 @@ void gcbarrier_patch_code(void* where, int nbits)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // .... ____ _xxx xxx_ ____ = 0x7E0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     //                  ^ deposit it here, in (BYTE 6 5) of the instruction.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     *pc = (inst & ~0x7E0) | (m_encoded << 5);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    lose("can't patch rldicl in 32-bit"); // illegal instruction
</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;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span></pre><pre style='margin:0'>

</pre>