#include <linux/sched/mm.h>
#include <linux/syscalls.h>
-int mshare_release(struct inode *inode, struct file *file)
+static ssize_t mshare_read(struct kiocb *iocb, struct iov_iter *iov)
+{
+ struct mm_struct *mm = iocb->ki_filp->private_data;
+ size_t ret;
+ u64 tmp[2];
+
+ tmp[0] = mm->mmap_base;
+ tmp[1] = mm->task_size - mm->mmap_base;
+ ret = copy_to_iter(&tmp, sizeof(tmp), iov);
+ if (!ret)
+ return -EFAULT;
+ return ret;
+}
+
+static int mshare_release(struct inode *inode, struct file *file)
{
struct mm_struct *mm = file->private_data;
}
static const struct file_operations mshare_fops = {
+ .read_iter = mshare_read,
.release = mshare_release,
};
if ((addr | len) & (PGDIR_SIZE - 1))
return -EINVAL;
+ if ((addr + len - 1) < addr)
+ return -EINVAL;
mm = mm_alloc();
if (!mm)
return -ENOMEM;
+ mm->mmap_base = addr;
+ mm->task_size = addr + len;
+ if (!mm->task_size)
+ mm->task_size--;
fd = anon_inode_getfd("mshare", &mshare_fops, mm, O_RDWR);