Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/Utility/RegisterContextDarwin_i386.h
96381 views
//===-- RegisterContextDarwin_i386.h ----------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_I386_H9#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_I386_H1011#include "lldb/Target/RegisterContext.h"12#include "lldb/lldb-private.h"1314class RegisterContextDarwin_i386 : public lldb_private::RegisterContext {15public:16RegisterContextDarwin_i386(lldb_private::Thread &thread,17uint32_t concrete_frame_idx);1819~RegisterContextDarwin_i386() override;2021void InvalidateAllRegisters() override;2223size_t GetRegisterCount() override;2425const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;2627size_t GetRegisterSetCount() override;2829const lldb_private::RegisterSet *GetRegisterSet(size_t set) override;3031bool ReadRegister(const lldb_private::RegisterInfo *reg_info,32lldb_private::RegisterValue &value) override;3334bool WriteRegister(const lldb_private::RegisterInfo *reg_info,35const lldb_private::RegisterValue &value) override;3637bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override;3839bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;4041uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,42uint32_t num) override;4344bool HardwareSingleStep(bool enable) override;4546struct GPR {47uint32_t eax;48uint32_t ebx;49uint32_t ecx;50uint32_t edx;51uint32_t edi;52uint32_t esi;53uint32_t ebp;54uint32_t esp;55uint32_t ss;56uint32_t eflags;57uint32_t eip;58uint32_t cs;59uint32_t ds;60uint32_t es;61uint32_t fs;62uint32_t gs;63};6465struct MMSReg {66uint8_t bytes[10];67uint8_t pad[6];68};6970struct XMMReg {71uint8_t bytes[16];72};7374struct FPU {75uint32_t pad[2];76uint16_t fcw;77uint16_t fsw;78uint8_t ftw;79uint8_t pad1;80uint16_t fop;81uint32_t ip;82uint16_t cs;83uint16_t pad2;84uint32_t dp;85uint16_t ds;86uint16_t pad3;87uint32_t mxcsr;88uint32_t mxcsrmask;89MMSReg stmm[8];90XMMReg xmm[8];91uint8_t pad4[14 * 16];92int pad5;93};9495struct EXC {96uint32_t trapno;97uint32_t err;98uint32_t faultvaddr;99};100101protected:102enum { GPRRegSet = 1, FPURegSet = 2, EXCRegSet = 3 };103104enum {105GPRWordCount = sizeof(GPR) / sizeof(uint32_t),106FPUWordCount = sizeof(FPU) / sizeof(uint32_t),107EXCWordCount = sizeof(EXC) / sizeof(uint32_t)108};109110enum { Read = 0, Write = 1, kNumErrors = 2 };111112GPR gpr;113FPU fpu;114EXC exc;115int gpr_errs[2]; // Read/Write errors116int fpu_errs[2]; // Read/Write errors117int exc_errs[2]; // Read/Write errors118119void InvalidateAllRegisterStates() {120SetError(GPRRegSet, Read, -1);121SetError(FPURegSet, Read, -1);122SetError(EXCRegSet, Read, -1);123}124125int GetError(int flavor, uint32_t err_idx) const {126if (err_idx < kNumErrors) {127switch (flavor) {128// When getting all errors, just OR all values together to see if129// we got any kind of error.130case GPRRegSet:131return gpr_errs[err_idx];132case FPURegSet:133return fpu_errs[err_idx];134case EXCRegSet:135return exc_errs[err_idx];136default:137break;138}139}140return -1;141}142143bool SetError(int flavor, uint32_t err_idx, int err) {144if (err_idx < kNumErrors) {145switch (flavor) {146case GPRRegSet:147gpr_errs[err_idx] = err;148return true;149150case FPURegSet:151fpu_errs[err_idx] = err;152return true;153154case EXCRegSet:155exc_errs[err_idx] = err;156return true;157158default:159break;160}161}162return false;163}164165bool RegisterSetIsCached(int set) const { return GetError(set, Read) == 0; }166167void LogGPR(lldb_private::Log *log, const char *title);168169int ReadGPR(bool force);170171int ReadFPU(bool force);172173int ReadEXC(bool force);174175int WriteGPR();176177int WriteFPU();178179int WriteEXC();180181// Subclasses override these to do the actual reading.182virtual int DoReadGPR(lldb::tid_t tid, int flavor, GPR &gpr) = 0;183184virtual int DoReadFPU(lldb::tid_t tid, int flavor, FPU &fpu) = 0;185186virtual int DoReadEXC(lldb::tid_t tid, int flavor, EXC &exc) = 0;187188virtual int DoWriteGPR(lldb::tid_t tid, int flavor, const GPR &gpr) = 0;189190virtual int DoWriteFPU(lldb::tid_t tid, int flavor, const FPU &fpu) = 0;191192virtual int DoWriteEXC(lldb::tid_t tid, int flavor, const EXC &exc) = 0;193194int ReadRegisterSet(uint32_t set, bool force);195196int WriteRegisterSet(uint32_t set);197198static uint32_t GetRegisterNumber(uint32_t reg_kind, uint32_t reg_num);199200static int GetSetForNativeRegNum(int reg_num);201202static size_t GetRegisterInfosCount();203204static const lldb_private::RegisterInfo *GetRegisterInfos();205};206207#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_I386_H208209210