remote_gdb.hh revision 12449
12391SN/A/*
28931Sandreas.hansson@arm.com * Copyright 2015 LabWare
37733SAli.Saidi@ARM.com * Copyright 2014 Google, Inc.
47733SAli.Saidi@ARM.com * Copyright (c) 2007 The Hewlett-Packard Development Company
57733SAli.Saidi@ARM.com * All rights reserved.
67733SAli.Saidi@ARM.com *
77733SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall
87733SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual
97733SAli.Saidi@ARM.com * property including but not limited to intellectual property relating
107733SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software
117733SAli.Saidi@ARM.com * licensed hereunder.  You may use the software subject to the license
127733SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated
137733SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software,
142391SN/A * modified or unmodified, in source code or in binary form.
152391SN/A *
162391SN/A * Redistribution and use in source and binary forms, with or without
172391SN/A * modification, are permitted provided that the following conditions are
182391SN/A * met: redistributions of source code must retain the above copyright
192391SN/A * notice, this list of conditions and the following disclaimer;
202391SN/A * redistributions in binary form must reproduce the above copyright
212391SN/A * notice, this list of conditions and the following disclaimer in the
222391SN/A * documentation and/or other materials provided with the distribution;
232391SN/A * neither the name of the copyright holders nor the names of its
242391SN/A * contributors may be used to endorse or promote products derived from
252391SN/A * this software without specific prior written permission.
262391SN/A *
272391SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
282391SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
292391SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
302391SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
312391SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
322391SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
332391SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
342391SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
352391SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
362665Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
378931Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
382391SN/A *
392391SN/A * Authors: Gabe Black
409293Sandreas.hansson@arm.com *          Boris Shingarov
419293Sandreas.hansson@arm.com */
429293Sandreas.hansson@arm.com
439293Sandreas.hansson@arm.com#ifndef __ARCH_X86_REMOTEGDB_HH__
449293Sandreas.hansson@arm.com#define __ARCH_X86_REMOTEGDB_HH__
459293Sandreas.hansson@arm.com
469293Sandreas.hansson@arm.com#include <algorithm>
479293Sandreas.hansson@arm.com
489293Sandreas.hansson@arm.com#include "arch/x86/types.hh"
499293Sandreas.hansson@arm.com#include "base/remote_gdb.hh"
509293Sandreas.hansson@arm.com
519293Sandreas.hansson@arm.comclass System;
529293Sandreas.hansson@arm.comclass ThreadContext;
539356Snilay@cs.wisc.edu
548931Sandreas.hansson@arm.comnamespace X86ISA
559293Sandreas.hansson@arm.com{
569293Sandreas.hansson@arm.comclass RemoteGDB : public BaseRemoteGDB
572394SN/A{
582394SN/A  protected:
592391SN/A    bool acc(Addr addr, size_t len);
602391SN/A    bool checkBpLen(size_t len) { return len == 1; }
619293Sandreas.hansson@arm.com    class X86GdbRegCache : public BaseGdbRegCache
629293Sandreas.hansson@arm.com    {
639293Sandreas.hansson@arm.com      using BaseGdbRegCache::BaseGdbRegCache;
642391SN/A      private:
659293Sandreas.hansson@arm.com        struct {
669293Sandreas.hansson@arm.com          uint32_t eax;
678931Sandreas.hansson@arm.com          uint32_t ecx;
688931Sandreas.hansson@arm.com          uint32_t edx;
698931Sandreas.hansson@arm.com          uint32_t ebx;
708931Sandreas.hansson@arm.com          uint32_t esp;
718931Sandreas.hansson@arm.com          uint32_t ebp;
722391SN/A          uint32_t esi;
738931Sandreas.hansson@arm.com          uint32_t edi;
748931Sandreas.hansson@arm.com          uint32_t eip;
758931Sandreas.hansson@arm.com          uint32_t eflags;
768931Sandreas.hansson@arm.com          uint32_t cs;
778931Sandreas.hansson@arm.com          uint32_t ss;
788931Sandreas.hansson@arm.com          uint32_t ds;
798931Sandreas.hansson@arm.com          uint32_t es;
808931Sandreas.hansson@arm.com          uint32_t fs;
819293Sandreas.hansson@arm.com          uint32_t gs;
829293Sandreas.hansson@arm.com        } r;
839293Sandreas.hansson@arm.com      public:
849293Sandreas.hansson@arm.com        char *data() const { return (char *)&r; }
859293Sandreas.hansson@arm.com        size_t size() const { return sizeof(r); }
869293Sandreas.hansson@arm.com        void getRegs(ThreadContext*);
879293Sandreas.hansson@arm.com        void setRegs(ThreadContext*) const;
889293Sandreas.hansson@arm.com        const std::string
899293Sandreas.hansson@arm.com        name() const
909293Sandreas.hansson@arm.com        {
919293Sandreas.hansson@arm.com            return gdb->name() + ".X86GdbRegCache";
929293Sandreas.hansson@arm.com        }
939293Sandreas.hansson@arm.com    };
949293Sandreas.hansson@arm.com
958931Sandreas.hansson@arm.com    class AMD64GdbRegCache : public BaseGdbRegCache
969293Sandreas.hansson@arm.com    {
979293Sandreas.hansson@arm.com      using BaseGdbRegCache::BaseGdbRegCache;
989293Sandreas.hansson@arm.com      private:
999293Sandreas.hansson@arm.com        struct M5_ATTR_PACKED {
1009293Sandreas.hansson@arm.com          uint64_t rax;
1019293Sandreas.hansson@arm.com          uint64_t rbx;
1029293Sandreas.hansson@arm.com          uint64_t rcx;
1039293Sandreas.hansson@arm.com          uint64_t rdx;
1049293Sandreas.hansson@arm.com          uint64_t rsi;
1059293Sandreas.hansson@arm.com          uint64_t rdi;
1069293Sandreas.hansson@arm.com          uint64_t rbp;
1079293Sandreas.hansson@arm.com          uint64_t rsp;
1089293Sandreas.hansson@arm.com          uint64_t r8;
1099293Sandreas.hansson@arm.com          uint64_t r9;
1109293Sandreas.hansson@arm.com          uint64_t r10;
1119293Sandreas.hansson@arm.com          uint64_t r11;
1129293Sandreas.hansson@arm.com          uint64_t r12;
1139293Sandreas.hansson@arm.com          uint64_t r13;
1149293Sandreas.hansson@arm.com          uint64_t r14;
1159293Sandreas.hansson@arm.com          uint64_t r15;
1169293Sandreas.hansson@arm.com          uint64_t rip;
1179293Sandreas.hansson@arm.com          uint32_t eflags;
1189293Sandreas.hansson@arm.com          uint32_t cs;
1199293Sandreas.hansson@arm.com          uint32_t ss;
1209293Sandreas.hansson@arm.com          uint32_t ds;
1219293Sandreas.hansson@arm.com          uint32_t es;
1229293Sandreas.hansson@arm.com          uint32_t fs;
1239293Sandreas.hansson@arm.com          uint32_t gs;
1249293Sandreas.hansson@arm.com          /*
1259293Sandreas.hansson@arm.com           * We do not model st[], FPU status regs, xmm[] etc.
1269293Sandreas.hansson@arm.com           * While it's not ok to have G-packets larger than what gdb
1279293Sandreas.hansson@arm.com           * knows about, it is ok to have smaller ones.
1289293Sandreas.hansson@arm.com           */
1299293Sandreas.hansson@arm.com        } r;
1309293Sandreas.hansson@arm.com      public:
1319293Sandreas.hansson@arm.com        char *data() const { return (char *)&r; }
1329293Sandreas.hansson@arm.com        size_t size() const { return sizeof(r); }
1339293Sandreas.hansson@arm.com        void getRegs(ThreadContext*);
1349293Sandreas.hansson@arm.com        void setRegs(ThreadContext*) const;
1359293Sandreas.hansson@arm.com        const std::string
1369293Sandreas.hansson@arm.com        name() const
1379293Sandreas.hansson@arm.com        {
1389293Sandreas.hansson@arm.com            return gdb->name() + ".AMD64GdbRegCache";
1399293Sandreas.hansson@arm.com        }
1409293Sandreas.hansson@arm.com    };
1419293Sandreas.hansson@arm.com
1429293Sandreas.hansson@arm.com    X86GdbRegCache regCache32;
1439293Sandreas.hansson@arm.com    AMD64GdbRegCache regCache64;
1449293Sandreas.hansson@arm.com
1459293Sandreas.hansson@arm.com  public:
1469293Sandreas.hansson@arm.com    RemoteGDB(System *system, ThreadContext *context, int _port);
1479293Sandreas.hansson@arm.com    BaseGdbRegCache *gdbRegs();
1489293Sandreas.hansson@arm.com};
1499293Sandreas.hansson@arm.com} // namespace X86ISA
1509293Sandreas.hansson@arm.com
1519293Sandreas.hansson@arm.com#endif // __ARCH_X86_REMOTEGDB_HH__
1529293Sandreas.hansson@arm.com