[libc] Move the implementation of mmap and munmap into a linux specific area.

This allows us to get rid of the PAGE_SIZE macro and use EXEC_PAGESIZE
from linux/param.h.

Few other points about this change:
1. The linux syscall functions have been moved into a linux specific area
instead of src/unistd/syscall.h. The Linux syscall function from unistd.h
is a public vararg function. What we have currently are linux speciif internal
overloaded C++ functions. So, moving them to a Linux only area is more
meaningful.
2. The implementations of mmap and munmap are now in a 'linux' directory
within src/sys/mman. The idea here is that platform specific
implementations will live in a platform specific subdirectories like these.
Infrastructure common to a platform will live in the platform's config
directory. For example, the linux syscall implementations live in
config/linux.

Reviewers: abrachet

Tags: #libc-project

Differential Revision: https://reviews.llvm.org/D73302
This commit is contained in:
Siva Chandra Reddy 2020-01-07 13:46:12 -08:00
parent 96f3ea0d21
commit ec62bf2fd3
15 changed files with 75 additions and 68 deletions

View File

@ -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)

View File

@ -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

View File

@ -56,6 +56,7 @@ add_gen_header(
GEN_HDR sys/mman.h
DEPENDS
libc_posix_types_h
llvm_libc_common_h
)
add_gen_header(

View File

@ -3,6 +3,5 @@ add_subdirectory(math)
add_subdirectory(string)
# TODO: Add this target conditional to the target OS.
add_subdirectory(sys)
add_subdirectory(unistd)
add_subdirectory(__support)

View File

@ -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()

View File

@ -0,0 +1,25 @@
add_entrypoint_object(
mmap
SRCS
mmap.cpp
HDRS
../mmap.h
DEPENDS
sys_mman_h
sys_syscall_h
linux_syscall_h
__errno_location
)
add_entrypoint_object(
munmap
SRCS
munmap.cpp
HDRS
../munmap.h
DEPENDS
sys_mman_h
sys_syscall_h
linux_syscall_h
__errno_location
)

View File

@ -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 <linux/param.h> // For EXEC_PAGESIZE.
namespace __llvm_libc {
@ -22,8 +25,12 @@ void *LLVM_LIBC_ENTRYPOINT(mmap)(void *addr, size_t size, int prot, int flags,
// 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 @@ void *LLVM_LIBC_ENTRYPOINT(mmap)(void *addr, size_t size, int prot, int flags,
// 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;
}

View File

@ -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 {

View File

@ -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
)

View File

@ -3,6 +3,6 @@ add_libc_unittest(
SUITE libc_linux_tests
SRCS syscall_test.cpp
DEPENDS
syscall_impl_h
linux_syscall_h
support_common_h
)

View File

@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
#include "src/unistd/syscall.h"
#include "config/linux/syscall.h"
#include "utils/UnitTest/Test.h"
#include <functional>

View File

@ -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()

View File

@ -0,0 +1,15 @@
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
)