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)
 | 
			
		||||
{
 | 
			
		||||
    EHCIPacket *p = QTAILQ_FIRST(&q->packets);
 | 
			
		||||
    uint32_t *qtd, addr;
 | 
			
		||||
    int again = 0;
 | 
			
		||||
 | 
			
		||||
    /*  Write back the QTD from the QH area */
 | 
			
		||||
| 
						 | 
				
			
			@ -2077,8 +2078,9 @@ static int ehci_state_writeback(EHCIQueue *q)
 | 
			
		|||
    assert(p->qtdaddr == q->qtdaddr);
 | 
			
		||||
 | 
			
		||||
    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,
 | 
			
		||||
               sizeof(EHCIqtd) >> 2);
 | 
			
		||||
    qtd = (uint32_t *) &q->qh.next_qtd;
 | 
			
		||||
    addr = NLPTR_GET(p->qtdaddr);
 | 
			
		||||
    put_dwords(q->ehci, addr + 2 * sizeof(uint32_t), qtd + 2, 2);
 | 
			
		||||
    ehci_free_packet(p);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue