/* * Copyright (c) 2012, 2018 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall * not be construed as granting a license to any other intellectual * property including but not limited to intellectual property relating * to a hardware implementation of the functionality of the software * licensed hereunder. You may use the software subject to the license * terms below provided that you ensure that this notice is replicated * unmodified and in its entirety in all distributions of the software, * modified or unmodified, in source code or in binary form. * * Copyright (c) 2006 The Regents of The University of Michigan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "base/addr_range_map.hh" using namespace gem5; // Converted from legacy unit test framework TEST(AddrRangeMapTest, LegacyTests) { AddrRangeMap r; AddrRangeMap::const_iterator i; i = r.insert(RangeIn(10, 40), 5); ASSERT_NE(i, r.end()); i = r.insert(RangeIn(60, 90), 3); ASSERT_NE(i, r.end()); EXPECT_NE(r.intersects(RangeIn(20, 30)), r.end()); EXPECT_EQ(r.contains(RangeIn(55, 55)), r.end()); EXPECT_EQ(r.intersects(RangeIn(55, 55)), r.end()); i = r.insert(RangeIn(0, 12), 1); EXPECT_EQ(i, r.end()); i = r.insert(RangeIn(0, 9), 1); ASSERT_NE(i, r.end()); EXPECT_NE(r.contains(RangeIn(20, 30)), r.end()); } /** * Test AddrRangeMap with interleaved address ranges defined by bitmasks. * An AddrRangeMap containing a set of N interleaved address ranges, * defined with the same start and end address, and including all possible * intlvMatch values 0..N-1, must contain the start address. * For N-way interleaving, log2(N) selection masks are needed. * For N = 16, define the masks as follows, * * masks[0] = 1 << 6 * masks[1] = 1 << 7 * masks[2] = 1 << 8 * masks[3] = 1 << 9 * */ TEST(AddrRangeMapTest, InterleavedTest1) { const auto N = 16; const auto masks = std::vector{ 0x40, 0x80, 0x100, 0x200 }; const Addr start = 0x80000000; const Addr end = 0xc0000000; AddrRangeMap r; AddrRangeMap::const_iterator i; // populate AddrRangeMap with N-way interleaved address ranges // for all intlvMatch values 0..N-1 for (int k=0; k < N; k++) { r.insert(AddrRange(start, end, masks, k), k); } // find AddrRange element containing start address i = r.contains(start); // i must not be the past-the-end iterator ASSERT_NE(i, r.end()) << "start address not found in AddrRangeMap"; // intlvMatch = 0 for start = 0x80000000 EXPECT_EQ(i->second, 0); } /** * Test AddrRangeMap with interleaved address ranges defined by bitmasks. * An AddrRangeMap containing a set of N interleaved address ranges, * defined with the same start and end address, and including all possible * intlvMatch values 0..N-1, must contain the start address. * For N-way interleaving, log2(N) selection masks are needed. * For N = 16, define the masks as described in the * CMN-600 Technical Reference Manual [1], section 2.17.3 * * masks[0] = 1 << 6 | 1 << 10 | 1 << 14 | .. | 1 << 50 * masks[1] = 1 << 7 | 1 << 11 | 1 << 15 | .. | 1 << 51 * masks[2] = 1 << 8 | 1 << 12 | 1 << 16 | .. | 1 << 48 * masks[3] = 1 << 9 | 1 << 13 | 1 << 17 | .. | 1 << 49 * * [1] https://developer.arm.com/documentation/100180/0302 */ TEST(AddrRangeMapTest, InterleavedTest2) { const auto N = 16; const auto masks = std::vector{ 0x4444444444440, 0x8888888888880, 0x1111111111100, 0x2222222222200 }; const Addr start = 0x80000000; const Addr end = 0xc0000000; AddrRangeMap r; AddrRangeMap::const_iterator i; // populate AddrRangeMap with N-way interleaved address ranges // for all intlvMatch values 0..N-1 for (int k=0; k < N; k++) { r.insert(AddrRange(start, end, masks, k), k); } // find AddrRange element containing start address i = r.contains(start); // i must not be the past-the-end iterator ASSERT_NE(i, r.end()) << "start address not found in AddrRangeMap"; // intlvMatch = 2 for start = 0x80000000 EXPECT_EQ(i->second, 2); }