mirror of https://github.com/xemu-project/xemu.git
ehci: fix td writeback
Only write back the dwords the hc is supposed to update. Should not make a difference in theory as the guest must not touch the td while it is active to avoid races. But it is still more correct. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
a5e0139ab6
commit
4ed1c57a64
|
@ -2070,6 +2070,7 @@ out:
|
||||||
static int ehci_state_writeback(EHCIQueue *q)
|
static int ehci_state_writeback(EHCIQueue *q)
|
||||||
{
|
{
|
||||||
EHCIPacket *p = QTAILQ_FIRST(&q->packets);
|
EHCIPacket *p = QTAILQ_FIRST(&q->packets);
|
||||||
|
uint32_t *qtd, addr;
|
||||||
int again = 0;
|
int again = 0;
|
||||||
|
|
||||||
/* Write back the QTD from the QH area */
|
/* Write back the QTD from the QH area */
|
||||||
|
@ -2077,8 +2078,9 @@ static int ehci_state_writeback(EHCIQueue *q)
|
||||||
assert(p->qtdaddr == q->qtdaddr);
|
assert(p->qtdaddr == q->qtdaddr);
|
||||||
|
|
||||||
ehci_trace_qtd(q, NLPTR_GET(p->qtdaddr), (EHCIqtd *) &q->qh.next_qtd);
|
ehci_trace_qtd(q, NLPTR_GET(p->qtdaddr), (EHCIqtd *) &q->qh.next_qtd);
|
||||||
put_dwords(q->ehci, NLPTR_GET(p->qtdaddr), (uint32_t *) &q->qh.next_qtd,
|
qtd = (uint32_t *) &q->qh.next_qtd;
|
||||||
sizeof(EHCIqtd) >> 2);
|
addr = NLPTR_GET(p->qtdaddr);
|
||||||
|
put_dwords(q->ehci, addr + 2 * sizeof(uint32_t), qtd + 2, 2);
|
||||||
ehci_free_packet(p);
|
ehci_free_packet(p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue