From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Mingqiang Chi Date: Fri, 31 Aug 2018 10:59:01 +0800 Subject: [PATCH] vhm: add trusty init/de-init support vhm will allocate trusty memory from cma then do ept map for a VM with trusty. vhm will de-init trusty for a VM during its destroying. Signed-off-by: Mingqiang Chi Signed-off-by: Jason Chen CJ Reviewed-by: Zhao Yakui Acked-by: Eddie Dong --- drivers/char/vhm/vhm_dev.c | 10 ++++++++++ drivers/vhm/vhm_mm.c | 25 +++++++++++++++++++++++++ include/linux/vhm/acrn_vhm_mm.h | 3 +++ include/linux/vhm/vhm_vm_mngt.h | 1 + 4 files changed, 39 insertions(+) diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c index 75cdbb730fa9..964aee295cda 100644 --- a/drivers/char/vhm/vhm_dev.c +++ b/drivers/char/vhm/vhm_dev.c @@ -226,6 +226,14 @@ static long vhm_dev_ioctl(struct file *filep, vm->vmid = created_vm.vmid; + if (created_vm.vm_flag & SECURE_WORLD_ENABLED) { + ret = init_trusty(vm); + if (ret < 0) { + pr_err("vhm: failed to init trusty for VM!\n"); + return ret; + } + } + pr_info("vhm: VM %d created\n", created_vm.vmid); break; } @@ -258,6 +266,8 @@ static long vhm_dev_ioctl(struct file *filep, } case IC_DESTROY_VM: { + if (vm->trusty_host_gpa) + deinit_trusty(vm); ret = hcall_destroy_vm(vm->vmid); if (ret < 0) { pr_err("failed to destroy VM %ld\n", vm->vmid); diff --git a/drivers/vhm/vhm_mm.c b/drivers/vhm/vhm_mm.c index fb09ed2f994f..bff448208836 100644 --- a/drivers/vhm/vhm_mm.c +++ b/drivers/vhm/vhm_mm.c @@ -305,6 +305,31 @@ int check_guest_mem(struct vhm_vm *vm) return 0; } +#define TRUSTY_MEM_GPA_BASE (511UL * 1024UL * 1024UL * 1024UL) +#define TRUSTY_MEM_SIZE (0x01000000) +int init_trusty(struct vhm_vm *vm) +{ + unsigned long host_gpa, guest_gpa = TRUSTY_MEM_GPA_BASE; + unsigned long len = TRUSTY_MEM_SIZE; + + host_gpa = _alloc_memblk(vm->dev, TRUSTY_MEM_SIZE); + if (host_gpa == 0ULL) + return -ENOMEM; + + vm->trusty_host_gpa = host_gpa; + + pr_info("VHM: set ept for trusty memory [host_gpa=0x%lx, " + "guest_gpa=0x%lx, len=0x%lx]", host_gpa, guest_gpa, len); + return _mem_set_memmap(vm->vmid, guest_gpa, host_gpa, len, + MEM_TYPE_WB, MEM_ACCESS_RWX, MAP_MEM); +} + +void deinit_trusty(struct vhm_vm *vm) +{ + _free_memblk(vm->dev, vm->trusty_host_gpa, TRUSTY_MEM_SIZE); + vm->trusty_host_gpa = 0; +} + static void guest_vm_open(struct vm_area_struct *vma) { struct vhm_vm *vm = vma->vm_file->private_data; diff --git a/include/linux/vhm/acrn_vhm_mm.h b/include/linux/vhm/acrn_vhm_mm.h index 87d668f735dc..5ff9af92f81f 100644 --- a/include/linux/vhm/acrn_vhm_mm.h +++ b/include/linux/vhm/acrn_vhm_mm.h @@ -198,6 +198,9 @@ int alloc_guest_memseg(struct vhm_vm *vm, struct vm_memseg *memseg); */ int map_guest_memseg(struct vhm_vm *vm, struct vm_memmap *memmap); +int init_trusty(struct vhm_vm *vm); +void deinit_trusty(struct vhm_vm *vm); + int _mem_set_memmap(unsigned long vmid, unsigned long guest_gpa, unsigned long host_gpa, unsigned long len, unsigned int mem_type, unsigned int mem_access_right, diff --git a/include/linux/vhm/vhm_vm_mngt.h b/include/linux/vhm/vhm_vm_mngt.h index 14e9fe7a4d5f..b5f6ca1f2dea 100644 --- a/include/linux/vhm/vhm_vm_mngt.h +++ b/include/linux/vhm/vhm_vm_mngt.h @@ -94,6 +94,7 @@ struct vhm_vm { struct device *dev; struct list_head list; unsigned long vmid; + unsigned long trusty_host_gpa; int ioreq_fallback_client; long refcnt; struct mutex seg_lock; -- https://clearlinux.org