diff options
author | Alexandru Elisei <alexandru.elisei@arm.com> | 2021-10-12 14:25:06 +0100 |
---|---|---|
committer | Will Deacon <will@kernel.org> | 2021-10-13 08:36:59 +0100 |
commit | 34bfe5f632a4a82fad197bb0db12d3369ef0f7b2 (patch) | |
tree | f08508537c062b3307544b678238a5c247ca33cb | |
parent | 3d3dca077ae298636f441b302264abe7a1af7b9f (diff) | |
download | kvmtool-34bfe5f632a4a82fad197bb0db12d3369ef0f7b2.tar.gz |
pci: Fix pci_dev_* print macros
Evaluate the "pci_hdr" argument before attempting to deference a field.
This fixes cryptic errors like this one, which came about during a
debugging session:
vfio/pci.c: In function 'vfio_pci_bar_activate':
include/kvm/pci.h:18:40: error: invalid type argument of '->' (have 'struct pci_device_header')
pr_warning("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__)
^~
vfio/pci.c:482:3: note: in expansion of macro 'pci_dev_warn'
pci_dev_warn(&vdev->pci.hdr, "%s: BAR4\n", __func__);
This is caused by the operator precedence rules in C, where pointer
deference via "->" has a higher precedence than taking the address with the
ampersand symbol. When the macro is substituted, it becomes
&vdev->pci.hdr->vendor_id and it dereferences vdev->pci.hdr, which is not a
pointer, instead of dereferencing &vdev->pci.hdr, which is a pointer, and
quite likely what the author intended.
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
Link: https://lore.kernel.org/r/20211012132510.42134-4-alexandru.elisei@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r-- | include/kvm/pci.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/include/kvm/pci.h b/include/kvm/pci.h index 0f2d5bba..d6eb3986 100644 --- a/include/kvm/pci.h +++ b/include/kvm/pci.h @@ -13,15 +13,15 @@ #include "kvm/kvm-arch.h" #define pci_dev_err(pci_hdr, fmt, ...) \ - pr_err("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__) + pr_err("[%04x:%04x] " fmt, (pci_hdr)->vendor_id, (pci_hdr)->device_id, ##__VA_ARGS__) #define pci_dev_warn(pci_hdr, fmt, ...) \ - pr_warning("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__) + pr_warning("[%04x:%04x] " fmt, (pci_hdr)->vendor_id, (pci_hdr)->device_id, ##__VA_ARGS__) #define pci_dev_info(pci_hdr, fmt, ...) \ - pr_info("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__) + pr_info("[%04x:%04x] " fmt, (pci_hdr)->vendor_id, (pci_hdr)->device_id, ##__VA_ARGS__) #define pci_dev_dbg(pci_hdr, fmt, ...) \ - pr_debug("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__) + pr_debug("[%04x:%04x] " fmt, (pci_hdr)->vendor_id, (pci_hdr)->device_id, ##__VA_ARGS__) #define pci_dev_die(pci_hdr, fmt, ...) \ - die("[%04x:%04x] " fmt, pci_hdr->vendor_id, pci_hdr->device_id, ##__VA_ARGS__) + die("[%04x:%04x] " fmt, (pci_hdr)->vendor_id, (pci_hdr)->device_id, ##__VA_ARGS__) /* * PCI Configuration Mechanism #1 I/O ports. See Section 3.7.4.1. |