clear-pkgs-linux-iot-lts2018/0468-VHM-add-API-to-do-gues...

143 lines
5.1 KiB
Diff
Raw Normal View History

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
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>
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);
--
https://clearlinux.org
2018-10-11 02:06:46 +08:00