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);