x86/pci: introduce hvm_pci_decode_addr

And use it in the ioreq code to decode accesses to the PCI IO ports
into bus, slot, function and register values.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2017-08-25 14:08:19 +02:00
1 parent 34828425d3
commit a16e826da9
3 files changed
+29 -7

No files matched your search

+19
View File
@@ -256,6 +256,25 @@ void register_g2m_portio_handler(struct domain *d)
handler->ops = &g2m_portio_ops;
}
unsigned int hvm_pci_decode_addr(unsigned int cf8, unsigned int addr,
unsigned int *bus, unsigned int *slot,
unsigned int *func)
{
unsigned int bdf;
ASSERT(CF8_ENABLED(cf8));
bdf = CF8_BDF(cf8);
*bus = PCI_BUS(bdf);
*slot = PCI_SLOT(bdf);
*func = PCI_FUNC(bdf);
/*
* NB: the lower 2 bits of the register address are fetched from the
* offset into the 0xcfc register when reading/writing to it.
*/
return CF8_ADDR_LO(cf8) | (addr & 3);
}
/*
* Local variables:
* mode: C
+5 -7
View File
@@ -1178,18 +1178,16 @@ struct hvm_ioreq_server *hvm_select_ioreq_server(struct domain *d,
CF8_ENABLED(cf8) )
{
uint32_t sbdf, x86_fam;
unsigned int bus, slot, func, reg;
reg = hvm_pci_decode_addr(cf8, p->addr, &bus, &slot, &func);
/* PCI config data cycle */
sbdf = XEN_DMOP_PCI_SBDF(0,
PCI_BUS(CF8_BDF(cf8)),
PCI_SLOT(CF8_BDF(cf8)),
PCI_FUNC(CF8_BDF(cf8)));
sbdf = XEN_DMOP_PCI_SBDF(0, bus, slot, func);
type = XEN_DMOP_IO_RANGE_PCI;
addr = ((uint64_t)sbdf << 32) |
CF8_ADDR_LO(cf8) |
(p->addr & 3);
addr = ((uint64_t)sbdf << 32) | reg;
/* AMD extended configuration space access? */
if ( CF8_ADDR_HI(cf8) &&
d->arch.cpuid->x86_vendor == X86_VENDOR_AMD &&
+5
View File
@@ -149,6 +149,11 @@ void stdvga_deinit(struct domain *d);
extern void hvm_dpci_msi_eoi(struct domain *d, int vector);
/* Decode a PCI port IO access into a bus/slot/func/reg. */
unsigned int hvm_pci_decode_addr(unsigned int cf8, unsigned int addr,
unsigned int *bus, unsigned int *slot,
unsigned int *func);
/*
* HVM port IO handler that performs forwarding of guest IO ports into machine
* IO ports.
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.