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

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/9da88533634dede705a7dc13f47849350b52690f">https://github.com/macports/macports-ports/commit/9da88533634dede705a7dc13f47849350b52690f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 9da88533634dede705a7dc13f47849350b52690f
</span>Author: Dean M Greer <38226388+Gcenx@users.noreply.github.com>
AuthorDate: Thu Jan 23 14:06:36 2025 -0500

<span style='display:block; white-space:pre;color:#404040;'>    wine-*: Update to 10.0
</span>---
 emulators/wine-devel/Portfile                      |  32 +-
 ...patch.diff => 0001-winemac.drv-no-flicker.diff} |   0
 emulators/wine-stable/Portfile                     | 106 ++++-
 .../files/0001-winemac.drv-no-flicker.diff         |  27 +-
 .../{macos_hacks.diff => 0002-macos_hacks.diff}    | 514 ++++++++++++++-------
 .../0002-ntdll-workarond-sendmsg-bug-on-macos.diff |  31 --
 ...after-free_in_macdrv_copy_pasteboard_types.diff |  26 --
 emulators/wine-stable/files/5871.diff              |  87 ----
 8 files changed, 448 insertions(+), 375 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/Portfile b/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 271a26ecfa2..3c1b3e36fa7 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,12 +7,12 @@ PortGroup                   muniversal 1.1
</span> 
 # Keep the wine-stable, wine-devel and wine-crossover portfiles as similar as possible.
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup                wine-mirror wine 9.21 wine-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup                wine-mirror wine 10.0 wine-
</span> github.tarball_from         archive
 name                        wine-devel
 conflicts                   wine-stable wine-staging wine-crossover
 set my_name                 wine
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision                    1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    0
</span> # MacPorts does not support i386 on macOS Mojave and new WoW64 requires macOS Catalina 10.15.4
 platforms                   {darwin > 15 != 18}
 set branch                  [lindex [split ${version} .] 0].x
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,9 +38,9 @@ long_description \
</span> 
 checksums \
     ${distname}${extract.suffix} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    rmd160  9df39caf3f99be28c1fc73bda63edb8374fda62b \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sha256  10dbc38de71950da5f8535d419f984a218be48641f54ab98830dd8415a6d9e75 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    size    51733008
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rmd160  0807d7f380af0851151b7abd04490a9636b187f1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sha256  b3edf134a5698d55bd210f11c3ae833c943abcece75810f6aa8cbd7a9f293ff7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    size    51935194
</span> 
 depends_build \
     port:bison \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,7 +58,7 @@ depends_lib \
</span> 
 depends_run \
     port:mingw-w64-wine-gecko-2.47.4 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    port:mingw-w64-wine-mono-9.3.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    port:mingw-w64-wine-mono-9.4.0
</span> 
 post-extract {
     # https://gitlab.winehq.org/wine/wine/-/commit/c7a97b5d5d56ef00a0061b75412c6e0e489fdc99
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -69,7 +69,7 @@ post-extract {
</span> patch.pre_args-replace -p0 -p1
 
 patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    0001-winemac.drv-no-flicker-patch.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0001-winemac.drv-no-flicker.diff
</span> 
 # Some required hacks to make wine work better on macOS & Rosetta2
 patchfiles-append \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -130,9 +130,9 @@ configure.ldflags-append    -Wl,-rpath,${compiler.library_path}
</span> # FSF GCC cannot compile code using Apple's "blocks" language extensions
 compiler.blacklist-append   {*gcc*} {clang < 800} {macports-clang-3.*}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-if {${subport} eq "wine-devel"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    patchfiles-append       1001-devel-msync.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if {${subport} eq "wine-devel"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#    patchfiles-append       1001-devel-msync.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#}
</span> 
 subport wine-staging {
     conflicts               wine-stable wine-devel wine-crossover
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -145,9 +145,9 @@ subport wine-staging {
</span> 
     checksums-append \
         ${wine_staging_distfile} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        rmd160  61f5912f617b47274545bf0941802f3f6b20d37c \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sha256  2e8c9cf9e378f99de133c7d86f9f0d5d506305869f4c802cb598f97b2f6bf8a6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        size    9564841
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        rmd160  7c2cac03da0a1d90ae866f28499c53115e3f72b6 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        sha256  59eb36a2d9786d28242901458b282d49430bdbacf801af575566dcfc6c2943ea \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        size    9490601
</span> 
     depends_patch-append    port:autoconf
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -159,8 +159,8 @@ subport wine-staging {
</span>     post-patch {
         system -W ${worksrcpath} \
             "${frameworks_dir}/Python.framework/Versions/${py_ver}/bin/python3 ${workpath}/wine-staging-${staging_version}/staging/patchinstall.py --all -W eventfd_synchronization -W ntdll-Syscall_Emulation -W winemac.drv-no-flicker-patch"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        system -W ${worksrcpath} \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            "patch -p1 < ${filespath}/1001-staging-msync.diff"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #system -W ${worksrcpath} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #    "patch -p1 < ${filespath}/1001-staging-msync.diff"
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -224,8 +224,10 @@ if {${os.major} < 19} {
</span>             create a new wine prefix. The architecture can be selected using the\
             WINEARCH environment variable which can be set to either \"win32\" or\
             \"win64\".
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n
</span>             To create a new pure 32-bit prefix, you can run:
                 \$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n
</span>             See the Wine FAQ for details: https://wiki.winehq.org/FAQ#Wineprefixes
         "
     } else {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff b/emulators/wine-devel/files/0001-winemac.drv-no-flicker.diff
</span>similarity index 100%
rename from emulators/wine-devel/files/0001-winemac.drv-no-flicker-patch.diff
rename to emulators/wine-devel/files/0001-winemac.drv-no-flicker.diff
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/Portfile b/emulators/wine-stable/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 40eb2a9b7b5..4dd912cf0b5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-stable/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,17 +7,18 @@ PortGroup                   muniversal 1.1
</span> 
 # Keep the wine-stable, wine-devel and wine-crossover portfiles as similar as possible.
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup                wine-mirror wine 9.0 wine-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup                wine-mirror wine 10.0 wine-
</span> github.tarball_from         archive
 name                        wine-stable
 conflicts                   wine-devel wine-staging wine-crossover
 set my_name                 wine
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision                    2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-platforms                   {darwin >= 19}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision                    0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# MacPorts does not support i386 on macOS Mojave and new WoW64 requires macOS Catalina 10.15.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+platforms                   {darwin > 15 != 18}
</span> set branch                  [lindex [split ${version} .] 0].0
 license                     LGPL-2.1+
 categories                  emulators
<span style='display:block; white-space:pre;background:#ffe0e0;'>-supported_archs             x86_64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+supported_archs             i386 x86_64
</span> maintainers                 {@Gcenx gmail.com:gcenx83}
 homepage                    https://www.winehq.org
 dist_subdir                 ${my_name}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -36,9 +37,10 @@ long_description \
</span>     integrate Windows applications into your desktop.
 
 checksums \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    rmd160  8a74032d3612e613ef5b97e9d2908ac612fa8d93 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sha256  90cd86d1203a7b1d304ae15461bbe0cbf1fd24feb407b551d011cc6d2967eb3f \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    size    48912704
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ${distname}${extract.suffix} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rmd160  0807d7f380af0851151b7abd04490a9636b187f1 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sha256  b3edf134a5698d55bd210f11c3ae833c943abcece75810f6aa8cbd7a9f293ff7 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    size    51935194
</span> 
 depends_build \
     port:bison \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -51,29 +53,27 @@ depends_lib \
</span>     port:freetype \
     port:gettext-runtime \
     path:lib/pkgconfig/gnutls.pc:gnutls \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    path:lib/libMoltenVK.dylib:MoltenVK-latest \
</span>     port:libpcap \
     port:libsdl2
 
 depends_run \
     port:mingw-w64-wine-gecko-2.47.4 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    port:mingw-w64-wine-mono-8.1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    port:mingw-w64-wine-mono-9.4.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+post-extract {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # https://gitlab.winehq.org/wine/wine/-/commit/c7a97b5d5d56ef00a0061b75412c6e0e489fdc99
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    reinplace -q "/PKG_CONFIG_LIBDIR/d"  ${worksrcpath}/configure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    reinplace -q "/PKG_CONFIG_LIBDIR/d"  ${worksrcpath}/configure.ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 patch.pre_args-replace -p0 -p1
 
 patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    0001-winemac.drv-no-flicker.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    0002-ntdll-workarond-sendmsg-bug-on-macos.diff \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    0003-winemac.drv-fix_use-after-free_in_macdrv_copy_pasteboard_types.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0001-winemac.drv-no-flicker.diff
</span> 
 # Some required hacks to make wine work better on macOS & Rosetta2
 patchfiles-append \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# ntdll: Fix macOS build errors with Xcode 16.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://gitlab.winehq.org/wine/wine/-/merge_requests/5871
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles-append \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    5871.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0002-macos_hacks.diff
</span> 
 # wine requires the program specified in INSTALL to create intermediate
 # directories; /usr/bin/install doesn't.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -82,7 +82,6 @@ configure.install \
</span>     ${worksrcpath}/tools/install-sh
 
 configure.args.x86_64 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    --enable-archs=i386,x86_64 \
</span>     --enable-win64
 
 configure.args \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -92,6 +91,7 @@ configure.args \
</span>     --with-coreaudio \
     --with-cups \
     --without-dbus \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    --without-ffmpeg \
</span>     --without-fontconfig \
     --with-freetype \
     --with-gettext \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -117,7 +117,7 @@ configure.args \
</span>     --with-unwind \
     --without-usb \
     --without-v4l2 \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    --with-vulkan \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    --without-vulkan \
</span>     --without-wayland \
     --without-x
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -130,10 +130,6 @@ configure.ldflags-append    -Wl,-rpath,${compiler.library_path}
</span> # FSF GCC cannot compile code using Apple's "blocks" language extensions
 compiler.blacklist-append   {*gcc*} {clang < 800} {macports-clang-3.*}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Setting an older deployment target avoids build error with MacOSX15.sdk
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://gitlab.winehq.org/wine/wine/-/merge_requests/5935#note_74758
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-macosx_deployment_target    10.15
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> # Makes destroot take significantly longer
 variant dev description "Install ${subport} development environment" {
     build.target            all
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -145,6 +141,23 @@ variant gphoto description "Build ${subport} with support for digital cameras" {
</span>     configure.args-replace  --without-gphoto --with-gphoto
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+variant ffmpeg description "Build ${subport} with FFmpeg-based implementation for the MF byte stream handlers" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Use the same version of ffmpeg as gstreamer1-gst-libav
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ffmpeg_ver          6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib-append      port:ffmpeg${ffmpeg_ver}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args-replace  --without-ffmpeg --with-ffmpeg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.pkg_config_path   ${prefix}/libexec/ffmpeg${ffmpeg_ver}/lib/pkgconfig
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    notes-append "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        The new implementation can be enabled by setting the DWORD value:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        DisableGstByteStreamHandler = 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        in the HKCU\Software\Wine\MediaFoundation registry key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> variant gstreamer description "Build ${subport} with GStreamer, for multimedia support" {
     depends_lib-append      port:gstreamer1 port:gstreamer1-gst-plugins-base port:gstreamer1-gst-plugins-good \
         port:gstreamer1-gst-plugins-bad port:gstreamer1-gst-plugins-ugly port:gstreamer1-gst-libav
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -156,7 +169,50 @@ variant kerberos description "Build ${subport} with Kerberos, for network authen
</span>     configure.args-replace  --without-krb5 --with-krb5
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-default_variants            +gstreamer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${os.major} < 19} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Using the 10.13 SDK as that's what CodeWeavers tests against for i386
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.sdk_version   10.13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${configure.sdkroot} eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        pre-fetch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            error "Building ${subport} @${version} requires the MacOSX10.13.sdk to be present in ${developer_dir}/SDKs/"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    default_variants            +universal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {${universal_possible} && [variant_isset universal]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        configure.args.i386     --with-wine64=${workpath}/${worksrcdir}-x86_64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        notes-append "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            Wine supports both 32-bit and 64-bit now. It is compatible with your\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            existing 32-bit wine prefix, but it will now default to 64-bit when you\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            create a new wine prefix. The architecture can be selected using the\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            WINEARCH environment variable which can be set to either \"win32\" or\
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \"win64\".
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            To create a new pure 32-bit prefix, you can run:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                \$ WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            \n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            See the Wine FAQ for details: https://wiki.winehq.org/FAQ#Wineprefixes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        supported_archs         i386
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {${os.major} > 18} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    depends_lib                 path:lib/libMoltenVK.dylib:MoltenVK-latest
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args.x86_64-append --enable-archs=i386,x86_64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.args-replace      --without-vulkan --with-vulkan
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Setting an older deployment target avoids build error with MacOSX15.sdk
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # https://gitlab.winehq.org/wine/wine/-/merge_requests/5935#note_74758
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    macosx_deployment_target    10.15
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    default_variants            +ffmpeg +gstreamer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 triplet.add_build           cross
 triplet.add_host            none
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/files/0001-winemac.drv-no-flicker.diff b/emulators/wine-stable/files/0001-winemac.drv-no-flicker.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 615b70c751b..126639e9068 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/files/0001-winemac.drv-no-flicker.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-stable/files/0001-winemac.drv-no-flicker.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 2bb3073bab5575a0a346ed25cde1a52da6f70a36 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 2d72a65d874538ec1032adaf42a28940e6b6a375 Mon Sep 17 00:00:00 2001
</span> From: Ken Thomases <ken@codeweavers.com>
 Date: Tue, 22 Jun 2021 07:56:43 +1000
 Subject: [PATCH] winemac.drv: No Flicker patch
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,30 +10,30 @@ Subject: [PATCH] winemac.drv: No Flicker patch
</span>  3 files changed, 6 insertions(+), 1 deletion(-)
 
 diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index a1cdcc76ebc..14db3930474 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f9ada39d38a..89ffa0d5825 100644
</span> --- a/dlls/winemac.drv/macdrv.h
 +++ b/dlls/winemac.drv/macdrv.h
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -44,6 +44,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -43,6 +43,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern BOOL allow_vsync;
</span>  extern BOOL allow_set_gamma;
  extern BOOL allow_software_rendering;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern BOOL disable_window_decorations;
</span> +extern BOOL force_backing_store;
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern const char* debugstr_cf(CFTypeRef t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern UINT64 app_icon_callback;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern UINT64 app_quit_request_callback;
</span> diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b40bf02f267..bc630305175 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ea556aef68d..e67f17f9f43 100644
</span> --- a/dlls/winemac.drv/macdrv_main.c
 +++ b/dlls/winemac.drv/macdrv_main.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -60,6 +60,7 @@ int use_precise_scrolling = TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,6 +59,7 @@ int use_precise_scrolling = TRUE;
</span>  int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE;
  int retina_enabled = FALSE;
  int enable_app_nap = FALSE;
 +BOOL force_backing_store = FALSE;
  
<span style='display:block; white-space:pre;background:#ffe0e0;'>- CFDictionaryRef localized_strings;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -378,6 +379,9 @@ static void setup_options(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ UINT64 app_icon_callback = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ UINT64 app_quit_request_callback = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -379,6 +380,9 @@ static void setup_options(void)
</span>      if (!get_config_key(hkey, appkey, "EnableAppNap", buffer, sizeof(buffer)))
          enable_app_nap = IS_OPTION_TRUE(buffer[0]);
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,7 +44,7 @@ index b40bf02f267..bc630305175 100644
</span>         processes in the prefix. */
      if (!get_config_key(hkey, NULL, "RetinaMode", buffer, sizeof(buffer)))
 diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index f78454ed149..205c0816d44 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ac87cfc1313..68de39f49cd 100644
</span> --- a/dlls/winemac.drv/opengl.c
 +++ b/dlls/winemac.drv/opengl.c
 @@ -1451,7 +1451,7 @@ static BOOL create_context(struct wgl_context *context, CGLContextObj share, uns
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -57,4 +57,5 @@ index f78454ed149..205c0816d44 100644
</span>  
      if (core)
 -- 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-2.42.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.45.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/files/macos_hacks.diff b/emulators/wine-stable/files/0002-macos_hacks.diff
</span>similarity index 72%
rename from emulators/wine-stable/files/macos_hacks.diff
rename to emulators/wine-stable/files/0002-macos_hacks.diff
<span style='display:block; white-space:pre;color:#808080;'>index c5d6b8bea40..e8477d198d2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/files/macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-stable/files/0002-macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,23 +1,13 @@
</span> diff --git a/dlls/kernelbase/process.c b/dlls/kernelbase/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 1aeb8f55257..956fd6c679f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index df3447a9014..4d70b83ee14 100644
</span> --- a/dlls/kernelbase/process.c
 +++ b/dlls/kernelbase/process.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -504,6 +504,46 @@ done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -502,6 +502,36 @@ done:
</span>      return ret;
  }
  
 +static const WCHAR *hack_append_command_line( const WCHAR *cmd, const WCHAR *cmd_line )
 +{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* CROSSOVER HACK: bug 13322 (winehq bug 39403)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * Insert --no-sandbox in command line of Steam's web helper process to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * work around rendering problems.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * CROSSOVER HACK: bug 17315
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * Insert --in-process-gpu in command line of Steam's web helper process to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * work around page rendering problems.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * CROSSOVER HACK: bug 21883
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * Insert --disable-gpu as well.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> +    static const struct
 +    {
 +        const WCHAR *exe_name;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -49,7 +39,7 @@ index 1aeb8f55257..956fd6c679f 100644
</span>  /**********************************************************************
   *           CreateProcessInternalW   (kernelbase.@)
   */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -520,6 +560,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -518,6 +548,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span>      RTL_USER_PROCESS_PARAMETERS *params = NULL;
      RTL_USER_PROCESS_INFORMATION rtl_info;
      HANDLE parent = 0, debug = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -57,7 +47,7 @@ index 1aeb8f55257..956fd6c679f 100644
</span>      ULONG nt_flags = 0;
      USHORT machine = 0;
      NTSTATUS status;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -545,6 +586,20 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -543,6 +574,20 @@ BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessInternalW( HANDLE token, const WCHAR
</span>          app_name = name;
      }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -79,16 +69,80 @@ index 1aeb8f55257..956fd6c679f 100644
</span>  
      if (flags & (IDLE_PRIORITY_CLASS | HIGH_PRIORITY_CLASS | REALTIME_PRIORITY_CLASS |
 diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 59624bc70f8..99d70a74248 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2f2a7fe5427..ac525f1a477 100644
</span> --- a/dlls/ntdll/loader.c
 +++ b/dlls/ntdll/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2693,6 +2693,331 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2244,6 +2244,11 @@ static NTSTATUS perform_relocations( void *module, IMAGE_NT_HEADERS *nt, SIZE_T
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __x86_64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_binary_patches( WINE_MODREF* wm );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*************************************************************************
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  *                build_module
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2324,6 +2329,15 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     TRACE_(loaddll)( "Loaded %s at %p: %s\n", debugstr_w(wm->ldr.FullDllName.Buffer), *module,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                      is_builtin ? "builtin" : "native" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__x86_64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW HACK 22434 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!wcscmp( wm->ldr.BaseDllName.Buffer, L"libcef.dll" ) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        !wcscmp( wm->ldr.BaseDllName.Buffer, L"Qt5WebEngineCore.dll" ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        apply_binary_patches( wm );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     wm->ldr.LoadCount = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     *pwm = wm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     *module = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2765,6 +2779,399 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span>      return NULL;
  }
  
 +#ifdef __x86_64__
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* CW HACK 19487: Patch out %gs:8h accesses in various versions of libcef.dll */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static void patch_libcef( const WCHAR* libname, WINE_MODREF** pwm )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL byte_pattern_matches( const char *addr, char wildcard_byte,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                  const char *pattern, size_t pattern_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < pattern_size; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (pattern[i] != wildcard_byte && addr[i] != pattern[i])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void *find_byte_pattern( void *dllbase, size_t size_of_image,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                char wildcard_byte, const char *pattern, size_t pattern_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (offset = 0; offset <= size_of_image - pattern_size; offset++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        char *addr = (char *)dllbase + offset;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (byte_pattern_matches( addr, wildcard_byte, pattern, pattern_size ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            return addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_byte_pattern_patch( void *addr, char wildcard_byte, const char *after, size_t after_size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    size_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < after_size; i++)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (after[i] != wildcard_byte)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            ((char *)addr)[i] = after[i];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static void apply_binary_patches( WINE_MODREF* wm )
</span> +{
 +    static const char before_85_3_9_0[] =
 +    {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -251,6 +305,23 @@ index 59624bc70f8..99d70a74248 100644
</span> +    };
 +    C_ASSERT( sizeof(before_qt_5_15_2_0_2) == sizeof(after_qt_5_15_2_0_2) );
 +
<span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    static const char before_epic_cmd_line_args_90_6_7[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x8b, 0x47, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x89, 0x43, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x8b, 0x47, 0x68,              /* mov eax, dword ptr [rdi+0x68] */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x89, 0x43, 0x68,              /* mov dword ptr [rbx + 0x68], eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    static const char after_epic_cmd_line_args_90_6_7[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x8b, 0x47, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x89, 0x43, 0x64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x31, 0xc0,                     /* xor eax, eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x90,                           /* nop */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        0x89, 0x43, 0x68                /* mov dword ptr [rsi+0x68], eax */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    C_ASSERT( sizeof(before_epic_cmd_line_args_90_6_7) == sizeof(after_epic_cmd_line_args_90_6_7) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +    struct
 +    {
 +        const WCHAR *libname;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -266,7 +337,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +         */
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "85.3.11-0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 85.3.11-0",
</span> +            /* This patch is identical to the one for 85.3.9, just at a different offset. */
 +            before_85_3_9_0, after_85_3_9_0,
 +            sizeof(before_85_3_9_0),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -275,7 +346,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "85.3.11-1",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 85.3.11-1",
</span> +            before_85_3_11_1, after_85_3_11_1,
 +            sizeof(before_85_3_11_1),
 +            0x28c521a,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -289,7 +360,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +         */
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "85.3.9.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 85.3.9.0",
</span> +            before_85_3_9_0, after_85_3_9_0,
 +            sizeof(before_85_3_9_0),
 +            0x28c4b30,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -302,7 +373,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +         */
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.121-0",
</span> +            before_72_0_3626_121_1, after_72_0_3626_121_1,
 +            sizeof(before_72_0_3626_121_1),
 +            0x23bb2ad,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -310,7 +381,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.121-1",
</span> +            before_72_0_3626_121_2, after_72_0_3626_121_2,
 +            sizeof(before_72_0_3626_121_2),
 +            0x23bb329,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -318,7 +389,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.121",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.121-2",
</span> +            before_72_0_3626_121_3, after_72_0_3626_121_3,
 +            sizeof(before_72_0_3626_121_3),
 +            0x23bb369,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -331,7 +402,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +         */
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.96-0",
</span> +            /* This patch is identical to the one for 72.0.3626.121, just at a different offset. */
 +            before_72_0_3626_121_1, after_72_0_3626_121_1,
 +            sizeof(before_72_0_3626_121_1),
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -340,7 +411,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.96-1",
</span> +            before_72_0_3626_121_2, after_72_0_3626_121_2,
 +            sizeof(before_72_0_3626_121_2),
 +            0x23bb8a9,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -348,7 +419,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"libcef.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "72.0.3626.96",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF %gs 72.0.3626.96-2",
</span> +            before_72_0_3626_121_3, after_72_0_3626_121_3,
 +            sizeof(before_72_0_3626_121_3),
 +            0x23bb8e9,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -361,7 +432,7 @@ index 59624bc70f8..99d70a74248 100644
</span> +         */
 +        {
 +            L"Qt5WebEngineCore.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "5.15.2.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF/Qt5WebEngineCore %gs 5.15.2.0-0",
</span> +            before_qt_5_15_2_0_1, after_qt_5_15_2_0_1,
 +            sizeof(before_qt_5_15_2_0_1),
 +            0x2810f10,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -369,39 +440,54 @@ index 59624bc70f8..99d70a74248 100644
</span> +        },
 +        {
 +            L"Qt5WebEngineCore.dll",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            "5.15.2.0",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF/Qt5WebEngineCore %gs 5.15.2.0-1",
</span> +            before_qt_5_15_2_0_2, after_qt_5_15_2_0_2,
 +            sizeof(before_qt_5_15_2_0_2),
 +            0x2810f8d,
 +            TRUE
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* CW HACK 23854:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * Ignore the command_line_args_disabled flag in the cef_settings_t
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         * passed to cef_inititalize. Always set it to 0.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            L"libcef.dll",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            "CEF cmd_line_args_disabled 90.6.7",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            before_epic_cmd_line_args_90_6_7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            after_epic_cmd_line_args_90_6_7,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            sizeof(before_epic_cmd_line_args_90_6_7),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            0x3807,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            TRUE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        },
</span> +    };
 +
 +    unsigned int i;
 +    SIZE_T pagesize = page_size;
<span style='display:block; white-space:pre;background:#e0ffe0;'>++    WCHAR *libname = wm->ldr.BaseDllName.Buffer;
</span> +
 +    for (i = 0; i < ARRAY_SIZE(patches); i++)
 +    {
 +        DWORD old_prot;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+        void *dllbase = (*pwm)->ldr.DllBase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        void *dllbase = wm->ldr.DllBase;
</span> +        void *target = (void *)((ULONG_PTR)dllbase + patches[i].offset);
 +        void *target_page = (void *)((ULONG_PTR)target & ~(page_size-1));
 +
 +        if (wcscmp( libname, patches[i].libname ))
 +            continue;
 +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if ((*pwm)->ldr.SizeOfImage < patches[i].offset)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (wm->ldr.SizeOfImage < patches[i].offset)
</span> +        {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            TRACE( "%s too small to be %s\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            TRACE( "%s too small to match patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> +            continue;
 +        }
 +        if (memcmp( target, patches[i].before, patches[i].size ))
 +        {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+            TRACE( "%s doesn't match %s\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            TRACE( "%s doesn't match patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> +            continue;
 +        }
 +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+        TRACE( "Found %s %s, patching out gs:0x8 accesses\n", debugstr_w(libname), patches[i].name );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        TRACE( "Found matching %s, applying patch '%s'\n", debugstr_w(libname), patches[i].name );
</span> +        NtProtectVirtualMemory( NtCurrentProcess(), &target_page, &pagesize, PAGE_EXECUTE_READWRITE, &old_prot );
 +        memcpy( target, patches[i].after, patches[i].size );
 +        NtProtectVirtualMemory( NtCurrentProcess(), &target_page, &pagesize, old_prot, &old_prot );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -414,18 +500,7 @@ index 59624bc70f8..99d70a74248 100644
</span>  
  /******************************************************************************
   *    load_native_dll  (internal)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3272,6 +3597,10 @@ static NTSTATUS load_dll( const WCHAR *load_path, const WCHAR *libname, DWORD fl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     case STATUS_SUCCESS:  /* valid PE file */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         nts = load_native_dll( load_path, &nt_name, mapping, &image_info, &id, flags, system, pwm );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __x86_64__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (nts == STATUS_SUCCESS && (!wcscmp( libname, L"libcef.dll" ) || !wcscmp( libname, L"Qt5WebEngineCore.dll" )))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            patch_libcef( libname, pwm );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</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;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4260,6 +4589,18 @@ static void release_address_space(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4365,6 +4772,18 @@ static void release_address_space(void)
</span>  #endif
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -444,10 +519,11 @@ index 59624bc70f8..99d70a74248 100644
</span>  /******************************************************************
   *            loader_init
   *
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4337,6 +4678,24 @@ void loader_init( CONTEXT *context, void **entry )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4451,6 +4870,25 @@ void loader_init( CONTEXT *context, void **entry )
</span>      }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     else wm = get_modref( NtCurrentTeb()->Peb->ImageBaseAddress );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +#ifdef __x86_64__
 +        if (is_macos() && !NtCurrentTeb()->WowTebOffset)
 +        {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -467,13 +543,13 @@ index 59624bc70f8..99d70a74248 100644
</span> +#endif
 +
  #ifdef _WIN64
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (NtCurrentTeb()->WowTebOffset) init_wow64( context );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (NtCurrentTeb()->WowTebOffset) init_wow64( context );
</span>  #endif
 diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 803d8079213..b1723851e97 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 92f2e2eb3a3..0dfee19f714 100644
</span> --- a/dlls/ntdll/unix/loader.c
 +++ b/dlls/ntdll/unix/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1797,6 +1797,48 @@ static ULONG_PTR get_image_address(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1847,6 +1847,48 @@ static ULONG_PTR get_image_address(void)
</span>      return 0;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -522,7 +598,7 @@ index 803d8079213..b1723851e97 100644
</span>  /***********************************************************************
   *           start_main_thread
   */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1819,6 +1861,13 @@ static void start_main_thread(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1869,6 +1911,13 @@ static void start_main_thread(void)
</span>      load_ntdll();
      load_wow64_ntdll( main_image_info.Machine );
      load_apiset_dll();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -537,10 +613,10 @@ index 803d8079213..b1723851e97 100644
</span>  }
  
 diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index ab544908883..231c7f0ede0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 537e4e1f60e..73d18fc80fb 100644
</span> --- a/dlls/ntdll/unix/signal_x86_64.c
 +++ b/dlls/ntdll/unix/signal_x86_64.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1004,7 +1004,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1023,7 +1023,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
</span>          ret = set_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_AMD64 );
  #ifdef __APPLE__
          if ((flags & CONTEXT_DEBUG_REGISTERS) && (ret == STATUS_UNSUCCESSFUL))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -553,7 +629,7 @@ index ab544908883..231c7f0ede0 100644
</span>  #endif
          if (ret || !self) return ret;
          if (flags & CONTEXT_DEBUG_REGISTERS)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1214,6 +1218,14 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1236,6 +1240,14 @@ NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size )
</span>      if (!self)
      {
          NTSTATUS ret = set_thread_context( handle, context, &self, IMAGE_FILE_MACHINE_I386 );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -568,7 +644,7 @@ index ab544908883..231c7f0ede0 100644
</span>          if (ret || !self) return ret;
          if (flags & CONTEXT_I386_DEBUG_REGISTERS)
          {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1701,6 +1713,135 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1742,6 +1754,135 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status
</span>      user_mode_callback_return( ret_ptr, ret_len, status, NtCurrentTeb() );
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -704,7 +780,7 @@ index ab544908883..231c7f0ede0 100644
</span>  
  /***********************************************************************
   *           is_privileged_instr
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1942,7 +2083,14 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1990,7 +2131,14 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span>          rec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED;
          break;
      case TRAP_x86_PRIVINFLT:   /* Invalid opcode exception */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -719,53 +795,7 @@ index ab544908883..231c7f0ede0 100644
</span>          break;
      case TRAP_x86_STKFLT:  /* Stack fault */
          rec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2170,6 +2318,34 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</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 __APPLE__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* CW HACK 22350 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/**********************************************************************
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *                sigsys_handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Handler for SIGSYS, signals that a non-existent system call was invoked.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Only called on macOS 14 Sonoma and later.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+static void sigsys_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    extern const void *__wine_syscall_dispatcher_prolog_end_ptr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    struct syscall_frame *frame = amd64_thread_data()->syscall_frame;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    ucontext_t *ctx = sigcontext;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    TRACE_(seh)("SIGSYS, rax %#llx, rip %#llx.\n", RAX_sig(ctx), RIP_sig(ctx));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    frame->rip = RIP_sig(ctx) + 0xb;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    frame->rcx = RIP_sig(ctx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    frame->eflags = EFL_sig(ctx);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    frame->restore_flags = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    RCX_sig(ctx) = (ULONG_PTR)frame;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    R11_sig(ctx) = frame->eflags;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    EFL_sig(ctx) &= ~0x100;  /* clear single-step flag */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    RIP_sig(ctx) = (ULONG64)__wine_syscall_dispatcher_prolog_end_ptr;
</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;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /***********************************************************************
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  *           LDT support
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2460,6 +2636,10 @@ void signal_init_process(void)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    sig_act.sa_sigaction = sigsys_handler;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    if (sigaction( SIGSYS, &sig_act, NULL ) == -1) goto error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  error:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2492,6 +2672,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2600,6 +2748,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span>      __asm__ volatile (".byte 0x65\n\tmovq %0,%c1" :: "r" (teb->Tib.Self), "n" (FIELD_OFFSET(TEB, Tib.Self)));
      __asm__ volatile (".byte 0x65\n\tmovq %0,%c1" :: "r" (teb->ThreadLocalStoragePointer), "n" (FIELD_OFFSET(TEB, ThreadLocalStoragePointer)));
      thread_data->pthread_teb = mac_thread_gsbase();
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -775,10 +805,10 @@ index ab544908883..231c7f0ede0 100644
</span>         thread's gsbase.  Have each thread record its gsbase pointer into its
         TEB so alloc_tls_slot() can find it. */
 diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 9e84ec3cc96..95b862a56d7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3909470dd66..ef6867ecdca 100644
</span> --- a/dlls/ntdll/unix/thread.c
 +++ b/dlls/ntdll/unix/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1084,6 +1084,16 @@ static DECLSPEC_NORETURN void pthread_exit_wrapper( int status )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1096,6 +1096,16 @@ static DECLSPEC_NORETURN void pthread_exit_wrapper( int status )
</span>      close( ntdll_get_thread_data()->wait_fd[1] );
      close( ntdll_get_thread_data()->reply_fd );
      close( ntdll_get_thread_data()->request_fd );
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -796,7 +826,7 @@ index 9e84ec3cc96..95b862a56d7 100644
</span>  }
  
 diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index abe1b4dc4ec..9838650847c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 684a58a724b..bbe82086085 100644
</span> --- a/dlls/ntdll/unix/virtual.c
 +++ b/dlls/ntdll/unix/virtual.c
 @@ -62,6 +62,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -807,7 +837,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>  #endif
  
  #include "ntstatus.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1714,6 +1715,42 @@ static void mprotect_range( void *base, size_t size, BYTE set, BYTE clear )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1744,6 +1745,42 @@ static void mprotect_range( void *base, size_t size, BYTE set, BYTE clear )
</span>      if (count) mprotect_exec( addr, count << page_shift, prot );
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -850,7 +880,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>  
  /***********************************************************************
   *           set_vprot
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2085,7 +2122,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2114,7 +2151,7 @@ static NTSTATUS map_file_into_view( struct file_view *view, int fd, size_t start
</span>      /* only try mmap if media is not removable (or if we require write access) */
      if (!removable || (flags & MAP_SHARED))
      {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -859,7 +889,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>              goto done;
  
          switch (errno)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2413,7 +2450,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2442,7 +2479,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, int fd, BOOL *removable )
</span>  
      if (!*removable)
      {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -868,7 +898,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>              return STATUS_SUCCESS;
  
          switch (errno)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3892,7 +3929,7 @@ void virtual_map_user_shared_data(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3943,7 +3980,7 @@ void virtual_map_user_shared_data(void)
</span>          exit(1);
      }
      if ((res = server_get_unix_fd( section, 0, &fd, &needs_close, NULL, NULL )) ||
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -877,7 +907,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>      {
          ERR( "failed to remap the process USD: %d\n", res );
          exit(1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5906,6 +5943,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6124,6 +6161,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span>      return status;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -934,7 +964,7 @@ index abe1b4dc4ec..9838650847c 100644
</span>  
  /***********************************************************************
   *             NtWriteVirtualMemory   (NTDLL.@)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5926,6 +6013,10 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6144,6 +6231,10 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
</span>              if ((status = wine_server_call( req ))) size = 0;
          }
          SERVER_END_REQ;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -946,13 +976,20 @@ index abe1b4dc4ec..9838650847c 100644
</span>      else
      {
 diff --git a/dlls/wow64cpu/cpu.c b/dlls/wow64cpu/cpu.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index a613c73d29f..26c471ff778 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6c6b2352bb6..2edac50a51c 100644
</span> --- a/dlls/wow64cpu/cpu.c
 +++ b/dlls/wow64cpu/cpu.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -38,6 +38,15 @@ struct thunk_32to64
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     DWORD op;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -40,10 +40,35 @@ struct thunk_32to64
</span>      DWORD addr;
      WORD  cs;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct thunk_32to64_rosetta2_workaround
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BYTE  lcall;  /* call far, absolute indirect */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BYTE  modrm;  /* address=disp32, opcode=3 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DWORD op;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DWORD addr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    WORD  cs;
</span> +
 +    BYTE add;
 +    BYTE add_modrm;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -962,38 +999,80 @@ index a613c73d29f..26c471ff778 100644
</span> +    BYTE jmp_modrm;
 +    DWORD jmp_op;
 +    ULONG64 jmp_addr;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span>  struct thunk_opcodes
  {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -207,7 +216,18 @@ __ASM_GLOBAL_FUNC( syscall_32to64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    struct thunk_32to64 syscall_thunk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    struct thunk_32to64 unix_thunk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        struct thunk_32to64 syscall_thunk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        struct thunk_32to64_rosetta2_workaround syscall_thunk_rosetta;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    union
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        struct thunk_32to64 unix_thunk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        struct thunk_32to64_rosetta2_workaround unix_thunk_rosetta;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "poppack.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -55,6 +80,19 @@ static USHORT fs32_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void **__wine_unix_call_dispatcher = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++BOOL use_rosetta2_workaround;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL is_rosetta2(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    char buffer[64];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NTSTATUS status = NtQuerySystemInformation( SystemProcessorBrandString, buffer, sizeof(buffer), NULL );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (status || !strstr( buffer, "VirtualApple" ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return FALSE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (reason == DLL_PROCESS_ATTACH) LdrDisableThreadCalloutsForDll( inst );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -206,7 +244,21 @@ __ASM_GLOBAL_FUNC( syscall_32to64,
</span>                     "movl %edx,4(%rsp)\n\t"
                     "movl 0xc4(%r13),%r14d\n\t"  /* context->Esp */
                     "xchgq %r14,%rsp\n\t"
 -                   "ljmp *(%r14)\n"
 +
 +                   /* CW HACK 20760:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    * Use lretq rather than ljmp to work around a Rosetta SIGUSR1 race condition.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    * When running under Rosetta 2, use lretq instead of ljmp to work around a SIGUSR1 race condition.
</span> +                    */
<span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "cmpl $0, " __ASM_NAME("use_rosetta2_workaround") "\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "jne syscall_32to64_rosetta2_workaround\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "ljmp *(%r14)\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "syscall_32to64_rosetta2_workaround:\n\t"
</span> +                   "subq $0x10,%rsp\n\t"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "movl 4(%r14),%ebx\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "movq %rbx,0x8(%rsp)\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "movl 0(%r14),%ebx\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "movq %rbx,(%rsp)\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "movl 0xa4(%r13),%ebx\n\t"   /* context->Ebx */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "movl 4(%r14),%edx\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "movq %rdx,0x8(%rsp)\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "movl 0(%r14),%edx\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "movq %rdx,(%rsp)\n\t"
</span> +                   "lretq\n"
 +
                     ".Lsyscall_32to64_return:\n\t"
                     "movq %rsp,%r14\n\t"
                     "movl 0xa8(%r13),%edx\n\t"   /* context->Edx */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -261,7 +281,16 @@ __ASM_GLOBAL_FUNC( unix_call_32to64,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -263,7 +315,20 @@ __ASM_GLOBAL_FUNC( unix_call_32to64,
</span>                     "movl %edx,4(%rsp)\n\t"
                     "movl 0xc4(%r13),%r14d\n\t"  /* context->Esp */
                     "xchgq %r14,%rsp\n\t"
 -                   "ljmp *(%r14)" )
 +
 +                   /* CW HACK 20760:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    * Use lretq rather than ljmp to work around a Rosetta SIGUSR1 race condition.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    * When running under Rosetta 2, use lretq instead of ljmp to work around a SIGUSR1 race condition.
</span> +                    */
<span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "cmpl $0, " __ASM_NAME("use_rosetta2_workaround") "\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "jne unix_call_32to64_rosetta2_workaround\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "ljmp *(%r14)\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "unix_call_32to64_rosetta2_workaround:\n\t"
</span> +                   "subq $0x10,%rsp\n\t"
 +                   "movl 4(%r14),%edx\n\t"
 +                   "movq %rdx,0x8(%rsp)\n\t"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1003,63 +1082,142 @@ index a613c73d29f..26c471ff778 100644
</span>  
  
  /**********************************************************************
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -308,22 +337,53 @@ NTSTATUS WINAPI BTCpuProcessInit(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -309,6 +374,8 @@ NTSTATUS WINAPI BTCpuProcessInit(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     wow64info->CpuFlags |= WOW64_CPUFLAGS_MSFT64;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    use_rosetta2_workaround = is_rosetta2();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     LdrGetDllHandle( NULL, 0, &str, &module );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     p__wine_unix_call_dispatcher = RtlFindExportedRoutineByName( module, "__wine_unix_call_dispatcher" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     __wine_unix_call_dispatcher = *p__wine_unix_call_dispatcher;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -318,17 +385,65 @@ NTSTATUS WINAPI BTCpuProcessInit(void)
</span>      ds64_sel = context.SegDs;
      fs32_sel = context.SegFs;
  
 -    thunk->syscall_thunk.ljmp  = 0xff;
 -    thunk->syscall_thunk.modrm = 0x2d;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* CW HACK 20760:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * Use lcall rather than ljmp to work around a Rosetta SIGUSR1 race condition.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.ljmp  = 0xff;      /* call far, absolute indirect */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.modrm = 0x1d;      /* address=disp32, opcode=3 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->syscall_thunk.op    = PtrToUlong( &thunk->syscall_thunk.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->syscall_thunk.op    = PtrToUlong( &thunk->syscall_thunk.addr );
</span> -    thunk->syscall_thunk.addr  = PtrToUlong( syscall_32to64 );
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.addr  = PtrToUlong( &thunk->syscall_thunk.add );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->syscall_thunk.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* We are now in 64-bit. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* add $0x08,%esp to remove the addr/segment pushed on the stack by the lcall */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.add = 0x83;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.add_modrm = 0xc4;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.add_op = 0x08;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* jmp to syscall_32to64 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.jmp = 0xff;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.jmp_modrm = 0x25;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.jmp_op = 0x00;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->syscall_thunk.jmp_addr = PtrToUlong( syscall_32to64 );
</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;'>-+    /* CW HACK 20760:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     * Use lcall rather than ljmp to work around a Rosetta SIGUSR1 race condition.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+     */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.pushl   = 0x68;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.dispatcher_high = (ULONG_PTR)*p__wine_unix_call_dispatcher >> 32;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.pushl2  = 0x68;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.dispatcher_low = (ULONG_PTR)*p__wine_unix_call_dispatcher;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thunk->unix_thunk.t.ljmp  = 0xff;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thunk->unix_thunk.t.modrm = 0x2d;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.ljmp  = 0xff;       /* call far, absolute indirect */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.modrm = 0x1d;       /* address=disp32, opcode=3 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.t.op    = PtrToUlong( &thunk->unix_thunk.t.addr );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    thunk->unix_thunk.t.addr  = PtrToUlong( unix_call_32to64 );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.addr  = PtrToUlong( &thunk->unix_thunk.t.add );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     thunk->unix_thunk.t.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* We are now in 64-bit. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* add $0x08,%esp to remove the addr/segment pushed on the stack by the lcall */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.add = 0x83;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.add_modrm = 0xc4;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.add_op = 0x08;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    /* jmp to unix_call_32to64 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.jmp = 0xff;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.jmp_modrm = 0x25;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.jmp_op = 0x00;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    thunk->unix_thunk.t.jmp_addr = PtrToUlong( unix_call_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->syscall_thunk.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->unix_thunk.ljmp  = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->unix_thunk.modrm = 0x2d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->unix_thunk.op    = PtrToUlong( &thunk->unix_thunk.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->unix_thunk.addr  = PtrToUlong( unix_call_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    thunk->unix_thunk.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW HACK 20760 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (use_rosetta2_workaround)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.lcall     = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.modrm     = 0x1d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.op        = PtrToUlong( &thunk->syscall_thunk_rosetta.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.addr      = PtrToUlong( &thunk->syscall_thunk_rosetta.add );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.cs        = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* We are now in 64-bit. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* add $0x08,%esp to remove the addr/segment pushed on the stack by the lcall */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.add       = 0x83;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.add_modrm = 0xc4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.add_op    = 0x08;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* jmp to syscall_32to64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.jmp       = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.jmp_modrm = 0x25;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.jmp_op    = 0x00;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk_rosetta.jmp_addr  = PtrToUlong( syscall_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk.ljmp  = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk.modrm = 0x2d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk.op    = PtrToUlong( &thunk->syscall_thunk.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk.addr  = PtrToUlong( syscall_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->syscall_thunk.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span> +
<span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW HACK 20760 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (use_rosetta2_workaround)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.lcall     = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.modrm     = 0x1d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.op        = PtrToUlong( &thunk->unix_thunk_rosetta.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.addr      = PtrToUlong( &thunk->unix_thunk_rosetta.add );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.cs        = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* We are now in 64-bit. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* add $0x08,%esp to remove the addr/segment pushed on the stack by the lcall */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.add       = 0x83;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.add_modrm = 0xc4;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.add_op    = 0x08;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* jmp to unix_call_32to64 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.jmp       = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.jmp_modrm = 0x25;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.jmp_op    = 0x00;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk_rosetta.jmp_addr  = PtrToUlong( unix_call_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk.ljmp  = 0xff;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk.modrm = 0x2d;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk.op    = PtrToUlong( &thunk->unix_thunk.addr );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk.addr  = PtrToUlong( unix_call_32to64 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        thunk->unix_thunk.cs    = cs64_sel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span>      NtProtectVirtualMemory( GetCurrentProcess(), (void **)&thunk, &size, PAGE_EXECUTE_READ, &old_prot );
      return STATUS_SUCCESS;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/server/mach.c b/server/mach.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 86ff7eac382..c659857884f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/server/mach.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/server/mach.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -48,6 +48,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <mach/thread_act.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <mach/mach_vm.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <servers/bootstrap.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static mach_port_t server_mach_port;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -172,6 +173,26 @@ void init_thread_context( struct thread *thread )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span>  }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* CX HACK 21217 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int is_apple_silicon( void )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    static int apple_silicon_status, did_check = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!did_check)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* returns 0 for native process or on error, 1 for translated */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        int ret = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        size_t size = sizeof(ret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (sysctlbyname( "sysctl.proc_translated", &ret, &size, NULL, 0 ) == -1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            apple_silicon_status = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            apple_silicon_status = ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        did_check = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return apple_silicon_status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* retrieve the thread x86 registers */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void get_thread_context( struct thread *thread, context_t *context, unsigned int flags )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -251,6 +272,13 @@ void get_thread_context( struct thread *thread, context_t *context, unsigned int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         context->flags |= SERVER_CTX_DEBUG_REGISTERS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    else if (is_apple_silicon())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* CX HACK 21217: Fake debug registers on Apple Silicon */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        fprintf( stderr, "%04x: thread_get_state failed on Apple Silicon - faking zero debug registers\n", thread->id );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        memset( &context->debug, 0, sizeof(context->debug) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        context->flags |= SERVER_CTX_DEBUG_REGISTERS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         mach_set_error( ret );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ done:
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/files/0002-ntdll-workarond-sendmsg-bug-on-macos.diff b/emulators/wine-stable/files/0002-ntdll-workarond-sendmsg-bug-on-macos.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index ea952239f21..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/files/0002-ntdll-workarond-sendmsg-bug-on-macos.diff
</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 174bb7776d3971e1ed91d57a47a7599b14c6eb45 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Piotr Caban <piotr@codeweavers.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Fri, 8 Mar 2024 13:37:30 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ntdll: Workaround sendmsg bug on macOS.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-There's a race on macOS when sending socket fd with sendmsg. The fd may get
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-broken if it's closed before recvmsg is called.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/ntdll/unix/process.c | 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 a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 4342ac8ac454..2c6dc1b43ccd 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/ntdll/unix/process.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/ntdll/unix/process.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -846,7 +846,6 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
</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;'>-     wine_server_send_fd( socketfd[1] );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    close( socketfd[1] );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* create the process on the server side */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -875,6 +874,7 @@ NTSTATUS WINAPI NtCreateUserProcess( HANDLE *process_handle_ptr, HANDLE *thread_
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         process_info = wine_server_ptr_handle( reply->info );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     SERVER_END_REQ;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    close( socketfd[1] );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     free( objattr );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     free( handles );
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     free( jobs );
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/files/0003-winemac.drv-fix_use-after-free_in_macdrv_copy_pasteboard_types.diff b/emulators/wine-stable/files/0003-winemac.drv-fix_use-after-free_in_macdrv_copy_pasteboard_types.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 57535afc98b..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/files/0003-winemac.drv-fix_use-after-free_in_macdrv_copy_pasteboard_types.diff
</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 7935a28d078f677467e68f551fb9c4e73863f25a Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Brendan Shanks <bshanks@codeweavers.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Thu, 2 May 2024 16:02:24 -0700
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] winemac.drv: Fix use-after-free in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- macdrv_copy_pasteboard_types.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Fixes a regression from bb2e02ab66c5c602d635722cf3a5820d6b366006.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/winemac.drv/cocoa_clipboard.m | 1 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 1 insertion(+)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/dlls/winemac.drv/cocoa_clipboard.m b/dlls/winemac.drv/cocoa_clipboard.m
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index a3dca323705..4994442f1df 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/winemac.drv/cocoa_clipboard.m
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/winemac.drv/cocoa_clipboard.m
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -103,6 +103,7 @@ CFArrayRef macdrv_copy_pasteboard_types(CFTypeRef pasteboard)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             @"com.compuserve.gif" : @(NSBitmapImageFileTypeGIF),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    @"public.jpeg" : @(NSBitmapImageFileTypeJPEG),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        [BitmapOutputTypeMap retain];
</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;'>-     OnMainThread(^{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-GitLab
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-stable/files/5871.diff b/emulators/wine-stable/files/5871.diff
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 9a62f1b8b02..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-stable/files/5871.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,87 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 802a52cb1b9825a8baa63276b0e6620d7f4edc83 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Brendan Shanks <bshanks@codeweavers.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Wed, 19 Jun 2024 15:36:27 -0700
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] ntdll: Make __wine_syscall_dispatcher_return a separate
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- function to fix Xcode 16 build errors.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-LLVM no longer allows non-private labels to appear between
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-.cfi_startproc/endproc when targeting Mach-O.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-For consistency, also modify ARM and i386.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/ntdll/unix/signal_arm.c    | 6 +++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/ntdll/unix/signal_arm64.c  | 6 +++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/ntdll/unix/signal_i386.c   | 5 ++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- dlls/ntdll/unix/signal_x86_64.c | 6 +++---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4 files changed, 11 insertions(+), 12 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 5115fa7ec3a..9cadd1ceb10 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/ntdll/unix/signal_arm.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/ntdll/unix/signal_arm.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1756,9 +1756,9 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "5:\tmovw r0, #0x000d\n\t" /* STATUS_INVALID_PARAMETER */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movt r0, #0xc000\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "add sp, sp, #0x10\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   ".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   __ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+__ASM_GLOBAL_FUNC( __wine_syscall_dispatcher_return,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "mov r8, r0\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "mov r0, r1\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index f96ec330796..898f2555bbb 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/ntdll/unix/signal_arm64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/ntdll/unix/signal_arm64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1864,9 +1864,9 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "ret x16\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "4:\tmov x0, #0xc0000000\n\t" /* STATUS_INVALID_PARAMETER */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movk x0, #0x000d\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   ".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   __ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+__ASM_GLOBAL_FUNC( __wine_syscall_dispatcher_return,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "mov sp, x0\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "mov x0, x1\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "b " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/dlls/ntdll/unix/signal_i386.c b/dlls/ntdll/unix/signal_i386.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 751b0081534..b0026711044 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/ntdll/unix/signal_i386.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/ntdll/unix/signal_i386.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2742,10 +2742,9 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    __ASM_CFI("\t.cfi_restore_state\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "6:\tmovl $0xc000000d,%eax\n\t" /* STATUS_INVALID_PARAMETER */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   ".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   __ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+__ASM_GLOBAL_FUNC( __wine_syscall_dispatcher_return,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movl 8(%esp),%eax\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movl 4(%esp),%esp\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index ab544908883..029374610b7 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/dlls/ntdll/unix/signal_x86_64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/dlls/ntdll/unix/signal_x86_64.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2821,9 +2821,9 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    __ASM_CFI("\t.cfi_restore_state\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "5:\tmovl $0xc000000d,%eax\n\t" /* STATUS_INVALID_PARAMETER */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movq %rsp,%rcx\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   ".globl " __ASM_NAME("__wine_syscall_dispatcher_return") "\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                   __ASM_NAME("__wine_syscall_dispatcher_return") ":\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                   "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") )
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+__ASM_GLOBAL_FUNC( __wine_syscall_dispatcher_return,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movq %rdi,%rcx\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movl 0xb0(%rcx),%r14d\n\t"     /* frame->syscall_flags */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "movq %rsi,%rax\n\t"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-GitLab
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span></pre><pre style='margin:0'>

</pre>