1/*
2 * Copyright 2014 Google, Inc.
3 * Copyright (c) 2002-2005 The Regents of The University of Michigan
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

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

136#include "debug/GDBAll.hh"
137#include "mem/port.hh"
138#include "mem/fs_translating_port_proxy.hh"
139#include "mem/se_translating_port_proxy.hh"
140#include "sim/full_system.hh"
141#include "sim/system.hh"
142
143using namespace std;
144using namespace Debug;
144using namespace TheISA;
145
146#ifndef NDEBUG
147vector<BaseRemoteGDB *> debuggers;
148
149void
150debugger()
151{

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

242
243BaseRemoteGDB::InputEvent::InputEvent(BaseRemoteGDB *g, int fd, int e)
244 : PollEvent(fd, e), gdb(g)
245{}
246
247void
248BaseRemoteGDB::InputEvent::process(int revent)
249{
251 BaseCPU *cpu = gdb->context->getCpuPtr();
252 EventQueue *eq = cpu->comInstEventQueue[gdb->context->threadId()];
250 if (revent & POLLIN) {
251 gdb->trapEvent.type(SIGILL);
255 // Here "ticks" aren't simulator ticks which measure time, they're
256 // instructions committed by the CPU.
257 eq->schedule(&gdb->trapEvent, eq->getCurTick());
252 gdb->scheduleInstCommitEvent(&gdb->trapEvent, 0);
253 } else if (revent & POLLNVAL) {
259 if (gdb->trapEvent.scheduled())
260 eq->deschedule(&gdb->trapEvent);
254 gdb->descheduleInstCommitEvent(&gdb->trapEvent);
255 gdb->detach();
256 }
257}
258
259void
260BaseRemoteGDB::TrapEvent::process()
261{
262 gdb->trap(_type);

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

525 return true;
526}
527
528PCEventQueue *BaseRemoteGDB::getPcEventQueue()
529{
530 return &system->pcEventQueue;
531}
532
533EventQueue *
534BaseRemoteGDB::getComInstEventQueue()
535{
536 BaseCPU *cpu = context->getCpuPtr();
537 return cpu->comInstEventQueue[context->threadId()];
538}
539
540void
541BaseRemoteGDB::scheduleInstCommitEvent(Event *ev, int delta)
542{
543 EventQueue *eq = getComInstEventQueue();
544 // Here "ticks" aren't simulator ticks which measure time, they're
545 // instructions committed by the CPU.
546 eq->schedule(ev, eq->getCurTick() + delta);
547}
548
549void
550BaseRemoteGDB::descheduleInstCommitEvent(Event *ev)
551{
552 if (ev->scheduled())
553 getComInstEventQueue()->deschedule(ev);
554}
555
556bool
557BaseRemoteGDB::checkBpLen(size_t len)
558{
559 return len == sizeof(MachInst);
560}
561
562BaseRemoteGDB::HardBreakpoint::HardBreakpoint(BaseRemoteGDB *_gdb, Addr pc)
563 : PCEvent(_gdb->getPcEventQueue(), "HardBreakpoint Event", pc),

--- 497 unchanged lines hidden ---