clear-pkgs-linux-iot-lts2018/0532-sos-vhm-add-hcall_writ...

160 lines
5.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: "Li, Fei1" <fei1.li@intel.com>
Date: Fri, 31 Aug 2018 10:59:02 +0800
Subject: [PATCH] sos: vhm: add hcall_write_protect_page hypercall
1. add write_protect_page to set or unset one page write protect
2. replace update_memmap_attr with write_protect_page to set or
unset one page write protect
3. replace update_memmap_attr with set_mmio_map to add guest memory region
Signed-off-by: Li, Fei1 <fei1.li@intel.com>
---
drivers/vhm/vhm_hypercall.c | 5 +++++
drivers/vhm/vhm_mm.c | 25 ++++++++++++++++++++-----
include/linux/vhm/acrn_hv_defs.h | 14 ++++++++++++++
include/linux/vhm/acrn_vhm_mm.h | 23 +++++------------------
include/linux/vhm/vhm_hypercall.h | 2 ++
5 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/drivers/vhm/vhm_hypercall.c b/drivers/vhm/vhm_hypercall.c
index 2c51c366c60f..8611bb1819d4 100644
--- a/drivers/vhm/vhm_hypercall.c
+++ b/drivers/vhm/vhm_hypercall.c
@@ -112,6 +112,11 @@ inline long hcall_set_memmaps(unsigned long pa_memmaps)
return acrn_hypercall1(HC_VM_SET_MEMMAPS, pa_memmaps);
}
+inline long hcall_write_protect_page(unsigned long vmid, unsigned long wp)
+{
+ return acrn_hypercall2(HC_VM_WRITE_PROTECT_PAGE, vmid, wp);
+}
+
inline long hcall_set_ioreq_buffer(unsigned long vmid, unsigned long buffer)
{
return acrn_hypercall2(HC_SET_IOREQ_BUFFER, vmid, buffer);
diff --git a/drivers/vhm/vhm_mm.c b/drivers/vhm/vhm_mm.c
index f663558ae943..c7ca8e99612d 100644
--- a/drivers/vhm/vhm_mm.c
+++ b/drivers/vhm/vhm_mm.c
@@ -159,12 +159,27 @@ int set_memmaps(struct set_memmaps *memmaps)
return 0;
}
-int update_memmap_attr(unsigned long vmid, unsigned long guest_gpa,
- unsigned long host_gpa, unsigned long len,
- unsigned int mem_type, unsigned int mem_access_right)
+/*
+ * when set is true, set page write protection,
+ * else clear page write protection.
+ */
+int write_protect_page(unsigned long vmid,
+ unsigned long gpa, unsigned char set)
{
- return _mem_set_memmap(vmid, guest_gpa, host_gpa, len,
- mem_type, mem_access_right, MAP_MEM);
+ struct wp_data wp;
+
+ wp.set = set;
+ wp.gpa = gpa;
+
+ if (hcall_write_protect_page(vmid,
+ virt_to_phys(&wp)) < 0) {
+ pr_err("vhm: vm[%ld] %s failed !\n", vmid, __func__);
+ return -EFAULT;
+ }
+
+ pr_debug("VHM: %s, gpa: 0x%lx, set: %d\n", __func__, gpa, set);
+
+ return 0;
}
int map_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap)
diff --git a/include/linux/vhm/acrn_hv_defs.h b/include/linux/vhm/acrn_hv_defs.h
index 67316fb49999..74f8a137206d 100644
--- a/include/linux/vhm/acrn_hv_defs.h
+++ b/include/linux/vhm/acrn_hv_defs.h
@@ -96,6 +96,7 @@
#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 HC_VM_SET_MEMMAPS _HC_ID(HC_ID, HC_ID_MEM_BASE + 0x02)
+#define HC_VM_WRITE_PROTECT_PAGE _HC_ID(HC_ID, HC_ID_MEM_BASE + 0x03)
/* PCI assignment*/
#define HC_ID_PCI_BASE 0x50UL
@@ -186,6 +187,19 @@ struct set_memmaps {
uint64_t memmaps_gpa;
} __attribute__((aligned(8)));
+struct wp_data {
+ /** set page write protect permission.
+ * ture: set the wp; flase: clear the wp
+ */
+ uint8_t set;
+
+ /** Reserved */
+ uint64_t pad:56;
+
+ /** the guest physical address of the page to change */
+ uint64_t gpa;
+} __aligned(8);
+
struct sbuf_setup_param {
uint16_t pcpu_id;
uint16_t reserved;
diff --git a/include/linux/vhm/acrn_vhm_mm.h b/include/linux/vhm/acrn_vhm_mm.h
index 645a8a56531e..0769200ea3bf 100644
--- a/include/linux/vhm/acrn_vhm_mm.h
+++ b/include/linux/vhm/acrn_vhm_mm.h
@@ -137,29 +137,16 @@ int unset_mmio_map(unsigned long vmid, unsigned long guest_gpa,
unsigned long host_gpa, unsigned long len);
/**
- * update_memmap_attr - update mmio EPT mapping between UOS gpa and SOS gpa
+ * write_protect_page - change one page write protection
*
* @vmid: guest vmid
- * @guest_gpa: gpa of UOS
- * @host_gpa: gpa of SOS
- * @len: memory mapped length
- * @mem_type: memory mapping type. Possible value could be:
- * MEM_TYPE_WB
- * MEM_TYPE_WT
- * MEM_TYPE_UC
- * MEM_TYPE_WC
- * MEM_TYPE_WP
- * @mem_access_right: memory mapping access. Possible value could be:
- * MEM_ACCESS_READ
- * MEM_ACCESS_WRITE
- * MEM_ACCESS_EXEC
- * MEM_ACCESS_RWX
+ * @gpa: gpa in guest vmid
+ * @set: set or clear page write protection
*
* Return: 0 on success, <0 for error.
*/
-int update_memmap_attr(unsigned long vmid, unsigned long guest_gpa,
- unsigned long host_gpa, unsigned long len,
- unsigned int mem_type, unsigned int mem_access_right);
+int write_protect_page(unsigned long vmid,
+ unsigned long gpa, unsigned char set);
int vhm_dev_mmap(struct file *file, struct vm_area_struct *vma);
diff --git a/include/linux/vhm/vhm_hypercall.h b/include/linux/vhm/vhm_hypercall.h
index 4de5e46b9d0f..87a34fec8d90 100644
--- a/include/linux/vhm/vhm_hypercall.h
+++ b/include/linux/vhm/vhm_hypercall.h
@@ -151,6 +151,8 @@ inline long hcall_get_cpu_state(unsigned long cmd, unsigned long state_pa);
inline long hcall_set_memmap(unsigned long vmid,
unsigned long memmap);
inline long hcall_set_memmaps(unsigned long pa_memmaps);
+inline long hcall_write_protect_page(unsigned long vmid,
+ unsigned long wp);
inline long hcall_set_ioreq_buffer(unsigned long vmid,
unsigned long buffer);
inline long hcall_notify_req_finish(unsigned long vmid, unsigned long vcpu);
--
https://clearlinux.org