From 8c741ed54e1be63528e79222b600f37506c6d6d2 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 23 Apr 2008 13:06:58 -0700 Subject: Add pread/pwrite ioctls to mmfs. --- tests/Makefile.am | 3 +- tests/drmtest.c | 33 +++++++++++++ tests/drmtest.h | 1 + tests/mmfs_basic.c | 24 +--------- tests/mmfs_readwrite.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 tests/mmfs_readwrite.c (limited to 'tests') diff --git a/tests/Makefile.am b/tests/Makefile.am index 97752774..e2931013 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -23,7 +23,8 @@ TESTS = auth \ lock \ setversion \ updatedraw \ - mmfs_basic + mmfs_basic \ + mmfs_readwrite EXTRA_PROGRAMS = $(TESTS) CLEANFILES = $(EXTRA_PROGRAMS) $(EXTRA_LTLIBRARIES) diff --git a/tests/drmtest.c b/tests/drmtest.c index cae99a0c..58f71a6a 100644 --- a/tests/drmtest.c +++ b/tests/drmtest.c @@ -26,7 +26,9 @@ */ #include +#include #include "drmtest.h" +#include "mmfs.h" /** Open the first DRM device we can find, searching up to 16 device nodes */ int drm_open_any(void) @@ -81,3 +83,34 @@ int drm_open_any_master(void) abort(); } +static void +create_mmfs_device() +{ + struct stat sb; + int ret; + + ret = stat(MMFS_DEVICE_PATH, &sb); + + if (ret == 0) + return; + + ret = mknod(MMFS_DEVICE_PATH, S_IFCHR | S_IRUSR | S_IWUSR, + makedev(MMFS_DEVICE_MAJOR, 0)); + + if (ret != 0) + errx(1, "mknod()"); +} + +int +open_mmfs_device() +{ + int fd; + + create_mmfs_device(); + + fd = open(MMFS_DEVICE_PATH, O_RDWR); + if (fd == -1) + errx(1, "open()"); + + return fd; +} diff --git a/tests/drmtest.h b/tests/drmtest.h index afa0df4a..b84ada71 100644 --- a/tests/drmtest.h +++ b/tests/drmtest.h @@ -35,3 +35,4 @@ int drm_open_any(void); int drm_open_any_master(void); +int open_mmfs_device(); diff --git a/tests/mmfs_basic.c b/tests/mmfs_basic.c index b0ae8905..c6975b0b 100644 --- a/tests/mmfs_basic.c +++ b/tests/mmfs_basic.c @@ -35,24 +35,6 @@ #include #include "mmfs.h" -static void -create_mmfs_device() -{ - struct stat sb; - int ret; - - ret = stat(MMFS_DEVICE_PATH, &sb); - - if (ret == 0) - return; - - ret = mknod(MMFS_DEVICE_PATH, S_IFCHR | S_IRUSR | S_IWUSR, - makedev(MMFS_DEVICE_MAJOR, 0)); - - if (ret != 0) - errx(1, "mknod()"); -} - static void test_bad_unref(int fd) { @@ -117,11 +99,7 @@ int main(int argc, char **argv) { int fd; - create_mmfs_device(); - - fd = open(MMFS_DEVICE_PATH, O_RDWR); - if (fd == -1) - errx(1, "open()"); + fd = open_mmfs_device(); test_bad_ioctl(fd); test_bad_unref(fd); diff --git a/tests/mmfs_readwrite.c b/tests/mmfs_readwrite.c new file mode 100644 index 00000000..09d1967d --- /dev/null +++ b/tests/mmfs_readwrite.c @@ -0,0 +1,125 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Eric Anholt + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mmfs.h" + +#define MMFS_BUFFER_SIZE 16384 + +int do_read(int fd, int handle, void *buf, int offset, int size) +{ + struct mmfs_pread_args read; + + /* Ensure that we don't have any convenient data in buf in case + * we fail. + */ + memset(buf, 0xd0, size); + + memset(&read, 0, sizeof(read)); + read.handle = handle; + read.data = buf; + read.size = size; + read.offset = offset; + + return ioctl(fd, MMFS_IOCTL_PREAD, &read); +} + +int do_write(int fd, int handle, void *buf, int offset, int size) +{ + struct mmfs_pwrite_args write; + + memset(&write, 0, sizeof(write)); + write.handle = handle; + write.data = buf; + write.size = size; + write.offset = offset; + + return ioctl(fd, MMFS_IOCTL_PWRITE, &write); +} + +int main(int argc, char **argv) +{ + int fd; + struct mmfs_alloc_args alloc; + uint8_t expected[MMFS_BUFFER_SIZE]; + uint8_t buf[MMFS_BUFFER_SIZE]; + int ret; + int handle; + + fd = open_mmfs_device(); + + memset(&alloc, 0, sizeof(alloc)); + alloc.size = MMFS_BUFFER_SIZE; + ret = ioctl(fd, MMFS_IOCTL_ALLOC, &alloc); + assert(ret == 0); + handle = alloc.handle; + + printf("Testing contents of newly allocated object.\n"); + ret = do_read(fd, handle, buf, 0, MMFS_BUFFER_SIZE); + assert(ret == 0); + memset(&expected, 0, sizeof(expected)); + assert(memcmp(expected, buf, sizeof(expected)) == 0); + + printf("Testing read beyond end of buffer.\n"); + ret = do_read(fd, handle, buf, MMFS_BUFFER_SIZE / 2, MMFS_BUFFER_SIZE); + assert(ret == -1 && errno == EINVAL); + + printf("Testing full write of buffer\n"); + memset(buf, 0, sizeof(buf)); + memset(buf + 1024, 0x01, 1024); + memset(expected + 1024, 0x01, 1024); + ret = do_write(fd, handle, buf, 0, MMFS_BUFFER_SIZE); + assert(ret == 0); + ret = do_read(fd, handle, buf, 0, MMFS_BUFFER_SIZE); + assert(ret == 0); + assert(memcmp(buf, expected, sizeof(buf)) == 0); + + printf("Testing partial write of buffer\n"); + memset(buf + 4096, 0x02, 1024); + memset(expected + 4096, 0x02, 1024); + ret = do_write(fd, handle, buf + 4096, 4096, 1024); + assert(ret == 0); + ret = do_read(fd, handle, buf, 0, MMFS_BUFFER_SIZE); + assert(ret == 0); + assert(memcmp(buf, expected, sizeof(buf)) == 0); + + printf("Testing partial read of buffer\n"); + ret = do_read(fd, handle, buf, 512, 1024); + assert(ret == 0); + assert(memcmp(buf, expected + 512, 1024) == 0); + + close(fd); + + return 0; +} -- cgit v1.2.3