remote_gdb.hh revision 77
112855Sgabeblack@google.com/* 212855Sgabeblack@google.com * Copyright (c) 2003 The Regents of The University of Michigan 312855Sgabeblack@google.com * All rights reserved. 412855Sgabeblack@google.com * 512855Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 612855Sgabeblack@google.com * modification, are permitted provided that the following conditions are 712855Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 812855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 912855Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 1012855Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1112855Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1212855Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1312855Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1412855Sgabeblack@google.com * this software without specific prior written permission. 1512855Sgabeblack@google.com * 1612855Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712855Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812855Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912855Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012855Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112855Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212855Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312855Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412855Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512855Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612855Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712855Sgabeblack@google.com */ 2812855Sgabeblack@google.com 2912855Sgabeblack@google.com#ifndef __REMOTE_GDB_HH__ 3012855Sgabeblack@google.com#define __REMOTE_GDB_HH__ 3112855Sgabeblack@google.com 3212855Sgabeblack@google.com#include <map> 3312855Sgabeblack@google.com 3412855Sgabeblack@google.com#include "base/kgdb.h" 3512855Sgabeblack@google.com#include "cpu/pc_event.hh" 3612855Sgabeblack@google.com#include "base/pollevent.hh" 3712855Sgabeblack@google.com#include "base/socket.hh" 3812855Sgabeblack@google.com 3912855Sgabeblack@google.comclass System; 4012855Sgabeblack@google.comclass ExecContext; 4112855Sgabeblack@google.comclass PhysicalMemory; 4212855Sgabeblack@google.com 4312855Sgabeblack@google.comclass RemoteGDB 4412855Sgabeblack@google.com{ 4512855Sgabeblack@google.com protected: 4612855Sgabeblack@google.com class Event : public PollEvent 4712855Sgabeblack@google.com { 4812855Sgabeblack@google.com protected: 4912855Sgabeblack@google.com RemoteGDB *gdb; 5012855Sgabeblack@google.com 5112855Sgabeblack@google.com public: 5212855Sgabeblack@google.com Event(RemoteGDB *g, int fd, int e); 5312855Sgabeblack@google.com void process(int revent); 5412855Sgabeblack@google.com }; 5512855Sgabeblack@google.com 5612855Sgabeblack@google.com friend class Event; 5712855Sgabeblack@google.com Event *event; 5812855Sgabeblack@google.com 5912855Sgabeblack@google.com protected: 6012855Sgabeblack@google.com int fd; 6112855Sgabeblack@google.com uint64_t gdbregs[KGDB_NUMREGS]; 6212855Sgabeblack@google.com 6312855Sgabeblack@google.com protected: 6412855Sgabeblack@google.com#ifdef notyet 6512855Sgabeblack@google.com label_t recover; 6612855Sgabeblack@google.com#endif 6712855Sgabeblack@google.com bool active; 6812855Sgabeblack@google.com bool attached; 6912855Sgabeblack@google.com 7012855Sgabeblack@google.com System *system; 7112855Sgabeblack@google.com PhysicalMemory *pmem; 7212855Sgabeblack@google.com ExecContext *context; 7312855Sgabeblack@google.com 7412855Sgabeblack@google.com protected: 7512855Sgabeblack@google.com uint8_t getbyte(); 7612855Sgabeblack@google.com void putbyte(uint8_t b); 7712855Sgabeblack@google.com 7812855Sgabeblack@google.com int recv(char *data, int len); 7912855Sgabeblack@google.com void send(const char *data); 8012855Sgabeblack@google.com 8112855Sgabeblack@google.com protected: 8212855Sgabeblack@google.com // Machine memory 8312855Sgabeblack@google.com bool read(Addr addr, size_t size, char *data); 8412855Sgabeblack@google.com bool write(Addr addr, size_t size, const char *data); 85 86 template <class T> T read(Addr addr); 87 template <class T> void write(Addr addr, T data); 88 89 public: 90 RemoteGDB(System *system, ExecContext *context); 91 ~RemoteGDB(); 92 93 void attach(int fd); 94 void detach(); 95 bool isattached(); 96 97 bool acc(Addr addr, size_t len); 98 static int signal(int type); 99 bool trap(int type); 100 101 protected: 102 void getregs(); 103 void setregs(); 104 105 void clearSingleStep(); 106 void setSingleStep(); 107 108 PCEventQueue *getPcEventQueue(); 109 110 protected: 111 class HardBreakpoint : public PCEvent 112 { 113 private: 114 RemoteGDB *gdb; 115 116 public: 117 HardBreakpoint(RemoteGDB *_gdb, Addr addr); 118 119 int refcount; 120 virtual void process(ExecContext *xc); 121 }; 122 friend class HardBreakpoint; 123 124 typedef std::map<Addr, HardBreakpoint *> break_map_t; 125 typedef break_map_t::iterator break_iter_t; 126 break_map_t hardBreakMap; 127 128 bool insertSoftBreak(Addr addr, size_t len); 129 bool removeSoftBreak(Addr addr, size_t len); 130 bool insertHardBreak(Addr addr, size_t len); 131 bool removeHardBreak(Addr addr, size_t len); 132 133 protected: 134 struct TempBreakpoint { 135 Addr address; // set here 136 MachInst bkpt_inst; // saved instruction at bkpt 137 int init_count; // number of times to skip bkpt 138 int count; // current count 139 }; 140 141 TempBreakpoint notTakenBkpt; 142 TempBreakpoint takenBkpt; 143 144 void clearTempBreakpoint(TempBreakpoint &bkpt); 145 void setTempBreakpoint(TempBreakpoint &bkpt, Addr addr); 146}; 147 148template <class T> 149inline T 150RemoteGDB::read(Addr addr) 151{ 152 T temp; 153 read(addr, sizeof(T), (char *)&temp); 154 return temp; 155} 156 157template <class T> 158inline void 159RemoteGDB::write(Addr addr, T data) 160{ write(addr, sizeof(T), (const char *)&data); } 161 162class GDBListener 163{ 164 protected: 165 class Event : public PollEvent 166 { 167 protected: 168 GDBListener *listener; 169 170 public: 171 Event(GDBListener *l, int fd, int e); 172 void process(int revent); 173 }; 174 175 friend class Event; 176 Event *event; 177 178 protected: 179 ListenSocket listener; 180 RemoteGDB *gdb; 181 int port; 182 183 public: 184 GDBListener(RemoteGDB *g, int p); 185 ~GDBListener(); 186 187 void accept(); 188 void listen(); 189}; 190 191#endif /* __REMOTE_GDB_H__ */ 192