106f6ba60Sopenharmony_ci/*
206f6ba60Sopenharmony_ci * Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License.
506f6ba60Sopenharmony_ci * You may obtain a copy of the License at
606f6ba60Sopenharmony_ci *
706f6ba60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
806f6ba60Sopenharmony_ci *
906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and
1306f6ba60Sopenharmony_ci * limitations under the License.
1406f6ba60Sopenharmony_ci */
1506f6ba60Sopenharmony_ci#define HILOG_TAG "RuntimeThread"
1606f6ba60Sopenharmony_ci
1706f6ba60Sopenharmony_ci#include "virtual_thread.h"
1806f6ba60Sopenharmony_ci
1906f6ba60Sopenharmony_ci#include <cinttypes>
2006f6ba60Sopenharmony_ci#include <iostream>
2106f6ba60Sopenharmony_ci#include <sstream>
2206f6ba60Sopenharmony_ci#if !is_mingw
2306f6ba60Sopenharmony_ci#include <sys/mman.h>
2406f6ba60Sopenharmony_ci#endif
2506f6ba60Sopenharmony_ci
2606f6ba60Sopenharmony_ci#include "common.h"
2706f6ba60Sopenharmony_ci#include "symbols_file.h"
2806f6ba60Sopenharmony_ci#include "utilities.h"
2906f6ba60Sopenharmony_ci#include "virtual_runtime.h"
3006f6ba60Sopenharmony_cinamespace OHOS {
3106f6ba60Sopenharmony_cinamespace Developtools {
3206f6ba60Sopenharmony_cinamespace NativeDaemon {
3306f6ba60Sopenharmony_ci#ifdef DEBUG_TIME
3406f6ba60Sopenharmony_cibool VirtualThread::IsSorted() const
3506f6ba60Sopenharmony_ci{
3606f6ba60Sopenharmony_ci    for (std::size_t index = 1; index < maps_->size(); ++index) {
3706f6ba60Sopenharmony_ci        if ((*maps_)[index - 1].end > (*maps_)[index].begin) {
3806f6ba60Sopenharmony_ci            std::cout << "maps_ order error:\n"
3906f6ba60Sopenharmony_ci                      << "    " << (*maps_)[index - 1].begin << "-" << (*maps_)[index - 1].end
4006f6ba60Sopenharmony_ci                      << "    " << (*maps_)[index].begin << "-" << (*maps_)[index].end;
4106f6ba60Sopenharmony_ci            return false;
4206f6ba60Sopenharmony_ci        }
4306f6ba60Sopenharmony_ci    }
4406f6ba60Sopenharmony_ci    return true;
4506f6ba60Sopenharmony_ci}
4606f6ba60Sopenharmony_ci#endif
4706f6ba60Sopenharmony_ci
4806f6ba60Sopenharmony_ciconst std::pair<std::shared_ptr<MemMaps>, uint32_t> VirtualThread::FindMemMapsByAddr(uint64_t addr) const
4906f6ba60Sopenharmony_ci{
5006f6ba60Sopenharmony_ci    return virtualruntime_->FindMap(addr);
5106f6ba60Sopenharmony_ci}
5206f6ba60Sopenharmony_ci
5306f6ba60Sopenharmony_ciconst std::shared_ptr<DfxMap> VirtualThread::FindMapByAddr(uint64_t addr) const
5406f6ba60Sopenharmony_ci{
5506f6ba60Sopenharmony_ci    HLOGM("try found vaddr 0x%" PRIx64 " in maps %zu ", addr, maps_->size());
5606f6ba60Sopenharmony_ci    if (maps_->size() == 0) {
5706f6ba60Sopenharmony_ci        return nullptr;
5806f6ba60Sopenharmony_ci    }
5906f6ba60Sopenharmony_ci    if (maps_->front()->begin > addr) {
6006f6ba60Sopenharmony_ci        return nullptr;
6106f6ba60Sopenharmony_ci    }
6206f6ba60Sopenharmony_ci    if (maps_->back()->end <= addr) {
6306f6ba60Sopenharmony_ci        return nullptr;
6406f6ba60Sopenharmony_ci    }
6506f6ba60Sopenharmony_ci    constexpr int two {2};
6606f6ba60Sopenharmony_ci    std::size_t left {0};
6706f6ba60Sopenharmony_ci    std::size_t right {maps_->size()};
6806f6ba60Sopenharmony_ci    std::size_t mid = (right - left) / two + left;
6906f6ba60Sopenharmony_ci    while (left < right) {
7006f6ba60Sopenharmony_ci        if (addr < (*maps_)[mid]->end) {
7106f6ba60Sopenharmony_ci            right = mid;
7206f6ba60Sopenharmony_ci            mid = (right - left) / two + left;
7306f6ba60Sopenharmony_ci            continue;
7406f6ba60Sopenharmony_ci        }
7506f6ba60Sopenharmony_ci        if (addr >= (*maps_)[mid]->end) {
7606f6ba60Sopenharmony_ci            left = mid + 1;
7706f6ba60Sopenharmony_ci            mid = (right - left) / two + left;
7806f6ba60Sopenharmony_ci            continue;
7906f6ba60Sopenharmony_ci        }
8006f6ba60Sopenharmony_ci    }
8106f6ba60Sopenharmony_ci    if (addr >= (*maps_)[left]->begin and addr < (*maps_)[left]->end) {
8206f6ba60Sopenharmony_ci        if (left > 0) {
8306f6ba60Sopenharmony_ci            (*maps_)[left]->prevMap = (*maps_)[left - 1];
8406f6ba60Sopenharmony_ci        }
8506f6ba60Sopenharmony_ci        return (*maps_)[left];
8606f6ba60Sopenharmony_ci    }
8706f6ba60Sopenharmony_ci    return nullptr;
8806f6ba60Sopenharmony_ci}
8906f6ba60Sopenharmony_ciVirtualThread::VirtualThread(pid_t pid,
9006f6ba60Sopenharmony_ci                             pid_t tid,
9106f6ba60Sopenharmony_ci                             const std::unordered_map<std::string, std::unique_ptr<SymbolsFile>>& symbolsFiles,
9206f6ba60Sopenharmony_ci                             VirtualRuntime* runtime,
9306f6ba60Sopenharmony_ci                             bool parseFlag)
9406f6ba60Sopenharmony_ci    : pid_(pid), tid_(tid), symbolsFiles_(symbolsFiles), virtualruntime_(runtime)
9506f6ba60Sopenharmony_ci{
9606f6ba60Sopenharmony_ci    maps_ = &virtualruntime_->processMaps_;
9706f6ba60Sopenharmony_ci    if (parseFlag) {
9806f6ba60Sopenharmony_ci        if (virtualruntime_->processMaps_.size() == 0) {
9906f6ba60Sopenharmony_ci            this->ParseMap(virtualruntime_->processMaps_);
10006f6ba60Sopenharmony_ci        }
10106f6ba60Sopenharmony_ci    }
10206f6ba60Sopenharmony_ci
10306f6ba60Sopenharmony_ci    this->name_ = ReadThreadName(pid);
10406f6ba60Sopenharmony_ci    HLOGM("%d %d map from parent size is %zu", pid, tid, maps_->size());
10506f6ba60Sopenharmony_ci}
10606f6ba60Sopenharmony_ci
10706f6ba60Sopenharmony_cistd::string VirtualThread::ReadThreadName(pid_t tid)
10806f6ba60Sopenharmony_ci{
10906f6ba60Sopenharmony_ci    std::string comm = ReadFileToString(StringPrintf("/proc/%d/comm", tid)).c_str();
11006f6ba60Sopenharmony_ci    comm.erase(std::remove(comm.begin(), comm.end(), '\r'), comm.end());
11106f6ba60Sopenharmony_ci    comm.erase(std::remove(comm.begin(), comm.end(), '\n'), comm.end());
11206f6ba60Sopenharmony_ci    return comm;
11306f6ba60Sopenharmony_ci}
11406f6ba60Sopenharmony_ci
11506f6ba60Sopenharmony_ciconst std::shared_ptr<DfxMap> VirtualThread::FindMapByFileInfo(const std::string name, uint64_t offset) const
11606f6ba60Sopenharmony_ci{
11706f6ba60Sopenharmony_ci    for (auto map : *maps_) {
11806f6ba60Sopenharmony_ci        if (name != map->name) {
11906f6ba60Sopenharmony_ci            continue;
12006f6ba60Sopenharmony_ci        }
12106f6ba60Sopenharmony_ci        // check begin and length
12206f6ba60Sopenharmony_ci        if (offset >= map->offset && (offset - map->offset) < (map->end - map->begin)) {
12306f6ba60Sopenharmony_ci            HLOGMMM("found fileoffset 0x%" PRIx64 " in map (0x%" PRIx64 " - 0x%" PRIx64
12406f6ba60Sopenharmony_ci                    " pageoffset 0x%" PRIx64 ")  from %s",
12506f6ba60Sopenharmony_ci                    offset, map->begin, map->end, map->offset, map->name.c_str());
12606f6ba60Sopenharmony_ci            return map;
12706f6ba60Sopenharmony_ci        }
12806f6ba60Sopenharmony_ci    }
12906f6ba60Sopenharmony_ci    HLOGM("NOT found offset 0x%" PRIx64 " in maps %zu ", offset, maps_->size());
13006f6ba60Sopenharmony_ci    return nullptr;
13106f6ba60Sopenharmony_ci}
13206f6ba60Sopenharmony_ci
13306f6ba60Sopenharmony_ciSymbolsFile *VirtualThread::FindSymbolsFileByMap(std::shared_ptr<DfxMap> inMap) const
13406f6ba60Sopenharmony_ci{
13506f6ba60Sopenharmony_ci    auto search = symbolsFiles_.find(inMap->name);
13606f6ba60Sopenharmony_ci    if (search != symbolsFiles_.end()) {
13706f6ba60Sopenharmony_ci        auto& symbolsFile = search->second;
13806f6ba60Sopenharmony_ci        HLOGM("found symbol for map '%s'", inMap->name.c_str());
13906f6ba60Sopenharmony_ci        symbolsFile->LoadDebugInfo(inMap);
14006f6ba60Sopenharmony_ci        return symbolsFile.get();
14106f6ba60Sopenharmony_ci    }
14206f6ba60Sopenharmony_ci#ifdef DEBUG_MISS_SYMBOL
14306f6ba60Sopenharmony_ci    if (find(missedSymbolFile_.begin(), missedSymbolFile_.end(), inMap->name) ==
14406f6ba60Sopenharmony_ci        missedSymbolFile_.end()) {
14506f6ba60Sopenharmony_ci        missedSymbolFile_.emplace_back(inMap->name);
14606f6ba60Sopenharmony_ci        HLOGW("NOT found symbol for map '%s'", inMap->name.c_str());
14706f6ba60Sopenharmony_ci        for (const auto &file : symbolsFiles_) {
14806f6ba60Sopenharmony_ci            HLOGW(" we have '%s'", file->filePath_.c_str());
14906f6ba60Sopenharmony_ci        }
15006f6ba60Sopenharmony_ci    }
15106f6ba60Sopenharmony_ci#endif
15206f6ba60Sopenharmony_ci    return nullptr;
15306f6ba60Sopenharmony_ci}
15406f6ba60Sopenharmony_ci
15506f6ba60Sopenharmony_ciSymbolsFile *VirtualThread::FindSymbolsFileByName(const std::string &name) const
15606f6ba60Sopenharmony_ci{
15706f6ba60Sopenharmony_ci    auto search = symbolsFiles_.find(name);
15806f6ba60Sopenharmony_ci    if (search != symbolsFiles_.end()) {
15906f6ba60Sopenharmony_ci        auto& symbolsFile = search->second;
16006f6ba60Sopenharmony_ci        HLOGM("found symbol for map '%s'", name.c_str());
16106f6ba60Sopenharmony_ci        symbolsFile->LoadDebugInfo();
16206f6ba60Sopenharmony_ci        return symbolsFile.get();
16306f6ba60Sopenharmony_ci    }
16406f6ba60Sopenharmony_ci#ifdef DEBUG_MISS_SYMBOL
16506f6ba60Sopenharmony_ci    if (find(missedSymbolFile_.begin(), missedSymbolFile_.end(), name) ==
16606f6ba60Sopenharmony_ci        missedSymbolFile_.end()) {
16706f6ba60Sopenharmony_ci        missedSymbolFile_.emplace_back(name);
16806f6ba60Sopenharmony_ci        HLOGW("NOT found symbol for map '%s'", name.c_str());
16906f6ba60Sopenharmony_ci        for (const auto &file : symbolsFiles_) {
17006f6ba60Sopenharmony_ci            HLOGW(" we have '%s'", file->filePath_.c_str());
17106f6ba60Sopenharmony_ci        }
17206f6ba60Sopenharmony_ci    }
17306f6ba60Sopenharmony_ci#endif
17406f6ba60Sopenharmony_ci    return nullptr;
17506f6ba60Sopenharmony_ci}
17606f6ba60Sopenharmony_ci
17706f6ba60Sopenharmony_civoid VirtualThread::ReportVaddrMapMiss(uint64_t vaddr) const
17806f6ba60Sopenharmony_ci{
17906f6ba60Sopenharmony_ci#ifdef HIPERF_DEBUG
18006f6ba60Sopenharmony_ci    if (DebugLogger::GetInstance()->GetLogLevel() <= LEVEL_VERBOSE) {
18106f6ba60Sopenharmony_ci        if (missedRuntimeVaddr_.find(vaddr) == missedRuntimeVaddr_.end()) {
18206f6ba60Sopenharmony_ci            missedRuntimeVaddr_.insert(vaddr);
18306f6ba60Sopenharmony_ci            HLOGV("vaddr %" PRIx64 " not found in any map", vaddr);
18406f6ba60Sopenharmony_ci            for (auto &map : *maps_) {
18506f6ba60Sopenharmony_ci                HLOGV("map %s ", map->ToString().c_str());
18606f6ba60Sopenharmony_ci            }
18706f6ba60Sopenharmony_ci        }
18806f6ba60Sopenharmony_ci    }
18906f6ba60Sopenharmony_ci#endif
19006f6ba60Sopenharmony_ci}
19106f6ba60Sopenharmony_ci
19206f6ba60Sopenharmony_cibool VirtualThread::ReadRoMemory(uint64_t vaddr, uint8_t *data, size_t size) const
19306f6ba60Sopenharmony_ci{
19406f6ba60Sopenharmony_ci    auto [curMemMaps, itemIndex] = virtualruntime_->FindMap(vaddr);
19506f6ba60Sopenharmony_ci    if (curMemMaps != nullptr) {
19606f6ba60Sopenharmony_ci        // found symbols by file name
19706f6ba60Sopenharmony_ci        SymbolsFile *symbolsFile = FindSymbolsFileByMap((curMemMaps->GetMaps())[itemIndex]);
19806f6ba60Sopenharmony_ci        if (symbolsFile != nullptr) {
19906f6ba60Sopenharmony_ci            std::shared_ptr<DfxMap> map = (curMemMaps->GetMaps())[itemIndex];
20006f6ba60Sopenharmony_ci            HLOGM("read vaddr from addr is 0x%" PRIx64 "  mapStart :0x%" PRIx64 " mapOffset :0x%" PRIx64 " at '%s'",
20106f6ba60Sopenharmony_ci                  vaddr - map->begin, map->begin, map->offset, map->name.c_str());
20206f6ba60Sopenharmony_ci            map->elf = symbolsFile->GetElfFile();
20306f6ba60Sopenharmony_ci            if (map->elf != nullptr) {
20406f6ba60Sopenharmony_ci                auto fileOffset = map->FileOffsetFromAddr(vaddr);
20506f6ba60Sopenharmony_ci                fileOffset -= map->elf->GetBaseOffset();
20606f6ba60Sopenharmony_ci                map->elf->Read(fileOffset, data, size);
20706f6ba60Sopenharmony_ci                return true;
20806f6ba60Sopenharmony_ci            }
20906f6ba60Sopenharmony_ci            HLOGE("ElfFile(%s) is null or read file offset from addr fail", curMemMaps->name_.c_str());
21006f6ba60Sopenharmony_ci            return false;
21106f6ba60Sopenharmony_ci        } else {
21206f6ba60Sopenharmony_ci            HLOGE("found addr %" PRIx64 " in map but not loaded symbole %s", vaddr, curMemMaps->name_.c_str());
21306f6ba60Sopenharmony_ci        }
21406f6ba60Sopenharmony_ci    } else {
21506f6ba60Sopenharmony_ci#ifdef HIPERF_DEBUG
21606f6ba60Sopenharmony_ci        ReportVaddrMapMiss(vaddr);
21706f6ba60Sopenharmony_ci#endif
21806f6ba60Sopenharmony_ci    }
21906f6ba60Sopenharmony_ci    return false;
22006f6ba60Sopenharmony_ci}
22106f6ba60Sopenharmony_ci
22206f6ba60Sopenharmony_cibool VirtualThread::ParseMap(std::vector<std::shared_ptr<DfxMap>>& memMaps, bool update)
22306f6ba60Sopenharmony_ci{
22406f6ba60Sopenharmony_ci    std::string mapPath = StringPrintf("/proc/%d/maps", pid_);
22506f6ba60Sopenharmony_ci    std::shared_ptr<DfxMaps> dfxMaps = OHOS::HiviewDFX::DfxMaps::Create(pid_, mapPath);
22606f6ba60Sopenharmony_ci    if (dfxMaps == nullptr) {
22706f6ba60Sopenharmony_ci        HLOGE("VirtualThread Failed to Parse Map.");
22806f6ba60Sopenharmony_ci        return false;
22906f6ba60Sopenharmony_ci    }
23006f6ba60Sopenharmony_ci    memMaps = dfxMaps->GetMaps();
23106f6ba60Sopenharmony_ci    bool mapsAdded = !update;
23206f6ba60Sopenharmony_ci    std::vector<std::shared_ptr<DfxMap>> tempMap;
23306f6ba60Sopenharmony_ci    std::string tempMapName;
23406f6ba60Sopenharmony_ci    std::shared_ptr<DfxMap> prevMap = nullptr;
23506f6ba60Sopenharmony_ci    for (auto memMapItem : memMaps) {
23606f6ba60Sopenharmony_ci        if (!update) {
23706f6ba60Sopenharmony_ci            virtualruntime_->FillMapsCache(tempMapName, memMapItem);
23806f6ba60Sopenharmony_ci            bool updateNormalSymbol = true;
23906f6ba60Sopenharmony_ci            if (memMapItem->name.find(".hap") != std::string::npos && (memMapItem->prots & PROT_EXEC)) {
24006f6ba60Sopenharmony_ci                memMapItem->prevMap = prevMap;
24106f6ba60Sopenharmony_ci                HLOGD("update hap(%s) symbols", memMapItem->name.c_str());
24206f6ba60Sopenharmony_ci                updateNormalSymbol = !virtualruntime_->UpdateHapSymbols(memMapItem);
24306f6ba60Sopenharmony_ci            }
24406f6ba60Sopenharmony_ci            if (updateNormalSymbol) {
24506f6ba60Sopenharmony_ci                virtualruntime_->UpdateSymbols(memMapItem->name, memMapItem);
24606f6ba60Sopenharmony_ci            }
24706f6ba60Sopenharmony_ci            prevMap = memMapItem;
24806f6ba60Sopenharmony_ci        } else if (!virtualruntime_->IsSymbolExist(memMapItem->name)) {
24906f6ba60Sopenharmony_ci            virtualruntime_->FillMapsCache(tempMapName, memMapItem);
25006f6ba60Sopenharmony_ci            mapsAdded = true;
25106f6ba60Sopenharmony_ci            tempMap.push_back(memMapItem);
25206f6ba60Sopenharmony_ci            bool updateNormalSymbol = true;
25306f6ba60Sopenharmony_ci            if (memMapItem->name.find(".hap") != std::string::npos && (memMapItem->prots & PROT_EXEC)) {
25406f6ba60Sopenharmony_ci                memMapItem->prevMap = prevMap;
25506f6ba60Sopenharmony_ci                HLOGD("update hap(%s) symbols", memMapItem->name.c_str());
25606f6ba60Sopenharmony_ci                updateNormalSymbol = !virtualruntime_->UpdateHapSymbols(memMapItem);
25706f6ba60Sopenharmony_ci            }
25806f6ba60Sopenharmony_ci            if (updateNormalSymbol) {
25906f6ba60Sopenharmony_ci                virtualruntime_->UpdateSymbols(memMapItem->name, memMapItem);
26006f6ba60Sopenharmony_ci            }
26106f6ba60Sopenharmony_ci            prevMap = memMapItem;
26206f6ba60Sopenharmony_ci        }
26306f6ba60Sopenharmony_ci    }
26406f6ba60Sopenharmony_ci
26506f6ba60Sopenharmony_ci    // Find if there are duplicate mapping intervals, and if there are, overwrite the old data with the new data.
26606f6ba60Sopenharmony_ci    for (auto tempMapIter = tempMap.begin(); tempMapIter != tempMap.end(); ++tempMapIter) {
26706f6ba60Sopenharmony_ci        auto memMapIter = std::find_if(memMaps.begin(), memMaps.end(), [&](const std::shared_ptr<DfxMap>& map) {
26806f6ba60Sopenharmony_ci            if ((*tempMapIter)->begin == map->begin && (*tempMapIter)->end == map->end) {
26906f6ba60Sopenharmony_ci                return true;
27006f6ba60Sopenharmony_ci            }
27106f6ba60Sopenharmony_ci            return false;
27206f6ba60Sopenharmony_ci        });
27306f6ba60Sopenharmony_ci        if (memMapIter != memMaps.end()) {
27406f6ba60Sopenharmony_ci            virtualruntime_->DelSymbolFile((*memMapIter)->name);
27506f6ba60Sopenharmony_ci            memMaps.erase(memMapIter);
27606f6ba60Sopenharmony_ci        }
27706f6ba60Sopenharmony_ci    }
27806f6ba60Sopenharmony_ci    memMaps.insert(memMaps.end(), tempMap.begin(), tempMap.end());
27906f6ba60Sopenharmony_ci
28006f6ba60Sopenharmony_ci    if (mapsAdded) {
28106f6ba60Sopenharmony_ci        PROFILER_LOG_DEBUG(LOG_CORE, "maps changed and need sort");
28206f6ba60Sopenharmony_ci        SortMaps();
28306f6ba60Sopenharmony_ci    } else {
28406f6ba60Sopenharmony_ci        PROFILER_LOG_DEBUG(LOG_CORE, "maps no change");
28506f6ba60Sopenharmony_ci        return false;
28606f6ba60Sopenharmony_ci    }
28706f6ba60Sopenharmony_ci    virtualruntime_->soBegin_ = 0;
28806f6ba60Sopenharmony_ci    return true;
28906f6ba60Sopenharmony_ci}
29006f6ba60Sopenharmony_ci
29106f6ba60Sopenharmony_civoid VirtualThread::SortMaps()
29206f6ba60Sopenharmony_ci{
29306f6ba60Sopenharmony_ci    for (size_t currPos = 1; currPos < maps_->size(); ++currPos) {
29406f6ba60Sopenharmony_ci        int targetPos = static_cast<int>(currPos - 1);
29506f6ba60Sopenharmony_ci        while (targetPos >= 0 && (*maps_)[currPos]->end < (*maps_)[targetPos]->end) {
29606f6ba60Sopenharmony_ci            --targetPos;
29706f6ba60Sopenharmony_ci        }
29806f6ba60Sopenharmony_ci        if (targetPos < static_cast<int>(currPos - 1)) {
29906f6ba60Sopenharmony_ci            auto target = (*maps_)[currPos];
30006f6ba60Sopenharmony_ci            for (size_t k = currPos - 1; k > static_cast<size_t>(targetPos); --k) {
30106f6ba60Sopenharmony_ci                (*maps_)[k + 1] = (*maps_)[k];
30206f6ba60Sopenharmony_ci            }
30306f6ba60Sopenharmony_ci            (*maps_)[targetPos + 1] = target;
30406f6ba60Sopenharmony_ci        }
30506f6ba60Sopenharmony_ci    }
30606f6ba60Sopenharmony_ci    return;
30706f6ba60Sopenharmony_ci}
30806f6ba60Sopenharmony_ci
30906f6ba60Sopenharmony_civoid VirtualThread::CreateMapItem(const std::string filename, uint64_t begin, uint64_t len,
31006f6ba60Sopenharmony_ci                                  uint64_t offset)
31106f6ba60Sopenharmony_ci{
31206f6ba60Sopenharmony_ci    if (!OHOS::HiviewDFX::DfxMaps::IsLegalMapItem(filename)) {
31306f6ba60Sopenharmony_ci        return; // skip some memmap
31406f6ba60Sopenharmony_ci    }
31506f6ba60Sopenharmony_ci    uint32_t prots =  PROT_EXEC;
31606f6ba60Sopenharmony_ci
31706f6ba60Sopenharmony_ci    std::shared_ptr<DfxMap> map = std::make_shared<DfxMap>(begin, begin + len, offset, prots, filename);
31806f6ba60Sopenharmony_ci    maps_->emplace_back(map);
31906f6ba60Sopenharmony_ci    std::string tempMapName{" "};
32006f6ba60Sopenharmony_ci    virtualruntime_->FillMapsCache(tempMapName, map);
32106f6ba60Sopenharmony_ci    SortMaps();
32206f6ba60Sopenharmony_ci}
32306f6ba60Sopenharmony_ci} // namespace NativeDaemon
32406f6ba60Sopenharmony_ci} // namespace Developtools
32506f6ba60Sopenharmony_ci} // namespace OHOS