ref: 5ea540e75def56d3c2b5ef16f0f4e91d5f5c0ad1
parent: b1d1fa04b952d19064ecc9c4b0a6c07e39e71c3b
author: cinap_lenrek <[email protected]>
date: Sat Dec 12 13:00:41 EST 2020
sdiahci: enable pci busmaster before ahciconfigdrive() (fix qemu crash) enable pci busmaster before set the fis-receive-enable bit in the port command register. not doing so triggers a crash in qemu like: address_space_unmap: Assertion `mr != NULL' failed. as qemu tries to process the dma command list as soon as we set that flag and busmaster dma needs to be enabled at this point.
--- a/sys/src/9/pc/sdiahci.c
+++ b/sys/src/9/pc/sdiahci.c
@@ -1553,7 +1553,6 @@
}
if(c->ndrive == 0)
panic("iaenable: zero s->ctlr->ndrive");
- pcisetbme(c->pci);
snprint(name, sizeof name, "%s (%s)", s->name, s->ifc->name);
intrenable(c->pci->intl, iainterrupt, c, c->pci->tbdf, name);
/* supposed to squelch leftover interrupts here. */
@@ -2228,6 +2227,7 @@
c->drive[d->driveno] = d;
iadrive[niadrive + d->driveno] = d;
}
+ pcisetbme(c->pci);
for(i = 0; i < n; i++){
c->drive[i]->mode = DMautoneg;
configdrive(c->drive[i]);