remote_gdb.hh (10804:df2aa91dba5b) | remote_gdb.hh (11274:d9a0136ab8cc) |
---|---|
1/* | 1/* |
2 * Copyright 2015 LabWare |
|
2 * Copyright 2014 Google, Inc. 3 * Copyright (c) 2007 The Hewlett-Packard Development Company 4 * All rights reserved. 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating 9 * to a hardware implementation of the functionality of the software --- 21 unchanged lines hidden (view full) --- 31 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 32 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 36 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 * 38 * Authors: Gabe Black | 3 * Copyright 2014 Google, Inc. 4 * Copyright (c) 2007 The Hewlett-Packard Development Company 5 * All rights reserved. 6 * 7 * The license below extends only to copyright in the software and shall 8 * not be construed as granting a license to any other intellectual 9 * property including but not limited to intellectual property relating 10 * to a hardware implementation of the functionality of the software --- 21 unchanged lines hidden (view full) --- 32 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 33 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38 * 39 * Authors: Gabe Black |
40 * Boris Shingarov |
|
39 */ 40 41#ifndef __ARCH_X86_REMOTEGDB_HH__ 42#define __ARCH_X86_REMOTEGDB_HH__ 43 44#include <algorithm> 45 46#include "arch/x86/types.hh" 47#include "base/remote_gdb.hh" 48 49class System; 50class ThreadContext; 51 52namespace X86ISA 53{ 54class RemoteGDB : public BaseRemoteGDB 55{ | 41 */ 42 43#ifndef __ARCH_X86_REMOTEGDB_HH__ 44#define __ARCH_X86_REMOTEGDB_HH__ 45 46#include <algorithm> 47 48#include "arch/x86/types.hh" 49#include "base/remote_gdb.hh" 50 51class System; 52class ThreadContext; 53 54namespace X86ISA 55{ 56class RemoteGDB : public BaseRemoteGDB 57{ |
56 public: 57 enum | 58 protected: 59 bool acc(Addr addr, size_t len); 60 bool checkBpLen(size_t len) { return len == 1; } 61 class X86GdbRegCache : public BaseGdbRegCache |
58 { | 62 { |
59 GDB32_EAX, 60 GDB32_ECX, 61 GDB32_EDX, 62 GDB32_EBX, 63 GDB32_ESP, 64 GDB32_EBP, 65 GDB32_ESI, 66 GDB32_EDI, 67 GDB32_EIP, 68 GDB32_EFLAGS, 69 GDB32_CS, 70 GDB32_SS, 71 GDB32_DS, 72 GDB32_ES, 73 GDB32_FS, 74 GDB32_GS, 75 76 GDB32_NUMREGS | 63 using BaseGdbRegCache::BaseGdbRegCache; 64 private: 65 struct { 66 uint32_t eax; 67 uint32_t ecx; 68 uint32_t edx; 69 uint32_t ebx; 70 uint32_t esp; 71 uint32_t ebp; 72 uint32_t esi; 73 uint32_t edi; 74 uint32_t eip; 75 uint32_t eflags; 76 uint32_t cs; 77 uint32_t ss; 78 uint32_t ds; 79 uint32_t es; 80 uint32_t fs; 81 uint32_t gs; 82 } r; 83 public: 84 char *data() const { return (char *)&r; } 85 size_t size() const { return sizeof(r); } 86 void getRegs(ThreadContext*); 87 void setRegs(ThreadContext*) const; 88 const std::string name() const { return gdb->name() + ".X86GdbRegCache"; } |
77 }; 78 | 89 }; 90 |
79 enum | 91 class AMD64GdbRegCache : public BaseGdbRegCache |
80 { | 92 { |
81 GDB64_RAX, 82 GDB64_RBX, 83 GDB64_RCX, 84 GDB64_RDX, 85 GDB64_RSI, 86 GDB64_RDI, 87 GDB64_RBP, 88 GDB64_RSP, 89 GDB64_R8, 90 GDB64_R9, 91 GDB64_R10, 92 GDB64_R11, 93 GDB64_R12, 94 GDB64_R13, 95 GDB64_R14, 96 GDB64_R15, 97 GDB64_RIP, 98 // These indices index into the reg cache treated as an array of 32 99 // bit integers. The next index is one beyond the previous, and then 100 // scaled up from an index into an array of 64 bit integers. 101 GDB64_RFLAGS_32 = (GDB64_RIP + 1) * 2, 102 GDB64_CS_32, 103 GDB64_SS_32, 104 GDB64_DS_32, 105 GDB64_ES_32, 106 GDB64_FS_32, 107 GDB64_GS_32, 108 109 // Scale the end index count back down (rounded up) to be for an 110 // array of 64 bit integers. 111 GDB64_NUMREGS = (GDB64_GS_32 + 1) / 2 + 1 | 93 using BaseGdbRegCache::BaseGdbRegCache; 94 private: 95 struct { 96 uint64_t rax; 97 uint64_t rbx; 98 uint64_t rcx; 99 uint64_t rdx; 100 uint64_t rsi; 101 uint64_t rdi; 102 uint64_t rbp; 103 uint64_t rsp; 104 uint64_t r8; 105 uint64_t r9; 106 uint64_t r10; 107 uint64_t r11; 108 uint64_t r12; 109 uint64_t r13; 110 uint64_t r14; 111 uint64_t r15; 112 uint64_t rip; 113 uint32_t eflags; 114 uint32_t cs; 115 uint32_t ss; 116 uint32_t ds; 117 uint32_t es; 118 uint32_t fs; 119 uint32_t gs; 120 /* 121 * We do not model st[], FPU status regs, xmm[] etc. 122 * While it's not ok to have G-packets larger than what gdb 123 * knows about, it is ok to have smaller ones. 124 */ 125 } r; 126 public: 127 char *data() const { return (char *)&r; } 128 size_t size() const { return sizeof(r); } 129 void getRegs(ThreadContext*); 130 void setRegs(ThreadContext*) const; 131 const std::string name() const { return gdb->name() + ".AMD64GdbRegCache"; } |
112 }; 113 | 132 }; 133 |
134 public: |
|
114 RemoteGDB(System *system, ThreadContext *context); | 135 RemoteGDB(System *system, ThreadContext *context); |
115 116 bool acc(Addr addr, size_t len); 117 118 protected: 119 void getregs(); 120 void setregs(); 121 122 bool checkBpLen(size_t len) { return len == 1; } | 136 BaseGdbRegCache *gdbRegs(); |
123}; | 137}; |
138} // namespace X86ISA |
|
124 | 139 |
125const int GDB_REG_BYTES M5_VAR_USED = 126 std::max(RemoteGDB::GDB32_NUMREGS * sizeof(uint32_t), 127 RemoteGDB::GDB64_NUMREGS * sizeof(uint64_t)); 128 129} 130 | |
131#endif // __ARCH_X86_REMOTEGDB_HH__ | 140#endif // __ARCH_X86_REMOTEGDB_HH__ |