On Thu, 28 Mar 2019 at 11:46, Ryszard Knop <ryszard.k...@linux.intel.com> wrote: > > On Wed, 2019-03-27 at 16:32 +0100, Ard Biesheuvel wrote: > > On Tue, 29 Jan 2019 at 14:55, Ryszard Knop < > > ryszard.k...@linux.intel.com> wrote: > > > +Team > > > > > > > As it turns out, this driver is still broken for non-1:1 mapped DMA. > > > > In particular, I am hitting a crash on > > > > E1000MemCopy ( > > (UINT8 *) (UINTN) CpbReceive->BufferAddr, > > (UINT8 *) (UINTN) ReceiveDescriptor->buffer_addr, > > TempLen > > ); > > > > (around line 676 in e1000.c), which uses the DMA address > > 'ReceiveDescriptor->buffer_addr' in a memory copy operation performed > > by the CPU. This causes a crash on systems where the DMA address is > > not also a valid CPU address. > > Huh, this is new... I don't have access to any system behaving this > way, so I can't test this, but E1000.c -> E1000TxRxConfigure links > RxDesc->buffer_addr to the physical addresses, that descriptor is used > by the hardware to DMA data where needed, and we try to copy from that > same physical address later, while we should copy from unmapped > addresses instead. >
Indeed. > This probably should be solved by having a separate array/something > with CurRxInd -> unmapped addresses, but I'll have to talk with my team > to solve this in a sensible way. > > In the meantime, maybe you know if there's a way to simulate this > situation under QEMU or something? > I am using an arm64 board with modified firmware to emulate different PCIe host bridge configurations. I don't know whether QEMU has support for non-1:1 mapped DMA on x86, but it does emulate various boards (such as the raspberry pi 2 iirc) where the CPU and device addressing is not 1:1. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel