From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jason Chen CJ Date: Fri, 31 Aug 2018 10:58:55 +0800 Subject: [PATCH] VHM: add API to do guest gpa2hpa translation Added API vhm_vm_gpa2hpa: do translation between gpa and hpa for corresponding guest. Change-Id: I5ccdc3c6ac73d02d854878957093895c7f0cbee6 Tracked-On: 218445 Signed-off-by: Jason Chen CJ Reviewed-on: Reviewed-by: Chi, Mingqiang Reviewed-by: Dong, Eddie Tested-by: Dong, Eddie --- drivers/vhm/vhm_hypercall.c | 5 +++++ drivers/vhm/vhm_vm_mngt.c | 16 ++++++++++++++++ include/linux/vhm/acrn_common.h | 5 +++++ include/linux/vhm/acrn_hv_defs.h | 2 ++ include/linux/vhm/acrn_vhm_mm.h | 6 ++++++ include/linux/vhm/vhm_hypercall.h | 1 + include/linux/vhm/vhm_vm_mngt.h | 1 + 7 files changed, 36 insertions(+) diff --git a/drivers/vhm/vhm_hypercall.c b/drivers/vhm/vhm_hypercall.c index dc87d30151d5..384b86e60c9c 100644 --- a/drivers/vhm/vhm_hypercall.c +++ b/drivers/vhm/vhm_hypercall.c @@ -73,6 +73,11 @@ inline long hcall_set_memmap(unsigned long vmid, unsigned long memmap) return acrn_hypercall2(HC_VM_SET_MEMMAP, vmid, memmap); } +inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long gpa2hpa) +{ + return acrn_hypercall2(HC_VM_GPA2HPA, vmid, gpa2hpa); +} + inline long vhm_create_vm(struct vhm_vm *vm, unsigned long ioctl_param) { long ret = 0; diff --git a/drivers/vhm/vhm_vm_mngt.c b/drivers/vhm/vhm_vm_mngt.c index d1aa4ba1a4f0..8f1a00777dd4 100644 --- a/drivers/vhm/vhm_vm_mngt.c +++ b/drivers/vhm/vhm_vm_mngt.c @@ -130,6 +130,22 @@ int vhm_inject_msi(unsigned long vmid, unsigned long msi_addr, return 0; } +unsigned long vhm_vm_gpa2hpa(unsigned long vmid, unsigned long gpa) +{ + struct vm_gpa2hpa gpa2hpa; + int ret; + + gpa2hpa.gpa = gpa; + gpa2hpa.hpa = -1UL; /* Init value as invalid gpa */ + ret = hcall_vm_gpa2hpa(vmid, virt_to_phys(&gpa2hpa)); + if (ret < 0) { + pr_err("vhm: failed to inject!\n"); + return -EFAULT; + } + mb(); + return gpa2hpa.hpa; +} + void vm_list_add(struct list_head *list) { list_add(list, &vhm_vm_list); diff --git a/include/linux/vhm/acrn_common.h b/include/linux/vhm/acrn_common.h index cafb171490ca..f0567aa0f1dd 100644 --- a/include/linux/vhm/acrn_common.h +++ b/include/linux/vhm/acrn_common.h @@ -211,4 +211,9 @@ struct acrn_nmi_entry { unsigned long vcpuid; /* IN: -1 means vcpu0 */ } __attribute__((aligned(8))); +struct vm_gpa2hpa { + unsigned long gpa; /* IN: gpa to translation */ + unsigned long hpa; /* OUT: -1 means invalid gpa */ +} __attribute__((aligned(8))); + #endif /* ACRN_COMMON_H */ diff --git a/include/linux/vhm/acrn_hv_defs.h b/include/linux/vhm/acrn_hv_defs.h index 7b438cc01b48..d527a8fa8435 100644 --- a/include/linux/vhm/acrn_hv_defs.h +++ b/include/linux/vhm/acrn_hv_defs.h @@ -86,9 +86,11 @@ #define HC_SET_IOREQ_BUFFER _HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x00) #define HC_NOTIFY_REQUEST_FINISH _HC_ID(HC_ID, HC_ID_IOREQ_BASE + 0x01) + /* Guest memory management */ #define HC_ID_MEM_BASE 0x300UL #define HC_VM_SET_MEMMAP _HC_ID(HC_ID, HC_ID_MEM_BASE + 0x00) +#define HC_VM_GPA2HPA _HC_ID(HC_ID, HC_ID_MEM_BASE + 0x01) #define ACRN_DOM0_VMID (0UL) #define ACRN_INVALID_VMID (-1UL) diff --git a/include/linux/vhm/acrn_vhm_mm.h b/include/linux/vhm/acrn_vhm_mm.h index e701254bc249..1af6fd3aa11b 100644 --- a/include/linux/vhm/acrn_vhm_mm.h +++ b/include/linux/vhm/acrn_vhm_mm.h @@ -70,6 +70,12 @@ #define MMU_MEM_ATTR_ALL_WB 0x00000047 #define MMU_MEM_ATTR_ALL_WC 0x00000207 +/* 1:1 mapping for service OS */ +static inline unsigned long acrn_hpa2gpa(unsigned long hpa) +{ + return hpa; +} + void *map_guest_phys(unsigned long vmid, u64 uos_phys, size_t size); int unmap_guest_phys(unsigned long vmid, u64 uos_phys); int set_mmio_map(unsigned long vmid, unsigned long guest_gpa, diff --git a/include/linux/vhm/vhm_hypercall.h b/include/linux/vhm/vhm_hypercall.h index e372ea48fa81..f1ed9a07e708 100644 --- a/include/linux/vhm/vhm_hypercall.h +++ b/include/linux/vhm/vhm_hypercall.h @@ -144,6 +144,7 @@ inline long hcall_set_ioreq_buffer(unsigned long vmid, unsigned long buffer); inline long hcall_notify_req_finish(unsigned long vmid, unsigned long vcpu_mask); inline long hcall_set_memmap(unsigned long vmid, unsigned long memmap); +inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long gpa2hpa); inline long vhm_create_vm(struct vhm_vm *vm, unsigned long ioctl_param); inline long vhm_resume_vm(struct vhm_vm *vm); inline long vhm_pause_vm(struct vhm_vm *vm); diff --git a/include/linux/vhm/vhm_vm_mngt.h b/include/linux/vhm/vhm_vm_mngt.h index 77c21c4bba7a..5edacb31dc1b 100644 --- a/include/linux/vhm/vhm_vm_mngt.h +++ b/include/linux/vhm/vhm_vm_mngt.h @@ -86,6 +86,7 @@ void put_vm(struct vhm_vm *vm); int vhm_get_vm_info(unsigned long vmid, struct vm_info *info); int vhm_inject_msi(unsigned long vmid, unsigned long msi_addr, unsigned long msi_data); +unsigned long vhm_vm_gpa2hpa(unsigned long vmid, unsigned long gpa); void vm_list_add(struct list_head *list); void vm_mutex_lock(struct mutex *mlock); -- https://clearlinux.org