From: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> Add find_mem_range API support to indicate if a memory address belonging to system memory. This is used to check if an EPT violation caused by memory accessing in the later patch. Signed-off-by: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> Signed-off-by: Jason Chen CJ <jason.cj.chen@xxxxxxxxx> --- arch/x86/kvm/vmx/pkvm/hyp/memory.c | 37 ++++++++++++++++++++++++++++++ arch/x86/kvm/vmx/pkvm/hyp/memory.h | 8 +++++++ 2 files changed, 45 insertions(+) diff --git a/arch/x86/kvm/vmx/pkvm/hyp/memory.c b/arch/x86/kvm/vmx/pkvm/hyp/memory.c index eb913cf08691..d3e479860189 100644 --- a/arch/x86/kvm/vmx/pkvm/hyp/memory.c +++ b/arch/x86/kvm/vmx/pkvm/hyp/memory.c @@ -6,6 +6,8 @@ #include <linux/types.h> #include <asm/kvm_pkvm.h> +#include "memory.h" + unsigned long __page_base_offset; unsigned long __symbol_base_offset; @@ -26,3 +28,38 @@ unsigned long pkvm_virt_to_symbol_phys(void *virt) { return (unsigned long)virt - __symbol_base_offset; } + +bool find_mem_range(unsigned long addr, struct mem_range *range) +{ + int cur, left = 0, right = hyp_memblock_nr; + struct memblock_region *reg; + unsigned long end; + + range->start = 0; + range->end = ULONG_MAX; + + /* The list of memblock regions is sorted, binary search it */ + while (left < right) { + cur = (left + right) >> 1; + reg = &hyp_memory[cur]; + end = reg->base + reg->size; + if (addr < reg->base) { + right = cur; + range->end = reg->base; + } else if (addr >= end) { + left = cur + 1; + range->start = end; + } else { + range->start = reg->base; + range->end = end; + return true; + } + } + + return false; +} + +bool mem_range_included(struct mem_range *child, struct mem_range *parent) +{ + return parent->start <= child->start && child->end <= parent->end; +} diff --git a/arch/x86/kvm/vmx/pkvm/hyp/memory.h b/arch/x86/kvm/vmx/pkvm/hyp/memory.h index 87b53275bc74..c9175272096b 100644 --- a/arch/x86/kvm/vmx/pkvm/hyp/memory.h +++ b/arch/x86/kvm/vmx/pkvm/hyp/memory.h @@ -12,4 +12,12 @@ unsigned long pkvm_virt_to_symbol_phys(void *virt); #define __pkvm_pa_symbol(x) pkvm_virt_to_symbol_phys((void *)x) +struct mem_range { + unsigned long start; + unsigned long end; +}; + +bool find_mem_range(unsigned long addr, struct mem_range *range); +bool mem_range_included(struct mem_range *child, struct mem_range *parent); + #endif -- 2.25.1