1f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger/* 2f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger * Copyright (C) 2013 Richard Weinberger <richrd@nod.at> 3f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger * 4f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger * This program is free software; you can redistribute it and/or modify 5f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger * it under the terms of the GNU General Public License version 2 as 6f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger * published by the Free Software Foundation. 7f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger */ 8f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger 9f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger#include <linux/uaccess.h> 10f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger#include <linux/kernel.h> 11f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger#include <os.h> 12f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger 13f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinbergerlong probe_kernel_read(void *dst, const void *src, size_t size) 14f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger{ 15f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger void *psrc = (void *)rounddown((unsigned long)src, PAGE_SIZE); 16f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger 17f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger if ((unsigned long)src < PAGE_SIZE || size <= 0) 18f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger return -EFAULT; 19f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger 20f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger if (os_mincore(psrc, size + src - psrc) <= 0) 21f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger return -EFAULT; 22f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger 23f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger return __probe_kernel_read(dst, src, size); 24f75b1b1bedfb498cc43a992ce4d7ed8df3b1e770Richard Weinberger} 25