brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · a5b0d78 Raw
172 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H10#define LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H11 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 types18 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 58namespace I386 {59enum { NT_REGS = 33, NT_FPREGS = 35 };60}61 62} // namespace NETBSD63 64namespace OPENBSD {65enum {66  NT_PROCINFO = 10,67  NT_AUXV = 11,68  NT_REGS = 20,69  NT_FPREGS = 21,70};71}72 73struct CoreNote {74  ELFNote info;75  DataExtractor data;76};77 78// A structure describing how to find a register set in a core file from a given79// OS.80struct RegsetDesc {81  // OS to which this entry applies to. Must not be UnknownOS.82  llvm::Triple::OSType OS;83 84  // Architecture to which this entry applies to. Can be UnknownArch, in which85  // case it applies to all architectures of a given OS.86  llvm::Triple::ArchType Arch;87 88  // The note type under which the register set can be found.89  uint32_t Note;90};91 92// Returns the register set in Notes which corresponds to the specified Triple93// according to the list of register set descriptions in RegsetDescs. The list94// 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 place96// it earlier in the list. If a register set is not found, it returns an empty97// DataExtractor.98DataExtractor getRegset(llvm::ArrayRef<CoreNote> Notes,99                        const llvm::Triple &Triple,100                        llvm::ArrayRef<RegsetDesc> RegsetDescs);101 102constexpr RegsetDesc FPR_Desc[] = {103    // FreeBSD/i386 core NT_FPREGSET is x87 FSAVE result but the XSAVE dump104    // 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 result108    // of the FXSAVE instruction like in 64 bit files.109    // The result from FXSAVE is in NT_PRXFPREG for i386 core files110    {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},116};117 118constexpr RegsetDesc AARCH64_SVE_Desc[] = {119    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SVE},120};121 122constexpr RegsetDesc AARCH64_SSVE_Desc[] = {123    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_SSVE},124};125 126constexpr RegsetDesc AARCH64_ZA_Desc[] = {127    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_ZA},128};129 130constexpr RegsetDesc AARCH64_ZT_Desc[] = {131    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_ZT},132};133 134constexpr RegsetDesc AARCH64_PAC_Desc[] = {135    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_PAC_MASK},136};137 138constexpr RegsetDesc AARCH64_TLS_Desc[] = {139    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_TLS},140};141 142constexpr RegsetDesc AARCH64_MTE_Desc[] = {143    {llvm::Triple::Linux, llvm::Triple::aarch64,144     llvm::ELF::NT_ARM_TAGGED_ADDR_CTRL},145};146 147constexpr RegsetDesc AARCH64_FPMR_Desc[] = {148    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_FPMR},149};150 151constexpr RegsetDesc AARCH64_GCS_Desc[] = {152    {llvm::Triple::Linux, llvm::Triple::aarch64, llvm::ELF::NT_ARM_GCS},153};154 155constexpr RegsetDesc ARM_VFP_Desc[] = {156    {llvm::Triple::FreeBSD, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP},157    {llvm::Triple::Linux, llvm::Triple::arm, llvm::ELF::NT_ARM_VFP},158};159 160constexpr RegsetDesc PPC_VMX_Desc[] = {161    {llvm::Triple::FreeBSD, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},162    {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VMX},163};164 165constexpr RegsetDesc PPC_VSX_Desc[] = {166    {llvm::Triple::Linux, llvm::Triple::UnknownArch, llvm::ELF::NT_PPC_VSX},167};168 169} // namespace lldb_private170 171#endif // LLDB_SOURCE_PLUGINS_PROCESS_ELF_CORE_REGISTERUTILITIES_H172