From 4fbf59ac3a7c45421c3fc90592d213448c3c743d Mon Sep 17 00:00:00 2001 From: Anonymous Maarten 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 2d9687243f..ea6901642e 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 "$<$:/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 "$<$:/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 ec3b6124ca..c3d8c4702e 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 "$<$:/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 "$<$:/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 a527bf75d6..6698403fe8 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 0000000000..a769cc106f --- /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