remote_gdb.hh revision 3536
13536Sgblack@eecs.umich.edu/*
23536Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
33536Sgblack@eecs.umich.edu * All rights reserved.
43536Sgblack@eecs.umich.edu *
53536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
63536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
73536Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
83536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
93536Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
103536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
113536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
123536Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
133536Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
143536Sgblack@eecs.umich.edu * this software without specific prior written permission.
153536Sgblack@eecs.umich.edu *
163536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173536Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183536Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193536Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203536Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213536Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223536Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233536Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243536Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253536Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263536Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273536Sgblack@eecs.umich.edu *
283536Sgblack@eecs.umich.edu * Authors: Nathan Binkert
293536Sgblack@eecs.umich.edu */
303536Sgblack@eecs.umich.edu
313536Sgblack@eecs.umich.edu#ifndef __ARCH_ALPHA_REMOTE_GDB_HH__
323536Sgblack@eecs.umich.edu#define __ARCH_ALPHA_REMOTE_GDB_HH__
333536Sgblack@eecs.umich.edu
343536Sgblack@eecs.umich.edu#include <map>
353536Sgblack@eecs.umich.edu
363536Sgblack@eecs.umich.edu#include "arch/alpha/types.hh"
373536Sgblack@eecs.umich.edu#include "arch/alpha/kgdb.h"
383536Sgblack@eecs.umich.edu#include "base/remote_gdb.hh"
393536Sgblack@eecs.umich.edu#include "cpu/pc_event.hh"
403536Sgblack@eecs.umich.edu#include "base/pollevent.hh"
413536Sgblack@eecs.umich.edu#include "base/socket.hh"
423536Sgblack@eecs.umich.edu
433536Sgblack@eecs.umich.educlass System;
443536Sgblack@eecs.umich.educlass ThreadContext;
453536Sgblack@eecs.umich.educlass PhysicalMemory;
463536Sgblack@eecs.umich.edu
473536Sgblack@eecs.umich.edunamespace AlphaISA
483536Sgblack@eecs.umich.edu{
493536Sgblack@eecs.umich.edu    class RemoteGDB : public BaseRemoteGDB
503536Sgblack@eecs.umich.edu    {
513536Sgblack@eecs.umich.edu      private:
523536Sgblack@eecs.umich.edu        friend void debugger();
533536Sgblack@eecs.umich.edu        friend class GDBListener;
543536Sgblack@eecs.umich.edu
553536Sgblack@eecs.umich.edu      protected:
563536Sgblack@eecs.umich.edu        class Event : public PollEvent
573536Sgblack@eecs.umich.edu        {
583536Sgblack@eecs.umich.edu          protected:
593536Sgblack@eecs.umich.edu            RemoteGDB *gdb;
603536Sgblack@eecs.umich.edu
613536Sgblack@eecs.umich.edu          public:
623536Sgblack@eecs.umich.edu            Event(RemoteGDB *g, int fd, int e);
633536Sgblack@eecs.umich.edu            void process(int revent);
643536Sgblack@eecs.umich.edu        };
653536Sgblack@eecs.umich.edu
663536Sgblack@eecs.umich.edu        friend class Event;
673536Sgblack@eecs.umich.edu        Event *event;
683536Sgblack@eecs.umich.edu
693536Sgblack@eecs.umich.edu      protected:
703536Sgblack@eecs.umich.edu        // Machine memory
713536Sgblack@eecs.umich.edu        bool write(Addr addr, size_t size, const char *data);
723536Sgblack@eecs.umich.edu
733536Sgblack@eecs.umich.edu      public:
743536Sgblack@eecs.umich.edu        RemoteGDB(System *system, ThreadContext *context);
753536Sgblack@eecs.umich.edu        ~RemoteGDB();
763536Sgblack@eecs.umich.edu
773536Sgblack@eecs.umich.edu        bool acc(Addr addr, size_t len);
783536Sgblack@eecs.umich.edu
793536Sgblack@eecs.umich.edu      protected:
803536Sgblack@eecs.umich.edu        void getregs();
813536Sgblack@eecs.umich.edu        void setregs();
823536Sgblack@eecs.umich.edu
833536Sgblack@eecs.umich.edu        void clearSingleStep();
843536Sgblack@eecs.umich.edu        void setSingleStep();
853536Sgblack@eecs.umich.edu
863536Sgblack@eecs.umich.edu        PCEventQueue *getPcEventQueue();
873536Sgblack@eecs.umich.edu
883536Sgblack@eecs.umich.edu      protected:
893536Sgblack@eecs.umich.edu        class HardBreakpoint : public PCEvent
903536Sgblack@eecs.umich.edu        {
913536Sgblack@eecs.umich.edu          private:
923536Sgblack@eecs.umich.edu            RemoteGDB *gdb;
933536Sgblack@eecs.umich.edu
943536Sgblack@eecs.umich.edu          public:
953536Sgblack@eecs.umich.edu            int refcount;
963536Sgblack@eecs.umich.edu
973536Sgblack@eecs.umich.edu          public:
983536Sgblack@eecs.umich.edu            HardBreakpoint(RemoteGDB *_gdb, Addr addr);
993536Sgblack@eecs.umich.edu            std::string name() { return gdb->name() + ".hwbkpt"; }
1003536Sgblack@eecs.umich.edu
1013536Sgblack@eecs.umich.edu            virtual void process(ThreadContext *tc);
1023536Sgblack@eecs.umich.edu        };
1033536Sgblack@eecs.umich.edu        friend class HardBreakpoint;
1043536Sgblack@eecs.umich.edu
1053536Sgblack@eecs.umich.edu        typedef std::map<Addr, HardBreakpoint *> break_map_t;
1063536Sgblack@eecs.umich.edu        typedef break_map_t::iterator break_iter_t;
1073536Sgblack@eecs.umich.edu        break_map_t hardBreakMap;
1083536Sgblack@eecs.umich.edu
1093536Sgblack@eecs.umich.edu        bool insertSoftBreak(Addr addr, size_t len);
1103536Sgblack@eecs.umich.edu        bool removeSoftBreak(Addr addr, size_t len);
1113536Sgblack@eecs.umich.edu        bool insertHardBreak(Addr addr, size_t len);
1123536Sgblack@eecs.umich.edu        bool removeHardBreak(Addr addr, size_t len);
1133536Sgblack@eecs.umich.edu
1143536Sgblack@eecs.umich.edu      protected:
1153536Sgblack@eecs.umich.edu        struct TempBreakpoint {
1163536Sgblack@eecs.umich.edu            Addr	address;		// set here
1173536Sgblack@eecs.umich.edu            MachInst	bkpt_inst;		// saved instruction at bkpt
1183536Sgblack@eecs.umich.edu            int		init_count;		// number of times to skip bkpt
1193536Sgblack@eecs.umich.edu            int		count;			// current count
1203536Sgblack@eecs.umich.edu        };
1213536Sgblack@eecs.umich.edu
1223536Sgblack@eecs.umich.edu        TempBreakpoint notTakenBkpt;
1233536Sgblack@eecs.umich.edu        TempBreakpoint takenBkpt;
1243536Sgblack@eecs.umich.edu
1253536Sgblack@eecs.umich.edu        void clearTempBreakpoint(TempBreakpoint &bkpt);
1263536Sgblack@eecs.umich.edu        void setTempBreakpoint(TempBreakpoint &bkpt, Addr addr);
1273536Sgblack@eecs.umich.edu    };
1283536Sgblack@eecs.umich.edu}
1293536Sgblack@eecs.umich.edu
1303536Sgblack@eecs.umich.edu#endif /* __ARCH_ALPHA_REMOTE_GDB_H__ */
131