qemu-e2k/hw/i386
Jean-Philippe Brucker 5d31e1e59a amd_iommu: Fix pte_override_page_mask()
AMD IOMMU PTEs have a special mode allowing to specify an arbitrary page
size. Quoting the AMD IOMMU specification: "When the Next Level bits [of
a pte] are 7h, the size of the page is determined by the first zero bit
in the page address, starting from bit 12."

So if the lowest bits of the page address is 0, the page is 8kB. If the
lowest bits are 011, the page is 32kB. Currently pte_override_page_mask()
doesn't compute the right value for this page size and amdvi_translate()
can return the wrong guest-physical address. With a Linux guest, DMA
from SATA devices accesses the wrong memory and causes probe failure:

qemu-system-x86_64 ... -device amd-iommu -drive id=hd1,file=foo.bin,if=none \
		-device ahci,id=ahci -device ide-hd,drive=hd1,bus=ahci.0
[    6.613093] ata1.00: qc timeout (cmd 0xec)
[    6.615062] ata1.00: failed to IDENTIFY (I/O error, err_mask=0x4)

Fix the page mask.

Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Message-Id: <20210421084007.1190546-1-jean-philippe@linaro.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2021-05-04 07:27:37 -04:00
..
kvm sysemu: Let VMChangeStateHandler take boolean 'running' argument 2021-03-09 23:13:57 +01:00
xen sysemu: Let VMChangeStateHandler take boolean 'running' argument 2021-03-09 23:13:57 +01:00
acpi-build.c acpi: Move setters/getters of oem fields to X86MachineState 2021-03-22 18:58:19 -04:00
acpi-build.h
acpi-common.c acpi: Permit OEM ID and OEM table ID fields to be changed 2021-02-05 08:52:59 -05:00
acpi-common.h acpi: Permit OEM ID and OEM table ID fields to be changed 2021-02-05 08:52:59 -05:00
acpi-microvm.c acpi: Move setters/getters of oem fields to X86MachineState 2021-03-22 18:58:19 -04:00
acpi-microvm.h microvm/acpi: add minimal acpi support 2020-09-17 14:16:19 +02:00
amd_iommu.c amd_iommu: Fix pte_override_page_mask() 2021-05-04 07:27:37 -04:00
amd_iommu.h Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
e820_memory_layout.c
e820_memory_layout.h
fw_cfg.c i386: move kvm accel files into kvm/ 2020-12-16 14:06:52 -05:00
fw_cfg.h
generic_event_device_x86.c acpi: ged: add x86 device variant. 2020-09-17 14:16:19 +02:00
intel_iommu_internal.h
intel_iommu.c dma: Introduce dma_aligned_pow2_mask() 2021-03-12 12:40:10 +00:00
Kconfig hw/misc/pvpanic: split-out generic and bus dependent code 2021-01-29 10:47:28 +00:00
kvmvapic.c sysemu: Let VMChangeStateHandler take boolean 'running' argument 2021-03-09 23:13:57 +01:00
meson.build microvm/acpi: add minimal acpi support 2020-09-17 14:16:19 +02:00
microvm.c acpi: Move setters/getters of oem fields to X86MachineState 2021-03-22 18:58:19 -04:00
multiboot.c
multiboot.h
pc_piix.c i386/acpi: restore device paths for pre-5.1 vms 2021-03-02 05:40:35 -05:00
pc_q35.c i386/acpi: restore device paths for pre-5.1 vms 2021-03-02 05:40:35 -05:00
pc_sysfw.c sev/i386: Allow AP booting under SEV-ES 2021-02-16 17:15:39 +01:00
pc.c acpi: Move setters/getters of oem fields to X86MachineState 2021-03-22 18:58:19 -04:00
port92.c Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
trace-events
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
vmmouse.c vmmouse: put it into the 'input' category 2021-02-20 12:36:19 +01:00
vmport.c i386: do not use ram_size global 2020-12-10 12:15:08 -05:00
x86-iommu-stub.c
x86-iommu.c x86-iommu: Rename QOM type macros 2020-09-02 07:29:25 -04:00
x86.c acpi: Move setters/getters of oem fields to X86MachineState 2021-03-22 18:58:19 -04:00