sdl2-compat: Implement __chkstk for arm64

From b94fe81c62cd8330074f4dd140f7d8c1eb02e077 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Thu, 2 Jan 2025 22:08:23 +0100
Subject: [PATCH] Implement __chkstk for arm64

Lifted from a previously built SDL3.dll

sdl2-compat port from
https://github.com/libsdl-org/SDL/commit/4fbf59ac3a7c45421c3fc90592d213448c3c743d
---
 CMakeLists.txt             | 11 ++++++++---
 src/sdl2_mslibc.c          |  9 ---------
 src/sdl2_mslibc_arm64.masm | 26 ++++++++++++++++++++++++++
 3 files changed, 34 insertions(+), 12 deletions(-)
 create mode 100644 src/sdl2_mslibc_arm64.masm

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2631c99..cacb129 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -194,9 +194,14 @@ if(MSVC)
     )
     enable_language(ASM_MASM)
     set_property(SOURCE "src/sdl2_mslibc_x64.masm" PROPERTY LANGUAGE "ASM_MASM")
-  elseif(SDL_CPU_ARM32 OR SDL_CPU_ARM64)
-    # FIXME: ARM assembler (armasm.exe/armasm64.exe) is NOT ASM_MASM, and does currently not work with CMake
-    # (https://gitlab.kitware.com/cmake/cmake/-/issues/18912)
+  elseif(SDL_CPU_ARM64)
+    list(APPEND SDL2COMPAT_SRCS
+      "src/sdl2_mslibc_arm64.masm"
+    )
+    enable_language(ASM_MARMASM)
+    set_property(SOURCE "src/sdl2_mslibc_arm64.masm" PROPERTY LANGUAGE "ASM_MARMASM")
+  elseif(SDL_CPU_ARM32)
+    # FIXME: Add ARM32 _chkstk implementation
   endif()
 endif()
 
diff --git a/src/sdl2_mslibc.c b/src/sdl2_mslibc.c
index dab807f..2e06094 100644
--- a/src/sdl2_mslibc.c
+++ b/src/sdl2_mslibc.c
@@ -723,13 +723,4 @@ void __declspec(naked) _alloca_probe_16(void)
 
 #endif /* _M_IX86 */
 
-#ifdef _M_ARM64
-
-/* !!! FIXME !!! */
-void __chkstk(void);
-void __chkstk() {
-}
-
-#endif
-
 #endif /* MSC_VER */
diff --git a/src/sdl2_mslibc_arm64.masm b/src/sdl2_mslibc_arm64.masm
new file mode 100644
index 0000000..a769cc1
--- /dev/null
+++ b/src/sdl2_mslibc_arm64.masm
@@ -0,0 +1,26 @@
+TeStackLimit EQU 0x00010
+PAGE_SIZE equ 0x1000
+
+    AREA CODE, READONLY
+
+    EXPORT __chkstk
+
+__chkstk PROC
+    ldr                          x17,[x18, #TeStackLimit]
+    subs                         x16,sp,x15, LSL  #0x4
+    csel                         x16,xzr,x16,cc
+    cmp                          x16,x17
+    b.cc                         chkstk_start_loop
+    ret
+chkstk_start_loop
+    and                          x16,x16,#-PAGE_SIZE
+chkstk_loop
+    sub                          x17,x17,#0x1, LSL #12
+    ldr                          xzr,[x17]
+    cmp                          x17,x16
+    b.ne                         chkstk_loop
+    ret
+
+    ENDP
+
+    END