From 7e69b8f82a09753847dc580febe77d78c0c9b24f Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Mon, 17 Mar 2025 23:18:54 +0000 Subject: [PATCH] feat(userspace/libc): support for linux target Signed-off-by: EnderIce2 --- Userspace/.vscode/c_cpp_properties.json | 24 +- Userspace/.vscode/preinclude.h | 1 + Userspace/Makefile | 1 + Userspace/docker/.gitignore | 2 + Userspace/docker/Dockerfile | 3 + Userspace/docker/Makefile | 68 +++ Userspace/libc/CMakeLists.txt | 46 +- .../libc/abis/fennix/generic/bits/signal.h | 6 +- .../libc/abis/fennix/generic/bits/socket.h | 6 +- Userspace/libc/abis/linux/x86_64/bits/errno.h | 159 ++++++ .../libc/abis/linux/x86_64/bits/signal.h | 74 +++ .../libc/abis/linux/x86_64/bits/socket.h | 34 ++ .../libc/abis/linux/x86_64/bits/syscalls.h | 474 ++++++++++++++++++ Userspace/libc/include/math.h | 4 + Userspace/libc/include/sys/stat.h | 42 +- Userspace/libc/runtime/fennix/amd64/crt1.c | 18 +- Userspace/libc/runtime/linux/x86_64/Scrt1.c | 1 + Userspace/libc/runtime/linux/x86_64/crt1.c | 101 ++++ Userspace/libc/src/std/errno.c | 2 + Userspace/libc/src/std/math.c | 18 + Userspace/libc/src/std/signal.c | 8 + Userspace/libc/src/std/string.c | 2 + .../libc/sysdeps/linux/x86_64/dl_start.c | 48 ++ .../libc/sysdeps/linux/x86_64/stack_chk.c | 22 + .../sysdeps/linux/x86_64/syscall_check.cpp | 24 + .../libc/sysdeps/linux/x86_64/syscalls.c | 193 +++++++ Userspace/libc/sysdeps/linux/x86_64/tls.c | 46 ++ 27 files changed, 1379 insertions(+), 48 deletions(-) create mode 100644 Userspace/docker/.gitignore create mode 100644 Userspace/docker/Dockerfile create mode 100644 Userspace/docker/Makefile create mode 100644 Userspace/libc/abis/linux/x86_64/bits/errno.h create mode 100644 Userspace/libc/abis/linux/x86_64/bits/signal.h create mode 100644 Userspace/libc/abis/linux/x86_64/bits/socket.h create mode 100644 Userspace/libc/abis/linux/x86_64/bits/syscalls.h create mode 100644 Userspace/libc/runtime/linux/x86_64/Scrt1.c create mode 100644 Userspace/libc/runtime/linux/x86_64/crt1.c create mode 100644 Userspace/libc/sysdeps/linux/x86_64/dl_start.c create mode 100644 Userspace/libc/sysdeps/linux/x86_64/stack_chk.c create mode 100644 Userspace/libc/sysdeps/linux/x86_64/syscall_check.cpp create mode 100644 Userspace/libc/sysdeps/linux/x86_64/syscalls.c create mode 100644 Userspace/libc/sysdeps/linux/x86_64/tls.c diff --git a/Userspace/.vscode/c_cpp_properties.json b/Userspace/.vscode/c_cpp_properties.json index 8079dd31..a8fb9cf6 100644 --- a/Userspace/.vscode/c_cpp_properties.json +++ b/Userspace/.vscode/c_cpp_properties.json @@ -5,12 +5,16 @@ "includePath": [ "${workspaceFolder}/libc/include/**", "${workspaceFolder}/coreutils/include/**", - "${workspaceFolder}/libs/include/**" + "${workspaceFolder}/libs/include/**", + "${workspaceFolder}/out/include/**" ], "defines": [ "__debug_vscode__", "DEBUG=\"1\"" ], + "forcedInclude": [ + "${workspaceFolder}/.vscode/preinclude.h" + ], "compilerPath": "${workspaceFolder}/../tools/cross/bin/x86_64-fennix-gcc", "cStandard": "c17", "cppStandard": "c++20", @@ -47,12 +51,16 @@ "includePath": [ "${workspaceFolder}/libc/include/**", "${workspaceFolder}/coreutils/include/**", - "${workspaceFolder}/libs/include/**" + "${workspaceFolder}/libs/include/**", + "${workspaceFolder}/out/include/**" ], "defines": [ "__debug_vscode__", "DEBUG=\"1\"" ], + "forcedInclude": [ + "${workspaceFolder}/.vscode/preinclude.h" + ], "compilerPath": "${workspaceFolder}/../tools/cross/bin/i386-fennix-gcc", "cStandard": "c17", "cppStandard": "c++20", @@ -89,12 +97,16 @@ "includePath": [ "${workspaceFolder}/libc/include/**", "${workspaceFolder}/coreutils/include/**", - "${workspaceFolder}/libs/include/**" + "${workspaceFolder}/libs/include/**", + "${workspaceFolder}/out/include/**" ], "defines": [ "__debug_vscode__", "DEBUG=\"1\"" ], + "forcedInclude": [ + "${workspaceFolder}/.vscode/preinclude.h" + ], "compilerPath": "${workspaceFolder}/../tools/cross/bin/arm-fennix-gcc", "cStandard": "c17", "cppStandard": "c++20", @@ -111,12 +123,16 @@ "includePath": [ "${workspaceFolder}/libc/include/**", "${workspaceFolder}/coreutils/include/**", - "${workspaceFolder}/libs/include/**" + "${workspaceFolder}/libs/include/**", + "${workspaceFolder}/out/include/**" ], "defines": [ "__debug_vscode__", "DEBUG=\"1\"" ], + "forcedInclude": [ + "${workspaceFolder}/.vscode/preinclude.h" + ], "compilerPath": "${workspaceFolder}/../tools/cross/bin/aarch64-fennix-gcc", "cStandard": "c17", "cppStandard": "c++20", diff --git a/Userspace/.vscode/preinclude.h b/Userspace/.vscode/preinclude.h index c5d17039..b4c36faf 100644 --- a/Userspace/.vscode/preinclude.h +++ b/Userspace/.vscode/preinclude.h @@ -6,3 +6,4 @@ #undef __APPLE__ #undef __clang__ #define __vscode__ 1 +#define FENNIX_DYNAMIC_LOADER 1 diff --git a/Userspace/Makefile b/Userspace/Makefile index 106a3fd0..68d0b17c 100644 --- a/Userspace/Makefile +++ b/Userspace/Makefile @@ -79,3 +79,4 @@ clean: touch cache/.gitkeep make -C libs clean make -C apps clean + make -C docker clean diff --git a/Userspace/docker/.gitignore b/Userspace/docker/.gitignore new file mode 100644 index 00000000..c5be059b --- /dev/null +++ b/Userspace/docker/.gitignore @@ -0,0 +1,2 @@ +cache/* +docker-root/* diff --git a/Userspace/docker/Dockerfile b/Userspace/docker/Dockerfile new file mode 100644 index 00000000..62f5e977 --- /dev/null +++ b/Userspace/docker/Dockerfile @@ -0,0 +1,3 @@ +FROM scratch +ADD docker-root / +CMD ["/bin/sh"] diff --git a/Userspace/docker/Makefile b/Userspace/docker/Makefile new file mode 100644 index 00000000..246c20ad --- /dev/null +++ b/Userspace/docker/Makefile @@ -0,0 +1,68 @@ +export DOCKER_ROOT = $(CURDIR)/docker-root +DOCKER_IMAGE_NAME = fennix-userspace + +export CMAKE_INSTALL_PREFIX := $(DOCKER_ROOT) +export CMAKE_SYSROOT := $(DOCKER_ROOT) + +export LDFLAGS := --sysroot=$(DOCKER_ROOT) \ + -ggdb3 -O0 +export CFLAGS := \ + --sysroot=$(DOCKER_ROOT) \ + -I$(DOCKER_ROOT)/include \ + -DDEBUG -ggdb3 -O0 -fdiagnostics-color=always + +create_docker_out: + rm -rf cache + rm -rf $(DOCKER_ROOT) + mkdir -p $(DOCKER_ROOT) + mkdir -p $(DOCKER_ROOT)/bin + mkdir -p $(DOCKER_ROOT)/etc + mkdir -p $(DOCKER_ROOT)/lib + mkdir -p $(DOCKER_ROOT)/lib64 + mkdir -p $(DOCKER_ROOT)/include/linux + mkdir -p $(DOCKER_ROOT)/usr/bin + mkdir -p $(DOCKER_ROOT)/usr/share/doc + mkdir -p $(DOCKER_ROOT)/usr/share/info + mkdir -p $(DOCKER_ROOT)/usr/include + mkdir -p $(DOCKER_ROOT)/usr/lib + +build_docker_coreutils: + mkdir -p cache/coreutils + cd cache/coreutils && \ + cmake $(CURDIR)/../coreutils \ + -DCMAKE_INSTALL_PREFIX:PATH=$(DOCKER_ROOT) \ + -DCMAKE_SYSROOT=$(DOCKER_ROOT) \ + -DCMAKE_C_STANDARD_INCLUDE_DIRECTORIES=$(DOCKER_ROOT)/include \ + -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=$(DOCKER_ROOT)/include \ + && \ + make -j$(shell nproc) && \ + make install + +build_docker_libc: + mkdir -p cache/libc + cd cache/libc && \ + cmake $(CURDIR)/../libc \ + -DCMAKE_INSTALL_PREFIX=$(DOCKER_ROOT) \ + -DCMAKE_SYSROOT=$(DOCKER_ROOT) \ + -DCMAKE_INSTALL_INCLUDEDIR=include \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_INSTALL_BINDIR=bin && \ + make -j$(shell nproc) && \ + make install + +docker_image: + docker build -t $(DOCKER_IMAGE_NAME) -f Dockerfile . + +docker_run: + @echo "Running container..." + @docker run -it --name fennix-userspace-instance fennix-userspace:latest /bin/sh || true + @echo "\nExit code: $$(docker inspect fennix-userspace-instance --format='{{.State.ExitCode}}')" + @docker rm fennix-userspace-instance >/dev/null 2>&1 + +docker: create_docker_out + $(MAKE) build_docker_libc + $(MAKE) build_docker_coreutils + +clean: + rm -rf cache + rm -rf $(DOCKER_ROOT) diff --git a/Userspace/libc/CMakeLists.txt b/Userspace/libc/CMakeLists.txt index 5d6fdf9e..6ae8efb3 100644 --- a/Userspace/libc/CMakeLists.txt +++ b/Userspace/libc/CMakeLists.txt @@ -5,22 +5,39 @@ project(FennixCLibrary VERSION 1.0.0) if(NOT DEFINED ENV{WORKSPACE_DIR}) set(STANDALONE_BUILD ON) message(STATUS "Compiling standalone") - set(CMAKE_INSTALL_PREFIX "/usr") + + if(NOT DEFINED ENV{CMAKE_INSTALL_PREFIX}) + set(CMAKE_INSTALL_PREFIX "/usr") + message(STATUS "Using default install prefix: /usr") + else() + message(STATUS "Using custom install prefix: $ENV{CMAKE_INSTALL_PREFIX}") + endif() + else() set(STANDALONE_BUILD OFF) - set(CMAKE_INSTALL_PREFIX "$ENV{WORKSPACE_DIR}/out") message(STATUS "Compiling within workspace") + + if(NOT DEFINED ENV{CMAKE_INSTALL_PREFIX}) + set(CMAKE_INSTALL_PREFIX "$ENV{WORKSPACE_DIR}/out") + message(STATUS "Using default install prefix: $ENV{WORKSPACE_DIR}/out") + else() + message(STATUS "Using custom install prefix: $ENV{CMAKE_INSTALL_PREFIX}") + endif() + try_compile( WORKSPACE_TEST ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/workspace_test.c CMAKE_FLAGS "-DCMAKE_C_COMPILER=$ENV{CC} -DCMAKE_CXX_COMPILER=$ENV{CXX} -DCMAKE_ASM_COMPILER=$ENV{AS} -DCMAKE_AR=$ENV{AR} -DCMAKE_LINKER=$ENV{LD}" - OUTPUT_VARIABLE OUTPUT) + OUTPUT_VARIABLE OUTPUT + ) + if(NOT WORKSPACE_TEST) message(FATAL_ERROR "Workspace test failed: ${OUTPUT}") else() message(STATUS "Workspace test passed") endif() + endif() if(NOT DEFINED TARGET_OS) @@ -102,3 +119,26 @@ install(DIRECTORY ${ABIS_PATH}/ DESTINATION ${CMAKE_INSTALL_PREFIX}/include/ FILES_MATCHING PATTERN "*") + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + install(CODE "execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink + /lib/ld.so + \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib/ld-linux-x86-64.so.2\" +)") + install(CODE "execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink + /lib/ld.so + \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib64/ld-linux-x86-64.so.2\" +)") + install(CODE "execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink + /lib/libc.so + \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib/libc.so.6\" +)") + install(CODE "execute_process( + COMMAND ${CMAKE_COMMAND} -E create_symlink + /lib/libc.so + \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib64/libc.so.6\" +)") +endif() diff --git a/Userspace/libc/abis/fennix/generic/bits/signal.h b/Userspace/libc/abis/fennix/generic/bits/signal.h index d55e8d6d..8e1a28fb 100644 --- a/Userspace/libc/abis/fennix/generic/bits/signal.h +++ b/Userspace/libc/abis/fennix/generic/bits/signal.h @@ -15,8 +15,8 @@ along with Fennix C Library. If not, see . */ -#ifndef __BITS_SIGNAL_H -#define __BITS_SIGNAL_H +#ifndef _BITS_SIGNAL_H +#define _BITS_SIGNAL_H #include @@ -121,4 +121,4 @@ typedef unsigned long sigset_t; -#endif // __BITS_SIGNAL_H +#endif // _BITS_SIGNAL_H diff --git a/Userspace/libc/abis/fennix/generic/bits/socket.h b/Userspace/libc/abis/fennix/generic/bits/socket.h index 7e45c2b8..017dfa38 100644 --- a/Userspace/libc/abis/fennix/generic/bits/socket.h +++ b/Userspace/libc/abis/fennix/generic/bits/socket.h @@ -15,8 +15,8 @@ along with Fennix C Library. If not, see . */ -#ifndef __BITS_SOCKET_H -#define __BITS_SOCKET_H +#ifndef _BITS_SOCKET_H +#define _BITS_SOCKET_H #define __socklen_t_defined typedef __UINT32_TYPE__ socklen_t; @@ -31,4 +31,4 @@ struct sockaddr char sa_data[14]; }; -#endif // __BITS_SOCKET_H +#endif // _BITS_SOCKET_H diff --git a/Userspace/libc/abis/linux/x86_64/bits/errno.h b/Userspace/libc/abis/linux/x86_64/bits/errno.h new file mode 100644 index 00000000..aa69ae6b --- /dev/null +++ b/Userspace/libc/abis/linux/x86_64/bits/errno.h @@ -0,0 +1,159 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#ifndef _BITS_ERRNO_H +#define _BITS_ERRNO_H + +#define EPERM 1 +#define ENOENT 2 +#define ESRCH 3 +#define EINTR 4 +#define EIO 5 +#define ENXIO 6 +#define E2BIG 7 +#define ENOEXEC 8 +#define EBADF 9 +#define ECHILD 10 +#define EAGAIN 11 +#define ENOMEM 12 +#define EACCES 13 +#define EFAULT 14 +#define ENOTBLK 15 +#define EBUSY 16 +#define EEXIST 17 +#define EXDEV 18 +#define ENODEV 19 +#define ENOTDIR 20 +#define EISDIR 21 +#define EINVAL 22 +#define ENFILE 23 +#define EMFILE 24 +#define ENOTTY 25 +#define ETXTBSY 26 +#define EFBIG 27 +#define ENOSPC 28 +#define ESPIPE 29 +#define EROFS 30 +#define EMLINK 31 +#define EPIPE 32 +#define EDOM 33 +#define ERANGE 34 +#define EDEADLK 35 +#define ENAMETOOLONG 36 +#define ENOLCK 37 +#define ENOSYS 38 +#define ENOTEMPTY 39 +#define ELOOP 40 +#define EWOULDBLOCK 41 +#define ENOMSG 42 +#define EIDRM 43 +#define ECHRNG 44 +#define EL2NSYNC 45 +#define EL3HLT 46 +#define EL3RST 47 +#define ELNRNG 48 +#define EUNATCH 49 +#define ENOCSI 50 +#define EL2HLT 51 +#define EBADE 52 +#define EBADR 53 +#define EXFULL 54 +#define ENOANO 55 +#define EBADRQC 56 +#define EBADSLT 57 +#define EDEADLOCK 58 +#define EBFONT 59 +#define ENOSTR 60 +#define ENODATA 61 +#define ETIME 62 +#define ENOSR 63 +#define ENONET 64 +#define ENOPKG 65 +#define EREMOTE 66 +#define ENOLINK 67 +#define EADV 68 +#define ESRMNT 69 +#define ECOMM 70 +#define EPROTO 71 +#define EMULTIHOP 72 +#define EDOTDOT 73 +#define EBADMSG 74 +#define EOVERFLOW 75 +#define ENOTUNIQ 76 +#define EBADFD 77 +#define EREMCHG 78 +#define ELIBACC 79 +#define ELIBBAD 80 +#define ELIBSCN 81 +#define ELIBMAX 82 +#define ELIBEXEC 83 +#define EILSEQ 84 +#define ERESTART 85 +#define ESTRPIPE 86 +#define EUSERS 87 +#define ENOTSOCK 88 +#define EDESTADDRREQ 89 +#define EMSGSIZE 90 +#define EPROTOTYPE 91 +#define ENOPROTOOPT 92 +#define EPROTONOSUPPORT 93 +#define ESOCKTNOSUPPORT 94 +#define EOPNOTSUPP 95 +#define EPFNOSUPPORT 96 +#define EAFNOSUPPORT 97 +#define EADDRINUSE 98 +#define EADDRNOTAVAIL 99 +#define ENETDOWN 100 +#define ENETUNREACH 101 +#define ENETRESET 102 +#define ECONNABORTED 103 +#define ECONNRESET 104 +#define ENOBUFS 105 +#define EISCONN 106 +#define ENOTCONN 107 +#define ESHUTDOWN 108 +#define ETOOMANYREFS 109 +#define ETIMEDOUT 110 +#define ECONNREFUSED 111 +#define EHOSTDOWN 112 +#define EHOSTUNREACH 113 +#define EALREADY 114 +#define EINPROGRESS 115 +#define ESTALE 116 +#define EUCLEAN 117 +#define ENOTNAM 118 +#define ENAVAIL 119 +#define EISNAM 120 +#define EREMOTEIO 121 +#define EDQUOT 122 + +#define ENOMEDIUM 123 +#define EMEDIUMTYPE 124 +#define ECANCELED 125 +#define ENOKEY 126 +#define EKEYEXPIRED 127 +#define EKEYREVOKED 128 +#define EKEYREJECTED 129 + +#define EOWNERDEAD 130 +#define ENOTRECOVERABLE 131 +#define ERFKILL 132 +#define EHWPOISON 133 + +#define ENOTSUP EOPNOTSUPP + +#endif // _BITS_ERRNO_H diff --git a/Userspace/libc/abis/linux/x86_64/bits/signal.h b/Userspace/libc/abis/linux/x86_64/bits/signal.h new file mode 100644 index 00000000..ad3e85ec --- /dev/null +++ b/Userspace/libc/abis/linux/x86_64/bits/signal.h @@ -0,0 +1,74 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#ifndef _BITS_SIGNAL_H +#define _BITS_SIGNAL_H + +typedef unsigned long sigset_t; + +#define NSIG 32 + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO + +#define SIGLOST 29 + +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +#define SIG_BLOCK 0 +#define SIG_UNBLOCK 1 +#define SIG_SETMASK 2 + +typedef void __signalfn_t(int); +typedef __signalfn_t *__sighandler_t; + +#define SIG_DFL ((__sighandler_t)0) +#define SIG_IGN ((__sighandler_t)1) +#define SIG_ERR ((__sighandler_t) - 1) + +#endif // _BITS_SIGNAL_H diff --git a/Userspace/libc/abis/linux/x86_64/bits/socket.h b/Userspace/libc/abis/linux/x86_64/bits/socket.h new file mode 100644 index 00000000..017dfa38 --- /dev/null +++ b/Userspace/libc/abis/linux/x86_64/bits/socket.h @@ -0,0 +1,34 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#ifndef _BITS_SOCKET_H +#define _BITS_SOCKET_H + +#define __socklen_t_defined +typedef __UINT32_TYPE__ socklen_t; + +#define __sa_family_t_defined +typedef unsigned int sa_family_t; + +#define __sockaddr_defined +struct sockaddr +{ + sa_family_t sa_family; + char sa_data[14]; +}; + +#endif // _BITS_SOCKET_H diff --git a/Userspace/libc/abis/linux/x86_64/bits/syscalls.h b/Userspace/libc/abis/linux/x86_64/bits/syscalls.h new file mode 100644 index 00000000..72660248 --- /dev/null +++ b/Userspace/libc/abis/linux/x86_64/bits/syscalls.h @@ -0,0 +1,474 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#ifndef _BITS_SYSCALLS_H +#define _BITS_SYSCALLS_H + +#pragma region Syscall Wrappers + +#define scarg __UINTPTR_TYPE__ + +static inline scarg syscall0(scarg syscall) +{ + scarg ret; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall1(scarg syscall, scarg arg1) +{ + scarg ret; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall2(scarg syscall, scarg arg1, scarg arg2) +{ + scarg ret; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1), "S"(arg2) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall3(scarg syscall, scarg arg1, scarg arg2, scarg arg3) +{ + scarg ret; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1), "S"(arg2), "d"(arg3) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall4(scarg syscall, scarg arg1, scarg arg2, scarg arg3, scarg arg4) +{ + scarg ret; + register scarg r10 __asm__("r10") = arg4; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1), "S"(arg2), "d"(arg3), "r"(r10) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall5(scarg syscall, scarg arg1, scarg arg2, scarg arg3, scarg arg4, scarg arg5) +{ + scarg ret; + register scarg r10 __asm__("r10") = arg4; + register scarg r8 __asm__("r8") = arg5; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1), "S"(arg2), "d"(arg3), "r"(r10), "r"(r8) + : "rcx", "r11", "memory"); + return ret; +} + +static inline scarg syscall6(scarg syscall, scarg arg1, scarg arg2, scarg arg3, scarg arg4, scarg arg5, scarg arg6) +{ + scarg ret; + register scarg r10 __asm__("r10") = arg4; + register scarg r8 __asm__("r8") = arg5; + register scarg r9 __asm__("r9") = arg6; + __asm__ __volatile__("syscall" + : "=a"(ret) + : "a"(syscall), "D"(arg1), "S"(arg2), "d"(arg3), "r"(r10), "r"(r8), "r"(r9) + : "rcx", "r11", "memory"); + return ret; +} + +#pragma endregion Syscall Wrappers + +#define sys_read 0 +#define sys_write 1 +#define sys_open 2 +#define sys_close 3 +#define sys_stat 4 +#define sys_fstat 5 +#define sys_lstat 6 +#define sys_poll 7 +#define sys_lseek 8 +#define sys_mmap 9 +#define sys_mprotect 10 +#define sys_munmap 11 +#define sys_brk 12 +#define sys_rt_sigaction 13 +#define sys_rt_sigprocmask 14 +#define sys_rt_sigreturn 15 +#define sys_ioctl 16 +#define sys_pread64 17 +#define sys_pwrite64 18 +#define sys_readv 19 +#define sys_writev 20 +#define sys_access 21 +#define sys_pipe 22 +#define sys_select 23 +#define sys_sched_yield 24 +#define sys_mremap 25 +#define sys_msync 26 +#define sys_mincore 27 +#define sys_madvise 28 +#define sys_shmget 29 +#define sys_shmat 30 +#define sys_shmctl 31 +#define sys_dup 32 +#define sys_dup2 33 +#define sys_pause 34 +#define sys_nanosleep 35 +#define sys_getitimer 36 +#define sys_alarm 37 +#define sys_setitimer 38 +#define sys_getpid 39 +#define sys_sendfile 40 +#define sys_socket 41 +#define sys_connect 42 +#define sys_accept 43 +#define sys_sendto 44 +#define sys_recvfrom 45 +#define sys_sendmsg 46 +#define sys_recvmsg 47 +#define sys_shutdown 48 +#define sys_bind 49 +#define sys_listen 50 +#define sys_getsockname 51 +#define sys_getpeername 52 +#define sys_socketpair 53 +#define sys_setsockopt 54 +#define sys_getsockopt 55 +#define sys_clone 56 +#define sys_fork 57 +#define sys_vfork 58 +#define sys_execve 59 +#define sys_exit 60 +#define sys_wait4 61 +#define sys_kill 62 +#define sys_uname 63 +#define sys_semget 64 +#define sys_semop 65 +#define sys_semctl 66 +#define sys_shmdt 67 +#define sys_msgget 68 +#define sys_msgsnd 69 +#define sys_msgrcv 70 +#define sys_msgctl 71 +#define sys_fcntl 72 +#define sys_flock 73 +#define sys_fsync 74 +#define sys_fdatasync 75 +#define sys_truncate 76 +#define sys_ftruncate 77 +#define sys_getdents 78 +#define sys_getcwd 79 +#define sys_chdir 80 +#define sys_fchdir 81 +#define sys_rename 82 +#define sys_mkdir 83 +#define sys_rmdir 84 +#define sys_creat 85 +#define sys_link 86 +#define sys_unlink 87 +#define sys_symlink 88 +#define sys_readlink 89 +#define sys_chmod 90 +#define sys_fchmod 91 +#define sys_chown 92 +#define sys_fchown 93 +#define sys_lchown 94 +#define sys_umask 95 +#define sys_gettimeofday 96 +#define sys_getrlimit 97 +#define sys_getrusage 98 +#define sys_sysinfo 99 +#define sys_times 100 +#define sys_ptrace 101 +#define sys_getuid 102 +#define sys_syslog 103 +#define sys_getgid 104 +#define sys_setuid 105 +#define sys_setgid 106 +#define sys_geteuid 107 +#define sys_getegid 108 +#define sys_setpgid 109 +#define sys_getppid 110 +#define sys_getpgrp 111 +#define sys_setsid 112 +#define sys_setreuid 113 +#define sys_setregid 114 +#define sys_getgroups 115 +#define sys_setgroups 116 +#define sys_setresuid 117 +#define sys_getresuid 118 +#define sys_setresgid 119 +#define sys_getresgid 120 +#define sys_getpgid 121 +#define sys_setfsuid 122 +#define sys_setfsgid 123 +#define sys_getsid 124 +#define sys_capget 125 +#define sys_capset 126 +#define sys_rt_sigpending 127 +#define sys_rt_sigtimedwait 128 +#define sys_rt_sigqueueinfo 129 +#define sys_rt_sigsuspend 130 +#define sys_sigaltstack 131 +#define sys_utime 132 +#define sys_mknod 133 +#define sys_uselib 134 +#define sys_personality 135 +#define sys_ustat 136 +#define sys_statfs 137 +#define sys_fstatfs 138 +#define sys_sysfs 139 +#define sys_getpriority 140 +#define sys_setpriority 141 +#define sys_sched_setparam 142 +#define sys_sched_getparam 143 +#define sys_sched_setscheduler 144 +#define sys_sched_getscheduler 145 +#define sys_sched_get_priority_max 146 +#define sys_sched_get_priority_min 147 +#define sys_sched_rr_get_interval 148 +#define sys_mlock 149 +#define sys_munlock 150 +#define sys_mlockall 151 +#define sys_munlockall 152 +#define sys_vhangup 153 +#define sys_modify_ldt 154 +#define sys_pivot_root 155 +#define sys__sysctl 156 +#define sys_prctl 157 +#define sys_arch_prctl 158 +#define sys_adjtimex 159 +#define sys_setrlimit 160 +#define sys_chroot 161 +#define sys_sync 162 +#define sys_acct 163 +#define sys_settimeofday 164 +#define sys_mount 165 +#define sys_umount2 166 +#define sys_swapon 167 +#define sys_swapoff 168 +#define sys_reboot 169 +#define sys_sethostname 170 +#define sys_setdomainname 171 +#define sys_iopl 172 +#define sys_ioperm 173 +#define sys_create_module 174 +#define sys_init_module 175 +#define sys_delete_module 176 +#define sys_get_kernel_syms 177 +#define sys_query_module 178 +#define sys_quotactl 179 +#define sys_nfsservctl 180 +#define sys_getpmsg 181 +#define sys_putpmsg 182 +#define sys_afs_syscall 183 +#define sys_tuxcall 184 +#define sys_security 185 +#define sys_gettid 186 +#define sys_readahead 187 +#define sys_setxattr 188 +#define sys_lsetxattr 189 +#define sys_fsetxattr 190 +#define sys_getxattr 191 +#define sys_lgetxattr 192 +#define sys_fgetxattr 193 +#define sys_listxattr 194 +#define sys_llistxattr 195 +#define sys_flistxattr 196 +#define sys_removexattr 197 +#define sys_lremovexattr 198 +#define sys_fremovexattr 199 +#define sys_tkill 200 +#define sys_time 201 +#define sys_futex 202 +#define sys_sched_setaffinity 203 +#define sys_sched_getaffinity 204 +#define sys_set_thread_area 205 +#define sys_io_setup 206 +#define sys_io_destroy 207 +#define sys_io_getevents 208 +#define sys_io_submit 209 +#define sys_io_cancel 210 +#define sys_get_thread_area 211 +#define sys_lookup_dcookie 212 +#define sys_epoll_create 213 +#define sys_epoll_ctl_old 214 +#define sys_epoll_wait_old 215 +#define sys_remap_file_pages 216 +#define sys_getdents64 217 +#define sys_set_tid_address 218 +#define sys_restart_syscall 219 +#define sys_semtimedop 220 +#define sys_fadvise64 221 +#define sys_timer_create 222 +#define sys_timer_settime 223 +#define sys_timer_gettime 224 +#define sys_timer_getoverrun 225 +#define sys_timer_delete 226 +#define sys_clock_settime 227 +#define sys_clock_gettime 228 +#define sys_clock_getres 229 +#define sys_clock_nanosleep 230 +#define sys_exit_group 231 +#define sys_epoll_wait 232 +#define sys_epoll_ctl 233 +#define sys_tgkill 234 +#define sys_utimes 235 +#define sys_vserver 236 +#define sys_mbind 237 +#define sys_set_mempolicy 238 +#define sys_get_mempolicy 239 +#define sys_mq_open 240 +#define sys_mq_unlink 241 +#define sys_mq_timedsend 242 +#define sys_mq_timedreceive 243 +#define sys_mq_notify 244 +#define sys_mq_getsetattr 245 +#define sys_kexec_load 246 +#define sys_waitid 247 +#define sys_add_key 248 +#define sys_request_key 249 +#define sys_keyctl 250 +#define sys_ioprio_set 251 +#define sys_ioprio_get 252 +#define sys_inotify_init 253 +#define sys_inotify_add_watch 254 +#define sys_inotify_rm_watch 255 +#define sys_migrate_pages 256 +#define sys_openat 257 +#define sys_mkdirat 258 +#define sys_mknodat 259 +#define sys_fchownat 260 +#define sys_futimesat 261 +#define sys_newfstatat 262 +#define sys_unlinkat 263 +#define sys_renameat 264 +#define sys_linkat 265 +#define sys_symlinkat 266 +#define sys_readlinkat 267 +#define sys_fchmodat 268 +#define sys_faccessat 269 +#define sys_pselect6 270 +#define sys_ppoll 271 +#define sys_unshare 272 +#define sys_set_robust_list 273 +#define sys_get_robust_list 274 +#define sys_splice 275 +#define sys_tee 276 +#define sys_sync_file_range 277 +#define sys_vmsplice 278 +#define sys_move_pages 279 +#define sys_utimensat 280 +#define sys_epoll_pwait 281 +#define sys_signalfd 282 +#define sys_timerfd_create 283 +#define sys_eventfd 284 +#define sys_fallocate 285 +#define sys_timerfd_settime 286 +#define sys_timerfd_gettime 287 +#define sys_accept4 288 +#define sys_signalfd4 289 +#define sys_eventfd2 290 +#define sys_epoll_create1 291 +#define sys_dup3 292 +#define sys_pipe2 293 +#define sys_inotify_init1 294 +#define sys_preadv 295 +#define sys_pwritev 296 +#define sys_rt_tgsigqueueinfo 297 +#define sys_perf_event_open 298 +#define sys_recvmmsg 299 +#define sys_fanotify_init 300 +#define sys_fanotify_mark 301 +#define sys_prlimit64 302 +#define sys_name_to_handle_at 303 +#define sys_open_by_handle_at 304 +#define sys_clock_adjtime 305 +#define sys_syncfs 306 +#define sys_sendmmsg 307 +#define sys_setns 308 +#define sys_getcpu 309 +#define sys_process_vm_readv 310 +#define sys_process_vm_writev 311 +#define sys_kcmp 312 +#define sys_finit_module 313 +#define sys_sched_setattr 314 +#define sys_sched_getattr 315 +#define sys_renameat2 316 +#define sys_seccomp 317 +#define sys_getrandom 318 +#define sys_memfd_create 319 +#define sys_kexec_file_load 320 +#define sys_bpf 321 +#define sys_execveat 322 +#define sys_userfaultfd 323 +#define sys_membarrier 324 +#define sys_mlock2 325 +#define sys_copy_file_range 326 +#define sys_preadv2 327 +#define sys_pwritev2 328 +#define sys_pkey_mprotect 329 +#define sys_pkey_alloc 330 +#define sys_pkey_free 331 +#define sys_statx 332 +#define sys_io_pgetevents 333 +#define sys_rseq 334 +#define sys_pidfd_send_signal 424 +#define sys_io_uring_setup 425 +#define sys_io_uring_enter 426 +#define sys_io_uring_register 427 +#define sys_open_tree 428 +#define sys_move_mount 429 +#define sys_fsopen 430 +#define sys_fsconfig 431 +#define sys_fsmount 432 +#define sys_fspick 433 +#define sys_pidfd_open 434 +#define sys_clone3 435 +#define sys_close_range 436 +#define sys_openat2 437 +#define sys_pidfd_getfd 438 +#define sys_faccessat2 439 +#define sys_process_madvise 440 +#define sys_epoll_pwait2 441 +#define sys_mount_setattr 442 +#define sys_quotactl_fd 443 +#define sys_landlock_create_ruleset 444 +#define sys_landlock_add_rule 445 +#define sys_landlock_restrict_self 446 +#define sys_memfd_secret 447 +#define sys_process_mrelease 448 + +struct kutsname +{ + char sysname[65]; + char nodename[65]; + char release[65]; + char version[65]; + char machine[65]; + char domainname[65]; +}; + +#endif // _BITS_SYSCALLS_H diff --git a/Userspace/libc/include/math.h b/Userspace/libc/include/math.h index d2a7f0c2..c3b0c3dd 100644 --- a/Userspace/libc/include/math.h +++ b/Userspace/libc/include/math.h @@ -287,6 +287,10 @@ typedef long double double_t; double y1(double x); double yn(int n, double x); + void sincos(double x, double *s, double *c); + void sincosf(float x, float *s, float *c); + void sincosl(long double x, long double *s, long double *c); + #ifdef __cplusplus } #endif // __cplusplus diff --git a/Userspace/libc/include/sys/stat.h b/Userspace/libc/include/sys/stat.h index 7075b315..560c883d 100644 --- a/Userspace/libc/include/sys/stat.h +++ b/Userspace/libc/include/sys/stat.h @@ -42,14 +42,14 @@ extern "C" blkcnt_t st_blocks; /* Number of blocks allocated for this object. */ }; -#define S_IFMT -#define S_IFBLK -#define S_IFCHR -#define S_IFIFO -#define S_IFREG -#define S_IFDIR -#define S_IFLNK -#define S_IFSOCK +#define S_IFMT 0170000 +#define S_IFBLK 0060000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_IFREG 0100000 +#define S_IFDIR 0040000 +#define S_IFLNK 0120000 +#define S_IFSOCK 0140000 #define S_IRWXU 0700 #define S_IRUSR 0400 @@ -68,21 +68,21 @@ extern "C" #define S_ISGID 02000 #define S_ISVTX 01000 -#define S_ISBLK(m) -#define S_ISCHR(m) -#define S_ISDIR(m) -#define S_ISFIFO(m) -#define S_ISREG(m) -#define S_ISLNK(m) -#define S_ISSOCK(m) +#define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) -#define S_TYPEISMQ(buf) -#define S_TYPEISSEM(buf) -#define S_TYPEISSHM(buf) -#define S_TYPEISTMO(buf) +#define S_TYPEISMQ(buf) 0 +#define S_TYPEISSEM(buf) 0 +#define S_TYPEISSHM(buf) 0 +#define S_TYPEISTMO(buf) 0 -#define UTIME_NOW -#define UTIME_OMIT +#define UTIME_NOW 0x3fffffff +#define UTIME_OMIT 0x3ffffffe int chmod(const char *, mode_t); int fchmod(int, mode_t); diff --git a/Userspace/libc/runtime/fennix/amd64/crt1.c b/Userspace/libc/runtime/fennix/amd64/crt1.c index f6b0b66d..73c53e3c 100644 --- a/Userspace/libc/runtime/fennix/amd64/crt1.c +++ b/Userspace/libc/runtime/fennix/amd64/crt1.c @@ -1,18 +1,18 @@ /* - This file is part of Fennix Userspace. + This file is part of Fennix C Library. - Fennix Userspace is free software: you can redistribute it and/or + Fennix C Library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - Fennix Userspace is distributed in the hope that it will be useful, + Fennix C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Fennix Userspace. If not, see . + along with Fennix C Library. If not, see . */ typedef void (*fct)(void); @@ -39,7 +39,6 @@ void __crt_fini_array(void) __attribute__((naked, used, no_stack_protector, section(".text"))) void _start() { -#if defined(__amd64__) asm("xor %rbp, %rbp\n" "andq $-16, %rsp\n" "movq %rsp, %rbp\n" @@ -67,15 +66,6 @@ __attribute__((naked, used, no_stack_protector, section(".text"))) void _start() "movl %eax, %edi\n" "call _exit\n"); -#elif defined(__i386__) -#warning "i386 _start not implemented" -#elif defined(__arm__) -#warning "arm _start not implemented" -#elif defined(__aarch64__) -#warning "aarch64 _start not implemented" -#else -#error "Unsupported architecture" -#endif } /* These are declared in GNU ld */ diff --git a/Userspace/libc/runtime/linux/x86_64/Scrt1.c b/Userspace/libc/runtime/linux/x86_64/Scrt1.c new file mode 100644 index 00000000..822f10bb --- /dev/null +++ b/Userspace/libc/runtime/linux/x86_64/Scrt1.c @@ -0,0 +1 @@ +#include "crt1.c" diff --git a/Userspace/libc/runtime/linux/x86_64/crt1.c b/Userspace/libc/runtime/linux/x86_64/crt1.c new file mode 100644 index 00000000..73c53e3c --- /dev/null +++ b/Userspace/libc/runtime/linux/x86_64/crt1.c @@ -0,0 +1,101 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +typedef void (*fct)(void); +#define asm __asm__ __volatile__ + +extern void (*__preinit_array_start[])(void) __attribute__((weak)); +extern void (*__preinit_array_end[])(void) __attribute__((weak)); +extern void (*__init_array_start[])(void) __attribute__((weak)); +extern void (*__init_array_end[])(void) __attribute__((weak)); +extern void (*__fini_array_start[])(void) __attribute__((weak)); +extern void (*__fini_array_end[])(void) __attribute__((weak)); + +void __crt_init_array(void) +{ + for (fct *func = __init_array_start; func != __init_array_end; func++) + (*func)(); +} + +void __crt_fini_array(void) +{ + for (fct *func = __fini_array_start; func != __fini_array_end; func++) + (*func)(); +} + +__attribute__((naked, used, no_stack_protector, section(".text"))) void _start() +{ + asm("xor %rbp, %rbp\n" + "andq $-16, %rsp\n" + "movq %rsp, %rbp\n" + + "movq %rdx, %rax\n" + "pushq %rcx\n" + "pushq %rdx\n" + "pushq %rsi\n" + "pushq %rdi\n" + "movq %rax, %rdi\n" + + "call __libc_init\n" + "call __crt_init_array\n" + + "popq %rdi\n" + "popq %rsi\n" + "popq %rdx\n" + "popq %rcx\n" + + "call main\n" + + "pushq %rax\n" + "call __crt_fini_array\n" + "popq %rax\n" + + "movl %eax, %edi\n" + "call _exit\n"); +} + +/* These are declared in GNU ld */ +enum +{ + NT_FNX_ABI_TAG = 1, + NT_FNX_VERSION = 2, + NT_FNX_BUILD_ID = 3, + NT_FNX_ARCH = 4 +}; + +typedef struct Elf_Nhdr +{ + __UINT32_TYPE__ n_namesz; + __UINT32_TYPE__ n_descsz; + __UINT32_TYPE__ n_type; + char n_name[]; +} __attribute__((packed)) Elf_Nhdr; + +const struct +{ + Elf_Nhdr header; + char name[4]; + __UINT32_TYPE__ desc[4]; +} __abi_tag __attribute__((aligned(4), section(".note.ABI-tag"))) = { + .header = { + .n_namesz = 4, /* "FNX" + '\0' */ + .n_descsz = sizeof(__UINT32_TYPE__) * 4, /* Description Size */ + .n_type = NT_FNX_ABI_TAG, /* Type */ + }, + .name = "FNX", + .desc = {0, 0, 0, 0}, +}; diff --git a/Userspace/libc/src/std/errno.c b/Userspace/libc/src/std/errno.c index 9e20895d..ee5bf582 100644 --- a/Userspace/libc/src/std/errno.c +++ b/Userspace/libc/src/std/errno.c @@ -166,8 +166,10 @@ export char *strerror(int errnum) return (char *)"State not recoverable"; case ENOTSOCK: return (char *)"Not a socket"; +#if ENOTSUP != EOPNOTSUPP case ENOTSUP: return (char *)"Not supported"; +#endif case ENOTTY: return (char *)"Inappropriate I/O control operation"; case ENXIO: diff --git a/Userspace/libc/src/std/math.c b/Userspace/libc/src/std/math.c index 44a2baf0..c0235a0d 100644 --- a/Userspace/libc/src/std/math.c +++ b/Userspace/libc/src/std/math.c @@ -1700,3 +1700,21 @@ export double yn(int n, double x) } return by; } + +void sincos(double x, double *s, double *c) +{ + *s = sin(x); + *c = cos(x); +} + +void sincosf(float x, float *s, float *c) +{ + *s = sinf(x); + *c = cosf(x); +} + +void sincosl(long double x, long double *s, long double *c) +{ + *s = sinl(x); + *c = cosl(x); +} diff --git a/Userspace/libc/src/std/signal.c b/Userspace/libc/src/std/signal.c index e45ee177..0153c09c 100644 --- a/Userspace/libc/src/std/signal.c +++ b/Userspace/libc/src/std/signal.c @@ -65,6 +65,14 @@ export int sigaction(int sig, const struct sigaction *restrict act, struct sigac export int sigaddset(sigset_t *set, int signo) { +#ifndef SIGNAL_MAX +#ifdef NSIG +#define SIGNAL_MAX NSIG +#else +#error "NSIG is not defined" +#endif // NSIG +#endif // SIGNAL_MAX + if (set == NULL || signo <= 0 || signo >= SIGNAL_MAX) { errno = EINVAL; diff --git a/Userspace/libc/src/std/string.c b/Userspace/libc/src/std/string.c index abf6d4c1..deeeea09 100644 --- a/Userspace/libc/src/std/string.c +++ b/Userspace/libc/src/std/string.c @@ -563,8 +563,10 @@ export char *strsignal(int signum) { switch (signum) { +#ifdef SIGNULL case SIGNULL: return "NULL signal"; +#endif case SIGABRT: return "Aborted"; case SIGALRM: diff --git a/Userspace/libc/sysdeps/linux/x86_64/dl_start.c b/Userspace/libc/sysdeps/linux/x86_64/dl_start.c new file mode 100644 index 00000000..df77965c --- /dev/null +++ b/Userspace/libc/sysdeps/linux/x86_64/dl_start.c @@ -0,0 +1,48 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#ifdef FENNIX_DYNAMIC_LOADER +__attribute__((naked, used, no_stack_protector)) void _dl_start() +{ + __asm__( + "xorq %rbp, %rbp\n" /* Clear rbp */ + + "push %rdi\n" + "push %rsi\n" + "push %rdx\n" + "push %rcx\n" + "push %r8\n" + "push %r9\n" + + "call __init_print_buffer\n" /* Call __init_print_buffer */ + "call _dl_preload\n" /* Call _dl_preload */ + "movl %eax, %edi\n" /* Move return value to edi */ + "cmp $0, %edi\n" /* Check if return value is 0 */ + "jne _exit\n" /* If not, jump to _exit */ + + "pop %r9\n" + "pop %r8\n" + "pop %rcx\n" + "pop %rdx\n" + "pop %rsi\n" + "pop %rdi\n" + + "call main\n" /* Call _dl_main */ + "movl %eax, %edi\n" /* Move return value to edi */ + "call _exit\n"); /* Call _exit */ +} +#endif diff --git a/Userspace/libc/sysdeps/linux/x86_64/stack_chk.c b/Userspace/libc/sysdeps/linux/x86_64/stack_chk.c new file mode 100644 index 00000000..f1666f37 --- /dev/null +++ b/Userspace/libc/sysdeps/linux/x86_64/stack_chk.c @@ -0,0 +1,22 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +__attribute__((noreturn)) __attribute__((no_stack_protector)) __attribute__((weak)) void __stack_chk_fail(void) +{ + _exit(0xbeef); + __builtin_unreachable(); +} diff --git a/Userspace/libc/sysdeps/linux/x86_64/syscall_check.cpp b/Userspace/libc/sysdeps/linux/x86_64/syscall_check.cpp new file mode 100644 index 00000000..d6b8e070 --- /dev/null +++ b/Userspace/libc/sysdeps/linux/x86_64/syscall_check.cpp @@ -0,0 +1,24 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#include +#include +#include +#include +#include + +// static_assert( == ); diff --git a/Userspace/libc/sysdeps/linux/x86_64/syscalls.c b/Userspace/libc/sysdeps/linux/x86_64/syscalls.c new file mode 100644 index 00000000..977dc430 --- /dev/null +++ b/Userspace/libc/sysdeps/linux/x86_64/syscalls.c @@ -0,0 +1,193 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#include +#include +#include + +void sysdep(Exit)(int Status) +{ + syscall1(sys_exit, Status); +} + +int sysdep(Accept)(int Socket, struct sockaddr *restrict Address, socklen_t *restrict AddressLength) +{ + return syscall3(sys_accept, Socket, Address, AddressLength); +} + +int sysdep(Bind)(int Socket, const struct sockaddr *Address, socklen_t AddressLength) +{ + return syscall3(sys_bind, Socket, Address, AddressLength); +} + +int sysdep(Connect)(int Socket, const struct sockaddr *Address, socklen_t AddressLength) +{ + return syscall3(sys_connect, Socket, Address, AddressLength); +} + +int sysdep(Listen)(int Socket, int Backlog) +{ + return syscall2(sys_listen, Socket, Backlog); +} + +int sysdep(Socket)(int Domain, int Type, int Protocol) +{ + return syscall3(sys_socket, Domain, Type, Protocol); +} + +int sysdep(UnixName)(struct utsname *Name) +{ + struct kutsname kname; + int result = syscall1(sys_uname, &kname); + if (result == 0) + { + strcpy(Name->sysname, kname.sysname); + strcpy(Name->release, kname.release); + strcpy(Name->version, kname.version); + strcpy(Name->machine, kname.machine); + return 0; + } + + return result; +} + +int sysdep(WaitProcessID)(pid_t ProcessID, int *Status, int Options) +{ + return syscall3(sys_wait4, ProcessID, (scarg)Status, Options); +} + +int sysdep(IOControl)(int Descriptor, unsigned long Operation, void *Argument) +{ + return syscall3(sys_ioctl, Descriptor, Operation, (scarg)Argument); +} + +void *sysdep(MemoryMap)(void *Address, size_t Length, int Protection, int Flags, int Descriptor, off_t Offset) +{ + return syscall6(sys_mmap, (scarg)Address, Length, Protection, Flags, Descriptor, Offset); +} + +int sysdep(MemoryUnmap)(void *Address, size_t Length) +{ + return syscall2(sys_munmap, (scarg)Address, Length); +} + +int sysdep(MemoryProtect)(void *Address, size_t Length, int Protection) +{ + return syscall3(sys_mprotect, (scarg)Address, Length, Protection); +} + +int sysdep(Fork)(void) +{ + return syscall0(sys_fork); +} + +int sysdep(Read)(int Descriptor, void *Buffer, size_t Size) +{ + return syscall3(sys_read, Descriptor, (scarg)Buffer, Size); +} + +int sysdep(Write)(int Descriptor, const void *Buffer, size_t Size) +{ + return syscall3(sys_write, Descriptor, (scarg)Buffer, Size); +} + +int sysdep(PRead)(int Descriptor, void *Buffer, size_t Size, off_t Offset) +{ + return syscall4(sys_pread64, Descriptor, (scarg)Buffer, Size, Offset); +} + +int sysdep(PWrite)(int Descriptor, const void *Buffer, size_t Size, off_t Offset) +{ + return syscall4(sys_pwrite64, Descriptor, (scarg)Buffer, Size, Offset); +} + +int sysdep(Open)(const char *Pathname, int Flags, mode_t Mode) +{ + return syscall3(sys_open, (scarg)Pathname, Flags, Mode); +} + +int sysdep(Close)(int Descriptor) +{ + return syscall1(sys_close, Descriptor); +} + +int sysdep(Access)(const char *Pathname, int Mode) +{ + return syscall2(sys_access, (scarg)Pathname, Mode); +} + +int sysdep(Tell)(int Descriptor) +{ +#undef SEEK_CUR +#define SEEK_CUR 1 + return syscall3(sys_lseek, Descriptor, 0, SEEK_CUR); +} + +int sysdep(Seek)(int Descriptor, off_t Offset, int Whence) +{ + return syscall3(sys_lseek, Descriptor, Offset, Whence); +} + +pid_t sysdep(GetProcessID)(void) +{ + return syscall0(sys_getpid); +} + +pid_t sysdep(GetParentProcessID)(void) +{ + return syscall0(sys_getppid); +} + +int sysdep(Execve)(const char *Pathname, char *const *Argv, char *const *Envp) +{ + return syscall3(sys_execve, (scarg)Pathname, (scarg)Argv, (scarg)Envp); +} + +int sysdep(Kill)(pid_t ProcessID, int Signal) +{ + return syscall2(sys_kill, ProcessID, Signal); +} + +int sysdep(Stat)(const char *Pathname, struct stat *Statbuf) +{ + return syscall2(sys_stat, (scarg)Pathname, (scarg)Statbuf); +} + +int sysdep(FStat)(int Descriptor, struct stat *Statbuf) +{ + return syscall2(sys_fstat, Descriptor, (scarg)Statbuf); +} + +int sysdep(LStat)(const char *Pathname, struct stat *Statbuf) +{ + return syscall2(sys_lstat, (scarg)Pathname, (scarg)Statbuf); +} + +int sysdep(Truncate)(const char *Pathname, off_t Length) +{ + return syscall2(sys_truncate, (scarg)Pathname, Length); +} + +int sysdep(MakeDirectory)(const char *Pathname, mode_t Mode) +{ + return syscall2(sys_mkdir, (scarg)Pathname, Mode); +} + +int sysdep(ProcessControl)(unsigned long Option, unsigned long Arg1, unsigned long Arg2, unsigned long Arg3, unsigned long Arg4) +{ + return syscall5(sys_prctl, Option, Arg1, Arg2, Arg3, Arg4); +} diff --git a/Userspace/libc/sysdeps/linux/x86_64/tls.c b/Userspace/libc/sysdeps/linux/x86_64/tls.c new file mode 100644 index 00000000..38b2587b --- /dev/null +++ b/Userspace/libc/sysdeps/linux/x86_64/tls.c @@ -0,0 +1,46 @@ +/* + This file is part of Fennix C Library. + + Fennix C Library is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix C Library. If not, see . +*/ + +#include +#include +#include +#include +#include +#include + +#ifndef FENNIX_DYNAMIC_LOADER +export __attribute__((naked, used, no_stack_protector)) void *__tls_get_addr(void *__data) +{ +#warning "__tls_get_addr not implemented" +#if defined(__amd64__) || defined(__i386__) + __asm__("ud2"); +#endif +} + +int __init_pthread(void) +{ + __pthread *ptr = (__pthread *)syscall6(sys_mmap, 0, + 0x1000, + PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, + -1, 0); + syscall2(sys_prctl, 0x1002, ptr); + ptr->Self = ptr; + ptr->CurrentError = 0; + return 0; +} +#endif