1 //===-- RegisterContextDarwin_i386.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_UTILITY_REGISTERCONTEXTDARWIN_I386_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_I386_H
12 #include "lldb/Target/RegisterContext.h"
13 #include "lldb/lldb-private.h"
15 class RegisterContextDarwin_i386
: public lldb_private::RegisterContext
{
17 RegisterContextDarwin_i386(lldb_private::Thread
&thread
,
18 uint32_t concrete_frame_idx
);
20 ~RegisterContextDarwin_i386() override
;
22 void InvalidateAllRegisters() override
;
24 size_t GetRegisterCount() override
;
26 const lldb_private::RegisterInfo
*GetRegisterInfoAtIndex(size_t reg
) override
;
28 size_t GetRegisterSetCount() override
;
30 const lldb_private::RegisterSet
*GetRegisterSet(size_t set
) override
;
32 bool ReadRegister(const lldb_private::RegisterInfo
*reg_info
,
33 lldb_private::RegisterValue
&value
) override
;
35 bool WriteRegister(const lldb_private::RegisterInfo
*reg_info
,
36 const lldb_private::RegisterValue
&value
) override
;
38 bool ReadAllRegisterValues(lldb::WritableDataBufferSP
&data_sp
) override
;
40 bool WriteAllRegisterValues(const lldb::DataBufferSP
&data_sp
) override
;
42 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind
,
43 uint32_t num
) override
;
45 bool HardwareSingleStep(bool enable
) override
;
92 uint8_t pad4
[14 * 16];
103 enum { GPRRegSet
= 1, FPURegSet
= 2, EXCRegSet
= 3 };
106 GPRWordCount
= sizeof(GPR
) / sizeof(uint32_t),
107 FPUWordCount
= sizeof(FPU
) / sizeof(uint32_t),
108 EXCWordCount
= sizeof(EXC
) / sizeof(uint32_t)
111 enum { Read
= 0, Write
= 1, kNumErrors
= 2 };
116 int gpr_errs
[2]; // Read/Write errors
117 int fpu_errs
[2]; // Read/Write errors
118 int exc_errs
[2]; // Read/Write errors
120 void InvalidateAllRegisterStates() {
121 SetError(GPRRegSet
, Read
, -1);
122 SetError(FPURegSet
, Read
, -1);
123 SetError(EXCRegSet
, Read
, -1);
126 int GetError(int flavor
, uint32_t err_idx
) const {
127 if (err_idx
< kNumErrors
) {
129 // When getting all errors, just OR all values together to see if
130 // we got any kind of error.
132 return gpr_errs
[err_idx
];
134 return fpu_errs
[err_idx
];
136 return exc_errs
[err_idx
];
144 bool SetError(int flavor
, uint32_t err_idx
, int err
) {
145 if (err_idx
< kNumErrors
) {
148 gpr_errs
[err_idx
] = err
;
152 fpu_errs
[err_idx
] = err
;
156 exc_errs
[err_idx
] = err
;
166 bool RegisterSetIsCached(int set
) const { return GetError(set
, Read
) == 0; }
168 void LogGPR(lldb_private::Log
*log
, const char *title
);
170 int ReadGPR(bool force
);
172 int ReadFPU(bool force
);
174 int ReadEXC(bool force
);
182 // Subclasses override these to do the actual reading.
183 virtual int DoReadGPR(lldb::tid_t tid
, int flavor
, GPR
&gpr
) = 0;
185 virtual int DoReadFPU(lldb::tid_t tid
, int flavor
, FPU
&fpu
) = 0;
187 virtual int DoReadEXC(lldb::tid_t tid
, int flavor
, EXC
&exc
) = 0;
189 virtual int DoWriteGPR(lldb::tid_t tid
, int flavor
, const GPR
&gpr
) = 0;
191 virtual int DoWriteFPU(lldb::tid_t tid
, int flavor
, const FPU
&fpu
) = 0;
193 virtual int DoWriteEXC(lldb::tid_t tid
, int flavor
, const EXC
&exc
) = 0;
195 int ReadRegisterSet(uint32_t set
, bool force
);
197 int WriteRegisterSet(uint32_t set
);
199 static uint32_t GetRegisterNumber(uint32_t reg_kind
, uint32_t reg_num
);
201 static int GetSetForNativeRegNum(int reg_num
);
203 static size_t GetRegisterInfosCount();
205 static const lldb_private::RegisterInfo
*GetRegisterInfos();
208 #endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERCONTEXTDARWIN_I386_H