diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index 019b7eaf89..dc1d10505f 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -9,7 +9,13 @@ file(GLOB ELF_SOURCES "../Libraries/LibELF/*.cpp") set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/plt_trampoline.S) file(GLOB LIBC_SOURCES1 "../Libraries/LibC/*.cpp") file(GLOB LIBC_SOURCES2 "../Libraries/LibC/*/*.cpp") -file(GLOB LIBC_SOURCES3 "../Libraries/LibC/*.S") + +if ("${SERENITY_ARCH}" STREQUAL "i686") + file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/i386/*.S") +elseif ("${SERENITY_ARCH}" STREQUAL "x86_64") + file(GLOB LIBC_SOURCES3 "../Libraries/LibC/arch/x86_64/*.S") +endif() + file(GLOB LIBSYSTEM_SOURCES "../Libraries/LibSystem/*.cpp") list(FILTER LIBC_SOURCES1 EXCLUDE REGEX ".+crt0.cpp") diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index d0e7947fb8..571c384b0c 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -24,7 +24,6 @@ set(LIBC_SOURCES sched.cpp semaphore.cpp serenity.cpp - setjmp.S signal.cpp spawn.cpp stat.cpp @@ -53,7 +52,13 @@ set(LIBC_SOURCES file(GLOB AK_SOURCES CONFIGURE_DEPENDS "../../../AK/*.cpp") file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp") -set(ELF_SOURCES ${ELF_SOURCES} ../LibELF/Arch/i386/plt_trampoline.S) + +if ("${SERENITY_ARCH}" STREQUAL "i686") + set(ASM_SOURCES "arch/i386/setjmp.S") + set(ELF_SOURCES ${ELF_SOURCES} ../LibELF/Arch/i386/plt_trampoline.S) +elseif ("${SERENITY_ARCH}" STREQUAL "x86_64") + set(ASM_SOURCES "arch/x86_64/setjmp.S") +endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option -DSERENITY_LIBC_BUILD") @@ -76,7 +81,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy $ ${CMAKE_INSTALL_PREFIX}/usr/lib/ssp.o ) -set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ELF_SOURCES}) +set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${ASM_SOURCES}) serenity_libc_static(LibCStatic c) target_link_libraries(LibCStatic crt0 ssp system) diff --git a/Userland/Libraries/LibC/setjmp.S b/Userland/Libraries/LibC/arch/i386/setjmp.S similarity index 100% rename from Userland/Libraries/LibC/setjmp.S rename to Userland/Libraries/LibC/arch/i386/setjmp.S diff --git a/Userland/Libraries/LibC/arch/x86_64/setjmp.S b/Userland/Libraries/LibC/arch/x86_64/setjmp.S new file mode 100644 index 0000000000..6b6df0441a --- /dev/null +++ b/Userland/Libraries/LibC/arch/x86_64/setjmp.S @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021, Andreas Kling + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +.global setjmp +setjmp: + mov %rbx, (%rdi) + mov %rbp, 8(%rdi) + mov %r12, 16(%rdi) + mov %r13, 24(%rdi) + mov %r14, 32(%rdi) + mov %r15, 40(%rdi) + lea 8(%rsp), %rcx + mov %rcx, 48(%rdi) + mov (%rsp), %rcx + mov %rcx, 56(%rdi) + xor %eax, %eax + ret + +.global longjmp +longjmp: + mov (%rdi), %rbx + mov 8(%rdi), %rbp + mov 16(%rdi), %r12 + mov 24(%rdi), %r13 + mov 32(%rdi), %r14 + mov 40(%rdi), %r15 + mov 48(%rdi), %rsp + + test %rsi, %rsi + jnz .nonzero + mov 1, %rax +.nonzero: + jmp *56(%rdi) +