diff --git a/lib/libc/CMakeLists.txt b/lib/libc/CMakeLists.txt index 74cc29f..c2f3d02 100644 --- a/lib/libc/CMakeLists.txt +++ b/lib/libc/CMakeLists.txt @@ -26,7 +26,7 @@ bsp_add_library( NAME libc LIB_DIR /usr/lib) -target_link_libraries(libc PRIVATE libmango libxpc-static interface::fs) +target_link_libraries(libc PRIVATE libmango librosetta libxpc-static interface::fs) target_compile_definitions(libc PRIVATE ENABLE_GLOBAL_HEAP=1) add_subdirectory(pthread) diff --git a/lib/libc/core/CMakeLists.txt b/lib/libc/core/CMakeLists.txt index c5ab489..e618c23 100644 --- a/lib/libc/core/CMakeLists.txt +++ b/lib/libc/core/CMakeLists.txt @@ -8,13 +8,17 @@ foreach (dir ${source_dirs}) set(headers ${headers} ${dir_headers}) endforeach (dir) -set(component_sources ${sources} PARENT_SCOPE) +file(GLOB sys_sources + ${CMAKE_CURRENT_SOURCE_DIR}/sys/${CMAKE_SYSTEM_PROCESSOR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/sys/${CMAKE_SYSTEM_PROCESSOR}/*.S) + +set(component_sources ${sources} ${sys_sources} PARENT_SCOPE) set(component_headers ${headers} PARENT_SCOPE) rosetta_add_library(STATIC NAME libc-core PUBLIC_INCLUDE_DIRS ${public_include_dirs} - SOURCES ${sources} + SOURCES ${sources} ${sys_sources} HEADERS ${headers}) sysroot_add_library( diff --git a/lib/libc/core/sys/x86_64/init.c b/lib/libc/core/sys/x86_64/init.c new file mode 100644 index 0000000..cff8c9a --- /dev/null +++ b/lib/libc/core/sys/x86_64/init.c @@ -0,0 +1,18 @@ +#include +#include +#include + +extern int main(int, const char **, const char **); + +void *__attribute__((weak)) pthread_self(void) +{ + /* Nothing */ + return NULL; +} + +int __libc_init(const struct rosetta_bootstrap *bsinfo) +{ + (volatile void)pthread_self(); + kern_logf("bsinfo = %p", bsinfo); + return 0; +} diff --git a/lib/libc/runtime/x86_64/crt0.s b/lib/libc/runtime/x86_64/crt0.s index 514aeb3..b36fb27 100644 --- a/lib/libc/runtime/x86_64/crt0.s +++ b/lib/libc/runtime/x86_64/crt0.s @@ -3,18 +3,20 @@ .global _start .type _start, @function -.extern main -.type main, @function +.extern __libc_init +.type __libc_init, @function .extern task_exit .type task_exit, @function _start: - # Args (as provided by the ABI) - # %rdi: int argc - # %rsi: const char **argv - # %rdx: kern_handle_t task - # %rcx: kern_handle_t address_space + # %rdi: (struct rosetta_bootstrap *)bs_info + mov %rdi, %rbx + call __libc_init + + mov 0(%rbx), %rdi # argc + mov 8(%rbx), %rsi # argv + mov 24(%rbx), %rdx # envp call main mov %rax, %rdi