diff --git a/libc/config/linux/CMakeLists.txt b/libc/config/linux/CMakeLists.txt --- a/libc/config/linux/CMakeLists.txt +++ b/libc/config/linux/CMakeLists.txt @@ -1 +1,11 @@ +add_gen_header( + linux_syscall_h + DEF_FILE syscall.h.def + GEN_HDR syscall.h + PARAMS + inline_syscalls=${LIBC_TARGET_MACHINE}/syscall.h.inc + DATA_FILES + ${LIBC_TARGET_MACHINE}/syscall.h.inc +) + add_subdirectory(x86_64) diff --git a/libc/config/linux/platfrom_defs.h.inc b/libc/config/linux/platfrom_defs.h.inc --- a/libc/config/linux/platfrom_defs.h.inc +++ b/libc/config/linux/platfrom_defs.h.inc @@ -11,9 +11,3 @@ #define ENTRYPOINT_SECTION_ATTRIBUTE(name) \ __attribute__((section(".llvm.libc.entrypoint."#name))) #define LLVM_LIBC_ENTRYPOINT(name) ENTRYPOINT_SECTION_ATTRIBUTE(name) name - -// TODO: Get rid of the PAGE_SIZE macro. It is present only as an interim -// measure until we can move the implementations of mmap and munmap to under -// the config/linux directory. After that, the implementations can use -// EXEC_PAGESIZE until page size can be read from the aux vector. -#define PAGE_SIZE 4096 diff --git a/libc/src/unistd/syscall.h.def b/libc/config/linux/syscall.h.def rename from libc/src/unistd/syscall.h.def rename to libc/config/linux/syscall.h.def diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -56,6 +56,7 @@ GEN_HDR sys/mman.h DEPENDS libc_posix_types_h + llvm_libc_common_h ) add_gen_header( diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt --- a/libc/src/CMakeLists.txt +++ b/libc/src/CMakeLists.txt @@ -3,6 +3,5 @@ add_subdirectory(string) # TODO: Add this target conditional to the target OS. add_subdirectory(sys) -add_subdirectory(unistd) add_subdirectory(__support) diff --git a/libc/src/sys/mman/CMakeLists.txt b/libc/src/sys/mman/CMakeLists.txt --- a/libc/src/sys/mman/CMakeLists.txt +++ b/libc/src/sys/mman/CMakeLists.txt @@ -1,27 +1,3 @@ -#TODO: The sources and target listed here should ideally live in config/linux. - -add_entrypoint_object( - mmap - SRCS - mmap.cpp - HDRS - mmap.h - DEPENDS - sys_mman_h - sys_syscall_h - syscall_impl_h - __errno_location -) - -add_entrypoint_object( - munmap - SRCS - munmap.cpp - HDRS - munmap.h - DEPENDS - sys_mman_h - sys_syscall_h - syscall_impl_h - __errno_location -) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + add_subdirectory(${LIBC_TARGET_OS}) +endif() diff --git a/libc/src/sys/mman/CMakeLists.txt b/libc/src/sys/mman/linux/CMakeLists.txt copy from libc/src/sys/mman/CMakeLists.txt copy to libc/src/sys/mman/linux/CMakeLists.txt --- a/libc/src/sys/mman/CMakeLists.txt +++ b/libc/src/sys/mman/linux/CMakeLists.txt @@ -1,15 +1,13 @@ -#TODO: The sources and target listed here should ideally live in config/linux. - add_entrypoint_object( mmap SRCS mmap.cpp HDRS - mmap.h + ../mmap.h DEPENDS sys_mman_h sys_syscall_h - syscall_impl_h + linux_syscall_h __errno_location ) @@ -18,10 +16,10 @@ SRCS munmap.cpp HDRS - munmap.h + ../munmap.h DEPENDS sys_mman_h sys_syscall_h - syscall_impl_h + linux_syscall_h __errno_location ) diff --git a/libc/src/sys/mman/mmap.cpp b/libc/src/sys/mman/linux/mmap.cpp rename from libc/src/sys/mman/mmap.cpp rename to libc/src/sys/mman/linux/mmap.cpp --- a/libc/src/sys/mman/mmap.cpp +++ b/libc/src/sys/mman/linux/mmap.cpp @@ -1,4 +1,4 @@ -//===-------------- Implementation of the POSIX mmap function -------------===// +//===---------- Linux implementation of the POSIX mmap function -----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -7,10 +7,13 @@ //===----------------------------------------------------------------------===// #include "src/sys/mman/mmap.h" -#include "include/sys/syscall.h" // For syscall numbers. + +#include "config/linux/syscall.h" // For internal syscall function. +#include "include/sys/syscall.h" // For syscall numbers. #include "src/__support/common.h" #include "src/errno/llvmlibc_errno.h" -#include "src/unistd/syscall.h" // For internal syscall function. + +#include // For EXEC_PAGESIZE. namespace __llvm_libc { @@ -22,8 +25,12 @@ // done in this function as modern linux versions do it in the syscall. // TODO: Perform argument validation not done by the linux syscall. + // EXEC_PAGESIZE is used for the page size. While this is OK for x86_64, it + // might not be correct in general. + // TODO: Use pagesize read from the ELF aux vector instead of EXEC_PAGESIZE. + #ifdef SYS_mmap2 - offset /= PAGE_SIZE; + offset /= EXEC_PAGESIZE; long syscall_number = SYS_mmap2; #elif SYS_mmap long syscall_number = SYS_mmap; @@ -44,7 +51,7 @@ // However, since a valid return address cannot be within the last page, a // return value corresponding to a location in the last page is an error // value. - if (ret_val < 0 && ret_val > -PAGE_SIZE) { + if (ret_val < 0 && ret_val > -EXEC_PAGESIZE) { llvmlibc_errno = -ret_val; return MAP_FAILED; } diff --git a/libc/src/sys/mman/munmap.cpp b/libc/src/sys/mman/linux/munmap.cpp rename from libc/src/sys/mman/munmap.cpp rename to libc/src/sys/mman/linux/munmap.cpp --- a/libc/src/sys/mman/munmap.cpp +++ b/libc/src/sys/mman/linux/munmap.cpp @@ -1,4 +1,4 @@ -//===------------- Implementation of the POSIX munmap function ------------===// +//===---------- Linux implementation of the POSIX munmap function ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -7,10 +7,11 @@ //===----------------------------------------------------------------------===// #include "src/sys/mman/munmap.h" -#include "include/sys/syscall.h" // For syscall numbers. + +#include "config/linux/syscall.h" // For internal syscall function. +#include "include/sys/syscall.h" // For syscall numbers. #include "src/__support/common.h" #include "src/errno/llvmlibc_errno.h" -#include "src/unistd/syscall.h" // For internal syscall function. namespace __llvm_libc { diff --git a/libc/src/unistd/CMakeLists.txt b/libc/src/unistd/CMakeLists.txt deleted file mode 100644 --- a/libc/src/unistd/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -add_gen_header( - syscall_impl_h - DEF_FILE syscall.h.def - GEN_HDR syscall.h - PARAMS - inline_syscalls=../../config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/syscall.h.inc - DATA_FILES - ../../config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/syscall.h.inc -) diff --git a/libc/test/config/linux/x86_64/CMakeLists.txt b/libc/test/config/linux/x86_64/CMakeLists.txt --- a/libc/test/config/linux/x86_64/CMakeLists.txt +++ b/libc/test/config/linux/x86_64/CMakeLists.txt @@ -3,6 +3,6 @@ SUITE libc_linux_tests SRCS syscall_test.cpp DEPENDS - syscall_impl_h + linux_syscall_h support_common_h ) diff --git a/libc/test/config/linux/x86_64/syscall_test.cpp b/libc/test/config/linux/x86_64/syscall_test.cpp --- a/libc/test/config/linux/x86_64/syscall_test.cpp +++ b/libc/test/config/linux/x86_64/syscall_test.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "src/unistd/syscall.h" +#include "config/linux/syscall.h" #include "utils/UnitTest/Test.h" #include diff --git a/libc/test/src/sys/mman/CMakeLists.txt b/libc/test/src/sys/mman/CMakeLists.txt --- a/libc/test/src/sys/mman/CMakeLists.txt +++ b/libc/test/src/sys/mman/CMakeLists.txt @@ -1,15 +1,3 @@ -add_libc_testsuite(libc_sys_mman_unittests) - -add_libc_unittest( - mmap_test - SUITE - libc_sys_mman_unittests - SRCS - mmap_test.cpp - DEPENDS - errno_h - sys_mman_h - mmap - munmap - __errno_location -) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + add_subdirectory(${LIBC_TARGET_OS}) +endif() diff --git a/libc/test/src/sys/mman/CMakeLists.txt b/libc/test/src/sys/mman/linux/CMakeLists.txt copy from libc/test/src/sys/mman/CMakeLists.txt copy to libc/test/src/sys/mman/linux/CMakeLists.txt diff --git a/libc/test/src/sys/mman/mmap_test.cpp b/libc/test/src/sys/mman/linux/mmap_test.cpp rename from libc/test/src/sys/mman/mmap_test.cpp rename to libc/test/src/sys/mman/linux/mmap_test.cpp