|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 1/9] vpci: move BAR mapping permissions checks
There's no need to defer the permissions checks. Perform them right away
in modify_bars().
As a result of the move, the permissions checks will now cover the whole
BAR before any holes are removed.
Carry over the domain_crash() in the error path for domUs.
Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
---
v5: new patch
---
xen/drivers/vpci/header.c | 40 +++++++++++++++++++++------------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c
index d1c92cf77f8a..5ac525036672 100644
--- a/xen/drivers/vpci/header.c
+++ b/xen/drivers/vpci/header.c
@@ -58,24 +58,6 @@ static int cf_check map_range(
* offset of the current address from the BAR start.
*/
unsigned long map_mfn = start_mfn + s - start_gfn;
- unsigned long m_end = map_mfn + size - 1;
-
- if ( !iomem_access_permitted(map->d, map_mfn, m_end) )
- {
- printk(XENLOG_G_WARNING
- "%pd denied access to MMIO range [%#lx, %#lx]\n",
- map->d, map_mfn, m_end);
- return -EPERM;
- }
-
- rc = xsm_iomem_mapping_vpci(XSM_HOOK, map->d, map_mfn, m_end,
map->map);
- if ( rc )
- {
- printk(XENLOG_G_WARNING
- "%pd XSM denied access to MMIO range [%#lx, %#lx]: %d\n",
- map->d, map_mfn, m_end, rc);
- return rc;
- }
/*
* ARM TODOs:
@@ -369,6 +351,28 @@ static int modify_bars(const struct pci_dev *pdev,
uint16_t cmd, bool rom_only)
return -EINVAL;
}
+ if ( !iomem_access_permitted(pdev->domain, start, end) )
+ {
+ printk(XENLOG_G_WARNING
+ "%pd denied access to MMIO range [%#lx, %#lx]\n",
+ pdev->domain, start, end);
+ if ( !is_hardware_domain(pdev->domain) )
+ domain_crash(pdev->domain);
+ return -EPERM;
+ }
+
+ rc = xsm_iomem_mapping_vpci(XSM_HOOK, pdev->domain, start, end,
+ !!(cmd & PCI_COMMAND_MEMORY));
+ if ( rc )
+ {
+ printk(XENLOG_G_WARNING
+ "%pd XSM denied access to MMIO range [%#lx, %#lx]: %d\n",
+ pdev->domain, start, end, rc);
+ if ( !is_hardware_domain(pdev->domain) )
+ domain_crash(pdev->domain);
+ return rc;
+ }
+
rc = rangeset_add_range(bar->mem, start_guest, end_guest);
if ( rc )
{
--
2.54.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |