aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Fleytman <dmitry.fleytman@ravellosystems.com>2016-06-01 11:23:30 +0300
committerJason Wang <jasowang@redhat.com>2016-06-02 10:16:53 +0800
commit059a65f3ad506105ac9b5b0c7c31f8a0be0abbbc (patch)
tree40acd9328a3fa3adb1845eadf22e1a26cbd88cd0
parent16a3df403b10c4ac347159e39005fd520b2648bb (diff)
downloadqemu-059a65f3ad506105ac9b5b0c7c31f8a0be0abbbc.zip
qemu-059a65f3ad506105ac9b5b0c7c31f8a0be0abbbc.tar.gz
qemu-059a65f3ad506105ac9b5b0c7c31f8a0be0abbbc.tar.bz2
pci: fix unaligned access in pci_xxx_quad()
Replace legacy cpu_to_le64w()/le64_to_cpup() calls with stq_le_p()/ldq_le_p(). Motivation for this modification is that follow up patches add utility function pcie_dev_ser_num_init() for PCIe DSN capability creation which uses pci_set_quad() with a misaligned offset. Signed-off-by: Dmitry Fleytman <dmitry.fleytman@ravellosystems.com> Signed-off-by: Leonid Bloch <leonid.bloch@ravellosystems.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
-rw-r--r--include/hw/pci/pci.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index ef6ba51..4420f47 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -465,16 +465,23 @@ pci_get_long(const uint8_t *config)
return ldl_le_p(config);
}
+/*
+ * PCI capabilities and/or their fields
+ * are generally DWORD aligned only so
+ * mechanism used by pci_set/get_quad()
+ * must be tolerant to unaligned pointers
+ *
+ */
static inline void
pci_set_quad(uint8_t *config, uint64_t val)
{
- cpu_to_le64w((uint64_t *)config, val);
+ stq_le_p(config, val);
}
static inline uint64_t
pci_get_quad(const uint8_t *config)
{
- return le64_to_cpup((const uint64_t *)config);
+ return ldq_le_p(config);
}
static inline void