From f43e1bc39617075968c96f6849b36c2395979187 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 27 Oct 2017 18:20:22 +0200 Subject: cyber_file: implement memory mapping support --- src/cyber_file.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 #include +#include +#include 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) -- cgit v1.2.3