Deleted Added
sdiff udiff text old ( 3536:89aa06409e4d ) new ( 3550:515e876568b4 )
full compact
1/*
2 * Copyright (c) 2002-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 110 unchanged lines hidden (view full) ---

119#include <sys/signal.h>
120
121#include <string>
122#include <unistd.h>
123
124#include "arch/vtophys.hh"
125#include "arch/sparc/remote_gdb.hh"
126#include "base/intmath.hh"
127#include "base/remote_gdb.hh"
128#include "base/socket.hh"
129#include "base/trace.hh"
130#include "config/full_system.hh"
131#include "cpu/thread_context.hh"
132#include "cpu/static_inst.hh"
133#include "mem/physical.hh"
134#include "mem/port.hh"
135#include "sim/system.hh"
136
137using namespace std;
138using namespace TheISA;
139
140RemoteGDB::RemoteGDB(System *_system, ThreadContext *c)
141 : BaseRemoteGDB(_system, c, NumGDBRegs)
142{}
143
144///////////////////////////////////////////////////////////
145// RemoteGDB::acc
146//
147// Determine if the mapping at va..(va+len) is valid.
148//
149bool
150RemoteGDB::acc(Addr va, size_t len)
151{
152#if 0
153 Addr last_va;
154
155 va = TheISA::TruncPage(va);
156 last_va = TheISA::RoundPage(va + len);
157
158 do {
159 if (TheISA::IsK0Seg(va)) {
160 if (va < (TheISA::K0SegBase + pmem->size())) {

--- 22 unchanged lines hidden (view full) ---

183 if (!pte.valid()) {
184 DPRINTF(GDBAcc, "acc: %#x pte is invalid\n", va);
185 return false;
186 }
187 va += TheISA::PageBytes;
188 } while (va < last_va);
189
190 DPRINTF(GDBAcc, "acc: %#x mapping is valid\n", va);
191#endif
192 return true;
193}
194
195///////////////////////////////////////////////////////////
196// RemoteGDB::getregs
197//
198// Translate the kernel debugger register format into
199// the GDB register format.
200void
201RemoteGDB::getregs()
202{
203 memset(gdbregs.regs, 0, gdbregs.size);
204
205 gdbregs.regs[RegPc] = context->readPC();
206 gdbregs.regs[RegNpc] = context->readNextPC();
207 for(int x = RegG0; x <= RegI7; x++)
208 gdbregs.regs[x] = context->readIntReg(x - RegG0);
209 for(int x = RegF0; x <= RegF31; x++)
210 gdbregs.regs[x] = context->readFloatRegBits(x - RegF0);
211 gdbregs.regs[RegY] = context->readMiscReg(MISCREG_Y);
212 //XXX need to also load up Psr, Wim, Tbr, Fpsr, and Cpsr
213}
214
215///////////////////////////////////////////////////////////
216// RemoteGDB::setregs
217//
218// Translate the GDB register format into the kernel
219// debugger register format.
220//
221void
222RemoteGDB::setregs()
223{
224 context->setPC(gdbregs.regs[RegPc]);
225 context->setNextPC(gdbregs.regs[RegNpc]);
226 for(int x = RegG0; x <= RegI7; x++)
227 context->setIntReg(x - RegG0, gdbregs.regs[x]);
228 for(int x = RegF0; x <= RegF31; x++)
229 context->setFloatRegBits(x - RegF0, gdbregs.regs[x]);
230 context->setMiscRegWithEffect(MISCREG_Y, gdbregs.regs[RegY]);
231 //XXX need to also set Psr, Wim, Tbr, Fpsr, and Cpsr
232}
233
234void
235RemoteGDB::clearSingleStep()
236{
237#if 0
238 DPRINTF(GDBMisc, "clearSingleStep bt_addr=%#x nt_addr=%#x\n",
239 takenBkpt.address, notTakenBkpt.address);
240
241 if (takenBkpt.address != 0)
242 clearTempBreakpoint(takenBkpt);
243
244 if (notTakenBkpt.address != 0)
245 clearTempBreakpoint(notTakenBkpt);
246#endif
247}
248
249void
250RemoteGDB::setSingleStep()
251{
252#if 0
253 Addr pc = context->readPC();
254 Addr npc, bpc;
255 bool set_bt = false;
256
257 npc = pc + sizeof(MachInst);
258
259 // User was stopped at pc, e.g. the instruction at pc was not
260 // executed.

--- 8 unchanged lines hidden (view full) ---

269
270 DPRINTF(GDBMisc, "setSingleStep bt_addr=%#x nt_addr=%#x\n",
271 takenBkpt.address, notTakenBkpt.address);
272
273 setTempBreakpoint(notTakenBkpt, npc);
274
275 if (set_bt)
276 setTempBreakpoint(takenBkpt, bpc);
277#endif
278}