[PATCH v5 2/2] psxtests: Add a mmap dedicated test case
Joel Sherrill
joel at rtems.org
Fri Jul 14 20:53:26 UTC 2017
Does this close the ticket? Or just update it?
Should we have info in the POSIX guide for these calls?
On Jul 14, 2017 3:08 PM, "Gedare Bloom" <gedare at rtems.org> wrote:
> I checked these in. Thanks!
>
> On Thu, Jun 29, 2017 at 10:36 AM, Kevin Kirspel <kevin-kirspel at idexx.com>
> wrote:
> > Updates #2859
> > ---
> > testsuites/psxtests/Makefile.am | 1 +
> > testsuites/psxtests/configure.ac | 1 +
> > testsuites/psxtests/psxmmap01/Makefile.am | 22 ++
> > testsuites/psxtests/psxmmap01/init.c | 352
> ++++++++++++++++++++++++++++
> > testsuites/psxtests/psxmmap01/psxmmap01.scn | 0
> > testsuites/psxtests/psxmmap01/system.h | 31 +++
> > testsuites/psxtests/psxmmap01/test_driver.c | 67 ++++++
> > testsuites/psxtests/psxmmap01/test_driver.h | 14 ++
> > testsuites/psxtests/psxmmap01/test_helper.c | 32 +++
> > testsuites/psxtests/psxmmap01/test_helper.h | 41 ++++
> > 10 files changed, 561 insertions(+)
> > create mode 100644 testsuites/psxtests/psxmmap01/Makefile.am
> > create mode 100644 testsuites/psxtests/psxmmap01/init.c
> > create mode 100644 testsuites/psxtests/psxmmap01/psxmmap01.scn
> > create mode 100644 testsuites/psxtests/psxmmap01/system.h
> > create mode 100644 testsuites/psxtests/psxmmap01/test_driver.c
> > create mode 100644 testsuites/psxtests/psxmmap01/test_driver.h
> > create mode 100644 testsuites/psxtests/psxmmap01/test_helper.c
> > create mode 100644 testsuites/psxtests/psxmmap01/test_helper.h
> >
> > diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/
> Makefile.am
> > index 7bcea46..cccdb39 100644
> > --- a/testsuites/psxtests/Makefile.am
> > +++ b/testsuites/psxtests/Makefile.am
> > @@ -85,6 +85,7 @@ _SUBDIRS += psxrwlock01
> > _SUBDIRS += psxsem01
> > _SUBDIRS += psxshm01
> > _SUBDIRS += psxshm02
> > +_SUBDIRS += psxmmap01
> > _SUBDIRS += psxsignal01
> > _SUBDIRS += psxsignal02
> > _SUBDIRS += psxsignal03
> > diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/
> configure.ac
> > index 1de1312..96a0149 100644
> > --- a/testsuites/psxtests/configure.ac
> > +++ b/testsuites/psxtests/configure.ac
> > @@ -190,6 +190,7 @@ psxrwlock01/Makefile
> > psxsem01/Makefile
> > psxshm01/Makefile
> > psxshm02/Makefile
> > +psxmmap01/Makefile
> > psxsignal01/Makefile
> > psxsignal02/Makefile
> > psxsignal03/Makefile
> > diff --git a/testsuites/psxtests/psxmmap01/Makefile.am
> b/testsuites/psxtests/psxmmap01/Makefile.am
> > new file mode 100644
> > index 0000000..57b0087
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/Makefile.am
> > @@ -0,0 +1,22 @@
> > +
> > +rtems_tests_PROGRAMS = psxmmap01
> > +psxmmap01_SOURCES = init.c test_helper.c test_driver.c system.h
> > +
> > +dist_rtems_tests_DATA = psxmmap01.scn
> > +
> > +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
> > +include $(top_srcdir)/../automake/compile.am
> > +include $(top_srcdir)/../automake/leaf.am
> > +
> > +
> > +AM_CPPFLAGS += -I$(top_srcdir)/include
> > +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
> > +
> > +LINK_OBJS = $(psxmmap01_OBJECTS)
> > +LINK_LIBS = $(psxmmap01_LDLIBS)
> > +
> > +psxmmap01$(EXEEXT): $(psxmmap01_OBJECTS) $(psxmmap01_DEPENDENCIES)
> > + @rm -f psxmmap01$(EXEEXT)
> > + $(make-exe)
> > +
> > +include $(top_srcdir)/../automake/local.am
> > diff --git a/testsuites/psxtests/psxmmap01/init.c b/testsuites/psxtests/
> psxmmap01/init.c
> > new file mode 100644
> > index 0000000..eb1c747
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/init.c
> > @@ -0,0 +1,344 @@
> > +/*-
> > + * Copyright (c) 2009 Simon L. Nielsen <simon at FreeBSD.org>,
> > + * Bjoern A. Zeeb <bz at FreeBSD.org>
> > + *
> > + * Redistribution and use in source and binary forms, with or without
> > + * modification, are permitted provided that the following conditions
> > + * are met:
> > + * 1. Redistributions of source code must retain the above copyright
> > + * notice, this list of conditions and the following disclaimer.
> > + * 2. Redistributions in binary form must reproduce the above copyright
> > + * notice, this list of conditions and the following disclaimer in
> the
> > + * documentation and/or other materials provided with the
> distribution.
> > + *
> > + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
> AND
> > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
> > + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
> LIABLE
> > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> CONSEQUENTIAL
> > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
> GOODS
> > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> STRICT
> > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> ANY WAY
> > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
> OF
> > + * SUCH DAMAGE.
> > + *
> > + * $FreeBSD$
> > + */
> > +
> > +#ifdef HAVE_CONFIG_H
> > +#include "config.h"
> > +#endif
> > +
> > +#define CONFIGURE_INIT
> > +#include "system.h"
> > +#include "pritime.h"
> > +#include "test_helper.h"
> > +#include "test_driver.h"
> > +
> > +#include <sys/mman.h>
> > +
> > +#include <errno.h>
> > +#include <fcntl.h>
> > +#include <string.h>
> > +
> > +const char rtems_test_name[] = "PSX MMAP01";
> > +const char test_driver_name[] = "/dev/test_driver";
> > +
> > +static const struct {
> > + void *addr;
> > + int ok;
> > +} map_at_zero_tests[] = {
> > + { (void *)0, 0 },
> > + { (void *)1, 0 },
> > + { (void *)(PAGE_SIZE - 1), 0 },
> > + { (void *)PAGE_SIZE, 1 },
> > + { (void *)-1, 0 },
> > + { (void *)(-PAGE_SIZE), 0 },
> > + { (void *)(-1 - PAGE_SIZE), 0 },
> > + { (void *)(-1 - PAGE_SIZE - 1), 0 },
> > + { (void *)(0x1000 * PAGE_SIZE), 1 },
> > +};
> > +
> > +#define MAP_AT_ZERO_NITEMS (sizeof(map_at_zero_tests) /
> sizeof(map_at_zero_tests[0]))
> > +
> > +static void* checked_mmap(
> > + int prot,
> > + int flags,
> > + int fd,
> > + int error,
> > + const char *msg
> > +)
> > +{
> > + void *p;
> > + int pagesize, err;
> > +
> > + rtems_test_assert((pagesize = getpagesize()) > 0);
> > + p = mmap(NULL, pagesize, prot, flags, fd, 0);
> > + if (p == MAP_FAILED) {
> > + if (error == 0)
> > + mmap_test_assert(0, "%s failed with errno %d\n", msg, errno);
> > + else {
> > + err = errno;
> > + mmap_test_assert_equal(error, err,
> > + "%s failed with wrong errno %d (expected %d)\n", msg,
> > + errno, error);
> > + }
> > + } else {
> > + mmap_test_check(error == 0, "%s succeeded\n", msg);
> > + munmap(p, pagesize);
> > + }
> > + return p;
> > +}
> > +
> > +static void mmap_map_at_zero( void )
> > +{
> > + void *p;
> > + unsigned int i;
> > +
> > + for (i = 0; i < MAP_AT_ZERO_NITEMS; i++) {
> > + p = mmap((void *)map_at_zero_tests[i].addr, PAGE_SIZE,
> > + PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_FIXED |
> MAP_PRIVATE,
> > + -1, 0);
> > + if (p == MAP_FAILED) {
> > + mmap_test_assert( map_at_zero_tests[i].ok == 0,
> > + "mmap(%08lX, ...) failed\n", (uint32_t)map_at_zero_tests[i].addr
> );
> > + } else {
> > + mmap_test_check( map_at_zero_tests[i].ok == 1,
> > + "mmap(%p, ...) succeeded: p=%p\n",
> > + map_at_zero_tests[i].addr, p );
> > + }
> > + }
> > +}
> > +
> > +static void mmap_bad_arguments( void )
> > +{
> > + int devfd, pagesize, shmfd, zerofd;
> > + void* p;
> > +
> > + rtems_test_assert((pagesize = getpagesize()) > 0);
> > + rtems_test_assert((devfd = open(&test_driver_name[0], O_RDONLY)) >=
> 0);
> > + rtems_test_assert((shmfd = shm_open("/shm", O_CREAT | O_RDWR, 0644))
> >= 0);
> > + rtems_test_assert(ftruncate(shmfd, pagesize) == 0);
> > + rtems_test_assert((zerofd = open("/dev/zero", O_RDONLY)) >= 0);
> > +
> > + /*
> > + * These should normally work on FREEBSD. Test cases below that fail
> are
> > + * due to unsupported features in RTEMS.
> > + */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON, -1, 0,
> > + "simple MAP_ANON");
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0,
> > + "simple shm fd shared");
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_PRIVATE, shmfd, 0,
> > + "simple shm fd private");
> > + /* RTEMS cannot protect against writes so this will fail */
> > + checked_mmap(PROT_READ, MAP_SHARED, zerofd, ENOTSUP,
> > + "simple /dev/zero shared");
> > + /*
> > + * Repeat with no write protection. Will fail because of
> unimplemented
> > + * mmap handler in /dev/zero.
> > + */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_SHARED, zerofd, ENOTSUP,
> > + "simple /dev/zero shared");
> > + /* RTEMS /dev/zero is a character device so this will fail */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_PRIVATE, zerofd, EINVAL,
> > + "simple /dev/zero private");
> > + /* RTEMS cannot protect against writes so this will fail */
> > + checked_mmap(PROT_READ, MAP_SHARED, devfd, ENOTSUP,
> > + "simple test driver shared");
> > + /*
> > + * Repeat with no write protection. Should fail because of
> unimplemented
> > + * mmap handler in /dev/null.
> > + */
> > + p = checked_mmap(PROT_READ | PROT_WRITE, MAP_SHARED, devfd, 0,
> > + "simple test driver shared");
> > + rtems_test_assert(p == &test_data[0]);
> > +
> > + /* Extra PROT flags. */
> > + checked_mmap(PROT_READ | PROT_WRITE | 0x100000, MAP_ANON, -1, EINVAL,
> > + "MAP_ANON with extra PROT flags");
> > + checked_mmap(0xffff, MAP_SHARED, shmfd, EINVAL,
> > + "shm fd with garbage PROT");
> > +
> > + /* Undefined flag. */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON | MAP_RESERVED0080, -1,
> > + EINVAL, "Undefined flag");
> > +
> > + /* Both MAP_SHARED and MAP_PRIVATE */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE |
> > + MAP_SHARED, -1, EINVAL, "MAP_ANON with both SHARED and PRIVATE");
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_SHARED, shmfd,
> > + EINVAL, "shm fd with both SHARED and PRIVATE");
> > +
> > + /* At least one of MAP_SHARED or MAP_PRIVATE without ANON */
> > + checked_mmap(PROT_READ | PROT_WRITE, 0, shmfd, EINVAL,
> > + "shm fd without sharing flag");
> > +
> > + /* MAP_ANON with sharing flag. Will fail on RTEMS*/
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1,
> EINVAL,
> > + "shared MAP_ANON");
> > + /* MAP_ANON with private flag*/
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0,
> > + "private MAP_ANON");
> > +
> > + /* MAP_ANON should require an fd of -1. */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, 0,
> EINVAL,
> > + "MAP_ANON with fd != -1");
> > +
> > + /*
> > + * Writable MAP_SHARED should fail on read-only descriptors. Will fail
> > + * on RTEMS because of unimplemented mmap handler in /dev/null and
> the fact
> > + * that there is no read only protection.
> > + */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_SHARED, zerofd, ENOTSUP,
> > + "MAP_SHARED of read-only /dev/zero");
> > +
> > + /*
> > + * Character devices other than /dev/zero do not support private
> > + * mappings. RTEMS cannot protect against writes so this will fail
> with
> > + * ENOTSUP
> > + */
> > + checked_mmap(PROT_READ, MAP_PRIVATE, devfd, ENOTSUP,
> > + "MAP_PRIVATE of test driver");
> > +
> > + /*
> > + * Repeat with no write protection.
> > + */
> > + checked_mmap(PROT_READ | PROT_WRITE, MAP_PRIVATE, devfd, EINVAL,
> > + "MAP_PRIVATE of test driver");
> > +
> > + close(devfd);
> > + close(shmfd);
> > + close(zerofd);
> > +}
> > +
> > +static void mmap_dev_zero_private( void )
> > +{
> > + char *p1, *p2, *p3;
> > + int fd, pagesize;
> > + /*int i*/
> > +
> > + rtems_test_assert((pagesize = getpagesize()) > 0);
> > + rtems_test_assert((fd = open("/dev/zero", O_RDONLY)) >= 0);
> > +
> > + /* This should not return MAP_FAILED but does on RTEMS */
> > + p1 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
> > + /*rtems_test_assert(p1 != MAP_FAILED);*/
> > + rtems_test_assert(p1 == MAP_FAILED);
> > +
> > + /* This should not return MAP_FAILED but does on RTEMS */
> > + p2 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
> > + /*rtems_test_assert(p2 != MAP_FAILED);*/
> > + rtems_test_assert(p2 == MAP_FAILED);
> > +
> > + /* These tests can not run due to failures above */
> > + /*for (i = 0; i < pagesize; i++)
> > + mmap_test_assert_equal(0, p1[i], "byte at p1[%d] is %x", i, p1[i]);
> > +
> > + rtems_test_assert(memcmp(p1, p2, pagesize) == 0);
> > +
> > + p1[0] = 1;
> > +
> > + rtems_test_assert(p2[0] == 0);
> > +
> > + p2[0] = 2;
> > +
> > + rtems_test_assert(p1[0] == 1);*/
> > +
> > + /* This should not return MAP_FAILED but does on RTEMS */
> > + p3 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
> > + /*rtems_test_assert(p3 != MAP_FAILED);*/
> > + rtems_test_assert(p3 == MAP_FAILED);
> > +
> > + /*rtems_test_assert(p3[0] == 0);
> > +
> > + munmap(p1, pagesize);
> > + munmap(p2, pagesize);
> > + munmap(p3, pagesize);*/
> > + close(fd);
> > +}
> > +
> > +static void mmap_dev_zero_shared( void )
> > +{
> > + char *p1, *p2, *p3;
> > + int fd, pagesize;
> > + /*int i*/
> > +
> > + rtems_test_assert((pagesize = getpagesize()) > 0);
> > + rtems_test_assert((fd = open("/dev/zero", O_RDWR)) >= 0);
> > +
> > + /* This should not return MAP_FAILED but does on RTEMS */
> > + p1 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
> > + /*rtems_test_assert(p1 != MAP_FAILED);*/
> > + rtems_test_assert(p1 == MAP_FAILED);
> > +
> > + /* This should not return MAP_FAILED but does on RTEMS */
> > + p2 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
> > + /*rtems_test_assert(p2 != MAP_FAILED);*/
> > + rtems_test_assert(p2 == MAP_FAILED);
> > +
> > + /* These tests can not run due to failures above */
> > + /*for (i = 0; i < pagesize; i++)
> > + mmap_test_assert_equal(0, p1[i], "byte at p1[%d] is %x", i, p1[i]);
> > +
> > + rtems_test_assert(memcmp(p1, p2, pagesize) == 0);
> > +
> > + p1[0] = 1;
> > +
> > + rtems_test_assert(p2[0] == 0);
> > +
> > + p2[0] = 2;
> > +
> > + rtems_test_assert(p1[0] == 1);*/
> > +
> > + p3 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
> > + /*rtems_test_assert(p3 != MAP_FAILED);*/
> > + rtems_test_assert(p3 == MAP_FAILED);
> > +
> > + /*rtems_test_assert(p3[0] == 0);
> > +
> > + munmap(p1, pagesize);
> > + munmap(p2, pagesize);
> > + munmap(p3, pagesize);*/
> > + close(fd);
> > +}
> > +
> > +void *POSIX_Init(
> > + void *argument
> > +)
> > +{
> > + int rv;
> > +
> > + TEST_BEGIN();
> > +
> > + rv = IMFS_make_generic_node(
> > + &test_driver_name[0],
> > + S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO,
> > + &node_control,
> > + NULL
> > + );
> > + rtems_test_assert(rv == 0);
> > +
> > + puts( "Init: mmap - map at zero" );
> > + mmap_map_at_zero();
> > + puts( "Init: mmap - bad arguments" );
> > + mmap_bad_arguments();
> > + /*
> > + * The following test does not work on RTEMS because /dev/zero is
> > + * implemented as a character device which does not support
> MAP_PRIVATE.
> > + */
> > + puts( "Init: mmap - /dev/zero private" );
> > + mmap_dev_zero_private();
> > + /*
> > + * The following test does not work on RTEMS because /dev/zero does
> not
> > + * implemented the mmap handler.
> > + */
> > + puts( "Init: mmap - /dev/zero shared" );
> > + mmap_dev_zero_shared();
> > +
> > + TEST_END();
> > +
> > + rtems_test_exit(0);
> > + return 0;
> > +}
> > diff --git a/testsuites/psxtests/psxmmap01/psxmmap01.scn
> b/testsuites/psxtests/psxmmap01/psxmmap01.scn
> > new file mode 100644
> > index 0000000..e69de29
> > diff --git a/testsuites/psxtests/psxmmap01/system.h
> b/testsuites/psxtests/psxmmap01/system.h
> > new file mode 100644
> > index 0000000..2241f88
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/system.h
> > @@ -0,0 +1,31 @@
> > +/*
> > + * Copyright (c) 2017 Kevin Kirspel.
> > + *
> > + * 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.
> > + */
> > +
> > +#include <pmacros.h>
> > +#include <unistd.h>
> > +#include <errno.h>
> > +
> > +void *POSIX_Init(
> > + void *argument
> > +);
> > +
> > +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> > +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> > +#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
> > +#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
> > +
> > +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
> > +
> > +#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
> > +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 10
> > +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1
> > +#define CONFIGURE_MEMORY_OVERHEAD 10
> > +
> > +#define CONFIGURE_POSIX_INIT_THREAD_TABLE
> > +
> > +#include <rtems/confdefs.h>
> > diff --git a/testsuites/psxtests/psxmmap01/test_driver.c
> b/testsuites/psxtests/psxmmap01/test_driver.c
> > new file mode 100644
> > index 0000000..87719b9
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/test_driver.c
> > @@ -0,0 +1,67 @@
> > +/*
> > + * Copyright (c) 2017 Kevin Kirspel.
> > + *
> > + * 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.
> > + */
> > +
> > +#ifdef HAVE_CONFIG_H
> > +#include "config.h"
> > +#endif
> > +
> > +#include "test_driver.h"
> > +
> > +#include <rtems/libio.h>
> > +
> > +char test_data[PAGE_SIZE];
> > +
> > +static int handler_fstat(
> > + const rtems_filesystem_location_info_t *loc,
> > + struct stat *buf
> > +)
> > +{
> > + buf->st_mode = S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO;
> > + return 0;
> > +}
> > +
> > +static ssize_t handler_mmap(
> > + rtems_libio_t *iop,
> > + void **addr,
> > + size_t len,
> > + int prot,
> > + off_t off
> > +)
> > +{
> > + if ( len <= sizeof(test_data) ) {
> > + *addr = test_data;
> > + } else {
> > + *addr = NULL;
> > + }
> > + return 0;
> > +}
> > +
> > +static const rtems_filesystem_file_handlers_r node_handlers = {
> > + .open_h = rtems_filesystem_default_open,
> > + .close_h = rtems_filesystem_default_close,
> > + .read_h = rtems_filesystem_default_read,
> > + .write_h = rtems_filesystem_default_write,
> > + .ioctl_h = rtems_filesystem_default_ioctl,
> > + .lseek_h = rtems_filesystem_default_lseek,
> > + .fstat_h = handler_fstat,
> > + .ftruncate_h = rtems_filesystem_default_ftruncate,
> > + .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
> > + .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
> > + .fcntl_h = rtems_filesystem_default_fcntl,
> > + .poll_h = rtems_filesystem_default_poll,
> > + .kqfilter_h = rtems_filesystem_default_kqfilter,
> > + .mmap_h = handler_mmap,
> > + .readv_h = rtems_filesystem_default_readv,
> > + .writev_h = rtems_filesystem_default_writev
> > +};
> > +
> > +const IMFS_node_control node_control = IMFS_GENERIC_INITIALIZER(
> > + &node_handlers,
> > + IMFS_node_initialize_default,
> > + IMFS_node_destroy_default
> > +);
> > diff --git a/testsuites/psxtests/psxmmap01/test_driver.h
> b/testsuites/psxtests/psxmmap01/test_driver.h
> > new file mode 100644
> > index 0000000..5afdb9b
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/test_driver.h
> > @@ -0,0 +1,14 @@
> > +/*
> > + * Copyright (c) 2017 Kevin Kirspel.
> > + *
> > + * 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.
> > + */
> > +
> > +#include <rtems.h>
> > +#include <rtems/imfs.h>
> > +#include <rtems/libcsupport.h>
> > +
> > +extern const IMFS_node_control node_control;
> > +extern char test_data[PAGE_SIZE];
> > diff --git a/testsuites/psxtests/psxmmap01/test_helper.c
> b/testsuites/psxtests/psxmmap01/test_helper.c
> > new file mode 100644
> > index 0000000..cab8e91
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/test_helper.c
> > @@ -0,0 +1,32 @@
> > +/*
> > + * Copyright (c) 2017 Kevin Kirspel.
> > + *
> > + * 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.
> > + */
> > +
> > +#ifdef HAVE_CONFIG_H
> > +#include "config.h"
> > +#endif
> > +
> > +#include "test_helper.h"
> > +
> > +#include <stdio.h>
> > +#include <stdarg.h>
> > +
> > +void fail_check(
> > + const char *file,
> > + const size_t line,
> > + const char *fmt,
> > + ...
> > +)
> > +{
> > + va_list ap;
> > +
> > + printf( "%s: %d: ", file, line );
> > +
> > + va_start(ap, fmt);
> > + vprintf(fmt, ap);
> > + va_end(ap);
> > +}
> > diff --git a/testsuites/psxtests/psxmmap01/test_helper.h
> b/testsuites/psxtests/psxmmap01/test_helper.h
> > new file mode 100644
> > index 0000000..65ca3c1
> > --- /dev/null
> > +++ b/testsuites/psxtests/psxmmap01/test_helper.h
> > @@ -0,0 +1,41 @@
> > +/*
> > + * Copyright (c) 2017 Kevin Kirspel.
> > + *
> > + * 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.
> > + */
> > +
> > +#include <string.h>
> > +
> > +#define mmap_test_assert(__exp, fmt, ...) \
> > + do { \
> > + if (!(__exp)) { \
> > + fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \
> > + rtems_test_exit(0); \
> > + } \
> > + } while (0)
> > +
> > +#define mmap_test_check(__exp, fmt, ...) \
> > + do { \
> > + if (!(__exp)) { \
> > + fail_check(__FILE__, __LINE__, fmt, ##__VA_ARGS__); \
> > + } else { \
> > + rtems_test_assert(__exp); \
> > + }\
> > + } while (0)
> > +
> > +#define mmap_test_assert_equal(expected, actual, fmt, ...) \
> > + mmap_test_assert((expected) == (actual), "%s != %s: " fmt, \
> > + #expected, #actual, ##__VA_ARGS__)
> > +
> > +#define mmap_test_check_equal(expected, actual, fmt, ...) \
> > + mmap_test_check((expected) == (actual), "%s != %s: " fmt, \
> > + #expected, #actual, ##__VA_ARGS__)
> > +
> > +extern void fail_check(
> > + const char *file,
> > + const size_t line,
> > + const char *fmt,
> > + ...
> > +);
> > --
> > 1.9.1
> >
> > _______________________________________________
> > devel mailing list
> > devel at rtems.org
> > http://lists.rtems.org/mailman/listinfo/devel
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20170714/0375d1d6/attachment-0002.html>
More information about the devel
mailing list