1//===-- RegisterUtilities.h -------------------------------------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_REGISTERUTILITIES_H
10#define LLDB_REGISTERUTILITIES_H
11
12#include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
13#include "lldb/Utility/DataExtractor.h"
14#include "llvm/BinaryFormat/ELF.h"
15
16namespace lldb_private {
17/// Core files PT_NOTE segment descriptor types
18
19namespace NETBSD {
20enum { NT_PROCINFO = 1, NT_AUXV = 2 };
21
22/* Size in bytes */
23enum { NT_PROCINFO_SIZE = 160 };
24
25/* Size in bytes */
26enum {
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,
48};
49
50namespace AARCH64 {
51enum { NT_REGS = 32, NT_FPREGS = 34 };
52}
53
54namespace AMD64 {
55enum { NT_REGS = 33, NT_FPREGS = 35 };
56}
57
58} // namespace NETBSD
59
60namespace OPENBSD {
61enum {
62  NT_PROCINFO = 10,
63  NT_AUXV = 11,
64  NT_REGS = 20,
65  NT_FPREGS = 21,
66};
67}
68
69struct CoreNote {
70  ELFNote info;
71  DataExtractor data;
72};
73
74// A structure describing how to find a register set in a core file from a given
75// OS.
76struct RegsetDesc {
77  // OS to which this entry applies to. Must not be UnknownOS.
78  llvm::Triple::OSType OS;
79
80  // Architecture to which this entry applies to. Can be UnknownArch, in which
81  // case it applies to all architectures of a given OS.
82  llvm::Triple::ArchType Arch;
83
84  // The note type under which the register set can be found.
85  uint32_t Note;
86};
87
88// Returns the register set in Notes which corresponds to the specified Triple
89// according to the list of register set descriptions in RegsetDescs. The list
90// is scanned linearly, so you can use a more specific entry (e.g. linux-i386)
91// to override a more general entry (e.g. general linux), as long as you place
92// it earlier in the list. If a register set is not found, it returns an empty
93// DataExtractor.
94DataExtractor getRegset(llvm::ArrayRef<CoreNote> Notes,
95                        const llvm::Triple &Triple,
96                        llvm::ArrayRef<RegsetDesc> RegsetDescs);
97
98constexpr RegsetDesc FPR_Desc[] = {
99    {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_FPREGSET},
100    // In a i386 core file NT_FPREGSET is present, but it's not the result
101    // of the FXSAVE instruction like in 64 bit files.
102    // The result from FXSAVE is in NT_PRXFPREG for i386 core files
103    {llvm::Triple::Linux, llvm::Triple::x86, llvm::ELF::NT_PRXFPREG},
104    {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_FPREGSET},
105    {llvm::Triple::NetBSD, llvm::Triple::aarch64, NETBSD::AARCH64::NT_FPREGS},
106    {llvm::Triple::NetBSD, llvm::Triple::x86_64, NETBSD::AMD64::NT_FPREGS},
107    {llvm::Triple::OpenBSD, llvm::Triple::UnknownArch, OPENBSD::NT_FPREGS},
108};
109
110constexpr RegsetDesc PPC_VMX_Desc[] = {
111    {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},
112    {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},
113};
114
115constexpr RegsetDesc PPC_VSX_Desc[] = {
116    {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VSX},
117};
118
119} // namespace lldb_private
120
121#endif // #ifndef LLDB_REGISTERUTILITIES_H
122