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

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/af923628693dfd4b2d62b2c17a518f83f725c734">https://github.com/macports/macports-ports/commit/af923628693dfd4b2d62b2c17a518f83f725c734</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new af923628693 wine-devel,wine-staging: Update to 10.4
</span>af923628693 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit af923628693dfd4b2d62b2c17a518f83f725c734
</span>Author: Dean M Greer <38226388+Gcenx@users.noreply.github.com>
AuthorDate: Mon Mar 24 21:24:45 2025 -0400

<span style='display:block; white-space:pre;color:#404040;'>    wine-devel,wine-staging: Update to 10.4
</span>---
 emulators/wine-devel/Portfile                      |  27 ++-
 emulators/wine-devel/files/0002-macos_hacks.diff   | 236 +++++++++++++++++----
 .../files/0003-wined3d-cwhack-18311.diff           |  29 +++
 ...ll-Force-committed-access-on-anonymous-map.diff |  29 +++
 ...ll-Always-map-files-as-writable-and-adjust.diff | 124 +++++++++++
 5 files changed, 396 insertions(+), 49 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 85699fb0d3a..8e2c81b188e 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,7 +7,7 @@ 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 10.3 wine-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup                wine-mirror wine 10.4 wine-
</span> github.tarball_from         archive
 name                        wine-devel
 conflicts                   wine-stable wine-staging wine-crossover
<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  8a8db166d082ed4a6305f744a73f95e064fc62a4 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sha256  f724829eb0cb39cd521bb636c2c3ef7ebee130fb7509dc67b03f9ac5349d2e82 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    size    52419009
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rmd160  dcaf3977e430b7bc83ce96e42f64b522b7cb572a \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sha256  3bc62c3833760c7f4ababd36cf1ba75203ddb049093d1c538ecba1224e1e8256 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    size    52490798
</span> 
 depends_build \
     port:bison \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -68,13 +68,23 @@ post-extract {
</span> 
 patch.pre_args-replace -p0 -p1
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://bugs.winehq.org/show_bug.cgi?id=34166#c103
</span> patchfiles-append \
     0001-winemac.drv-no-flicker.diff
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://bugs.winehq.org/show_bug.cgi?id=58008#c3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    3001-Revert-ntdll-Force-committed-access-on-anonymous-map.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    3002-Revert-ntdll-Always-map-files-as-writable-and-adjust.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # Some required hacks to make wine work better on macOS & Rosetta2
 patchfiles-append \
     0002-macos_hacks.diff
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Use the Vulkan renderer on macOS for d3d10/11 applications
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles-append \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    0003-wined3d-cwhack-18311.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # wine requires the program specified in INSTALL to create intermediate
 # directories; /usr/bin/install doesn't.
 # http://bugs.winehq.org/show_bug.cgi?id=35310
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -145,9 +155,9 @@ subport wine-staging {
</span> 
     checksums-append \
         ${wine_staging_distfile} \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        rmd160  812b67e394436a9773066efceb1b2728863f7153 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sha256  775fc4e8cef23700e4ec8e14923d6cf737136ef5be3071fcda7dd55168d4b9e9 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        size    9417555
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        rmd160  57f20d91ff64b0f56d475b6f036d2a982b63f0f5 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        sha256  544cba69dad546927bd04b32c66cfb61c036d0ba11f42dcee7d2b641abba705b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        size    9476104
</span> 
     depends_patch-append    port:autoconf
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -168,6 +178,7 @@ subport wine-staging {
</span> 
 # Makes destroot take significantly longer
 variant dev description "Install ${subport} development environment" {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    configure.optflags-prepend -g
</span>     build.target            all
     destroot.target-append  install-dev
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -261,7 +272,7 @@ compiler.limit_flags        yes
</span> muniversal.arch_flag        no
 muniversal.arch_compiler    yes
 configure.ldflags-delete    -L${compiler.library_path}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-configure.optflags          -g -O2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+configure.optflags          -O2
</span> configure.env-append        "CROSSCFLAGS=${configure.optflags}"
 
 # Were only installing wine not the development files
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/0002-macos_hacks.diff b/emulators/wine-devel/files/0002-macos_hacks.diff
</span><span style='display:block; white-space:pre;color:#808080;'>index 52824672efb..d366bc10711 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/emulators/wine-devel/files/0002-macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/0002-macos_hacks.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -69,10 +69,10 @@ index df3447a9014..4d70b83ee14 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 33415b6dda8..2413fb537d7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 74eb1b7f500..272a7e54058 100644
</span> --- a/dlls/ntdll/loader.c
 +++ b/dlls/ntdll/loader.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2197,6 +2197,11 @@ done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2231,6 +2231,11 @@ done:
</span>      return status;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -84,7 +84,7 @@ index 33415b6dda8..2413fb537d7 100644
</span>  
  /*************************************************************************
   *            build_module
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2278,6 +2283,15 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2312,6 +2317,15 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name,
</span>      TRACE_(loaddll)( "Loaded %s at %p: %s\n", debugstr_w(wm->ldr.FullDllName.Buffer), *module,
                       is_builtin ? "builtin" : "native" );
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -100,7 +100,7 @@ index 33415b6dda8..2413fb537d7 100644
</span>      wm->ldr.LoadCount = 1;
      *pwm = wm;
      *module = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2723,6 +2737,399 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2757,6 +2771,399 @@ static WINE_MODREF *find_existing_module( HMODULE module )
</span>      return NULL;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -500,7 +500,7 @@ index 33415b6dda8..2413fb537d7 100644
</span>  
  /******************************************************************************
   *    load_native_dll  (internal)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4324,6 +4731,18 @@ static void release_address_space(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4358,6 +4765,18 @@ static void release_address_space(void)
</span>  #endif
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -519,7 +519,7 @@ index 33415b6dda8..2413fb537d7 100644
</span>  /******************************************************************
   *            loader_init
   *
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4414,6 +4833,25 @@ void loader_init( CONTEXT *context, void **entry )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4448,6 +4867,25 @@ void loader_init( CONTEXT *context, void **entry )
</span>      }
      else
      {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -613,10 +613,60 @@ index 0bade5b35f0..1e4c485894f 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 52c907f1a32..f41eb03e26b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 26b540bd629..457af046085 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;'>-@@ -1023,7 +1023,11 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -80,6 +80,15 @@ WINE_DECLARE_DEBUG_CHANNEL(seh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "dwarf.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* CW Hack 24256 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/sysctl.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL is_rosetta2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* CW Hack 23427 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static BOOL sequoia_or_later = FALSE;
</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;'>+  * signal context platform-specific definitions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -447,6 +456,9 @@ struct amd64_thread_data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DWORD                 xstate_features_size;  /* 033c */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     UINT64                xstate_features_mask;  /* 0340 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void                **instrumentation_callback; /* 0348 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__  /* CW Hack 24265 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DWORD                 mxcsr;         /* 350 */
</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;'>+ C_ASSERT( sizeof(struct amd64_thread_data) <= sizeof(((struct ntdll_thread_data *)0)->cpu_data) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -456,6 +468,9 @@ C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct amd64_thread_data, sys
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct amd64_thread_data, fs ) == 0x338 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct amd64_thread_data, xstate_features_size ) == 0x33c );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct amd64_thread_data, xstate_features_mask ) == 0x340 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__  /* CW Hack 24265 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++C_ASSERT( offsetof( TEB, GdiTebBatch ) + offsetof( struct amd64_thread_data, mxcsr ) == 0x350 );
</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;'>+ static inline struct amd64_thread_data *amd64_thread_data(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -919,6 +934,13 @@ static void save_context( struct xcontext *xcontext, const ucontext_t *sigcontex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         context->ContextFlags |= CONTEXT_FLOATING_POINT;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         context->FltSave = *FPU_sig(sigcontext);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* CW Hack 24256: mxcsr in signal contexts is incorrect in Rosetta.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           In Rosetta only, the actual value of the register from within the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           handler is correct (on Intel it has some default value). */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (is_rosetta2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            __asm__ volatile( "stmxcsr %0" : "=m" (context->FltSave.MxCsr) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         context->MxCsr = context->FltSave.MxCsr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (xstate_extended_features() && (xs = XState_sig(FPU_sig(sigcontext))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1023,7 +1045,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;'>@@ -629,7 +679,7 @@ index 52c907f1a32..f41eb03e26b 100644
</span>  #endif
          if (ret || !self) return ret;
          if (flags & CONTEXT_DEBUG_REGISTERS)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1236,6 +1240,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 +1262,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;'>@@ -644,7 +694,7 @@ index 52c907f1a32..f41eb03e26b 100644
</span>          if (ret || !self) return ret;
          if (flags & CONTEXT_I386_DEBUG_REGISTERS)
          {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1742,6 +1754,135 @@ NTSTATUS WINAPI NtCallbackReturn( void *ret_ptr, ULONG ret_len, NTSTATUS status
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1742,6 +1776,167 @@ 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;'>@@ -711,10 +761,7 @@ index 52c907f1a32..f41eb03e26b 100644
</span> +    }
 +    return FALSE;
 +}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span> +/***********************************************************************
 + *           handle_fndisi
 + *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -775,37 +822,135 @@ index 52c907f1a32..f41eb03e26b 100644
</span> +    }
 +    return FALSE;
 +}
<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;'>++ *           emulate_xgetbv
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Check if the fault location is an Intel XGETBV instruction for xcr0 and
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * emulate it if so. Actual Intel hardware supports this instruction, so this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * will only take effect under Rosetta.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * CW HACK 23427
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static inline BOOL emulate_xgetbv( ucontext_t *sigcontext, CONTEXT *context )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    BYTE instr[3];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int len = virtual_uninterrupted_read_memory( (BYTE *)context->Rip, instr, sizeof(instr) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* Prefixed xgetbv is illegal, so no need to check. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (len < 3 || instr[0] != 0x0f || instr[1] != 0x01 || instr[2] != 0xd0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (RCX_sig(sigcontext) & 0xffffffff) != 0 /* only handling xcr0 (ecx==0) */)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</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;'>++    RDX_sig(sigcontext) = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (sequoia_or_later)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Arguably we should only claim AVX support if ROSETTA_ADVERTISE_AVX is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           set, but presumably apps will also check cpuid. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        RAX_sig(sigcontext) = 0xe7;  /* fpu/mmx, sse, avx, full avx-512 */
</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;'>++        RAX_sig(sigcontext) = 0x07;  /* fpu/mmx, sse */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    RIP_sig(sigcontext) += 3;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    TRACE_(seh)( "emulated an XGETBV instruction\n" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return TRUE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span> +#endif
 +
  
  /***********************************************************************
   *           is_privileged_instr
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1990,7 +2131,14 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1990,6 +2185,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 */
 +#ifdef __APPLE__
 +        /* CW HACK 20186 */
 +        if (handle_cet_nop( ucontext, &context.c )) return;
<span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* Winehq bug 56441 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (handle_fndisi( ucontext, &context.c )) return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        /* CW HACK 23427 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (emulate_xgetbv( ucontext, &context.c )) return;
</span> +#endif
          rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  if (handle_fndisi( ucontext, &context.c )) return;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span>          break;
      case TRAP_x86_STKFLT:  /* Stack fault */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-         rec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2600,6 +2748,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2248,6 +2451,15 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</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 __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* CW Hack 24265 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern void __restore_mxcsr_thunk(void);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++__ASM_GLOBAL_FUNC( __restore_mxcsr_thunk,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "pushq %rcx\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "movq %gs:0x30,%rcx\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "ldmxcsr 0x350(%rcx)\n\t"  /* amd64_thread_data()->mxcsr */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "popq %rcx\n\t"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                   "jmp " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_prolog_end") );
</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;'>+  *                sigsys_handler
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2275,6 +2487,23 @@ static void sigsys_handler( int signal, siginfo_t *siginfo, void *sigcontext )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         frame->restore_flags |= CONTEXT_CONTROL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     RIP_sig(ucontext) = (ULONG64)__wine_syscall_dispatcher_prolog_end_ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW Hack 24265 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (is_rosetta2)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        unsigned int direct_mxcsr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        __asm__ volatile( "stmxcsr %0" : "=m" (direct_mxcsr) );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (direct_mxcsr != FPU_sig(ucontext)->MxCsr)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            FPU_sig(ucontext)->MxCsr = direct_mxcsr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            /* On the M3, Rosetta will restore mxcsr to the initial, incorrect
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               value from the sigcontext, even if we change it. So we jump to a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               thunk that restores the value from amd64_thread_data. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            amd64_thread_data()->mxcsr = direct_mxcsr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            RIP_sig(ucontext) = (ULONG64)__restore_mxcsr_thunk;
</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;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2553,6 +2782,23 @@ void signal_init_process(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW Hack 24256: We need the value of sysctl.proc_translated in signal
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       handlers but sysctl[byname] is not signal-safe. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    {
</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;'>++            is_rosetta2 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            is_rosetta2 = ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW Hack 23427: __builtin_available presumably isn't signal-safe. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (__builtin_available( macOS 15.0, * ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        sequoia_or_later = TRUE;
</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;'>+     sig_act.sa_mask = server_block_set;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     sig_act.sa_flags = SA_SIGINFO | SA_RESTART | SA_ONSTACK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2611,6 +2857,7 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined (__APPLE__)
</span>      __asm__ volatile ("movq %0,%%gs:%c1" :: "r" (teb->Tib.Self), "n" (FIELD_OFFSET(TEB, Tib.Self)));
      __asm__ volatile ("movq %0,%%gs:%c1" :: "r" (teb->ThreadLocalStoragePointer), "n" (FIELD_OFFSET(TEB, ThreadLocalStoragePointer)));
<span style='display:block; white-space:pre;background:#e0ffe0;'>++    __asm__ volatile ("movq %0,%%gs:%c1" :: "r" (teb->Peb), "n" (FIELD_OFFSET(TEB, Peb)));
</span>      thread_data->pthread_teb = mac_thread_gsbase();
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+    __asm__ volatile (".byte 0x65\n\tmovq %0,%c1" :: "r" (teb->Peb), "n" (FIELD_OFFSET(TEB, Peb)));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    amd64_thread_data()->pthread_teb = mac_thread_gsbase();
</span>      /* alloc_tls_slot() needs to poke a value to an address relative to each
         thread's gsbase.  Have each thread record its gsbase pointer into its
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        TEB so alloc_tls_slot() can find it. */
</span> diff --git a/dlls/ntdll/unix/thread.c b/dlls/ntdll/unix/thread.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index b64a7dd40af..3da3606cfd3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b31f8969c21..fe8c61acd37 100644
</span> --- a/dlls/ntdll/unix/thread.c
 +++ b/dlls/ntdll/unix/thread.c
 @@ -1099,6 +1099,16 @@ static DECLSPEC_NORETURN void pthread_exit_wrapper( int status )
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -826,7 +971,7 @@ index b64a7dd40af..3da3606cfd3 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 06a260cfe3f..06612e84440 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7b565b6c113..99f6f009d17 100644
</span> --- a/dlls/ntdll/unix/virtual.c
 +++ b/dlls/ntdll/unix/virtual.c
 @@ -68,6 +68,7 @@
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -837,13 +982,13 @@ index 06a260cfe3f..06612e84440 100644
</span>  #endif
  
  #include "ntstatus.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1750,6 +1751,42 @@ static void mprotect_range( void *base, size_t size, BYTE set, BYTE clear )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1750,6 +1751,40 @@ 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:#e0ffe0;'>++#ifdef __APPLE__
</span> +static BOOL is_catalina_or_later(void)
 +{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef __APPLE__
</span> +    static int result = -1;
 +    struct utsname name;
 +    unsigned major, minor;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -855,10 +1000,8 @@ index 06a260cfe3f..06612e84440 100644
</span> +                  major >= 19 /* macOS 10.15 Catalina */);
 +    }
 +    return (result == 1) ? TRUE : FALSE;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    return FALSE;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span> +}
<span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span> +
 +static void *wine_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
 +{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -880,7 +1023,7 @@ index 06a260cfe3f..06612e84440 100644
</span>  
  /***********************************************************************
   *           set_vprot
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2120,7 +2157,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;'>+@@ -2120,7 +2155,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;'>@@ -889,16 +1032,16 @@ index 06a260cfe3f..06612e84440 100644
</span>              goto done;
  
          switch (errno)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2448,7 +2485,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;'>+@@ -2448,7 +2483,7 @@ static NTSTATUS map_pe_header( void *ptr, size_t size, size_t map_size, int fd,
</span>  
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (!*removable)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!*removable && map_size)
</span>      {
<span style='display:block; white-space:pre;background:#ffe0e0;'>--        if (mmap( ptr, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE, fd, 0 ) != MAP_FAILED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        if (wine_mmap( ptr, size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_PRIVATE, fd, 0 ) != MAP_FAILED)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             return STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         switch (errno)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3962,7 +3999,7 @@ void virtual_map_user_shared_data(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (mmap( ptr, map_size, PROT_READ | PROT_WRITE | PROT_EXEC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        if (wine_mmap( ptr, map_size, PROT_READ | PROT_WRITE | PROT_EXEC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   MAP_FIXED | MAP_PRIVATE, fd, 0 ) != MAP_FAILED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (size > map_size) pread( fd, (char *)ptr + map_size, size - map_size, map_size );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3970,7 +4005,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;'>@@ -907,7 +1050,18 @@ index 06a260cfe3f..06612e84440 100644
</span>      {
          ERR( "failed to remap the process USD: %d\n", res );
          exit(1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6143,6 +6180,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4102,6 +4137,10 @@ NTSTATUS virtual_handle_fault( EXCEPTION_RECORD *rec, void *stack )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ret = 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;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef __APPLE__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     mutex_unlock( &virtual_mutex );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     rec->ExceptionCode = ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return ret;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6147,6 +6186,56 @@ NTSTATUS WINAPI NtReadVirtualMemory( HANDLE process, const void *addr, void *buf
</span>      return status;
  }
  
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -964,7 +1118,7 @@ index 06a260cfe3f..06612e84440 100644
</span>  
  /***********************************************************************
   *             NtWriteVirtualMemory   (NTDLL.@)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -6163,6 +6250,10 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6167,6 +6256,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;'>@@ -1169,7 +1323,7 @@ index 6c6b2352bb6..2edac50a51c 100644
</span>      NtProtectVirtualMemory( GetCurrentProcess(), (void **)&thunk, &size, PAGE_EXECUTE_READ, &old_prot );
      return STATUS_SUCCESS;
 diff --git a/server/mach.c b/server/mach.c
<span style='display:block; white-space:pre;background:#ffe0e0;'>-index 0472e7a6701..aa34a56e887 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 50d21e2810a..96f0480bb86 100644
</span> --- a/server/mach.c
 +++ b/server/mach.c
 @@ -48,6 +48,7 @@
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/0003-wined3d-cwhack-18311.diff b/emulators/wine-devel/files/0003-wined3d-cwhack-18311.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..12c1860e871
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/0003-wined3d-cwhack-18311.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,29 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/dlls/wined3d/directx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/dlls/wined3d/directx.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3460,13 +3460,25 @@ done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static struct wined3d_adapter *wined3d_adapter_create(unsigned int ordinal, DWORD wined3d_creation_flags)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    struct wined3d_adapter *adapter = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (wined3d_creation_flags & WINED3D_NO3D)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return wined3d_adapter_no3d_create(ordinal, wined3d_creation_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (wined3d_settings.renderer == WINED3D_RENDERER_VULKAN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         return wined3d_adapter_vk_create(ordinal, wined3d_creation_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return wined3d_adapter_gl_create(ordinal, wined3d_creation_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (wined3d_settings.renderer == WINED3D_RENDERER_OPENGL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        return wined3d_adapter_gl_create(ordinal, wined3d_creation_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    /* CW HACK 18311: Use the Vulkan renderer on macOS. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if ((adapter = wined3d_adapter_vk_create(ordinal, wined3d_creation_flags)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        ERR_(winediag)("Using the Vulkan renderer for d3d10/11 applications.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!adapter)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        adapter = wined3d_adapter_gl_create(ordinal, wined3d_creation_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return adapter;
</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 STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/emulators/wine-devel/files/3001-Revert-ntdll-Force-committed-access-on-anonymous-map.diff b/emulators/wine-devel/files/3001-Revert-ntdll-Force-committed-access-on-anonymous-map.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..e360024a365
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/3001-Revert-ntdll-Force-committed-access-on-anonymous-map.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,29 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 37b9e75dc7bcc23a236c1d90441cdfd2feb92efc Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Dean M Greer <38226388+Gcenx@users.noreply.github.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 23 Mar 2025 16:31:25 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 1/2] Revert "ntdll: Force committed access on anonymous
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mappings."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This reverts commit 9e006e94c9cb3473cb874e1efe1efe56be307463.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dlls/ntdll/unix/virtual.c | 4 +---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 1 file changed, 1 insertion(+), 3 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bb196c57155..1d5293bdd28 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3269,9 +3269,7 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     res = map_file_into_view( view, unix_handle, 0, size, offset.QuadPart, vprot, needs_close );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (res == STATUS_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        /* file mappings must always be accessible */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        mprotect_range( view->base, view->size, VPROT_COMMITTED, 0 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        set_vprot( view, view->base, size, vprot );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         SERVER_START_REQ( map_view )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             req->mapping = wine_server_obj_handle( handle );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.39.5 (Apple Git-154)
</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-devel/files/3002-Revert-ntdll-Always-map-files-as-writable-and-adjust.diff b/emulators/wine-devel/files/3002-Revert-ntdll-Always-map-files-as-writable-and-adjust.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..e0163dc94ac
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/emulators/wine-devel/files/3002-Revert-ntdll-Always-map-files-as-writable-and-adjust.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,124 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 9e9f6de76506ee65a79619fa62b4fa9174572bad Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: Dean M Greer <38226388+Gcenx@users.noreply.github.com>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Sun, 23 Mar 2025 16:31:42 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH 2/2] Revert "ntdll: Always map files as writable and adjust
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ permissions."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This reverts commit 07160a23fa2139c2dc9cad92158ddf0b64a3e75e.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dlls/kernel32/tests/virtual.c |  7 +++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dlls/ntdll/unix/virtual.c     | 19 ++++++++++---------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 2 files changed, 17 insertions(+), 9 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1c84acfc215..63eba0f5883 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/dlls/kernel32/tests/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/dlls/kernel32/tests/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4058,12 +4058,15 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags, BOOL readonly )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         continue;
</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;'>++                    todo_wine_if(readonly && page_prot[k] == PAGE_WRITECOPY && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(ret, "VirtualProtect error %ld, map %#lx, view %#lx, requested prot %#lx\n", GetLastError(), page_prot[i], view[j].prot, page_prot[k]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    todo_wine_if(readonly && page_prot[k] == PAGE_WRITECOPY && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(old_prot == prev_prot, "got %#lx, expected %#lx\n", old_prot, prev_prot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     prev_prot = actual_prot;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ret = VirtualQuery(base, &info, sizeof(info));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(ret, "%ld: VirtualQuery failed %ld\n", j, GetLastError());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    todo_wine_if(readonly && page_prot[k] == PAGE_WRITECOPY && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(info.Protect == actual_prot,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        "VirtualProtect wrong prot, map %#lx, view %#lx, requested prot %#lx got %#lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        page_prot[i], view[j].prot, page_prot[k], info.Protect );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4118,6 +4121,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags, BOOL readonly )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             if (!anon_mapping && is_compatible_protection(alloc_prot, PAGE_WRITECOPY))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ret = VirtualProtect(base, sec_flags & SEC_IMAGE ? si.dwPageSize : 2*si.dwPageSize, PAGE_WRITECOPY, &old_prot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                todo_wine_if(readonly && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ok(ret, "VirtualProtect error %ld, map %#lx, view %#lx\n", GetLastError(), page_prot[i], view[j].prot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 if (ret) *(DWORD*)base = 0xdeadbeef;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ret = VirtualQuery(base, &info, sizeof(info));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4136,6 +4140,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags, BOOL readonly )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ret = VirtualQuery((char*)base + si.dwPageSize, &info, sizeof(info));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(ret, "%ld: VirtualQuery failed %ld\n", j, GetLastError());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                    todo_wine_if(readonly && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ok(info.Protect == PAGE_WRITECOPY, "wrong prot, map %#lx, view %#lx got %#lx\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        page_prot[i], view[j].prot, info.Protect);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4155,7 +4160,9 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags, BOOL readonly )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                             continue;
</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;'>++                        todo_wine_if(readonly && page_prot[k] == PAGE_WRITECOPY && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         ok(ret, "VirtualProtect error %ld, map %#lx, view %#lx, requested prot %#lx\n", GetLastError(), page_prot[i], view[j].prot, page_prot[k]);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                        todo_wine_if(readonly && page_prot[k] == PAGE_WRITECOPY && view[j].prot != PAGE_WRITECOPY)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         ok(old_prot == prev_prot, "got %#lx, expected %#lx\n", old_prot, prev_prot);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         ret = VirtualQuery(base, &info, sizeof(info));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1d5293bdd28..7b565b6c113 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/dlls/ntdll/unix/virtual.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2104,17 +2104,16 @@ 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;'>+                                     off_t offset, unsigned int vprot, BOOL removable )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void *ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    int prot = PROT_READ | PROT_WRITE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    unsigned int flags = MAP_FIXED | ((vprot & VPROT_WRITE) ? MAP_SHARED : MAP_PRIVATE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int prot = get_unix_prot( vprot | VPROT_COMMITTED /* make sure it is accessible */ );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unsigned int flags = MAP_FIXED | ((vprot & VPROT_WRITECOPY) ? MAP_PRIVATE : MAP_SHARED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert( start < view->size );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert( start + size <= view->size );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if ((vprot & VPROT_EXEC) || force_exec_prot)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (force_exec_prot && (vprot & VPROT_READ))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        if (!(vprot & VPROT_EXEC))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            TRACE( "forcing exec permission on mapping %p-%p\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                   (char *)view->base + start, (char *)view->base + start + size - 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        TRACE( "forcing exec permission on mapping %p-%p\n",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               (char *)view->base + start, (char *)view->base + start + size - 1 );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         prot |= PROT_EXEC;
</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;'>+@@ -2122,7 +2121,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;'>+     if (!removable || (flags & MAP_SHARED))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (mmap( (char *)view->base + start, size, prot, flags, fd, offset ) != MAP_FAILED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            return STATUS_SUCCESS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            goto done;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         switch (errno)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2131,7 +2130,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;'>+             break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         case ENOEXEC:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         case ENODEV:  /* filesystem doesn't support mmap(), fall back to read() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            if (flags & MAP_SHARED)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            if (vprot & VPROT_WRITE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 ERR( "shared writable mmap not supported, broken filesystem?\n" );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                 return STATUS_NOT_SUPPORTED;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2163,6 +2162,9 @@ 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;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     /* Now read in the file */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     pread( fd, ptr, size, offset );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (prot != (PROT_READ|PROT_WRITE)) mprotect( ptr, size, prot );  /* Set the right protection */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++done:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    set_page_vprot( (char *)view->base + start, size, vprot );
</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;'>+@@ -3269,7 +3271,6 @@ static unsigned int virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG_P
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     res = map_file_into_view( view, unix_handle, 0, size, offset.QuadPart, vprot, needs_close );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (res == STATUS_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        set_vprot( view, view->base, size, vprot );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         SERVER_START_REQ( map_view )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             req->mapping = wine_server_obj_handle( handle );
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.39.5 (Apple Git-154)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>