132541685SDavid Spickett //===-- LinuxProcMapsTest.cpp ---------------------------------------------===// 232541685SDavid Spickett // 332541685SDavid Spickett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 432541685SDavid Spickett // See https://llvm.org/LICENSE.txt for license information. 532541685SDavid Spickett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 632541685SDavid Spickett // 732541685SDavid Spickett //===----------------------------------------------------------------------===// 832541685SDavid Spickett 932541685SDavid Spickett #include "gmock/gmock.h" 1032541685SDavid Spickett #include "gtest/gtest.h" 1132541685SDavid Spickett 1232541685SDavid Spickett #include "Plugins/Process/Utility/LinuxProcMaps.h" 1332541685SDavid Spickett #include "lldb/Target/MemoryRegionInfo.h" 1432541685SDavid Spickett #include "lldb/Utility/Status.h" 1532541685SDavid Spickett #include <tuple> 1632541685SDavid Spickett 1732541685SDavid Spickett using namespace lldb_private; 1832541685SDavid Spickett 1932541685SDavid Spickett typedef std::tuple<const char *, MemoryRegionInfos, const char *> 2032541685SDavid Spickett LinuxProcMapsTestParams; 2132541685SDavid Spickett 2232541685SDavid Spickett // Wrapper for convenience because Range is usually begin, size 2332541685SDavid Spickett static MemoryRegionInfo::RangeType make_range(lldb::addr_t begin, 2432541685SDavid Spickett lldb::addr_t end) { 2532541685SDavid Spickett MemoryRegionInfo::RangeType range(begin, 0); 2632541685SDavid Spickett range.SetRangeEnd(end); 2732541685SDavid Spickett return range; 2832541685SDavid Spickett } 2932541685SDavid Spickett 3032541685SDavid Spickett class LinuxProcMapsTestFixture 3132541685SDavid Spickett : public ::testing::TestWithParam<LinuxProcMapsTestParams> { 3232541685SDavid Spickett protected: 3332541685SDavid Spickett Status error; 3432541685SDavid Spickett std::string err_str; 3532541685SDavid Spickett MemoryRegionInfos regions; 3632541685SDavid Spickett LinuxMapCallback callback; 3732541685SDavid Spickett 3832541685SDavid Spickett void SetUp() override { 3932541685SDavid Spickett callback = [this](llvm::Expected<MemoryRegionInfo> Info) { 4032541685SDavid Spickett if (Info) { 4132541685SDavid Spickett err_str.clear(); 4232541685SDavid Spickett regions.push_back(*Info); 4332541685SDavid Spickett return true; 4432541685SDavid Spickett } 4532541685SDavid Spickett 4632541685SDavid Spickett err_str = toString(Info.takeError()); 4732541685SDavid Spickett return false; 4832541685SDavid Spickett }; 4932541685SDavid Spickett } 5032541685SDavid Spickett 5132541685SDavid Spickett void check_regions(LinuxProcMapsTestParams params) { 5232541685SDavid Spickett EXPECT_THAT(std::get<1>(params), testing::ContainerEq(regions)); 5332541685SDavid Spickett ASSERT_EQ(std::get<2>(params), err_str); 5432541685SDavid Spickett } 5532541685SDavid Spickett }; 5632541685SDavid Spickett 5732541685SDavid Spickett TEST_P(LinuxProcMapsTestFixture, ParseMapRegions) { 5832541685SDavid Spickett auto params = GetParam(); 5932541685SDavid Spickett ParseLinuxMapRegions(std::get<0>(params), callback); 6032541685SDavid Spickett check_regions(params); 6132541685SDavid Spickett } 6232541685SDavid Spickett 6332541685SDavid Spickett // Note: ConstString("") != ConstString(nullptr) 6432541685SDavid Spickett // When a region has no name, it will have the latter in the MemoryRegionInfo 65d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P( 6632541685SDavid Spickett ProcMapTests, LinuxProcMapsTestFixture, 6732541685SDavid Spickett ::testing::Values( 6832541685SDavid Spickett // Nothing in nothing out 6932541685SDavid Spickett std::make_tuple("", MemoryRegionInfos{}, ""), 7032541685SDavid Spickett // Various formatting error conditions 7132541685SDavid Spickett std::make_tuple("55a4512f7000/55a451b68000 rw-p 00000000 00:00 0", 7232541685SDavid Spickett MemoryRegionInfos{}, 7332541685SDavid Spickett "malformed /proc/{pid}/maps entry, missing dash " 7432541685SDavid Spickett "between address range"), 7532541685SDavid Spickett std::make_tuple("0-0 rw", MemoryRegionInfos{}, 7632541685SDavid Spickett "malformed /proc/{pid}/maps entry, missing some " 7732541685SDavid Spickett "portion of permissions"), 7832541685SDavid Spickett std::make_tuple("0-0 z--p 00000000 00:00 0", MemoryRegionInfos{}, 7932541685SDavid Spickett "unexpected /proc/{pid}/maps read permission char"), 8032541685SDavid Spickett std::make_tuple("0-0 rz-p 00000000 00:00 0", MemoryRegionInfos{}, 8132541685SDavid Spickett "unexpected /proc/{pid}/maps write permission char"), 8232541685SDavid Spickett std::make_tuple("0-0 rwzp 00000000 00:00 0", MemoryRegionInfos{}, 8332541685SDavid Spickett "unexpected /proc/{pid}/maps exec permission char"), 8432541685SDavid Spickett // Stops at first parsing error 8532541685SDavid Spickett std::make_tuple( 8632541685SDavid Spickett "0-1 rw-p 00000000 00:00 0 [abc]\n" 8732541685SDavid Spickett "0-0 rwzp 00000000 00:00 0\n" 8832541685SDavid Spickett "2-3 r-xp 00000000 00:00 0 [def]\n", 8932541685SDavid Spickett MemoryRegionInfos{ 90*b1751faaSDavid Spickett MemoryRegionInfo( 91*b1751faaSDavid Spickett make_range(0, 1), MemoryRegionInfo::eYes, 92*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 93*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 94*b1751faaSDavid Spickett ConstString("[abc]"), MemoryRegionInfo::eDontKnow, 0, 95*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 9632541685SDavid Spickett MemoryRegionInfo::eDontKnow), 9732541685SDavid Spickett }, 9832541685SDavid Spickett "unexpected /proc/{pid}/maps exec permission char"), 9932541685SDavid Spickett // Single entry 10032541685SDavid Spickett std::make_tuple( 10132541685SDavid Spickett "55a4512f7000-55a451b68000 rw-p 00000000 00:00 0 [heap]", 10232541685SDavid Spickett MemoryRegionInfos{ 103b97afc9dSJonas Devlieghere MemoryRegionInfo( 104b97afc9dSJonas Devlieghere make_range(0x55a4512f7000, 0x55a451b68000), 105*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, 106*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, 107*b1751faaSDavid Spickett MemoryRegionInfo::eYes, ConstString("[heap]"), 108*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow, 109b97afc9dSJonas Devlieghere MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow), 11032541685SDavid Spickett }, 11132541685SDavid Spickett ""), 11232541685SDavid Spickett // Multiple entries 11332541685SDavid Spickett std::make_tuple( 11432541685SDavid Spickett "7fc090021000-7fc094000000 ---p 00000000 00:00 0\n" 115c0702ac0SEmre Kultursay "7fc094000000-7fc094a00000 ---s 00000000 00:00 0\n" 11632541685SDavid Spickett "ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 " 11732541685SDavid Spickett "[vsyscall]", 11832541685SDavid Spickett MemoryRegionInfos{ 119b97afc9dSJonas Devlieghere MemoryRegionInfo( 120b97afc9dSJonas Devlieghere make_range(0x7fc090021000, 0x7fc094000000), 121*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, 122*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, 123*b1751faaSDavid Spickett MemoryRegionInfo::eYes, ConstString(nullptr), 124*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow, 125c0702ac0SEmre Kultursay MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow), 126c0702ac0SEmre Kultursay MemoryRegionInfo( 127c0702ac0SEmre Kultursay make_range(0x7fc094000000, 0x7fc094a00000), 128*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eNo, 129*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 130*b1751faaSDavid Spickett MemoryRegionInfo::eYes, ConstString(nullptr), 131*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow, 132b97afc9dSJonas Devlieghere MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow), 13332541685SDavid Spickett MemoryRegionInfo( 13432541685SDavid Spickett make_range(0xffffffffff600000, 0xffffffffff601000), 135*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 136*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 137*b1751faaSDavid Spickett MemoryRegionInfo::eYes, ConstString("[vsyscall]"), 138*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, 0, MemoryRegionInfo::eDontKnow, 139b97afc9dSJonas Devlieghere MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow), 14032541685SDavid Spickett }, 141d4d80a29SBenjamin Kramer ""))); 14232541685SDavid Spickett 14332541685SDavid Spickett class LinuxProcSMapsTestFixture : public LinuxProcMapsTestFixture {}; 14432541685SDavid Spickett 145d4d80a29SBenjamin Kramer INSTANTIATE_TEST_SUITE_P( 14632541685SDavid Spickett ProcSMapTests, LinuxProcSMapsTestFixture, 14732541685SDavid Spickett ::testing::Values( 14832541685SDavid Spickett // Nothing in nothing out 14932541685SDavid Spickett std::make_tuple("", MemoryRegionInfos{}, ""), 15032541685SDavid Spickett // Uses the same parsing for first line, so same errors but referring to 15132541685SDavid Spickett // smaps 15232541685SDavid Spickett std::make_tuple("0/0 rw-p 00000000 00:00 0", MemoryRegionInfos{}, 15332541685SDavid Spickett "malformed /proc/{pid}/smaps entry, missing dash " 15432541685SDavid Spickett "between address range"), 15532541685SDavid Spickett // Stop parsing at first error 15632541685SDavid Spickett std::make_tuple( 15732541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0 [foo]\n" 15832541685SDavid Spickett "0/0 rw-p 00000000 00:00 0", 15932541685SDavid Spickett MemoryRegionInfos{ 160b97afc9dSJonas Devlieghere MemoryRegionInfo( 161*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 162*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 163*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 164*b1751faaSDavid Spickett ConstString("[foo]"), MemoryRegionInfo::eDontKnow, 0, 165*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 16632541685SDavid Spickett MemoryRegionInfo::eDontKnow), 16732541685SDavid Spickett }, 16832541685SDavid Spickett "malformed /proc/{pid}/smaps entry, missing dash between address " 16932541685SDavid Spickett "range"), 17032541685SDavid Spickett // Property line without a region is an error 17132541685SDavid Spickett std::make_tuple("Referenced: 2188 kB\n" 17232541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0 [foo]\n" 17332541685SDavid Spickett "3333-4444 rw-p 00000000 00:00 0 [bar]\n", 17432541685SDavid Spickett MemoryRegionInfos{}, 17532541685SDavid Spickett "Found a property line without a corresponding mapping " 17632541685SDavid Spickett "in /proc/{pid}/smaps"), 17732541685SDavid Spickett // Single region parses, has no flags 17832541685SDavid Spickett std::make_tuple( 17932541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0 [foo]", 18032541685SDavid Spickett MemoryRegionInfos{ 181b97afc9dSJonas Devlieghere MemoryRegionInfo( 182*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 183*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 184*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 185*b1751faaSDavid Spickett ConstString("[foo]"), MemoryRegionInfo::eDontKnow, 0, 186*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 187c0702ac0SEmre Kultursay MemoryRegionInfo::eDontKnow), 188c0702ac0SEmre Kultursay }, 189c0702ac0SEmre Kultursay ""), 190c0702ac0SEmre Kultursay // Single shared region parses, has no flags 191c0702ac0SEmre Kultursay std::make_tuple( 192c0702ac0SEmre Kultursay "1111-2222 rw-s 00000000 00:00 0 [foo]", 193c0702ac0SEmre Kultursay MemoryRegionInfos{ 194c0702ac0SEmre Kultursay MemoryRegionInfo( 195*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 196*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 197*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eYes, 198*b1751faaSDavid Spickett ConstString("[foo]"), MemoryRegionInfo::eDontKnow, 0, 199*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 20032541685SDavid Spickett MemoryRegionInfo::eDontKnow), 20132541685SDavid Spickett }, 20232541685SDavid Spickett ""), 20332541685SDavid Spickett // Single region with flags, other lines ignored 20432541685SDavid Spickett std::make_tuple( 20532541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0 [foo]\n" 20632541685SDavid Spickett "Referenced: 2188 kB\n" 20732541685SDavid Spickett "AnonHugePages: 0 kB\n" 20832541685SDavid Spickett "VmFlags: mt", 20932541685SDavid Spickett MemoryRegionInfos{ 21032541685SDavid Spickett MemoryRegionInfo( 211*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 212*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 213*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 214*b1751faaSDavid Spickett ConstString("[foo]"), MemoryRegionInfo::eDontKnow, 0, 215*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eDontKnow, 216*b1751faaSDavid Spickett MemoryRegionInfo::eNo), 21732541685SDavid Spickett }, 21832541685SDavid Spickett ""), 21932541685SDavid Spickett // Whitespace ignored 22032541685SDavid Spickett std::make_tuple( 22132541685SDavid Spickett "0-0 rw-p 00000000 00:00 0\n" 22232541685SDavid Spickett "VmFlags: mt ", 22332541685SDavid Spickett MemoryRegionInfos{ 224*b1751faaSDavid Spickett MemoryRegionInfo( 225*b1751faaSDavid Spickett make_range(0, 0), MemoryRegionInfo::eYes, 226*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 227*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 228*b1751faaSDavid Spickett ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0, 229*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eDontKnow, 230*b1751faaSDavid Spickett MemoryRegionInfo::eNo), 23132541685SDavid Spickett }, 23232541685SDavid Spickett ""), 23332541685SDavid Spickett // VmFlags line means it has flag info, but nothing is set 23432541685SDavid Spickett std::make_tuple( 23532541685SDavid Spickett "0-0 rw-p 00000000 00:00 0\n" 23632541685SDavid Spickett "VmFlags: ", 23732541685SDavid Spickett MemoryRegionInfos{ 238*b1751faaSDavid Spickett MemoryRegionInfo( 239*b1751faaSDavid Spickett make_range(0, 0), MemoryRegionInfo::eYes, 240*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 241*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 242*b1751faaSDavid Spickett ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0, 243*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eDontKnow, 244*b1751faaSDavid Spickett MemoryRegionInfo::eNo), 24532541685SDavid Spickett }, 24632541685SDavid Spickett ""), 24732541685SDavid Spickett // Handle some pages not having a flags line 24832541685SDavid Spickett std::make_tuple( 24932541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0 [foo]\n" 25032541685SDavid Spickett "Referenced: 2188 kB\n" 25132541685SDavid Spickett "AnonHugePages: 0 kB\n" 25232541685SDavid Spickett "3333-4444 r-xp 00000000 00:00 0 [bar]\n" 25332541685SDavid Spickett "VmFlags: mt", 25432541685SDavid Spickett MemoryRegionInfos{ 255b97afc9dSJonas Devlieghere MemoryRegionInfo( 256*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 257*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 258*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 259*b1751faaSDavid Spickett ConstString("[foo]"), MemoryRegionInfo::eDontKnow, 0, 260*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 26132541685SDavid Spickett MemoryRegionInfo::eDontKnow), 26232541685SDavid Spickett MemoryRegionInfo( 263*b1751faaSDavid Spickett make_range(0x3333, 0x4444), MemoryRegionInfo::eYes, 264*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 265*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 266*b1751faaSDavid Spickett ConstString("[bar]"), MemoryRegionInfo::eDontKnow, 0, 267*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eDontKnow, 268*b1751faaSDavid Spickett MemoryRegionInfo::eNo), 26932541685SDavid Spickett }, 27032541685SDavid Spickett ""), 27132541685SDavid Spickett // Handle no pages having a flags line (older kernels) 27232541685SDavid Spickett std::make_tuple( 27332541685SDavid Spickett "1111-2222 rw-p 00000000 00:00 0\n" 27432541685SDavid Spickett "Referenced: 2188 kB\n" 27532541685SDavid Spickett "AnonHugePages: 0 kB\n" 27632541685SDavid Spickett "3333-4444 r-xp 00000000 00:00 0\n" 27732541685SDavid Spickett "KernelPageSize: 4 kB\n" 27832541685SDavid Spickett "MMUPageSize: 4 kB\n", 27932541685SDavid Spickett MemoryRegionInfos{ 280b97afc9dSJonas Devlieghere MemoryRegionInfo( 281*b1751faaSDavid Spickett make_range(0x1111, 0x2222), MemoryRegionInfo::eYes, 282*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 283*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 284*b1751faaSDavid Spickett ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0, 285*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 286b97afc9dSJonas Devlieghere MemoryRegionInfo::eDontKnow), 287b97afc9dSJonas Devlieghere MemoryRegionInfo( 288*b1751faaSDavid Spickett make_range(0x3333, 0x4444), MemoryRegionInfo::eYes, 289*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 290*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 291*b1751faaSDavid Spickett ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0, 292*b1751faaSDavid Spickett MemoryRegionInfo::eDontKnow, MemoryRegionInfo::eDontKnow, 29332541685SDavid Spickett MemoryRegionInfo::eDontKnow), 29432541685SDavid Spickett }, 295*b1751faaSDavid Spickett ""), 296*b1751faaSDavid Spickett // We must look for exact flag strings, ignoring substrings of longer 297*b1751faaSDavid Spickett // flag names. 298*b1751faaSDavid Spickett std::make_tuple( 299*b1751faaSDavid Spickett "0-0 rw-p 00000000 00:00 0\n" 300*b1751faaSDavid Spickett "VmFlags: amt mtb amtb", 301*b1751faaSDavid Spickett MemoryRegionInfos{ 302*b1751faaSDavid Spickett MemoryRegionInfo( 303*b1751faaSDavid Spickett make_range(0, 0), MemoryRegionInfo::eYes, 304*b1751faaSDavid Spickett MemoryRegionInfo::eYes, MemoryRegionInfo::eNo, 305*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eYes, 306*b1751faaSDavid Spickett ConstString(nullptr), MemoryRegionInfo::eDontKnow, 0, 307*b1751faaSDavid Spickett MemoryRegionInfo::eNo, MemoryRegionInfo::eDontKnow, 308*b1751faaSDavid Spickett MemoryRegionInfo::eNo), 309*b1751faaSDavid Spickett }, 310d4d80a29SBenjamin Kramer ""))); 31132541685SDavid Spickett 31232541685SDavid Spickett TEST_P(LinuxProcSMapsTestFixture, ParseSMapRegions) { 31332541685SDavid Spickett auto params = GetParam(); 31432541685SDavid Spickett ParseLinuxSMapRegions(std::get<0>(params), callback); 31532541685SDavid Spickett check_regions(params); 31632541685SDavid Spickett } 317