| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "garnet/bin/guest/vmm/dev_mem.h" |
| |
| #include "gtest/gtest.h" |
| |
| namespace { |
| |
| static constexpr zx_gpaddr_t kGoodDeviceAddr = 0xc000000; |
| |
| TEST(DevMemTest, NoOverlappingRanges) { |
| DevMem dev_mem; |
| |
| EXPECT_TRUE(dev_mem.AddRange(kGoodDeviceAddr, 0x2000)); |
| |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr, 0x2000)); |
| |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr - 0x1000, 0x2000)); |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr + 0x1000, 0x2000)); |
| |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr - 1, 2)); |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr + 0x1fff, 2)); |
| } |
| |
| TEST(DevMemTest, CanHaveAdjacentRanges) { |
| DevMem dev_mem; |
| |
| EXPECT_TRUE(dev_mem.AddRange(kGoodDeviceAddr, 0x2000)); |
| |
| EXPECT_TRUE(dev_mem.AddRange(kGoodDeviceAddr - 1, 1)); |
| EXPECT_TRUE(dev_mem.AddRange(kGoodDeviceAddr + 0x2000, 1)); |
| } |
| |
| TEST(DevMemTest, SizedRanges) { |
| DevMem dev_mem; |
| |
| EXPECT_FALSE(dev_mem.AddRange(kGoodDeviceAddr, 0)); |
| EXPECT_FALSE(dev_mem.AddRange(0, 0)); |
| } |
| |
| TEST(DevMemTest, YieldInverseRange) { |
| DevMem dev_mem; |
| |
| EXPECT_TRUE(dev_mem.AddRange(kGoodDeviceAddr, 0x1000)); |
| |
| zx_gpaddr_t addr = 0; |
| size_t size = 0; |
| auto yield = [&addr, &size](zx_gpaddr_t addr_in, size_t size_in) { |
| addr = addr_in; |
| size = size_in; |
| }; |
| |
| // Memory is non-overlapping. |
| dev_mem.YieldInverseRange(kGoodDeviceAddr + 0x1000, 0x1000, yield); |
| EXPECT_EQ(kGoodDeviceAddr + 0x1000, addr); |
| EXPECT_EQ(0x1000ul, size); |
| |
| // Memory extends beyond end of range. |
| addr = 0; |
| size = 0; |
| dev_mem.YieldInverseRange(kGoodDeviceAddr, 0x3000, yield); |
| EXPECT_EQ(kGoodDeviceAddr + 0x1000, addr); |
| EXPECT_EQ(0x2000ul, size); |
| |
| // Memory begins before start of range. |
| addr = 0; |
| size = 0; |
| dev_mem.YieldInverseRange(0, kGoodDeviceAddr + 0x1000, yield); |
| EXPECT_EQ(0ul, addr); |
| EXPECT_EQ(kGoodDeviceAddr, size); |
| } |
| |
| } // namespace |