mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 06:17:35 +00:00
LibC: Add x86_64 implementation of setjmp() and longjmp()
This commit is contained in:
parent
17f076d912
commit
8714f389f9
4 changed files with 72 additions and 4 deletions
|
@ -9,7 +9,13 @@ file(GLOB ELF_SOURCES "../Libraries/LibELF/*.cpp")
|
||||||
set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/plt_trampoline.S)
|
set(ELF_SOURCES ${ELF_SOURCES} ../Libraries/LibELF/Arch/i386/plt_trampoline.S)
|
||||||
file(GLOB LIBC_SOURCES1 "../Libraries/LibC/*.cpp")
|
file(GLOB LIBC_SOURCES1 "../Libraries/LibC/*.cpp")
|
||||||
file(GLOB LIBC_SOURCES2 "../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")
|
file(GLOB LIBSYSTEM_SOURCES "../Libraries/LibSystem/*.cpp")
|
||||||
|
|
||||||
list(FILTER LIBC_SOURCES1 EXCLUDE REGEX ".+crt0.cpp")
|
list(FILTER LIBC_SOURCES1 EXCLUDE REGEX ".+crt0.cpp")
|
||||||
|
|
|
@ -24,7 +24,6 @@ set(LIBC_SOURCES
|
||||||
sched.cpp
|
sched.cpp
|
||||||
semaphore.cpp
|
semaphore.cpp
|
||||||
serenity.cpp
|
serenity.cpp
|
||||||
setjmp.S
|
|
||||||
signal.cpp
|
signal.cpp
|
||||||
spawn.cpp
|
spawn.cpp
|
||||||
stat.cpp
|
stat.cpp
|
||||||
|
@ -53,7 +52,13 @@ set(LIBC_SOURCES
|
||||||
|
|
||||||
file(GLOB AK_SOURCES CONFIGURE_DEPENDS "../../../AK/*.cpp")
|
file(GLOB AK_SOURCES CONFIGURE_DEPENDS "../../../AK/*.cpp")
|
||||||
file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp")
|
file(GLOB ELF_SOURCES CONFIGURE_DEPENDS "../LibELF/*.cpp")
|
||||||
|
|
||||||
|
if ("${SERENITY_ARCH}" STREQUAL "i686")
|
||||||
|
set(ASM_SOURCES "arch/i386/setjmp.S")
|
||||||
set(ELF_SOURCES ${ELF_SOURCES} ../LibELF/Arch/i386/plt_trampoline.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")
|
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 $<TARGET_OBJECTS:ssp> ${CMAKE_INSTALL_PREFIX}/usr/lib/ssp.o
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_OBJECTS:ssp> ${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)
|
serenity_libc_static(LibCStatic c)
|
||||||
target_link_libraries(LibCStatic crt0 ssp system)
|
target_link_libraries(LibCStatic crt0 ssp system)
|
||||||
|
|
57
Userland/Libraries/LibC/arch/x86_64/setjmp.S
Normal file
57
Userland/Libraries/LibC/arch/x86_64/setjmp.S
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
|
||||||
|
* 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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue