clear-pkgs-linux-iot-lts2018/0471-sos-cleanup-hypercall-...

840 lines
23 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mingqiang Chi <mingqiang.chi@intel.com>
Date: Fri, 31 Aug 2018 10:58:56 +0800
Subject: [PATCH] sos: cleanup hypercall API
Put all hypercall APIs into vhm_hypercall.c
other modules need to call hypercall API from
this file.
Change-Id: Id896a8300cf54279151a9d5674ed27a352df3f3f
Tracked-On:218445
Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com>
Reviewed-on:
Reviewed-by: Dong, Eddie <eddie.dong@intel.com>
Tested-by: Dong, Eddie <eddie.dong@intel.com>
---
drivers/char/vhm/vhm_dev.c | 237 +++++++++++++++++++---
drivers/vhm/vhm_hypercall.c | 320 ++++--------------------------
include/linux/vhm/vhm_hypercall.h | 63 +++---
3 files changed, 283 insertions(+), 337 deletions(-)
diff --git a/drivers/char/vhm/vhm_dev.c b/drivers/char/vhm/vhm_dev.c
index 97c20d82154f..32de7aeb30a1 100644
--- a/drivers/char/vhm/vhm_dev.c
+++ b/drivers/char/vhm/vhm_dev.c
@@ -92,6 +92,16 @@ static struct device *vhm_device;
static struct tasklet_struct vhm_io_req_tasklet;
static atomic_t ioreq_retry = ATOMIC_INIT(0);
+/* max num of pass-through devices using msix */
+#define MAX_ENTRY 3
+
+struct table_iomems {
+ /* device's virtual BDF */
+ unsigned short virt_bdf;
+ /* virtual base address of MSI-X table in memory space after ioremap */
+ unsigned long mmap_addr;
+} tables[MAX_ENTRY];
+
static int vhm_dev_open(struct inode *inodep, struct file *filep)
{
struct vhm_vm *vm;
@@ -153,25 +163,66 @@ static long vhm_dev_ioctl(struct file *filep,
}
switch (ioctl_num) {
- case IC_CREATE_VM:
- ret = vhm_create_vm(vm, ioctl_param);
- break;
+ case IC_CREATE_VM: {
+ struct acrn_create_vm created_vm;
+
+ if (copy_from_user(&created_vm, (void *)ioctl_param,
+ sizeof(struct acrn_create_vm)))
+ return -EFAULT;
+
+ ret = hcall_create_vm(virt_to_phys(&created_vm));
+ if ((ret < 0) ||
+ (created_vm.vmid == ACRN_INVALID_VMID)) {
+ pr_err("vhm: failed to create VM from Hypervisor !\n");
+ return -EFAULT;
+ }
+
+ if (copy_to_user((void *)ioctl_param, &created_vm,
+ sizeof(struct acrn_create_vm)))
+ return -EFAULT;
+
+ vm->vmid = created_vm.vmid;
- case IC_RESUME_VM:
- ret = vhm_resume_vm(vm);
+ pr_info("vhm: VM %ld created\n", created_vm.vmid);
break;
+ }
- case IC_PAUSE_VM:
- ret = vhm_pause_vm(vm);
+ case IC_RESUME_VM: {
+ ret = hcall_resume_vm(vm->vmid);
+ if (ret < 0) {
+ pr_err("vhm: failed to start VM %ld!\n", vm->vmid);
+ return -EFAULT;
+ }
break;
+ }
- case IC_DESTROY_VM:
- ret = vhm_destroy_vm(vm);
+ case IC_PAUSE_VM: {
+ ret = hcall_pause_vm(vm->vmid);
+ if (ret < 0) {
+ pr_err("vhm: failed to pause VM %ld!\n", vm->vmid);
+ return -EFAULT;
+ }
break;
+ }
- case IC_QUERY_VMSTATE:
- ret = vhm_query_vm_state(vm);
+ case IC_DESTROY_VM: {
+ ret = hcall_destroy_vm(vm->vmid);
+ if (ret < 0) {
+ pr_err("failed to destroy VM %ld\n", vm->vmid);
+ return -EFAULT;
+ }
+ vm->vmid = ACRN_INVALID_VMID;
break;
+ }
+
+ case IC_QUERY_VMSTATE: {
+ ret = hcall_query_vm_state(vm->vmid);
+ if (ret < 0) {
+ pr_err("vhm: failed to query VM State%ld!\n", vm->vmid);
+ return -EFAULT;
+ }
+ return ret;
+ }
case IC_ALLOC_MEMSEG: {
struct vm_memseg memseg;
@@ -239,17 +290,43 @@ static long vhm_dev_ioctl(struct file *filep,
}
case IC_ASSERT_IRQLINE: {
- ret = vhm_assert_irqline(vm, ioctl_param);
+ struct acrn_irqline irq;
+
+ if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
+ return -EFAULT;
+
+ ret = hcall_assert_irqline(vm->vmid, virt_to_phys(&irq));
+ if (ret < 0) {
+ pr_err("vhm: failed to assert irq!\n");
+ return -EFAULT;
+ }
break;
}
-
case IC_DEASSERT_IRQLINE: {
- ret = vhm_deassert_irqline(vm, ioctl_param);
+ struct acrn_irqline irq;
+
+ if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
+ return -EFAULT;
+
+ ret = hcall_deassert_irqline(vm->vmid, virt_to_phys(&irq));
+ if (ret < 0) {
+ pr_err("vhm: failed to deassert irq!\n");
+ return -EFAULT;
+ }
break;
}
-
case IC_PULSE_IRQLINE: {
- ret = vhm_pulse_irqline(vm, ioctl_param);
+ struct acrn_irqline irq;
+
+ if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
+ return -EFAULT;
+
+ ret = hcall_pulse_irqline(vm->vmid,
+ virt_to_phys(&irq));
+ if (ret < 0) {
+ pr_err("vhm: failed to assert irq!\n");
+ return -EFAULT;
+ }
break;
}
@@ -268,27 +345,141 @@ static long vhm_dev_ioctl(struct file *filep,
}
case IC_ASSIGN_PTDEV: {
- ret = vhm_assign_ptdev(vm, ioctl_param);
+ uint16_t bdf;
+
+ if (copy_from_user(&bdf,
+ (void *)ioctl_param, sizeof(uint16_t)))
+ return -EFAULT;
+
+ ret = hcall_assign_ptdev(vm->vmid, virt_to_phys(&bdf));
+ if (ret < 0) {
+ pr_err("vhm: failed to assign ptdev!\n");
+ return -EFAULT;
+ }
break;
}
-
case IC_DEASSIGN_PTDEV: {
- ret = vhm_deassign_ptdev(vm, ioctl_param);
+ uint16_t bdf;
+
+ if (copy_from_user(&bdf,
+ (void *)ioctl_param, sizeof(uint16_t)))
+ return -EFAULT;
+
+ ret = hcall_deassign_ptdev(vm->vmid, virt_to_phys(&bdf));
+ if (ret < 0) {
+ pr_err("vhm: failed to deassign ptdev!\n");
+ return -EFAULT;
+ }
break;
}
case IC_SET_PTDEV_INTR_INFO: {
- ret = vhm_set_ptdev_intr_info(vm, ioctl_param);
+ struct acrn_ptdev_irq pt_irq;
+ int i;
+
+ if (copy_from_user(&pt_irq,
+ (void *)ioctl_param, sizeof(pt_irq)))
+ return -EFAULT;
+
+ ret = hcall_set_ptdev_intr_info(vm->vmid,
+ virt_to_phys(&pt_irq));
+ if (ret < 0) {
+ pr_err("vhm: failed to set intr info for ptdev!\n");
+ return -EFAULT;
+ }
+
+ if (pt_irq.msix.table_paddr) {
+ for (i = 0; i < MAX_ENTRY; i++) {
+ if (tables[i].virt_bdf)
+ continue;
+
+ tables[i].virt_bdf = pt_irq.virt_bdf;
+ tables[i].mmap_addr =
+ ioremap_nocache(pt_irq.msix.table_paddr,
+ pt_irq.msix.table_size);
+ break;
+ }
+ }
+
break;
}
-
case IC_RESET_PTDEV_INTR_INFO: {
- ret = vhm_reset_ptdev_intr_info(vm, ioctl_param);
+ struct acrn_ptdev_irq pt_irq;
+ int i;
+
+ if (copy_from_user(&pt_irq,
+ (void *)ioctl_param, sizeof(pt_irq)))
+ return -EFAULT;
+
+ ret = hcall_reset_ptdev_intr_info(vm->vmid,
+ virt_to_phys(&pt_irq));
+ if (ret < 0) {
+ pr_err("vhm: failed to reset intr info for ptdev!\n");
+ return -EFAULT;
+ }
+
+ if (pt_irq.msix.table_paddr) {
+ for (i = 0; i < MAX_ENTRY; i++) {
+ if (tables[i].virt_bdf)
+ continue;
+
+ tables[i].virt_bdf = pt_irq.virt_bdf;
+ tables[i].mmap_addr =
+ ioremap_nocache(pt_irq.msix.table_paddr,
+ pt_irq.msix.table_size);
+ break;
+ }
+ }
+
break;
}
case IC_VM_PCI_MSIX_REMAP: {
- ret = vhm_remap_pci_msix(vm, ioctl_param);
+ struct acrn_vm_pci_msix_remap msix_remap;
+
+ if (copy_from_user(&msix_remap,
+ (void *)ioctl_param, sizeof(msix_remap)))
+ return -EFAULT;
+
+ ret = hcall_remap_pci_msix(vm->vmid, virt_to_phys(&msix_remap));
+
+ if (copy_to_user((void *)ioctl_param,
+ &msix_remap, sizeof(msix_remap)))
+ return -EFAULT;
+
+ if (msix_remap.msix) {
+ void __iomem *msix_entry;
+ int i;
+
+ for (i = 0; i < MAX_ENTRY; i++) {
+ if (tables[i].virt_bdf == msix_remap.virt_bdf)
+ break;
+ }
+
+ if (!tables[i].mmap_addr)
+ return -EFAULT;
+
+ msix_entry = tables[i].mmap_addr +
+ msix_remap.msix_entry_index *
+ PCI_MSIX_ENTRY_SIZE;
+
+ /* mask the entry when setup */
+ writel(PCI_MSIX_ENTRY_CTRL_MASKBIT,
+ msix_entry + PCI_MSIX_ENTRY_VECTOR_CTRL);
+
+ /* setup the msi entry */
+ writel((uint32_t)msix_remap.msi_addr,
+ msix_entry + PCI_MSIX_ENTRY_LOWER_ADDR);
+ writel((uint32_t)(msix_remap.msi_addr >> 32),
+ msix_entry + PCI_MSIX_ENTRY_UPPER_ADDR);
+ writel(msix_remap.msi_data,
+ msix_entry + PCI_MSIX_ENTRY_DATA);
+
+ /* unmask the entry */
+ writel(msix_remap.vector_ctl &
+ PCI_MSIX_ENTRY_CTRL_MASKBIT,
+ msix_entry + PCI_MSIX_ENTRY_VECTOR_CTRL);
+ }
break;
}
diff --git a/drivers/vhm/vhm_hypercall.c b/drivers/vhm/vhm_hypercall.c
index 0f3f6c1c5f4c..11ca6b86baed 100644
--- a/drivers/vhm/vhm_hypercall.c
+++ b/drivers/vhm/vhm_hypercall.c
@@ -48,341 +48,97 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
-#include <linux/uaccess.h>
-#include <linux/io.h>
-#include <linux/pci.h>
+#include <linux/types.h>
#include <linux/vhm/acrn_hv_defs.h>
#include <linux/vhm/vhm_hypercall.h>
-/* max num of pass-through devices using msix */
-#define MAX_ENTRY 3
-
-struct table_iomems {
- /* device's virtual BDF */
- unsigned short virt_bdf;
- /* virtual base address of MSI-X table in memory space after ioremap */
- unsigned long mmap_addr;
-} tables[MAX_ENTRY];
-
-inline long hcall_inject_msi(unsigned long vmid, unsigned long msi)
+inline long hcall_create_vm(unsigned long vminfo)
{
- return acrn_hypercall2(HC_INJECT_MSI, vmid, msi);
+ return acrn_hypercall2(HC_CREATE_VM, 0, vminfo);
}
-inline long hcall_remap_pci_msix(unsigned long vmid, unsigned long msix)
+inline long hcall_resume_vm(unsigned long vmid)
{
- return acrn_hypercall2(HC_VM_PCI_MSIX_REMAP, vmid, msix);
+ return acrn_hypercall1(HC_RESUME_VM, vmid);
}
-inline long hcall_set_ioreq_buffer(unsigned long vmid, unsigned long buffer)
+inline long hcall_pause_vm(unsigned long vmid)
{
- return acrn_hypercall2(HC_SET_IOREQ_BUFFER, vmid, buffer);
+ return acrn_hypercall1(HC_PAUSE_VM, vmid);
}
-inline long hcall_notify_req_finish(unsigned long vmid, unsigned long vcpu_mask)
+inline long hcall_destroy_vm(unsigned long vmid)
{
- return acrn_hypercall2(HC_NOTIFY_REQUEST_FINISH, vmid, vcpu_mask);
+ return acrn_hypercall1(HC_DESTROY_VM, vmid);
}
-inline long hcall_set_memmap(unsigned long vmid, unsigned long memmap)
+inline long hcall_query_vm_state(unsigned long vmid)
{
- return acrn_hypercall2(HC_VM_SET_MEMMAP, vmid, memmap);
+ return acrn_hypercall1(HC_QUERY_VMSTATE, vmid);
}
-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)
+inline long hcall_set_memmap(unsigned long vmid, unsigned long memmap)
{
- long ret = 0;
- struct acrn_create_vm created_vm;
-
- if (copy_from_user(&created_vm, (void *)ioctl_param,
- sizeof(struct acrn_create_vm)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_CREATE_VM, 0,
- virt_to_phys(&created_vm));
- if ((ret < 0) ||
- (created_vm.vmid == ACRN_INVALID_VMID)) {
- pr_err("vhm: failed to create VM from Hypervisor !\n");
- return -EFAULT;
- }
-
- if (copy_to_user((void *)ioctl_param, &created_vm,
- sizeof(struct acrn_create_vm)))
- return -EFAULT;
-
- vm->vmid = created_vm.vmid;
- pr_info("vhm: VM %ld created\n", created_vm.vmid);
-
- return ret;
+ return acrn_hypercall2(HC_VM_SET_MEMMAP, vmid, memmap);
}
-inline long vhm_resume_vm(struct vhm_vm *vm)
+inline long hcall_set_ioreq_buffer(unsigned long vmid, unsigned long buffer)
{
- long ret = 0;
-
- ret = acrn_hypercall1(HC_RESUME_VM, vm->vmid);
- if (ret < 0) {
- pr_err("vhm: failed to start VM %ld!\n", vm->vmid);
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_SET_IOREQ_BUFFER, vmid, buffer);
}
-inline long vhm_pause_vm(struct vhm_vm *vm)
+inline long hcall_notify_req_finish(unsigned long vmid, unsigned long vcpu_mask)
{
- long ret = 0;
-
- ret = acrn_hypercall1(HC_PAUSE_VM, vm->vmid);
- if (ret < 0) {
- pr_err("vhm: failed to pause VM %ld!\n", vm->vmid);
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_NOTIFY_REQUEST_FINISH, vmid, vcpu_mask);
}
-inline long vhm_destroy_vm(struct vhm_vm *vm)
+inline long hcall_assert_irqline(unsigned long vmid, unsigned long irq)
{
- long ret = 0;
-
- ret = acrn_hypercall1(HC_DESTROY_VM, vm->vmid);
- if (ret < 0) {
- pr_err("failed to destroy VM %ld\n", vm->vmid);
- return -EFAULT;
- }
- vm->vmid = ACRN_INVALID_VMID;
-
- return ret;
+ return acrn_hypercall2(HC_ASSERT_IRQLINE, vmid, irq);
}
-inline long vhm_query_vm_state(struct vhm_vm *vm)
+inline long hcall_deassert_irqline(unsigned long vmid, unsigned long irq)
{
- long ret = 0;
-
- ret = acrn_hypercall1(HC_QUERY_VMSTATE, vm->vmid);
- if (ret < 0) {
- pr_err("vhm: failed to query VM State%ld!\n", vm->vmid);
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_DEASSERT_IRQLINE, vmid, irq);
}
-inline long vhm_assert_irqline(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_pulse_irqline(unsigned long vmid, unsigned long irq)
{
- long ret = 0;
- struct acrn_irqline irq;
-
- if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_ASSERT_IRQLINE, vm->vmid,
- virt_to_phys(&irq));
- if (ret < 0) {
- pr_err("vhm: failed to assert irq!\n");
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_PULSE_IRQLINE, vmid, irq);
}
-inline long vhm_deassert_irqline(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_inject_msi(unsigned long vmid, unsigned long msi)
{
- long ret = 0;
- struct acrn_irqline irq;
-
- if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_DEASSERT_IRQLINE, vm->vmid,
- virt_to_phys(&irq));
- if (ret < 0) {
- pr_err("vhm: failed to deassert irq!\n");
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_INJECT_MSI, vmid, msi);
}
-inline long vhm_pulse_irqline(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_assign_ptdev(unsigned long vmid, unsigned long bdf)
{
- long ret = 0;
- struct acrn_irqline irq;
-
- if (copy_from_user(&irq, (void *)ioctl_param, sizeof(irq)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_PULSE_IRQLINE, vm->vmid,
- virt_to_phys(&irq));
- if (ret < 0) {
- pr_err("vhm: failed to assert irq!\n");
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_ASSIGN_PTDEV, vmid, bdf);
}
-inline long vhm_assign_ptdev(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_deassign_ptdev(unsigned long vmid, unsigned long bdf)
{
- long ret = 0;
- uint16_t bdf;
-
- if (copy_from_user(&bdf,
- (void *)ioctl_param, sizeof(uint16_t)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_ASSIGN_PTDEV, vm->vmid,
- virt_to_phys(&bdf));
- if (ret < 0) {
- pr_err("vhm: failed to assign ptdev!\n");
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_DEASSIGN_PTDEV, vmid, bdf);
}
-inline long vhm_deassign_ptdev(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_set_ptdev_intr_info(unsigned long vmid, unsigned long pt_irq)
{
- long ret = 0;
- uint16_t bdf;
-
- if (copy_from_user(&bdf,
- (void *)ioctl_param, sizeof(uint16_t)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_DEASSIGN_PTDEV, vm->vmid,
- virt_to_phys(&bdf));
- if (ret < 0) {
- pr_err("vhm: failed to deassign ptdev!\n");
- return -EFAULT;
- }
-
- return ret;
+ return acrn_hypercall2(HC_SET_PTDEV_INTR_INFO, vmid, pt_irq);
}
-inline long vhm_set_ptdev_intr_info(struct vhm_vm *vm,
- unsigned long ioctl_param)
+inline long hcall_reset_ptdev_intr_info(unsigned long vmid,
+ unsigned long pt_irq)
{
- long ret = 0;
- struct acrn_ptdev_irq pt_irq;
- int i;
-
- if (copy_from_user(&pt_irq,
- (void *)ioctl_param, sizeof(pt_irq)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_SET_PTDEV_INTR_INFO, vm->vmid,
- virt_to_phys(&pt_irq));
- if (ret < 0) {
- pr_err("vhm: failed to set intr info for ptdev!\n");
- return -EFAULT;
- }
-
- if (pt_irq.msix.table_paddr) {
- for (i = 0; i < MAX_ENTRY; i++) {
- if (tables[i].virt_bdf)
- continue;
-
- tables[i].virt_bdf = pt_irq.virt_bdf;
- tables[i].mmap_addr = (unsigned long)
- ioremap_nocache(pt_irq.msix.table_paddr,
- pt_irq.msix.table_size);
- break;
- }
- }
-
- return ret;
+ return acrn_hypercall2(HC_RESET_PTDEV_INTR_INFO, vmid, pt_irq);
}
-inline long vhm_reset_ptdev_intr_info(struct vhm_vm *vm,
- unsigned long ioctl_param)
+inline long hcall_remap_pci_msix(unsigned long vmid, unsigned long msi)
{
- long ret = 0;
- struct acrn_ptdev_irq pt_irq;
- int i;
-
- if (copy_from_user(&pt_irq,
- (void *)ioctl_param, sizeof(pt_irq)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_RESET_PTDEV_INTR_INFO, vm->vmid,
- virt_to_phys(&pt_irq));
- if (ret < 0) {
- pr_err("vhm: failed to reset intr info for ptdev!\n");
- return -EFAULT;
- }
-
- if (pt_irq.msix.table_paddr) {
- for (i = 0; i < MAX_ENTRY; i++) {
- if (tables[i].virt_bdf)
- continue;
-
- tables[i].virt_bdf = pt_irq.virt_bdf;
- tables[i].mmap_addr = (unsigned long)
- ioremap_nocache(pt_irq.msix.table_paddr,
- pt_irq.msix.table_size);
- break;
- }
- }
-
- return ret;
+ return acrn_hypercall2(HC_VM_PCI_MSIX_REMAP, vmid, msi);
}
-inline long vhm_remap_pci_msix(struct vhm_vm *vm, unsigned long ioctl_param)
+inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long addr)
{
- long ret = 0;
- struct acrn_vm_pci_msix_remap msix_remap;
-
- if (copy_from_user(&msix_remap,
- (void *)ioctl_param, sizeof(msix_remap)))
- return -EFAULT;
-
- ret = acrn_hypercall2(HC_VM_PCI_MSIX_REMAP, vm->vmid,
- virt_to_phys(&msix_remap));
-
- if (copy_to_user((void *)ioctl_param,
- &msix_remap, sizeof(msix_remap)))
- return -EFAULT;
-
- if (msix_remap.msix) {
- void __iomem *msix_entry;
- int i;
-
- for (i = 0; i < MAX_ENTRY; i++) {
- if (tables[i].virt_bdf == msix_remap.virt_bdf)
- break;
- }
-
- if (!tables[i].mmap_addr)
- return -EFAULT;
-
- msix_entry = (void *)(tables[i].mmap_addr +
- msix_remap.msix_entry_index *
- PCI_MSIX_ENTRY_SIZE);
-
- /* mask the entry when setup */
- writel(PCI_MSIX_ENTRY_CTRL_MASKBIT,
- msix_entry + PCI_MSIX_ENTRY_VECTOR_CTRL);
-
- /* setup the msi entry */
- writel((uint32_t)msix_remap.msi_addr,
- msix_entry + PCI_MSIX_ENTRY_LOWER_ADDR);
- writel((uint32_t)(msix_remap.msi_addr >> 32),
- msix_entry + PCI_MSIX_ENTRY_UPPER_ADDR);
- writel(msix_remap.msi_data,
- msix_entry + PCI_MSIX_ENTRY_DATA);
-
- /* unmask the entry */
- writel(msix_remap.vector_ctl &
- PCI_MSIX_ENTRY_CTRL_MASKBIT,
- msix_entry + PCI_MSIX_ENTRY_VECTOR_CTRL);
- }
-
- return ret;
+ return acrn_hypercall2(HC_VM_GPA2HPA, vmid, addr);
}
diff --git a/include/linux/vhm/vhm_hypercall.h b/include/linux/vhm/vhm_hypercall.h
index ce579e3734ff..35bb48ae6cd3 100644
--- a/include/linux/vhm/vhm_hypercall.h
+++ b/include/linux/vhm/vhm_hypercall.h
@@ -52,14 +52,12 @@
#ifndef VHM_HYPERCALL_H
#define VHM_HYPERCALL_H
-#include <linux/vhm/vhm_vm_mngt.h>
-
-static inline long acrn_hypercall0(unsigned long hyp_id)
+static inline long acrn_hypercall0(unsigned long hcall_id)
{
/* x86-64 System V ABI register usage */
register signed long result asm("rax");
- register unsigned long r8 asm("r8") = hyp_id;
+ register unsigned long r8 asm("r8") = hcall_id;
/* Execute vmcall */
asm volatile(".byte 0x0F,0x01,0xC1\n"
@@ -70,12 +68,12 @@ static inline long acrn_hypercall0(unsigned long hyp_id)
return result;
}
-static inline long acrn_hypercall1(unsigned long hyp_id, unsigned long param1)
+static inline long acrn_hypercall1(unsigned long hcall_id, unsigned long param1)
{
/* x86-64 System V ABI register usage */
register signed long result asm("rax");
- register unsigned long r8 asm("r8") = hyp_id;
+ register unsigned long r8 asm("r8") = hcall_id;
/* Execute vmcall */
asm volatile(".byte 0x0F,0x01,0xC1\n"
@@ -86,13 +84,13 @@ static inline long acrn_hypercall1(unsigned long hyp_id, unsigned long param1)
return result;
}
-static inline long acrn_hypercall2(unsigned long hyp_id, unsigned long param1,
+static inline long acrn_hypercall2(unsigned long hcall_id, unsigned long param1,
unsigned long param2)
{
/* x86-64 System V ABI register usage */
register signed long result asm("rax");
- register unsigned long r8 asm("r8") = hyp_id;
+ register unsigned long r8 asm("r8") = hcall_id;
/* Execute vmcall */
asm volatile(".byte 0x0F,0x01,0xC1\n"
@@ -103,13 +101,13 @@ static inline long acrn_hypercall2(unsigned long hyp_id, unsigned long param1,
return result;
}
-static inline long acrn_hypercall3(unsigned long hyp_id, unsigned long param1,
+static inline long acrn_hypercall3(unsigned long hcall_id, unsigned long param1,
unsigned long param2, unsigned long param3)
{
/* x86-64 System V ABI register usage */
register signed long result asm("rax");
- register unsigned long r8 asm("r8") = hyp_id;
+ register unsigned long r8 asm("r8") = hcall_id;
/* Execute vmcall */
asm volatile(".byte 0x0F,0x01,0xC1\n"
@@ -120,14 +118,14 @@ static inline long acrn_hypercall3(unsigned long hyp_id, unsigned long param1,
return result;
}
-static inline long acrn_hypercall4(unsigned long hyp_id, unsigned long param1,
+static inline long acrn_hypercall4(unsigned long hcall_id, unsigned long param1,
unsigned long param2, unsigned long param3,
unsigned long param4)
{
/* x86-64 System V ABI register usage */
register signed long result asm("rax");
- register unsigned long r8 asm("r8") = hyp_id;
+ register unsigned long r8 asm("r8") = hcall_id;
/* Execute vmcall */
asm volatile(".byte 0x0F,0x01,0xC1\n"
@@ -139,27 +137,28 @@ static inline long acrn_hypercall4(unsigned long hyp_id, unsigned long param1,
return result;
}
-inline long hcall_inject_msi(unsigned long vmid, unsigned long msi);
-inline long hcall_remap_pci_msix(unsigned long vmid, unsigned long msix);
-inline long hcall_set_ioreq_buffer(unsigned long vmid, unsigned long buffer);
+inline long hcall_create_vm(unsigned long vminfo);
+inline long hcall_resume_vm(unsigned long vmid);
+inline long hcall_pause_vm(unsigned long vmid);
+inline long hcall_destroy_vm(unsigned long vmid);
+inline long hcall_query_vm_state(unsigned long vmid);
+inline long hcall_set_memmap(unsigned long vmid,
+ unsigned long memmap);
+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);
-inline long vhm_destroy_vm(struct vhm_vm *vm);
-inline long vhm_query_vm_state(struct vhm_vm *vm);
-inline long vhm_assert_irqline(struct vhm_vm *vm, unsigned long ioctl_param);
-inline long vhm_deassert_irqline(struct vhm_vm *vm, unsigned long ioctl_param);
-inline long vhm_pulse_irqline(struct vhm_vm *vm, unsigned long ioctl_param);
-inline long vhm_assign_ptdev(struct vhm_vm *vm, unsigned long ioctl_param);
-inline long vhm_deassign_ptdev(struct vhm_vm *vm, unsigned long ioctl_param);
-inline long vhm_set_ptdev_intr_info(struct vhm_vm *vm,
- unsigned long ioctl_param);
-inline long vhm_reset_ptdev_intr_info(struct vhm_vm *vm,
- unsigned long ioctl_param);
-inline long vhm_remap_pci_msix(struct vhm_vm *vm, unsigned long ioctl_param);
+inline long hcall_assert_irqline(unsigned long vmid, unsigned long irq);
+inline long hcall_deassert_irqline(unsigned long vmid, unsigned long irq);
+inline long hcall_pulse_irqline(unsigned long vmid, unsigned long irq);
+inline long hcall_inject_msi(unsigned long vmid, unsigned long msi);
+inline long hcall_assign_ptdev(unsigned long vmid, unsigned long bdf);
+inline long hcall_deassign_ptdev(unsigned long vmid, unsigned long bdf);
+inline long hcall_set_ptdev_intr_info(unsigned long vmid,
+ unsigned long pt_irq);
+inline long hcall_reset_ptdev_intr_info(unsigned long vmid,
+ unsigned long pt_irq);
+inline long hcall_remap_pci_msix(unsigned long vmid, unsigned long msi);
+inline long hcall_vm_gpa2hpa(unsigned long vmid, unsigned long addr);
#endif /* VHM_HYPERCALL_H */
--
https://clearlinux.org