Alec Roelke has uploaded this change for review. ( https://gem5-review.googlesource.com/2300

Change subject: riscv: add remote gdb support
......................................................................

riscv: add remote gdb support

This patch adds support for debugging with remote GDB to RISC-V. At the
moment, all you can do is connect a remote GDB and pause and continue
execution; viewing debugging information and controlling execution do
not work properly.

Change-Id: I3fd48d4263bc0d9a290fc0f6f0939c7286ab93e5
---
M src/arch/riscv/remote_gdb.cc
M src/arch/riscv/remote_gdb.hh
2 files changed, 182 insertions(+), 43 deletions(-)



diff --git a/src/arch/riscv/remote_gdb.cc b/src/arch/riscv/remote_gdb.cc
index 64735d0..548b53c 100644
--- a/src/arch/riscv/remote_gdb.cc
+++ b/src/arch/riscv/remote_gdb.cc
@@ -1,8 +1,20 @@
 /*
+ * Copyright 2015 LabWare
+ * Copyright 2014 Google, Inc.
+ * Copyright (c) 2010 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2017 The University of Virginia
  * Copyright (c) 2002-2005 The Regents of The University of Michigan
- * Copyright (c) 2007-2008 The Florida State University
- * Copyright (c) 2009 The University of Edinburgh
- * Copyright (c) 2015 Sven Karlsson
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,43 +41,152 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Nathan Binkert
- *          Stephen Hines
- *          Timothy M. Jones
- *          Sven Karlsson
+ *          William Wang
+ *          Deyuan Guo
+ *          Boris Shingarov
+ *          Alec Roelke
  */

- #include "base/remote_gdb.hh"
- #include "arch/riscv/remote_gdb.hh"
- #include "sim/system.hh"
+/*
+ * Copyright (c) 1990, 1993 The Regents of the University of California
+ * All rights reserved
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Lawrence Berkeley Laboratories.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *      @(#)kgdb_stub.c 8.4 (Berkeley) 1/12/94
+ */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the NetBSD
+ *      Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * $NetBSD: kgdb_stub.c,v 1.8 2001/07/07 22:58:00 wdk Exp $
+ *
+ * Taken from NetBSD
+ *
+ * "Stub" to allow remote cpu to debug over a serial line using gdb.
+ */
+
+#include "arch/riscv/remote_gdb.hh"
+
+#include <string>
+
+#include "arch/riscv/registers.hh"
+#include "cpu/thread_state.hh"
+#include "debug/GDBAcc.hh"
+#include "sim/full_system.hh"

 using namespace std;
 using namespace RiscvISA;

-RemoteGDB::RemoteGDB(System *system, ThreadContext *context)
-    : BaseRemoteGDB(system, context)
+RemoteGDB::RemoteGDB(System *_system, ThreadContext *tc)
+    : BaseRemoteGDB(_system, tc)
 {
-}
-
-RemoteGDB::BaseGdbRegCache*
-RemoteGDB::gdbRegs()
-{
-    panic("gdbRegs not implemented for Riscv!");
 }

 bool
-RemoteGDB::acc(Addr, size_t)
+RemoteGDB::acc(Addr va, size_t len)
 {
-    panic("acc not implemented for Riscv!");
+    TlbEntry entry;
+    if (FullSystem)
+        panic("acc not implemented for RISCV FS!");
+    else
+        return context->getProcessPtr()->pTable->lookup(va, entry);
 }

 void
-RemoteGDB::getregs()
+RemoteGDB::RiscvGdbRegCache::getRegs(ThreadContext *context)
 {
-    panic("getregs not implemented for Riscv!");
+    DPRINTF(GDBAcc, "getregs in remotegdb \n");
+    r.pc = context->pcState().pc();
+    for (int i = 0; i < NumIntArchRegs; i++)
+        r.gpr[i] = context->readIntReg(i);
+    r.amo = context->readIntReg(NumIntArchRegs);
+    for (int i = 0; i < NumFloatRegs; i++)
+        r.fpr[i] = context->readFloatRegBits(i);
 }

 void
-RemoteGDB::setregs()
+RemoteGDB::RiscvGdbRegCache::setRegs(ThreadContext *context) const
 {
-    panic("setregs not implemented for Riscv!");
+    DPRINTF(GDBAcc, "setregs in remotegdb \n");
+    context->pcState(r.pc);
+    for (int i = 0; i < NumIntArchRegs; i++)
+        context->setIntReg(i, r.gpr[i]);
+    context->setIntReg(NumIntArchRegs, r.amo);
+    for (int i = 0; i < NumFloatRegs; i++)
+        context->setFloatRegBits(i, r.fpr[i]);
+}
+
+RemoteGDB::BaseGdbRegCache*
+RemoteGDB::gdbRegs() {
+    return new RiscvGdbRegCache(this);
 }
diff --git a/src/arch/riscv/remote_gdb.hh b/src/arch/riscv/remote_gdb.hh
index 1e9dc3e..78d40f6 100644
--- a/src/arch/riscv/remote_gdb.hh
+++ b/src/arch/riscv/remote_gdb.hh
@@ -1,8 +1,8 @@
 /*
- * Copyright (c) 2002-2005 The Regents of The University of Michigan
- * Copyright (c) 2007-2008 The Florida State University
- * Copyright (c) 2009 The University of Edinburgh
- * Copyright (c) 2015 Sven Karlsson
+ * Copyright (c) 2017 The University of Virginia
+ * Copyright 2015 LabWare
+ * Copyright 2014 Google, Inc.
+ * Copyright (c) 2007 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,14 +29,16 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Nathan Binkert
- *          Stephen Hines
- *          Timothy M. Jones
- *          Sven Karlsson
+ *          Boris Shingarov
+ *          Alec Roelke
  */

 #ifndef __ARCH_RISCV_REMOTE_GDB_HH__
 #define __ARCH_RISCV_REMOTE_GDB_HH__

+#include <string>
+
+#include "arch/riscv/registers.hh"
 #include "base/remote_gdb.hh"

 class System;
@@ -47,20 +49,36 @@

 class RemoteGDB : public BaseRemoteGDB
 {
+  protected:
+    bool acc(Addr addr, size_t len);
+
+    class RiscvGdbRegCache : public BaseGdbRegCache
+    {
+      using BaseGdbRegCache::BaseGdbRegCache;
+      private:
+        struct {
+            IntReg pc;
+            IntReg gpr[NumIntArchRegs];
+            IntReg amo;
+            FloatRegBits fpr[NumFloatRegs];
+        } r;
+      public:
+        char *data() const { return (char *)&r; }
+        size_t size() const { return sizeof(r); }
+        void getRegs(ThreadContext*);
+        void setRegs(ThreadContext*) const;
+
+        const std::string
+        name() const
+        {
+            return gdb->name() + ".RiscvGdbRegCache";
+        }
+    };
+
+
   public:
-    RemoteGDB(System *system, ThreadContext *context);
-
-    BaseGdbRegCache *
-    gdbRegs();
-
-    bool
-    acc(Addr, size_t);
-
-    void
-    getregs();
-
-    void
-    setregs();
+    RemoteGDB(System *_system, ThreadContext *tc);
+    BaseGdbRegCache *gdbRegs();
 };

 } // namespace RiscvISA

--
To view, visit https://gem5-review.googlesource.com/2300
To unsubscribe, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I3fd48d4263bc0d9a290fc0f6f0939c7286ab93e5
Gerrit-Change-Number: 2300
Gerrit-PatchSet: 1
Gerrit-Owner: Alec Roelke <[email protected]>
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to