1*0b57cec5SDimitry Andric //===-- AuxVector.cpp -----------------------------------------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "AuxVector.h" 10*0b57cec5SDimitry Andric #include <optional> 11*0b57cec5SDimitry Andric AuxVector(const lldb_private::DataExtractor & data)12*0b57cec5SDimitry AndricAuxVector::AuxVector(const lldb_private::DataExtractor &data) { 13*0b57cec5SDimitry Andric ParseAuxv(data); 14*0b57cec5SDimitry Andric } 15*0b57cec5SDimitry Andric ParseAuxv(const lldb_private::DataExtractor & data)16*0b57cec5SDimitry Andricvoid AuxVector::ParseAuxv(const lldb_private::DataExtractor &data) { 17*0b57cec5SDimitry Andric lldb::offset_t offset = 0; 18*0b57cec5SDimitry Andric const size_t value_type_size = data.GetAddressByteSize() * 2; 19*0b57cec5SDimitry Andric while (data.ValidOffsetForDataOfSize(offset, value_type_size)) { 20*0b57cec5SDimitry Andric // We're not reading an address but an int that could be 32 or 64 bit 21*0b57cec5SDimitry Andric // depending on the address size, which is what GetAddress does. 22*0b57cec5SDimitry Andric const uint64_t type = data.GetAddress(&offset); 23*0b57cec5SDimitry Andric const uint64_t value = data.GetAddress(&offset); 24*0b57cec5SDimitry Andric if (type == AUXV_AT_NULL) 25*0b57cec5SDimitry Andric break; 26*0b57cec5SDimitry Andric if (type == AUXV_AT_IGNORE) 27*0b57cec5SDimitry Andric continue; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric m_auxv_entries[type] = value; 30*0b57cec5SDimitry Andric } 31*0b57cec5SDimitry Andric } 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric std::optional<uint64_t> GetAuxValue(enum EntryType entry_type) const34*0b57cec5SDimitry AndricAuxVector::GetAuxValue(enum EntryType entry_type) const { 35*0b57cec5SDimitry Andric auto it = m_auxv_entries.find(static_cast<uint64_t>(entry_type)); 36*0b57cec5SDimitry Andric if (it != m_auxv_entries.end()) 37*0b57cec5SDimitry Andric return it->second; 38*0b57cec5SDimitry Andric return std::nullopt; 39*0b57cec5SDimitry Andric } 40*0b57cec5SDimitry Andric DumpToLog(lldb_private::Log * log) const41*0b57cec5SDimitry Andricvoid AuxVector::DumpToLog(lldb_private::Log *log) const { 42*0b57cec5SDimitry Andric if (!log) 43*0b57cec5SDimitry Andric return; 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric log->PutCString("AuxVector: "); 46*0b57cec5SDimitry Andric for (auto entry : m_auxv_entries) { 47*0b57cec5SDimitry Andric LLDB_LOGF(log, " %s [%" PRIu64 "]: %" PRIx64, 48*0b57cec5SDimitry Andric GetEntryName(static_cast<EntryType>(entry.first)), entry.first, 49*0b57cec5SDimitry Andric entry.second); 50*0b57cec5SDimitry Andric } 51*0b57cec5SDimitry Andric } 52*0b57cec5SDimitry Andric GetEntryName(EntryType type) const53*0b57cec5SDimitry Andricconst char *AuxVector::GetEntryName(EntryType type) const { 54*0b57cec5SDimitry Andric const char *name = "AT_???"; 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric #define ENTRY_NAME(_type) \ 57*0b57cec5SDimitry Andric _type: \ 58*0b57cec5SDimitry Andric name = &#_type[5] 59*0b57cec5SDimitry Andric switch (type) { 60*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_NULL); break; 61*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_IGNORE); break; 62*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_EXECFD); break; 63*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_PHDR); break; 64*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_PHENT); break; 65*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_PHNUM); break; 66*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_PAGESZ); break; 67*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_BASE); break; 68*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_FLAGS); break; 69*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_ENTRY); break; 70*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_NOTELF); break; 71*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_UID); break; 72*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_EUID); break; 73*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_GID); break; 74*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_EGID); break; 75*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_CLKTCK); break; 76*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_PLATFORM); break; 77*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_HWCAP); break; 78*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_FPUCW); break; 79*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_DCACHEBSIZE); break; 80*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_ICACHEBSIZE); break; 81*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_UCACHEBSIZE); break; 82*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_IGNOREPPC); break; 83*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_SECURE); break; 84*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_BASE_PLATFORM); break; 85*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_RANDOM); break; 86*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_HWCAP2); break; 87*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_EXECFN); break; 88*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_SYSINFO); break; 89*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_SYSINFO_EHDR); break; 90*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_L1I_CACHESHAPE); break; 91*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_L1D_CACHESHAPE); break; 92*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_L2_CACHESHAPE); break; 93*0b57cec5SDimitry Andric case ENTRY_NAME(AUXV_AT_L3_CACHESHAPE); break; 94*0b57cec5SDimitry Andric } 95*0b57cec5SDimitry Andric #undef ENTRY_NAME 96*0b57cec5SDimitry Andric 97 return name; 98 } 99