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