summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-06-14 15:17:09 -0700
committerCommit Bot <commit-bot@chromium.org>2019-06-25 04:36:46 +0000
commit5e3442e67519caa018c3ec51d7105b03ea648e4d (patch)
tree4785d1521ba65a70145ecad4cc2addd3c50301f2
parent4dd6ddbc3926d308479cf1db5055cd93967cb609 (diff)
downloadcrosvm-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.rs6
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