From 4fbf59ac3a7c45421c3fc90592d213448c3c743d Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sat, 28 Dec 2024 14:00:20 +0100
Subject: [PATCH] Implement __chkstk for arm64
Lifted from a previously built SDL3.dll
---
CMakeLists.txt | 22 +++++++++++++++++++---
cmake/sdlcompilers.cmake | 4 ++--
src/stdlib/SDL_mslibc.c | 8 --------
src/stdlib/SDL_mslibc_arm64.masm | 26 ++++++++++++++++++++++++++
4 files changed, 47 insertions(+), 13 deletions(-)
create mode 100644 src/stdlib/SDL_mslibc_arm64.masm
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2d9687243f50c..ea6901642e214 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -505,9 +505,14 @@ if(MSVC AND TARGET SDL3-shared AND NOT SDL_LIBC)
target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MASM>:/nologo>")
set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MASM")
target_sources(SDL3-shared PRIVATE "${asm_src}")
- 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)
+ enable_language(ASM_MARMASM)
+ set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_arm64.masm")
+ target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MARMASM>:/nologo>")
+ set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MARMASM")
+ target_sources(SDL3-shared PRIVATE "${asm_src}")
+ elseif(SDL_CPU_ARM32)
+ # FIXME
endif()
endif()
@@ -3388,6 +3393,17 @@ if(SDL_SHARED)
# (__rt_sdiv, __rt_udiv, __rt_sdiv64, _rt_udiv64, __dtou64, __u64tod, __i64tos)
target_link_libraries(SDL3-shared PRIVATE msvcrt.lib)
endif()
+ find_library(HAVE_ONECORE_LIB NAMES "onecore.lib")
+ if(HAVE_ONECORE_LIB)
+ # SDL_malloc.c: __imp_MapViewOfFileNuma2 referenced in function MapViewOfFile2
+ target_link_libraries(SDL3-shared PRIVATE onecore.lib)
+ endif()
+ find_library(HAVE_VOLATILEACCESSU_LIB NAMES "volatileaccessu.lib")
+ if(HAVE_VOLATILEACCESSU_LIB)
+ # SDL_malloc.c : RtlSetVolatileMemory referenced in function RtlFillVolatileMemory
+ # SDL_malloc.c : RtlFillDeviceMemory referenced in function RtlZeroDeviceMemory
+ target_link_libraries(SDL3-shared PRIVATE volatileaccessu.lib)
+ endif()
endif()
if(HAS_Q_NO_USE_LIBIRC)
target_compile_options(SDL3-shared PRIVATE /Q_no-use-libirc)
diff --git a/cmake/sdlcompilers.cmake b/cmake/sdlcompilers.cmake
index ec3b6124cade0..c3d8c4702e6ad 100644
--- a/cmake/sdlcompilers.cmake
+++ b/cmake/sdlcompilers.cmake
@@ -34,7 +34,7 @@ function(SDL_AddCommonCompilerFlags TARGET)
cmake_push_check_state()
check_c_compiler_flag("/W3" COMPILER_SUPPORTS_W3)
if(COMPILER_SUPPORTS_W3)
- target_compile_options(${TARGET} PRIVATE "/W3")
+ target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/W3>")
endif()
cmake_pop_check_state()
endif()
@@ -131,7 +131,7 @@ function(SDL_AddCommonCompilerFlags TARGET)
if(MSVC)
check_c_compiler_flag(/WX HAVE_WX)
if(HAVE_WX)
- target_compile_options(${TARGET} PRIVATE "/WX")
+ target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/WX>")
endif()
elseif(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QNX)
check_c_compiler_flag(-Werror HAVE_WERROR)
diff --git a/src/stdlib/SDL_mslibc.c b/src/stdlib/SDL_mslibc.c
index a527bf75d6bdf..6698403fe8904 100644
--- a/src/stdlib/SDL_mslibc.c
+++ b/src/stdlib/SDL_mslibc.c
@@ -728,14 +728,6 @@ void __declspec(naked) _alloca_probe_16(void)
#endif // _M_IX86
-#ifdef _M_ARM64
-
-void __chkstk(void);
-void __chkstk() {
-}
-
-#endif
-
#endif // MSC_VER
#ifdef __ICL
diff --git a/src/stdlib/SDL_mslibc_arm64.masm b/src/stdlib/SDL_mslibc_arm64.masm
new file mode 100644
index 0000000000000..a769cc106f5ff
--- /dev/null
+++ b/src/stdlib/SDL_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