From c6bb1c33bcf70d1398073c96a4fac4f9b031b9ab Mon Sep 17 00:00:00 2001 From: Kevin Kirspel Date: Thu, 29 Jun 2017 10:36:43 -0400 Subject: 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 --- cpukit/libcsupport/include/rtems/libio.h | 38 +++++++++++++++++++++++++ cpukit/libcsupport/include/rtems/termiostypes.h | 13 +++++++++ cpukit/libcsupport/src/__usrenv.c | 1 + cpukit/libcsupport/src/termios.c | 1 + 4 files changed, 53 insertions(+) (limited to 'cpukit/libcsupport') diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h index 4669cb52e1..8226d18ba2 100644 --- a/cpukit/libcsupport/include/rtems/libio.h +++ b/cpukit/libcsupport/include/rtems/libio.h @@ -976,6 +976,28 @@ typedef int (*rtems_filesystem_kqfilter_t)( 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. */ @@ -995,6 +1017,7 @@ struct _rtems_filesystem_file_handlers_r { rtems_filesystem_kqfilter_t kqfilter_h; rtems_filesystem_readv_t readv_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 ); +/** + * @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 +); + /** @} */ /** diff --git a/cpukit/libcsupport/include/rtems/termiostypes.h b/cpukit/libcsupport/include/rtems/termiostypes.h index e91faa7376..b3cac66e92 100644 --- a/cpukit/libcsupport/include/rtems/termiostypes.h +++ b/cpukit/libcsupport/include/rtems/termiostypes.h @@ -564,6 +564,19 @@ int rtems_termios_kqfilter( 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. * diff --git a/cpukit/libcsupport/src/__usrenv.c b/cpukit/libcsupport/src/__usrenv.c index a05295d642..611e0d7a92 100644 --- a/cpukit/libcsupport/src/__usrenv.c +++ b/cpukit/libcsupport/src/__usrenv.c @@ -56,6 +56,7 @@ const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers = { .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fcntl_h = rtems_filesystem_default_fcntl, .kqfilter_h = rtems_filesystem_default_kqfilter, + .mmap_h = rtems_filesystem_default_mmap, .poll_h = rtems_filesystem_default_poll, .readv_h = rtems_filesystem_default_readv, .writev_h = rtems_filesystem_default_writev diff --git a/cpukit/libcsupport/src/termios.c b/cpukit/libcsupport/src/termios.c index a22ae95719..7d843495c5 100644 --- a/cpukit/libcsupport/src/termios.c +++ b/cpukit/libcsupport/src/termios.c @@ -2212,6 +2212,7 @@ static const rtems_filesystem_file_handlers_r rtems_termios_imfs_handler = { .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, .fcntl_h = rtems_filesystem_default_fcntl, .kqfilter_h = rtems_termios_kqfilter, + .mmap_h = rtems_termios_mmap, .poll_h = rtems_termios_poll, .readv_h = rtems_filesystem_default_readv, .writev_h = rtems_filesystem_default_writev -- cgit v1.2.3