180814287SRaphael Isemann //===-- AuxVector.cpp -----------------------------------------------------===//
2943faef1SAntonio Afonso //
3943faef1SAntonio Afonso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4943faef1SAntonio Afonso // See https://llvm.org/LICENSE.txt for license information.
5943faef1SAntonio Afonso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6943faef1SAntonio Afonso //
7943faef1SAntonio Afonso //===----------------------------------------------------------------------===//
8943faef1SAntonio Afonso 
9943faef1SAntonio Afonso #include "AuxVector.h"
10943faef1SAntonio Afonso 
AuxVector(const lldb_private::DataExtractor & data)11943faef1SAntonio Afonso AuxVector::AuxVector(const lldb_private::DataExtractor &data) {
12943faef1SAntonio Afonso   ParseAuxv(data);
13943faef1SAntonio Afonso }
14943faef1SAntonio Afonso 
ParseAuxv(const lldb_private::DataExtractor & data)15943faef1SAntonio Afonso void AuxVector::ParseAuxv(const lldb_private::DataExtractor &data) {
16943faef1SAntonio Afonso   lldb::offset_t offset = 0;
17943faef1SAntonio Afonso   const size_t value_type_size = data.GetAddressByteSize() * 2;
18943faef1SAntonio Afonso   while (data.ValidOffsetForDataOfSize(offset, value_type_size)) {
19943faef1SAntonio Afonso     // We're not reading an address but an int that could be 32 or 64 bit
20943faef1SAntonio Afonso     // depending on the address size, which is what GetAddress does.
21943faef1SAntonio Afonso     const uint64_t type = data.GetAddress(&offset);
22943faef1SAntonio Afonso     const uint64_t value = data.GetAddress(&offset);
23943faef1SAntonio Afonso     if (type == AUXV_AT_NULL)
24943faef1SAntonio Afonso       break;
25943faef1SAntonio Afonso     if (type == AUXV_AT_IGNORE)
26943faef1SAntonio Afonso       continue;
27943faef1SAntonio Afonso 
28943faef1SAntonio Afonso     m_auxv_entries[type] = value;
29943faef1SAntonio Afonso   }
30943faef1SAntonio Afonso }
31943faef1SAntonio Afonso 
32943faef1SAntonio Afonso llvm::Optional<uint64_t>
GetAuxValue(enum EntryType entry_type) const33943faef1SAntonio Afonso AuxVector::GetAuxValue(enum EntryType entry_type) const {
34943faef1SAntonio Afonso   auto it = m_auxv_entries.find(static_cast<uint64_t>(entry_type));
35943faef1SAntonio Afonso   if (it != m_auxv_entries.end())
36943faef1SAntonio Afonso     return it->second;
37943faef1SAntonio Afonso   return llvm::None;
38943faef1SAntonio Afonso }
39943faef1SAntonio Afonso 
DumpToLog(lldb_private::Log * log) const40943faef1SAntonio Afonso void AuxVector::DumpToLog(lldb_private::Log *log) const {
41943faef1SAntonio Afonso   if (!log)
42943faef1SAntonio Afonso     return;
43943faef1SAntonio Afonso 
44943faef1SAntonio Afonso   log->PutCString("AuxVector: ");
45943faef1SAntonio Afonso   for (auto entry : m_auxv_entries) {
4663e5fb76SJonas Devlieghere     LLDB_LOGF(log, "   %s [%" PRIu64 "]: %" PRIx64,
47943faef1SAntonio Afonso               GetEntryName(static_cast<EntryType>(entry.first)), entry.first,
48943faef1SAntonio Afonso               entry.second);
49943faef1SAntonio Afonso   }
50943faef1SAntonio Afonso }
51943faef1SAntonio Afonso 
GetEntryName(EntryType type) const52943faef1SAntonio Afonso const char *AuxVector::GetEntryName(EntryType type) const {
53943faef1SAntonio Afonso   const char *name = "AT_???";
54943faef1SAntonio Afonso 
55943faef1SAntonio Afonso #define ENTRY_NAME(_type)                                                      \
56943faef1SAntonio Afonso   _type:                                                                       \
57943faef1SAntonio Afonso   name = &#_type[5]
58943faef1SAntonio Afonso   switch (type) {
59943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_NULL);           break;
60943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_IGNORE);         break;
61943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_EXECFD);         break;
62943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_PHDR);           break;
63943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_PHENT);          break;
64943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_PHNUM);          break;
65943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_PAGESZ);         break;
66943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_BASE);           break;
67943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_FLAGS);          break;
68943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_ENTRY);          break;
69943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_NOTELF);         break;
70943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_UID);            break;
71943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_EUID);           break;
72943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_GID);            break;
73943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_EGID);           break;
74943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_CLKTCK);         break;
75943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_PLATFORM);       break;
76943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_HWCAP);          break;
77943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_FPUCW);          break;
78943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_DCACHEBSIZE);    break;
79943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_ICACHEBSIZE);    break;
80943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_UCACHEBSIZE);    break;
81943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_IGNOREPPC);      break;
82943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_SECURE);         break;
83943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_BASE_PLATFORM);  break;
84943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_RANDOM);         break;
85*2fd4d923SMuhammad Omair Javaid     case ENTRY_NAME(AUXV_AT_HWCAP2);         break;
86943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_EXECFN);         break;
87943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_SYSINFO);        break;
88943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_SYSINFO_EHDR);   break;
89943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_L1I_CACHESHAPE); break;
90943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_L1D_CACHESHAPE); break;
91943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_L2_CACHESHAPE);  break;
92943faef1SAntonio Afonso     case ENTRY_NAME(AUXV_AT_L3_CACHESHAPE);  break;
93943faef1SAntonio Afonso     }
94943faef1SAntonio Afonso #undef ENTRY_NAME
95943faef1SAntonio Afonso 
96943faef1SAntonio Afonso     return name;
97943faef1SAntonio Afonso }
98