Allow byte reads of AHCI registers.
This is needed to support Windows guests that use byte reads to access certain AHCI registers (e.g. PxTFD.Status and PxTFD.Error). Reviewed by: grehan, mav Reported by: Leon Dang (ldang@nahannisys.com) Differential Revision: https://reviews.freebsd.org/D2469 MFC after: 2 weeks
This commit is contained in:
parent
089bb672c4
commit
1cba333329
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=282595
@ -2093,7 +2093,7 @@ pci_ahci_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi,
|
||||
struct pci_ahci_softc *sc = pi->pi_arg;
|
||||
|
||||
assert(baridx == 5);
|
||||
assert(size == 4);
|
||||
assert((offset % 4) == 0 && size == 4);
|
||||
|
||||
pthread_mutex_lock(&sc->mtx);
|
||||
|
||||
@ -2182,24 +2182,29 @@ pci_ahci_port_read(struct pci_ahci_softc *sc, uint64_t offset)
|
||||
|
||||
static uint64_t
|
||||
pci_ahci_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, int baridx,
|
||||
uint64_t offset, int size)
|
||||
uint64_t regoff, int size)
|
||||
{
|
||||
struct pci_ahci_softc *sc = pi->pi_arg;
|
||||
uint64_t offset;
|
||||
uint32_t value;
|
||||
|
||||
assert(baridx == 5);
|
||||
assert(size == 4);
|
||||
assert(size == 1 || size == 2 || size == 4);
|
||||
assert((regoff & (size - 1)) == 0);
|
||||
|
||||
pthread_mutex_lock(&sc->mtx);
|
||||
|
||||
offset = regoff & ~0x3; /* round down to a multiple of 4 bytes */
|
||||
if (offset < AHCI_OFFSET)
|
||||
value = pci_ahci_host_read(sc, offset);
|
||||
else if (offset < AHCI_OFFSET + sc->ports * AHCI_STEP)
|
||||
value = pci_ahci_port_read(sc, offset);
|
||||
else {
|
||||
value = 0;
|
||||
WPRINTF("pci_ahci: unknown i/o read offset 0x%"PRIx64"\n", offset);
|
||||
WPRINTF("pci_ahci: unknown i/o read offset 0x%"PRIx64"\n",
|
||||
regoff);
|
||||
}
|
||||
value >>= 8 * (regoff & 0x3);
|
||||
|
||||
pthread_mutex_unlock(&sc->mtx);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user