LLDB mainline
RegisterContextFreeBSDKernelCore_i386.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
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
10
11#include "lldb/Target/Process.h"
12#include "lldb/Target/Thread.h"
14#include "llvm/Support/Endian.h"
15
16#if defined(__FreeBSD__) && defined(__i386__)
17#include <machine/pcb.h>
18#endif
19
20using namespace lldb;
21using namespace lldb_private;
22
27
29
31
33 assert(0);
34 return false;
35}
36
38 assert(0);
39 return false;
40}
41
43 const RegisterInfo *reg_info, RegisterValue &value) {
45 return false;
46
47 // https://cgit.freebsd.org/src/tree/sys/i386/include/pcb.h
48 struct {
49 llvm::support::ulittle32_t edi;
50 llvm::support::ulittle32_t esi;
51 llvm::support::ulittle32_t ebp;
52 llvm::support::ulittle32_t esp;
53 llvm::support::ulittle32_t ebx;
54 llvm::support::ulittle32_t eip;
55 } pcb;
56
57#if defined(__FreeBSD__) && defined(__i386__)
58 static_assert(offsetof(struct pcb, pcb_edi) == offsetof(decltype(pcb), edi));
59 static_assert(offsetof(struct pcb, pcb_esi) == offsetof(decltype(pcb), esi));
60 static_assert(offsetof(struct pcb, pcb_ebp) == offsetof(decltype(pcb), ebp));
61 static_assert(offsetof(struct pcb, pcb_esp) == offsetof(decltype(pcb), esp));
62 static_assert(offsetof(struct pcb, pcb_ebx) == offsetof(decltype(pcb), ebx));
63 static_assert(offsetof(struct pcb, pcb_eip) == offsetof(decltype(pcb), eip));
64#endif
65
67 size_t rd =
68 m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error);
69 if (rd != sizeof(pcb))
70 return false;
71
72 uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
73 switch (reg) {
74#define REG(x) \
75 case lldb_##x##_i386: \
76 value = pcb.x; \
77 break;
78
79 REG(edi);
80 REG(esi);
81 REG(ebp);
82 REG(esp);
83 REG(eip);
84
85#undef REG
86
87 default:
88 return false;
89 }
90
91 return true;
92}
93
95 const RegisterInfo *reg_info, const RegisterValue &value) {
96 return false;
97}
static llvm::raw_ostream & error(Stream &strm)
#define REG(x)
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
RegisterContextFreeBSDKernelCore_i386(lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, lldb::addr_t pcb_addr)
RegisterContextPOSIX_x86(lldb_private::Thread &thread, uint32_t concrete_frame_idx, lldb_private::RegisterInfoInterface *register_info)
RegisterInfo interface to patch RegisterInfo structure for archs.
An error handling class.
Definition Status.h:118
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
uint64_t addr_t
Definition lldb-types.h:80
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.