diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2019-06-14 15:17:09 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-25 04:36:46 +0000 |
commit | 5e3442e67519caa018c3ec51d7105b03ea648e4d (patch) | |
tree | 4785d1521ba65a70145ecad4cc2addd3c50301f2 | |
parent | 4dd6ddbc3926d308479cf1db5055cd93967cb609 (diff) | |
download | crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar.gz crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar.bz2 crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar.lz crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar.xz crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.tar.zst crosvm-5e3442e67519caa018c3ec51d7105b03ea648e4d.zip |
devices: pci: check BAR address alignment
Each PCI BAR address must be aligned to at least its own size to allow the BAR sizing mechanism to work properly. Add a check in add_pci_bar() to enforce this. BUG=None TEST=Boot vm_kernel in crosvm Change-Id: Iee9d866c4982bd79935337682bd50b9205b95024 Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1660203 Reviewed-by: Dylan Reid <dgreid@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
-rw-r--r-- | devices/src/pci/pci_configuration.rs | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/devices/src/pci/pci_configuration.rs b/devices/src/pci/pci_configuration.rs index ab969f7..5f230af 100644 --- a/devices/src/pci/pci_configuration.rs +++ b/devices/src/pci/pci_configuration.rs @@ -200,6 +200,7 @@ pub struct PciBarConfiguration { #[derive(Debug)] pub enum Error { BarAddressInvalid(u64, u64), + BarAlignmentInvalid(u64, u64), BarInUse(usize), BarInUse64(usize), BarInvalid(usize), @@ -218,6 +219,7 @@ impl Display for Error { use self::Error::*; match self { BarAddressInvalid(a, s) => write!(f, "address {} size {} too big", a, s), + BarAlignmentInvalid(a, s) => write!(f, "address {} is not aligned to size {}", a, s), BarInUse(b) => write!(f, "bar {} already used", b), BarInUse64(b) => write!(f, "64bit bar {} already used(requires two regs)", b), BarInvalid(b) => write!(f, "bar {} invalid, max {}", b, NUM_BAR_REGS - 1), @@ -358,6 +360,10 @@ impl PciConfiguration { return Err(Error::BarInvalid(config.reg_idx)); } + if config.addr % config.size != 0 { + return Err(Error::BarAlignmentInvalid(config.addr, config.size)); + } + let bar_idx = BAR0_REG + config.reg_idx; let end_addr = config .addr |