a004dfabea
The DMA descriptor structures for this device have a set of "address extension" fields which extend the 32 bit source addresses with an extra 16 bits to give a 48 bit address: https://docs.amd.com/r/en-US/ug1085-zynq-ultrascale-trm/ADDR_EXT-Field However, we misimplemented this address extension in several ways: * we only extracted 12 bits of the extension fields, not 16 * we didn't shift the extension field up far enough * we accidentally did the shift as 32-bit arithmetic, which meant that we would have an overflow instead of setting bits [47:32] of the resulting 64-bit address Add a type cast and use extract64() instead of extract32() to avoid integer overflow on addition. Fix bit fields extraction according to documentation. Found by Linux Verification Center (linuxtesting.org) with SVACE. Cc: qemu-stable@nongnu.org Fixes: |
||
---|---|---|
.. | ||
bcm2835_dma.c | ||
etraxfs_dma.c | ||
i8257.c | ||
i82374.c | ||
Kconfig | ||
meson.build | ||
omap_dma.c | ||
pl080.c | ||
pl330.c | ||
pxa2xx_dma.c | ||
rc4030.c | ||
sifive_pdma.c | ||
soc_dma.c | ||
sparc32_dma.c | ||
trace-events | ||
trace.h | ||
xilinx_axidma.c | ||
xlnx_csu_dma.c | ||
xlnx_dpdma.c | ||
xlnx-zdma.c | ||
xlnx-zynq-devcfg.c |