From 57690479bd6b6464d8d839e791416e43e1a6a1cd Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Fri, 22 Jul 2016 20:48:54 +0900 Subject: [PATCH] read/patch_process_vm(): map non-LWK physical addresses properly --- arch/x86/kernel/memory.c | 28 ++++++++++++++++++++++++---- kernel/procfs.c | 7 +++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/memory.c b/arch/x86/kernel/memory.c index 39ee5631..79aac667 100644 --- a/arch/x86/kernel/memory.c +++ b/arch/x86/kernel/memory.c @@ -2295,8 +2295,18 @@ int read_process_vm(struct process_vm *vm, void *kdst, const void *usrc, size_t return error; } - va = phys_to_virt(pa); - memcpy(to, va, cpsize); + if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) || + pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) { + dkprintf("%s: pa is outside of LWK memory, to: %p, pa: %p," + "cpsize: %d\n", __FUNCTION__, to, pa, cpsize); + va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE); + memcpy(to, va, cpsize); + ihk_mc_unmap_virtual(va, 1, 1); + } + else { + va = phys_to_virt(pa); + memcpy(to, va, cpsize); + } from += cpsize; to += cpsize; @@ -2422,8 +2432,18 @@ int patch_process_vm(struct process_vm *vm, void *udst, const void *ksrc, size_t return error; } - va = phys_to_virt(pa); - memcpy(va, from, cpsize); + if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) || + pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) { + dkprintf("%s: pa is outside of LWK memory, from: %p," + "pa: %p, cpsize: %d\n", __FUNCTION__, from, pa, cpsize); + va = ihk_mc_map_virtual(pa, 1, PTATTR_ACTIVE); + memcpy(va, from, cpsize); + ihk_mc_unmap_virtual(va, 1, 1); + } + else { + va = phys_to_virt(pa); + memcpy(va, from, cpsize); + } from += cpsize; to += cpsize; diff --git a/kernel/procfs.c b/kernel/procfs.c index c5479460..4afa2eb2 100644 --- a/kernel/procfs.c +++ b/kernel/procfs.c @@ -281,6 +281,13 @@ process_procfs_request(unsigned long rarg) ans = -EIO; goto end; } + + if (pa < ihk_mc_get_memory_address(IHK_MC_GMA_MAP_START, 0) || + pa >= ihk_mc_get_memory_address(IHK_MC_GMA_MAP_END, 0)) { + ans = -EIO; + goto end; + } + va = phys_to_virt(pa); if(readwrite) memcpy(va, buf + ans, size);