diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2017-10-27 18:20:22 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2017-10-27 18:20:22 +0200 |
| commit | f43e1bc39617075968c96f6849b36c2395979187 (patch) | |
| tree | be207c6f51c2906754fccdf18e95bff6be96084f | |
| parent | 96939fa01f6fa444a6fe2822d0c695fad99308ab (diff) | |
| download | dev-cyber-f43e1bc39617075968c96f6849b36c2395979187.tar.xz dev-cyber-f43e1bc39617075968c96f6849b36c2395979187.zip | |
cyber_file: implement memory mapping support
| -rw-r--r-- | src/cyber_file.c | 14 |
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) |
