1 //===-- RegisterUtilities.h -------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H
12 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
13 #include "lldb/Utility/DataExtractor.h"
14 #include "llvm/BinaryFormat/ELF.h"
16 namespace lldb_private
{
17 /// Core files PT_NOTE segment descriptor types
20 enum { NT_PROCINFO
= 1, NT_AUXV
= 2 };
23 enum { NT_PROCINFO_SIZE
= 160 };
27 NT_PROCINFO_CPI_VERSION_SIZE
= 4,
28 NT_PROCINFO_CPI_CPISIZE_SIZE
= 4,
29 NT_PROCINFO_CPI_SIGNO_SIZE
= 4,
30 NT_PROCINFO_CPI_SIGCODE_SIZE
= 4,
31 NT_PROCINFO_CPI_SIGPEND_SIZE
= 16,
32 NT_PROCINFO_CPI_SIGMASK_SIZE
= 16,
33 NT_PROCINFO_CPI_SIGIGNORE_SIZE
= 16,
34 NT_PROCINFO_CPI_SIGCATCH_SIZE
= 16,
35 NT_PROCINFO_CPI_PID_SIZE
= 4,
36 NT_PROCINFO_CPI_PPID_SIZE
= 4,
37 NT_PROCINFO_CPI_PGRP_SIZE
= 4,
38 NT_PROCINFO_CPI_SID_SIZE
= 4,
39 NT_PROCINFO_CPI_RUID_SIZE
= 4,
40 NT_PROCINFO_CPI_EUID_SIZE
= 4,
41 NT_PROCINFO_CPI_SVUID_SIZE
= 4,
42 NT_PROCINFO_CPI_RGID_SIZE
= 4,
43 NT_PROCINFO_CPI_EGID_SIZE
= 4,
44 NT_PROCINFO_CPI_SVGID_SIZE
= 4,
45 NT_PROCINFO_CPI_NLWPS_SIZE
= 4,
46 NT_PROCINFO_CPI_NAME_SIZE
= 32,
47 NT_PROCINFO_CPI_SIGLWP_SIZE
= 4,
51 enum { NT_REGS
= 32, NT_FPREGS
= 34 };
55 enum { NT_REGS
= 33, NT_FPREGS
= 35 };
59 enum { NT_REGS
= 33, NT_FPREGS
= 35 };
78 // A structure describing how to find a register set in a core file from a given
81 // OS to which this entry applies to. Must not be UnknownOS.
82 llvm::Triple::OSType OS
;
84 // Architecture to which this entry applies to. Can be UnknownArch, in which
85 // case it applies to all architectures of a given OS.
86 llvm::Triple::ArchType Arch
;
88 // The note type under which the register set can be found.
92 // Returns the register set in Notes which corresponds to the specified Triple
93 // according to the list of register set descriptions in RegsetDescs. The list
94 // is scanned linearly, so you can use a more specific entry (e.g. linux-i386)
95 // to override a more general entry (e.g. general linux), as long as you place
96 // it earlier in the list. If a register set is not found, it returns an empty
98 DataExtractor
getRegset(llvm::ArrayRef
<CoreNote
> Notes
,
99 const llvm::Triple
&Triple
,
100 llvm::ArrayRef
<RegsetDesc
> RegsetDescs
);
102 constexpr RegsetDesc FPR_Desc
[] = {
103 // FreeBSD/i386 core NT_FPREGSET is x87 FSAVE result but the XSAVE dump
104 // starts with FXSAVE struct, so use that instead if available.
105 {llvm::Triple::FreeBSD
, llvm::Triple::x86
, llvm::ELF::NT_X86_XSTATE
},
106 {llvm::Triple::FreeBSD
, llvm::Triple::UnknownArch
, llvm::ELF::NT_FPREGSET
},
107 // In a i386 core file NT_FPREGSET is present, but it's not the result
108 // of the FXSAVE instruction like in 64 bit files.
109 // The result from FXSAVE is in NT_PRXFPREG for i386 core files
110 {llvm::Triple::Linux
, llvm::Triple::x86
, llvm::ELF::NT_PRXFPREG
},
111 {llvm::Triple::Linux
, llvm::Triple::UnknownArch
, llvm::ELF::NT_FPREGSET
},
112 {llvm::Triple::NetBSD
, llvm::Triple::aarch64
, NETBSD::AARCH64::NT_FPREGS
},
113 {llvm::Triple::NetBSD
, llvm::Triple::x86
, NETBSD::I386::NT_FPREGS
},
114 {llvm::Triple::NetBSD
, llvm::Triple::x86_64
, NETBSD::AMD64::NT_FPREGS
},
115 {llvm::Triple::OpenBSD
, llvm::Triple::UnknownArch
, OPENBSD::NT_FPREGS
},
118 constexpr RegsetDesc AARCH64_SVE_Desc
[] = {
119 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_SVE
},
122 constexpr RegsetDesc AARCH64_SSVE_Desc
[] = {
123 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_SSVE
},
126 constexpr RegsetDesc AARCH64_ZA_Desc
[] = {
127 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_ZA
},
130 constexpr RegsetDesc AARCH64_ZT_Desc
[] = {
131 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_ZT
},
134 constexpr RegsetDesc AARCH64_PAC_Desc
[] = {
135 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_PAC_MASK
},
138 constexpr RegsetDesc AARCH64_TLS_Desc
[] = {
139 {llvm::Triple::Linux
, llvm::Triple::aarch64
, llvm::ELF::NT_ARM_TLS
},
142 constexpr RegsetDesc AARCH64_MTE_Desc
[] = {
143 {llvm::Triple::Linux
, llvm::Triple::aarch64
,
144 llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL
},
147 constexpr RegsetDesc PPC_VMX_Desc
[] = {
148 {llvm::Triple::FreeBSD
, llvm::Triple::UnknownArch
, llvm::ELF::NT_PPC_VMX
},
149 {llvm::Triple::Linux
, llvm::Triple::UnknownArch
, llvm::ELF::NT_PPC_VMX
},
152 constexpr RegsetDesc PPC_VSX_Desc
[] = {
153 {llvm::Triple::Linux
, llvm::Triple::UnknownArch
, llvm::ELF::NT_PPC_VSX
},
156 } // namespace lldb_private
158 #endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H