Skip to content

Commit

Permalink
tools: Add new function to get gsi from dev
Browse files Browse the repository at this point in the history
On PVH dom0, when passthrough a device to domU, QEMU and xl tools
want to use gsi number to do pirq mapping, see QEMU code
xen_pt_realize->xc_physdev_map_pirq, and xl code
pci_add_dm_done->xc_physdev_map_pirq, but in current codes, the gsi
number is got from file /sys/bus/pci/devices/<sbdf>/irq, that is
wrong, because irq is not equal with gsi, they are in different
spaces, so pirq mapping fails.

And in current codes, there is no method to get gsi for userspace.
For above purpose, add new function to get gsi, and the
corresponding ioctl is implemented on linux kernel side.

Signed-off-by: Jiqian Chen <[email protected]>
Signed-off-by: Huang Rui <[email protected]>
Signed-off-by: Chen Jiqian <[email protected]>
Reviewed-by: Anthony PERARD <[email protected]>
  • Loading branch information
Jiqian Chen authored and jbeulich committed Sep 30, 2024
1 parent d6e9a2a commit b93e598
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 0 deletions.
7 changes: 7 additions & 0 deletions tools/include/xen-sys/Linux/privcmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ typedef struct privcmd_mmap_resource {
__u64 addr;
} privcmd_mmap_resource_t;

typedef struct privcmd_pcidev_get_gsi {
__u32 sbdf;
__u32 gsi;
} privcmd_pcidev_get_gsi_t;

/*
* @cmd: IOCTL_PRIVCMD_HYPERCALL
* @arg: &privcmd_hypercall_t
Expand All @@ -114,6 +119,8 @@ typedef struct privcmd_mmap_resource {
_IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
#define IOCTL_PRIVCMD_MMAP_RESOURCE \
_IOC(_IOC_NONE, 'P', 7, sizeof(privcmd_mmap_resource_t))
#define IOCTL_PRIVCMD_PCIDEV_GET_GSI \
_IOC(_IOC_NONE, 'P', 10, sizeof(privcmd_pcidev_get_gsi_t))
#define IOCTL_PRIVCMD_UNIMPLEMENTED \
_IOC(_IOC_NONE, 'P', 0xFF, 0)

Expand Down
2 changes: 2 additions & 0 deletions tools/include/xenctrl.h
Original file line number Diff line number Diff line change
Expand Up @@ -1642,6 +1642,8 @@ int xc_physdev_unmap_pirq(xc_interface *xch,
uint32_t domid,
int pirq);

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf);

/*
* LOGGING AND ERROR REPORTING
*/
Expand Down
6 changes: 6 additions & 0 deletions tools/libs/ctrl/xc_freebsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return ptr;
}

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}

/*
* Local variables:
* mode: C
Expand Down
20 changes: 20 additions & 0 deletions tools/libs/ctrl/xc_linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,26 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return ptr;
}

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
int ret;
privcmd_pcidev_get_gsi_t dev_gsi = {
.sbdf = sbdf,
.gsi = 0,
};

ret = ioctl(xencall_fd(xch->xcall),
IOCTL_PRIVCMD_PCIDEV_GET_GSI, &dev_gsi);

if (ret < 0) {
PERROR("Failed to get gsi from dev");
} else {
ret = dev_gsi.gsi;
}

return ret;
}

/*
* Local variables:
* mode: C
Expand Down
6 changes: 6 additions & 0 deletions tools/libs/ctrl/xc_minios.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return memalign(alignment, size);
}

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}

/*
* Local variables:
* mode: C
Expand Down
6 changes: 6 additions & 0 deletions tools/libs/ctrl/xc_netbsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return valloc(size);
}

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}

/*
* Local variables:
* mode: C
Expand Down
6 changes: 6 additions & 0 deletions tools/libs/ctrl/xc_solaris.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return memalign(alignment, size);
}

int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}

/*
* Local variables:
* mode: C
Expand Down

0 comments on commit b93e598

Please sign in to comment.