Avoid CPU endian memory accesses in devices
Don't compile virtio.c in hwlib, it depends on memory accesses performed in CPU endianness. Make loads and stores in CPU endianness unavailable to devices and poison them to avoid further bugs. Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
b5176d279a
commit
21673cdecb
@ -171,7 +171,7 @@ user-obj-y += cutils.o cache-utils.o
|
|||||||
|
|
||||||
hw-obj-y =
|
hw-obj-y =
|
||||||
hw-obj-y += vl.o loader.o
|
hw-obj-y += vl.o loader.o
|
||||||
hw-obj-$(CONFIG_VIRTIO) += virtio.o virtio-console.o
|
hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
|
||||||
hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
|
hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
|
||||||
hw-obj-y += fw_cfg.o
|
hw-obj-y += fw_cfg.o
|
||||||
hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o
|
hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o
|
||||||
|
@ -191,7 +191,7 @@ obj-y = arch_init.o cpus.o monitor.o machine.o gdbstub.o balloon.o
|
|||||||
# virtio has to be here due to weird dependency between PCI and virtio-net.
|
# virtio has to be here due to weird dependency between PCI and virtio-net.
|
||||||
# need to fix this properly
|
# need to fix this properly
|
||||||
obj-$(CONFIG_NO_PCI) += pci-stub.o
|
obj-$(CONFIG_NO_PCI) += pci-stub.o
|
||||||
obj-$(CONFIG_VIRTIO) += virtio-blk.o virtio-balloon.o virtio-net.o virtio-serial-bus.o
|
obj-$(CONFIG_VIRTIO) += virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-serial-bus.o
|
||||||
obj-y += vhost_net.o
|
obj-y += vhost_net.o
|
||||||
obj-$(CONFIG_VHOST_NET) += vhost.o
|
obj-$(CONFIG_VHOST_NET) += vhost.o
|
||||||
obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/virtio-9p-device.o
|
obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/virtio-9p-device.o
|
||||||
|
19
cpu-common.h
19
cpu-common.h
@ -134,28 +134,31 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
|
|||||||
void qemu_flush_coalesced_mmio_buffer(void);
|
void qemu_flush_coalesced_mmio_buffer(void);
|
||||||
|
|
||||||
uint32_t ldub_phys(target_phys_addr_t addr);
|
uint32_t ldub_phys(target_phys_addr_t addr);
|
||||||
uint32_t lduw_phys(target_phys_addr_t addr);
|
|
||||||
uint32_t lduw_le_phys(target_phys_addr_t addr);
|
uint32_t lduw_le_phys(target_phys_addr_t addr);
|
||||||
uint32_t lduw_be_phys(target_phys_addr_t addr);
|
uint32_t lduw_be_phys(target_phys_addr_t addr);
|
||||||
uint32_t ldl_phys(target_phys_addr_t addr);
|
|
||||||
uint32_t ldl_le_phys(target_phys_addr_t addr);
|
uint32_t ldl_le_phys(target_phys_addr_t addr);
|
||||||
uint32_t ldl_be_phys(target_phys_addr_t addr);
|
uint32_t ldl_be_phys(target_phys_addr_t addr);
|
||||||
uint64_t ldq_phys(target_phys_addr_t addr);
|
|
||||||
uint64_t ldq_le_phys(target_phys_addr_t addr);
|
uint64_t ldq_le_phys(target_phys_addr_t addr);
|
||||||
uint64_t ldq_be_phys(target_phys_addr_t addr);
|
uint64_t ldq_be_phys(target_phys_addr_t addr);
|
||||||
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val);
|
|
||||||
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val);
|
|
||||||
void stb_phys(target_phys_addr_t addr, uint32_t val);
|
void stb_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
void stw_phys(target_phys_addr_t addr, uint32_t val);
|
|
||||||
void stw_le_phys(target_phys_addr_t addr, uint32_t val);
|
void stw_le_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
void stw_be_phys(target_phys_addr_t addr, uint32_t val);
|
void stw_be_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
void stl_phys(target_phys_addr_t addr, uint32_t val);
|
|
||||||
void stl_le_phys(target_phys_addr_t addr, uint32_t val);
|
void stl_le_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
void stl_be_phys(target_phys_addr_t addr, uint32_t val);
|
void stl_be_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
void stq_phys(target_phys_addr_t addr, uint64_t val);
|
|
||||||
void stq_le_phys(target_phys_addr_t addr, uint64_t val);
|
void stq_le_phys(target_phys_addr_t addr, uint64_t val);
|
||||||
void stq_be_phys(target_phys_addr_t addr, uint64_t val);
|
void stq_be_phys(target_phys_addr_t addr, uint64_t val);
|
||||||
|
|
||||||
|
#ifdef NEED_CPU_H
|
||||||
|
uint32_t lduw_phys(target_phys_addr_t addr);
|
||||||
|
uint32_t ldl_phys(target_phys_addr_t addr);
|
||||||
|
uint64_t ldq_phys(target_phys_addr_t addr);
|
||||||
|
void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val);
|
||||||
|
void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val);
|
||||||
|
void stw_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
|
void stl_phys(target_phys_addr_t addr, uint32_t val);
|
||||||
|
void stq_phys(target_phys_addr_t addr, uint64_t val);
|
||||||
|
#endif
|
||||||
|
|
||||||
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
|
void cpu_physical_memory_write_rom(target_phys_addr_t addr,
|
||||||
const uint8_t *buf, int len);
|
const uint8_t *buf, int len);
|
||||||
|
|
||||||
|
9
poison.h
9
poison.h
@ -37,6 +37,15 @@
|
|||||||
#pragma GCC poison CPUState
|
#pragma GCC poison CPUState
|
||||||
#pragma GCC poison env
|
#pragma GCC poison env
|
||||||
|
|
||||||
|
#pragma GCC poison lduw_phys
|
||||||
|
#pragma GCC poison ldl_phys
|
||||||
|
#pragma GCC poison ldq_phys
|
||||||
|
#pragma GCC poison stl_phys_notdirty
|
||||||
|
#pragma GCC poison stq_phys_notdirty
|
||||||
|
#pragma GCC poison stw_phys
|
||||||
|
#pragma GCC poison stl_phys
|
||||||
|
#pragma GCC poison stq_phys
|
||||||
|
|
||||||
#pragma GCC poison CPU_INTERRUPT_HARD
|
#pragma GCC poison CPU_INTERRUPT_HARD
|
||||||
#pragma GCC poison CPU_INTERRUPT_EXITTB
|
#pragma GCC poison CPU_INTERRUPT_EXITTB
|
||||||
#pragma GCC poison CPU_INTERRUPT_HALT
|
#pragma GCC poison CPU_INTERRUPT_HALT
|
||||||
|
Loading…
Reference in New Issue
Block a user