<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 = ®s;
</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 = ®s;
</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>