aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2017-10-27 18:20:22 +0200
committerFelix Morgner <felix.morgner@gmail.com>2017-10-27 18:20:22 +0200
commitf43e1bc39617075968c96f6849b36c2395979187 (patch)
treebe207c6f51c2906754fccdf18e95bff6be96084f
parent96939fa01f6fa444a6fe2822d0c695fad99308ab (diff)
downloaddev-cyber-f43e1bc39617075968c96f6849b36c2395979187.tar.xz
dev-cyber-f43e1bc39617075968c96f6849b36c2395979187.zip
cyber_file: implement memory mapping support
-rw-r--r--src/cyber_file.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cyber_file.c b/src/cyber_file.c
index 6aa08a8..18fc915 100644
--- a/src/cyber_file.c
+++ b/src/cyber_file.c
@@ -20,6 +20,8 @@
#include <asm/uaccess.h>
#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
static char const * cyberPattern = "!CYBER! ";
static char * cyberSpace;
@@ -62,6 +64,17 @@ static ssize_t cyber_file_read(struct file * file, char __user * buffer, size_t
return cyberChunks * cybersPerChunk * 8;
}
+static int cyber_file_mmap(struct file * file, struct vm_area_struct * vma)
+{
+ ssize_t vmaSize = vma->vm_end - vma->vm_start;
+ ssize_t offset = 0;
+ for(; vmaSize; vmaSize -= PAGE_SIZE, ++offset)
+ {
+ vm_insert_page(vma, vma->vm_start + offset * PAGE_SIZE, virt_to_page(cyberSpace));
+ }
+ return 0;
+}
+
/**
* Handler for CYBER device write events
*
@@ -94,6 +107,7 @@ struct file_operations const cyber_operations = {
.read = cyber_file_read,
.write = cyber_file_write,
.release = cyber_file_close,
+ .mmap = cyber_file_mmap,
};
int cyber_file_init(void)