posix/mmap: Add support for file handler and MAP_ANON

Added a mmap file handler to struct _rtems_filesystem_file_handlers_r.
Updated each file handler object to support the default mmap handler.
Updated mmap() to call the mmap handler for MAP_SHARED.
Added a mmap file handler for shm

Added support for MAP_ANON in mmap().

Updates #2859
This commit is contained in:
Kevin Kirspel
2017-06-29 10:36:43 -04:00
committed by Gedare Bloom
parent e19da87ad7
commit c6bb1c33bc
34 changed files with 312 additions and 113 deletions

View File

@@ -218,6 +218,7 @@ static const rtems_filesystem_file_handlers_r i2c_bus_handler = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -115,6 +115,7 @@ static const rtems_filesystem_file_handlers_r i2c_dev_handler = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -235,6 +235,7 @@ static const rtems_filesystem_file_handlers_r spi_bus_handler = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -222,6 +222,7 @@ static const rtems_filesystem_file_handlers_r rtems_blkdev_imfs_node = {
.fdatasync_h = rtems_blkdev_imfs_fsync_or_fdatasync, .fdatasync_h = rtems_blkdev_imfs_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -976,6 +976,28 @@ typedef int (*rtems_filesystem_kqfilter_t)(
struct knote *kn struct knote *kn
); );
/**
* @brief MMAP support.
*
* @param[in, out] iop The IO pointer.
* @param[in, out] addr The starting address of the mapped memory.
* @param[in] len The maximum number of bytes to map.
* @param[in] prot The desired memory protection.
* @param[in] off The offset within the file descriptor to map.
*
* @retval 0 Successful operation.
* @retval error An error occurred. This is usually EINVAL.
*
* @see rtems_filesystem_default_mmap().
*/
typedef int (*rtems_filesystem_mmap_t)(
rtems_libio_t *iop,
void **addr,
size_t len,
int prot,
off_t off
);
/** /**
* @brief File system node operations table. * @brief File system node operations table.
*/ */
@@ -995,6 +1017,7 @@ struct _rtems_filesystem_file_handlers_r {
rtems_filesystem_kqfilter_t kqfilter_h; rtems_filesystem_kqfilter_t kqfilter_h;
rtems_filesystem_readv_t readv_h; rtems_filesystem_readv_t readv_h;
rtems_filesystem_writev_t writev_h; rtems_filesystem_writev_t writev_h;
rtems_filesystem_mmap_t mmap_h;
}; };
/** /**
@@ -1216,6 +1239,21 @@ int rtems_filesystem_default_kqfilter(
struct knote *kn struct knote *kn
); );
/**
* @brief Default MMAP handler.
*
* @retval ENOTSUP Always.
*
* @see rtems_filesystem_mmap_t.
*/
int rtems_filesystem_default_mmap(
rtems_libio_t *iop,
void **addr,
size_t len,
int prot,
off_t off
);
/** @} */ /** @} */
/** /**

View File

@@ -564,6 +564,19 @@ int rtems_termios_kqfilter(
struct knote *kn struct knote *kn
); );
/**
* @brief Termios mmap() filter filesystem node handler
*
* Real implementation is provided by libbsd.
*/
int rtems_termios_mmap(
rtems_libio_t *iop,
void **addr,
size_t len,
int prot,
off_t off
);
/** /**
* @brief Termios poll() filesystem node handler. * @brief Termios poll() filesystem node handler.
* *

View File

@@ -56,6 +56,7 @@ const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -2212,6 +2212,7 @@ static const rtems_filesystem_file_handlers_r rtems_termios_imfs_handler = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_termios_kqfilter, .kqfilter_h = rtems_termios_kqfilter,
.mmap_h = rtems_termios_mmap,
.poll_h = rtems_termios_poll, .poll_h = rtems_termios_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -33,6 +33,7 @@ libdefaultfs_a_SOURCES = \
src/defaults/default_ftruncate_directory.c \ src/defaults/default_ftruncate_directory.c \
src/defaults/default_handlers.c src/defaults/default_ops.c src/defaults/default_handlers.c src/defaults/default_ops.c
libdefaultfs_a_SOURCES += src/defaults/default_kqfilter.c libdefaultfs_a_SOURCES += src/defaults/default_kqfilter.c
libdefaultfs_a_SOURCES += src/defaults/default_mmap.c
libdefaultfs_a_SOURCES += src/defaults/default_poll.c libdefaultfs_a_SOURCES += src/defaults/default_poll.c
libdefaultfs_a_SOURCES += src/defaults/default_readv.c libdefaultfs_a_SOURCES += src/defaults/default_readv.c
libdefaultfs_a_SOURCES += src/defaults/default_writev.c libdefaultfs_a_SOURCES += src/defaults/default_writev.c

View File

@@ -34,6 +34,7 @@ const rtems_filesystem_file_handlers_r rtems_filesystem_handlers_default = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -0,0 +1,40 @@
/**
* @file
*
* @brief Default MMAP Handler
*
* @ingroup LibIOFSHandler
*/
/*
* Copyright (c) 2017 Kevin Kirspel (kirspkt@gmail.com)
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/libio_.h>
int rtems_filesystem_default_mmap(
rtems_libio_t *iop,
void **addr,
size_t len,
int prot,
off_t off
)
{
rtems_set_errno_and_return_minus_one( ENOTSUP );
}
int rtems_termios_mmap(
rtems_libio_t *iop,
void **addr,
size_t len,
int prot,
off_t off
) RTEMS_WEAK_ALIAS( rtems_filesystem_default_mmap );

View File

@@ -52,6 +52,7 @@ const rtems_filesystem_file_handlers_r devFS_file_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -34,6 +34,7 @@ const rtems_filesystem_file_handlers_r msdos_dir_handlers = {
.fdatasync_h = msdos_sync, .fdatasync_h = msdos_sync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -34,6 +34,7 @@ const rtems_filesystem_file_handlers_r msdos_file_handlers = {
.fdatasync_h = msdos_sync, .fdatasync_h = msdos_sync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -130,6 +130,7 @@ static const rtems_filesystem_file_handlers_r IMFS_dir_default_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -32,6 +32,7 @@ static const rtems_filesystem_file_handlers_r IMFS_dir_minimal_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -127,6 +127,7 @@ static const rtems_filesystem_file_handlers_r IMFS_fifo_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -45,6 +45,7 @@ static const rtems_filesystem_file_handlers_r IMFS_device_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -87,6 +87,7 @@ static const rtems_filesystem_file_handlers_r IMFS_linfile_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -93,6 +93,7 @@ static const rtems_filesystem_file_handlers_r IMFS_link_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -844,6 +844,7 @@ static const rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync_success,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -95,6 +95,7 @@ static const rtems_filesystem_file_handlers_r IMFS_link_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -606,6 +606,7 @@ static const rtems_filesystem_file_handlers_r rtems_jffs2_directory_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev
@@ -748,6 +749,7 @@ static const rtems_filesystem_file_handlers_r rtems_jffs2_file_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev
@@ -766,6 +768,7 @@ static const rtems_filesystem_file_handlers_r rtems_jffs2_link_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -2884,6 +2884,7 @@ struct _rtems_filesystem_file_handlers_r nfs_file_file_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev
@@ -2904,6 +2905,7 @@ struct _rtems_filesystem_file_handlers_r nfs_dir_file_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev
@@ -2924,6 +2926,7 @@ struct _rtems_filesystem_file_handlers_r nfs_link_file_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -195,6 +195,7 @@ const rtems_filesystem_file_handlers_r rtems_rfs_rtems_device_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -164,6 +164,7 @@ const rtems_filesystem_file_handlers_r rtems_rfs_rtems_dir_handlers = {
.fdatasync_h = rtems_rfs_rtems_fdatasync, .fdatasync_h = rtems_rfs_rtems_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -348,6 +348,7 @@ const rtems_filesystem_file_handlers_r rtems_rfs_rtems_file_handlers = {
.fdatasync_h = rtems_rfs_rtems_fdatasync, .fdatasync_h = rtems_rfs_rtems_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -701,6 +701,7 @@ const rtems_filesystem_file_handlers_r rtems_rfs_rtems_link_handlers =
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -1404,6 +1404,7 @@ static const rtems_filesystem_file_handlers_r rtems_ftpfs_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev
@@ -1422,6 +1423,7 @@ static const rtems_filesystem_file_handlers_r rtems_ftpfs_root_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -1053,6 +1053,7 @@ static const rtems_filesystem_file_handlers_r rtems_tftp_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -822,6 +822,7 @@ static const rtems_filesystem_file_handlers_r socket_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_bsdnet_fcntl, .fcntl_h = rtems_bsdnet_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = rtems_filesystem_default_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev

View File

@@ -5,6 +5,7 @@
/* /*
* Copyright (c) 2012 Chris Johns (chrisj@rtems.org) * Copyright (c) 2012 Chris Johns (chrisj@rtems.org)
* Copyright (c) 2017 Gedare Bloom (gedare@rtems.org) * Copyright (c) 2017 Gedare Bloom (gedare@rtems.org)
* Copyright (c) 2017 Kevin kirspel (kirspkt@gmail.com)
* *
* The license and distribution terms for this file may be * The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at * found in the file LICENSE in this distribution or at
@@ -107,30 +108,6 @@ bool mmap_mappings_lock_release(
return true; return true;
} }
/* Helper function only gets called for mmap mappings of shared memory objects
* with the MAP_SHARED flag.
*/
static void *shm_mmap( rtems_libio_t *iop, size_t len, int prot, off_t off)
{
POSIX_Shm_Control *shm = iop_to_shm( iop );
void *m;
_Objects_Allocator_lock();
m = (*shm->shm_object.ops->object_mmap)( &shm->shm_object, len, prot, off);
if ( m != NULL ) {
/* Keep a reference in the shared memory to prevent its removal. */
++shm->reference_count;
/* Update atime */
_POSIX_Shm_Update_atime(shm);
}
_Objects_Allocator_unlock();
return m;
}
void *mmap( void *mmap(
void *addr, size_t len, int prot, int flags, int fildes, off_t off void *addr, size_t len, int prot, int flags, int fildes, off_t off
) )
@@ -140,12 +117,97 @@ void *mmap(
ssize_t r; ssize_t r;
rtems_libio_t *iop; rtems_libio_t *iop;
bool map_fixed; bool map_fixed;
bool map_anonymous;
bool map_shared;
bool map_private;
int err;
map_fixed = (flags & MAP_FIXED) == MAP_FIXED; map_fixed = (flags & MAP_FIXED) == MAP_FIXED;
map_anonymous = (flags & MAP_ANON) == MAP_ANON;
map_shared = (flags & MAP_SHARED) == MAP_SHARED;
map_private = (flags & MAP_PRIVATE) == MAP_PRIVATE;
/* Clear errno. */ /* Clear errno. */
errno = 0; errno = 0;
iop = NULL;
if ( len == 0 ) {
errno = EINVAL;
return MAP_FAILED;
}
/*
* We can provide read, write and execute because the memory in RTEMS does
* not normally have protections but we cannot hide access to memory.
*/
if ( prot == PROT_NONE ) {
errno = ENOTSUP;
return MAP_FAILED;
}
/*
* We can not normally provide restriction of write access. Reject any
* attempt to map without write permission, since we are not able to
* prevent a write from succeeding.
*/
if ( PROT_WRITE != (prot & PROT_WRITE) ) {
errno = ENOTSUP;
return MAP_FAILED;
}
/*
* Anonymous mappings must have file descriptor set to -1 and the offset
* set to 0. Shared mappings are not supported with Anonymous mappings at
* this time
*/
if ( map_anonymous && (fildes != -1 || off != 0 || map_shared) ) {
errno = EINVAL;
return MAP_FAILED;
}
/*
* If MAP_ANON is declared without MAP_PRIVATE or MAP_SHARED,
* force MAP_PRIVATE
*/
if ( map_anonymous && !map_private && !map_shared ) {
flags |= MAP_PRIVATE;
map_private = true;
}
/* Check for supported flags */
if ((flags & ~(MAP_SHARED | MAP_PRIVATE | MAP_FIXED | MAP_ANON)) != 0) {
errno = EINVAL;
return MAP_FAILED;
}
/* Either MAP_SHARED or MAP_PRIVATE must be defined, but not both */
if ( map_shared ) {
if ( map_private ) {
errno = EINVAL;
return MAP_FAILED;
}
} else if ( !map_private ) {
errno = EINVAL;
return MAP_FAILED;
}
/* Check for illegal addresses. Watch out for address wrap. */
if ( map_fixed ) {
if ((uintptr_t)addr & PAGE_MASK) {
errno = EINVAL;
return MAP_FAILED;
}
if ( addr == NULL ) {
errno = EINVAL;
return MAP_FAILED;
}
if (addr + len < addr) {
errno = EINVAL;
return MAP_FAILED;
}
}
if ( !map_anonymous ) {
/* /*
* Get a stat of the file to get the dev + inode number and to make sure the * Get a stat of the file to get the dev + inode number and to make sure the
* fd is ok. The normal libio calls cannot be used because we need to return * fd is ok. The normal libio calls cannot be used because we need to return
@@ -160,47 +222,12 @@ void *mmap(
/* fstat ensures we have a good file descriptor. Hold on to iop. */ /* fstat ensures we have a good file descriptor. Hold on to iop. */
iop = rtems_libio_iop( fildes ); iop = rtems_libio_iop( fildes );
if ( len == 0 ) {
errno = EINVAL;
return MAP_FAILED;
}
/* Check the type of file we have and make sure it is supported. */ /* Check the type of file we have and make sure it is supported. */
if ( S_ISDIR( sb.st_mode ) || S_ISLNK( sb.st_mode )) { if ( S_ISDIR( sb.st_mode ) || S_ISLNK( sb.st_mode )) {
errno = ENODEV; errno = ENODEV;
return MAP_FAILED; return MAP_FAILED;
} }
/*
* We can provide read, write and execute because the memory in RTEMS does
* not normally have protections but we cannot hide access to memory.
*/
if ( prot == PROT_NONE ) {
errno = ENOTSUP;
return MAP_FAILED;
}
/* Either MAP_SHARED or MAP_PRIVATE must be defined, but not both */
if ( (flags & MAP_SHARED) == MAP_SHARED ) {
if ( (flags & MAP_PRIVATE) == MAP_PRIVATE ) {
errno = EINVAL;
return MAP_FAILED;
}
} else if ( (flags & MAP_PRIVATE) != MAP_PRIVATE ) {
errno = EINVAL;
return MAP_FAILED;
}
/*
* We can not normally provide restriction of write access. Reject any
* attempt to map without write permission, since we are not able to
* prevent a write from succeeding.
*/
if ( PROT_WRITE != (prot & PROT_WRITE) ) {
errno = ENOTSUP;
return MAP_FAILED;
}
/* Check to see if the mapping is valid for a regular file. */ /* Check to see if the mapping is valid for a regular file. */
if ( S_ISREG( sb.st_mode ) if ( S_ISREG( sb.st_mode )
/* FIXME: Should this be using strict inequality (>) comparisons? It would /* FIXME: Should this be using strict inequality (>) comparisons? It would
@@ -210,11 +237,8 @@ void *mmap(
return MAP_FAILED; return MAP_FAILED;
} }
/* /* Check to see if the mapping is valid for other file/object types. */
* Check to see if the mapping is valid for other file/object types. if ( !S_ISCHR( sb.st_mode ) && sb.st_size < off + len ) {
* Does this satisfy for devices?
*/
if ( sb.st_size < off + len ) {
errno = ENXIO; errno = ENXIO;
return MAP_FAILED; return MAP_FAILED;
} }
@@ -226,17 +250,25 @@ void *mmap(
} }
} }
/* cdevs do not provide private mappings of any kind. */
if ( S_ISCHR( sb.st_mode ) && map_private ) {
errno = EINVAL;
return MAP_FAILED;
}
}
/* Create the mapping */ /* Create the mapping */
mapping = malloc( sizeof( mmap_mapping )); mapping = malloc( sizeof( mmap_mapping ));
if ( !mapping ) { if ( !mapping ) {
errno = ENOMEM; errno = ENOMEM;
return NULL; return MAP_FAILED;
} }
memset( mapping, 0, sizeof( mmap_mapping )); memset( mapping, 0, sizeof( mmap_mapping ));
mapping->len = len; mapping->len = len;
mapping->flags = flags; mapping->flags = flags;
mapping->iop = iop; mapping->iop = iop;
if ( !map_anonymous ) {
/* /*
* HACK: We should have a better generic way to distinguish between * HACK: We should have a better generic way to distinguish between
* shm objects and other mmap'd files. We need to know at munmap time * shm objects and other mmap'd files. We need to know at munmap time
@@ -250,22 +282,16 @@ void *mmap(
} else { } else {
mapping->is_shared_shm = true; mapping->is_shared_shm = true;
} }
} else {
/* mapping->is_shared_shm = false;
* MAP_SHARED currently is only supported for shared memory objects.
*/
if ( (MAP_SHARED == (flags & MAP_SHARED)) && (mapping->is_shared_shm == false) ) {
free( mapping );
errno = ENOTSUP;
return MAP_FAILED;
} }
if ( map_fixed ) { if ( map_fixed ) {
mapping->addr = addr; mapping->addr = addr;
} else if ( MAP_PRIVATE == (flags & MAP_PRIVATE) ) { } else if ( map_private ) {
/* private mappings of shared memory do not need special treatment. */ /* private mappings of shared memory do not need special treatment. */
mapping->is_shared_shm = false; mapping->is_shared_shm = false;
mapping->addr = malloc( len ); posix_memalign( &mapping->addr, PAGE_SIZE, len );
if ( !mapping->addr ) { if ( !mapping->addr ) {
free( mapping ); free( mapping );
errno = ENOMEM; errno = ENOMEM;
@@ -306,7 +332,8 @@ void *mmap(
} }
/* Populate the data */ /* Populate the data */
if ( MAP_PRIVATE == (flags & MAP_PRIVATE) ) { if ( map_private ) {
if ( !map_anonymous ) {
/* /*
* Use read() for private mappings. This updates atime as needed. * Use read() for private mappings. This updates atime as needed.
* Changes to the underlying object will NOT be reflected in the mapping. * Changes to the underlying object will NOT be reflected in the mapping.
@@ -323,15 +350,25 @@ void *mmap(
errno = ENXIO; errno = ENXIO;
return MAP_FAILED; return MAP_FAILED;
} }
} else if ( MAP_SHARED == (flags & MAP_SHARED) ) { } else if ( !map_fixed ) {
/* Currently only shm objects can be MAP_SHARED. */ memset( mapping->addr, 0, len );
mapping->addr = shm_mmap(iop, len, prot, off); }
} else if ( map_shared ) {
err = (*iop->pathinfo.handlers->mmap_h)(
iop, &mapping->addr, len, prot, off );
if ( err != 0 ) {
mmap_mappings_lock_release( );
free( mapping );
return MAP_FAILED;
}
} }
if ( iop != NULL ) {
/* add an extra reference to the file associated with fildes that /* add an extra reference to the file associated with fildes that
* is not removed by a subsequent close(). This reference shall be removed * is not removed by a subsequent close(). This reference shall be removed
* when there are no more mappings to the file. */ * when there are no more mappings to the file. */
rtems_libio_increment_mapping_refcnt(iop); rtems_libio_increment_mapping_refcnt(iop);
}
rtems_chain_append( &mmap_mappings, &mapping->node ); rtems_chain_append( &mmap_mappings, &mapping->node );

View File

@@ -46,6 +46,12 @@ int munmap(void *addr, size_t len)
return -1; return -1;
} }
/* Check for illegal addresses. Watch out for address wrap. */
if (addr + len < addr) {
errno = EINVAL;
return -1;
}
/* /*
* Obtain the mmap lock. Sets errno on failure. * Obtain the mmap lock. Sets errno on failure.
*/ */
@@ -63,10 +69,12 @@ int munmap(void *addr, size_t len)
if ( mapping->is_shared_shm == true ) { if ( mapping->is_shared_shm == true ) {
shm_munmap(mapping->iop); shm_munmap(mapping->iop);
} }
if ( mapping->iop != NULL ) {
refcnt = rtems_libio_decrement_mapping_refcnt(mapping->iop); refcnt = rtems_libio_decrement_mapping_refcnt(mapping->iop);
if ( refcnt == 0 ) { if ( refcnt == 0 ) {
rtems_libio_check_deferred_free(mapping->iop); rtems_libio_check_deferred_free(mapping->iop);
} }
}
/* only free the mapping address for non-fixed mapping */ /* only free the mapping address for non-fixed mapping */
if (( mapping->flags & MAP_FIXED ) != MAP_FIXED ) { if (( mapping->flags & MAP_FIXED ) != MAP_FIXED ) {
/* only free the mapping address for non-shared mapping, because we /* only free the mapping address for non-shared mapping, because we

View File

@@ -106,6 +106,35 @@ static int shm_close( rtems_libio_t *iop )
return 0; return 0;
} }
static int shm_mmap(
rtems_libio_t *iop,
void** addr,
size_t len,
int prot,
off_t off
)
{
POSIX_Shm_Control *shm = iop_to_shm( iop );
_Objects_Allocator_lock();
*addr = (*shm->shm_object.ops->object_mmap)( &shm->shm_object, len, prot, off);
if ( *addr != NULL ) {
/* Keep a reference in the shared memory to prevent its removal. */
++shm->reference_count;
/* Update atime */
_POSIX_Shm_Update_atime(shm);
} else {
_Objects_Allocator_unlock();
rtems_set_errno_and_return_minus_one( ENOMEM );
}
_Objects_Allocator_unlock();
return 0;
}
static inline POSIX_Shm_Control *shm_allocate( static inline POSIX_Shm_Control *shm_allocate(
const char *name_arg, const char *name_arg,
size_t name_len, size_t name_len,
@@ -275,6 +304,7 @@ static const rtems_filesystem_file_handlers_r shm_handlers = {
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl, .fcntl_h = rtems_filesystem_default_fcntl,
.kqfilter_h = rtems_filesystem_default_kqfilter, .kqfilter_h = rtems_filesystem_default_kqfilter,
.mmap_h = shm_mmap,
.poll_h = rtems_filesystem_default_poll, .poll_h = rtems_filesystem_default_poll,
.readv_h = rtems_filesystem_default_readv, .readv_h = rtems_filesystem_default_readv,
.writev_h = rtems_filesystem_default_writev .writev_h = rtems_filesystem_default_writev