2019-03-29 14:12:17 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-10-11 02:06:46 +08:00
|
|
|
From: Jason Chen CJ <jason.cj.chen@intel.com>
|
|
|
|
Date: Fri, 31 Aug 2018 10:58:55 +0800
|
2019-03-29 14:12:17 +08:00
|
|
|
Subject: [PATCH] VHM: add API to do guest gpa2hpa translation
|
2018-10-11 02:06:46 +08:00
|
|
|
|
|
|
|
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 <jason.cj.chen@intel.com>
|
2018-10-16 02:05:43 +08:00
|
|
|
Reviewed-on:
|
2018-10-11 02:06:46 +08:00
|
|
|
Reviewed-by: Chi, Mingqiang <mingqiang.chi@intel.com>
|
|
|
|
Reviewed-by: Dong, Eddie <eddie.dong@intel.com>
|
|
|
|
Tested-by: Dong, Eddie <eddie.dong@intel.com>
|
|
|
|
---
|
|
|
|
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
|
2020-05-05 09:02:46 +08:00
|
|
|
index dc87d3015..384b86e60 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index d1aa4ba1a..8f1a00777 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index cafb17149..f0567aa0f 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index 7b438cc01..d527a8fa8 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index e701254bc..1af6fd3aa 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index e372ea48f..f1ed9a07e 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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
|
2020-05-05 09:02:46 +08:00
|
|
|
index 77c21c4bb..5edacb31d 100644
|
2018-10-11 02:06:46 +08:00
|
|
|
--- 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);
|
|
|
|
--
|
2019-04-08 18:08:36 +08:00
|
|
|
https://clearlinux.org
|
2018-10-11 02:06:46 +08:00
|
|
|
|