diff options
author | Loic Poulain <loic.poulain@linaro.org> | 2020-11-23 16:33:29 +0100 |
---|---|---|
committer | Loic Poulain <loic.poulain@linaro.org> | 2020-11-23 16:38:43 +0100 |
commit | 2e38aa0c4545d861181f70a0950a2507fc3bc8be (patch) | |
tree | 35fae0a1a14907cb67e9208107a8ae6093bd80ba |
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
-rw-r--r-- | Makefile | 13 | ||||
-rw-r--r-- | membuf-check.c | 184 |
2 files changed, 197 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ce7ed40 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +CC := gcc + +SRCS := membuf-check.c +OBJS := $(SRCS:.c=.o) + +membuf-check: $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +install: membuf-check + install -D -m 755 $< $(DESTDIR)$(prefix)/bin/$< + +clean: + rm -f membuf-check $(OBJS) diff --git a/membuf-check.c b/membuf-check.c new file mode 100644 index 0000000..497edbf --- /dev/null +++ b/membuf-check.c @@ -0,0 +1,184 @@ +#include <fcntl.h> +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <string.h> +#include <sys/wait.h> +#include <sys/ioctl.h> +#include <stdlib.h> +#include <semaphore.h> + +static char msg[] = "HELLO WORLD"; + +#define MEMBUF_IOC_MEMSIZE _IOR('M', 0x02 , unsigned int) + +int main(void) +{ + char *buffer; + unsigned bsize; + int fd, ret, i, pid, j; + + /* is /dev/membuf avaible ? */ + fd = open("/dev/membuf", O_RDWR); + if (fd < 0) { + perror("[ERROR] Unable to open /dev/membuf"); + return -1; + } + + printf("[OK] open /dev/membuf\n"); + + /* ioctl */ + ret = ioctl(fd, MEMBUF_IOC_MEMSIZE, &bsize); + if (ret) { + perror("[WARN] ioctl: unable to perform MEMBUF_IOC_MEMSIZE ioctl"); + bsize = 1024; + } else if (!bsize) { + /* can not do anything useful with 0-byte buffer */ + printf("[WARN] ioctl: reported memsize is 0, please increase\n"); + return -1; + } else { + printf("[OK] ioctl: buffer size = %u\n", bsize); + } + + buffer = malloc(bsize + 1); + + /* can we read one byte ? */ + ret = pread(fd, buffer, 1, 0); + if (ret < 0) { + perror("[ERROR] read-one: Unable to read one byte"); + return -1; + } else if (ret != 1) { + fprintf(stderr, "[ERROR] read-one: expected 1 byte, got %d bytes\n", ret); + return -1; + } + + printf("[OK] Read one byte\n"); + + /* can we read the whole buffer ? */ + ret = pread(fd, buffer, bsize, 0); + if (ret < 0) { + perror("[ERROR] read-whole: Unable to read the buffer"); + return -1; + } else if (ret != bsize) { + fprintf(stderr, "[ERROR] read-whole: Unable to read %d bytes, got %d bytes\n", bsize, ret); + return -1; + } + + printf("[OK] Read buffer\n"); + + /* Read more than bsize */ + ret = pread(fd, buffer, bsize + 1, 0); + if (ret < 0) { + perror("[ERROR] over-read: Unable to read the buffer"); + return -1; + } else if (ret != bsize) { + fprintf(stderr, "[ERROR] over-read: exp %d bytes, got %d bytes\n", bsize, ret); + return -1; + } + printf("[OK] Over read\n"); + + /* write 0x42 pattern */ + memset(buffer, 0x42, bsize); + ret = pwrite(fd, buffer, bsize, 0); + if (ret < 0) { + perror("[ERROR] Unable to write the buffer"); + return -1; + } else if (ret != bsize) { + fprintf(stderr, "[ERROR] read: Unable to write %d bytes, %d written\n", bsize, ret); + return -1; + } + + printf("[OK] Write buffer\n"); + + /* Read 0x42 pattern */ + memset(buffer, 0, bsize); + ret = pread(fd, buffer, bsize, 0); + if (ret < 0) { + perror("[ERROR] Unable to read back buffer"); + return -1; + } else if (ret != bsize) { + fprintf(stderr, "[ERROR] read-back: Unable to read %d bytes, got %d bytes\n", bsize, ret); + return -1; + } + for (i = 0; i < bsize; i++) { + if (buffer[i] != 0x42) { + fprintf(stderr, "[ERROR] read-back: pattern mismatch\n"); + return -1; + } + } + + printf("[OK] Read back buffer\n"); + + /* Write more than bsize */ + ret = pwrite(fd, buffer, bsize + 1, 0); + if (ret < 0) { + perror("[ERROR] over-write: Unable to read the buffer"); + return -1; + } else if (ret != bsize) { + fprintf(stderr, "[ERROR] over-write: exp %d bytes, got %d bytes\n", bsize, ret); + return -1; + } + printf("[OK] Over write\n"); + + memset(buffer, 0x00, bsize); + + /* test shared buffer */ + ret = 0; + if ((pid = fork()) == 0) { + /* child */ + + /* Write shared data */ + pwrite(fd, msg, sizeof(msg), 0); + + /*for (i = 0; i < 1000000; i++) { + memset(buffer, 0xFF, bsize); + pwrite(fd, buffer, bsize, 0); + pread(fd, buffer, bsize, 0); + for (j = 0; j < bsize; j++) { + if (buffer[j] != buffer[0]) { + fprintf(stderr, "[ERROR]\n"); + ret = -1; + } + } + }*/ + return 0; + } else { + int status; + + /* parent */ + i = 10000; + do { + /* insane ! */ + pread(fd, buffer, bsize, 0); + if (!memcmp(buffer, msg, sizeof(msg))) + break; + } while (i--); + + if (!i) { + fprintf(stderr, "[ERROR] shared-buffer: Unable to share data between processes\n"); + waitpid(pid, &status, 0); + return -1; + } + + printf("[OK] shared-buffer\n"); + + /*for (i = 0; i < 1000000; i++) { + memset(buffer, 0x00, bsize); + printf("Parent!\n"); + pwrite(fd, buffer, bsize, 0); + pread(fd, buffer, bsize, 0); + for (j = 0; j < bsize; j++) { + if (buffer[j] != 0x00) { + fprintf(stderr, "[ERROR]\n"); + ret = -1; + } + } + }*/ + + /* done */ + waitpid(pid, &status, 0); + if (status) ret = status; + } + + printf("Test complete - Congrats!\n"); +} |