sim: allow specifying remote gdb port for each workload

In a platform with multiple systems, we may want to specify the
remote gdb port for each system. This change makes it
possible to specify the port number at each Workload instance.

Change-Id: I755b3960ee920ae5289819aa05d98902614a5615
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/65151
Maintainer: Earl Ou <shunhsingou@google.com>
Reviewed-by: Yu-hsin Wang <yuhsingw@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/src/arch/arm/fs_workload.hh b/src/arch/arm/fs_workload.hh
index 547bbf1..0811f3d 100644
--- a/src/arch/arm/fs_workload.hh
+++ b/src/arch/arm/fs_workload.hh
@@ -153,7 +153,8 @@
     setSystem(System *sys) override
     {
         KernelWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     Addr
diff --git a/src/arch/arm/se_workload.hh b/src/arch/arm/se_workload.hh
index deb5d3b..f0bf0eb 100644
--- a/src/arch/arm/se_workload.hh
+++ b/src/arch/arm/se_workload.hh
@@ -42,7 +42,7 @@
 class SEWorkload : public gem5::SEWorkload
 {
   public:
-    using Params = ArmSEWorkloadParams;
+    PARAMS(ArmSEWorkload);
 
     SEWorkload(const Params &p, Addr page_shift) :
         gem5::SEWorkload(p, page_shift)
@@ -52,7 +52,8 @@
     setSystem(System *sys) override
     {
         gem5::SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return loader::Arm64; }
diff --git a/src/arch/mips/se_workload.hh b/src/arch/mips/se_workload.hh
index d5184dd..dc6f1dd 100644
--- a/src/arch/mips/se_workload.hh
+++ b/src/arch/mips/se_workload.hh
@@ -44,7 +44,7 @@
 class SEWorkload : public gem5::SEWorkload
 {
   public:
-    using Params = MipsSEWorkloadParams;
+    PARAMS(MipsSEWorkload);
 
     SEWorkload(const Params &p, Addr page_shift) :
         gem5::SEWorkload(p, page_shift)
@@ -54,7 +54,8 @@
     setSystem(System *sys) override
     {
         gem5::SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return loader::Mips; }
diff --git a/src/arch/power/se_workload.hh b/src/arch/power/se_workload.hh
index f3c7b35..d041c45 100644
--- a/src/arch/power/se_workload.hh
+++ b/src/arch/power/se_workload.hh
@@ -45,7 +45,7 @@
 class SEWorkload : public gem5::SEWorkload
 {
   public:
-    using Params = PowerSEWorkloadParams;
+    PARAMS(PowerSEWorkload);
     SEWorkload(const Params &p, Addr page_shift) :
         gem5::SEWorkload(p, page_shift)
     {}
@@ -54,7 +54,8 @@
     setSystem(System *sys) override
     {
         gem5::SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return loader::Power; }
diff --git a/src/arch/riscv/bare_metal/fs_workload.hh b/src/arch/riscv/bare_metal/fs_workload.hh
index e10c0a0..35f4255 100644
--- a/src/arch/riscv/bare_metal/fs_workload.hh
+++ b/src/arch/riscv/bare_metal/fs_workload.hh
@@ -60,7 +60,8 @@
     setSystem(System *sys) override
     {
         Workload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return bootloader->getArch(); }
diff --git a/src/arch/riscv/linux/fs_workload.hh b/src/arch/riscv/linux/fs_workload.hh
index cb29bee..1dc704d 100644
--- a/src/arch/riscv/linux/fs_workload.hh
+++ b/src/arch/riscv/linux/fs_workload.hh
@@ -51,7 +51,8 @@
     setSystem(System *sys) override
     {
         KernelWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     ByteOrder byteOrder() const override { return ByteOrder::little; }
diff --git a/src/arch/riscv/se_workload.hh b/src/arch/riscv/se_workload.hh
index 02ba6e8..6f7c2ed 100644
--- a/src/arch/riscv/se_workload.hh
+++ b/src/arch/riscv/se_workload.hh
@@ -44,7 +44,7 @@
 class SEWorkload : public gem5::SEWorkload
 {
   public:
-    using Params = RiscvSEWorkloadParams;
+    PARAMS(RiscvSEWorkload);
 
     SEWorkload(const Params &p, Addr page_shift) :
         gem5::SEWorkload(p, page_shift)
@@ -54,7 +54,8 @@
     setSystem(System *sys) override
     {
         gem5::SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return loader::Riscv64; }
diff --git a/src/arch/sparc/fs_workload.hh b/src/arch/sparc/fs_workload.hh
index 90d5131..3e901a4 100644
--- a/src/arch/sparc/fs_workload.hh
+++ b/src/arch/sparc/fs_workload.hh
@@ -46,6 +46,7 @@
     loader::SymbolTable defaultSymtab;
 
   public:
+    PARAMS(SparcFsWorkload);
     FsWorkload(const SparcFsWorkloadParams &params) : Workload(params) {}
     void initState() override;
 
@@ -53,7 +54,8 @@
     setSystem(System *sys) override
     {
         Workload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     Addr
diff --git a/src/arch/sparc/se_workload.hh b/src/arch/sparc/se_workload.hh
index f30f193..8cb373a 100644
--- a/src/arch/sparc/se_workload.hh
+++ b/src/arch/sparc/se_workload.hh
@@ -35,6 +35,7 @@
 #include "arch/sparc/remote_gdb.hh"
 #include "base/loader/object_file.hh"
 #include "cpu/thread_context.hh"
+#include "params/SparcSEWorkload.hh"
 #include "sim/se_workload.hh"
 #include "sim/syscall_abi.hh"
 
@@ -47,13 +48,15 @@
 class SEWorkload : public gem5::SEWorkload
 {
   public:
+    PARAMS(SparcSEWorkload);
     using gem5::SEWorkload::SEWorkload;
 
     void
     setSystem(System *sys) override
     {
         gem5::SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     virtual void handleTrap(ThreadContext *tc, int trapNum);
diff --git a/src/arch/x86/fs_workload.hh b/src/arch/x86/fs_workload.hh
index 5edadae..b40b69b 100644
--- a/src/arch/x86/fs_workload.hh
+++ b/src/arch/x86/fs_workload.hh
@@ -78,7 +78,7 @@
 class FsWorkload : public KernelWorkload
 {
   public:
-    using Params = X86FsWorkloadParams;
+    PARAMS(X86FsWorkload);
     FsWorkload(const Params &p);
 
   public:
@@ -88,7 +88,8 @@
     setSystem(System *sys) override
     {
         KernelWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     ByteOrder byteOrder() const override { return ByteOrder::little; }
diff --git a/src/arch/x86/linux/se_workload.hh b/src/arch/x86/linux/se_workload.hh
index d1e613f..f170776 100644
--- a/src/arch/x86/linux/se_workload.hh
+++ b/src/arch/x86/linux/se_workload.hh
@@ -57,7 +57,7 @@
 class EmuLinux : public SEWorkload
 {
   public:
-    using Params = X86EmuLinuxParams;
+    PARAMS(X86EmuLinux);
 
     EmuLinux(const Params &p);
 
@@ -65,7 +65,8 @@
     setSystem(System *sys) override
     {
         SEWorkload::setSystem(sys);
-        gdb = BaseRemoteGDB::build<RemoteGDB>(system);
+        gdb = BaseRemoteGDB::build<RemoteGDB>(
+                params().remote_gdb_port, system);
     }
 
     loader::Arch getArch() const override { return loader::X86_64; }
diff --git a/src/base/remote_gdb.hh b/src/base/remote_gdb.hh
index d4a8a5b..ad64bc7 100644
--- a/src/base/remote_gdb.hh
+++ b/src/base/remote_gdb.hh
@@ -180,9 +180,8 @@
 
     template <class GDBStub, class ...Args>
     static BaseRemoteGDB *
-    build(Args... args)
+    build(int port, Args... args)
     {
-        int port = getRemoteGDBPort();
         if (port)
             return new GDBStub(args..., port);
         else
diff --git a/src/python/m5/debug.py b/src/python/m5/debug.py
index f5a9d4d..70af2e0 100644
--- a/src/python/m5/debug.py
+++ b/src/python/m5/debug.py
@@ -28,7 +28,7 @@
 
 import _m5.debug
 from _m5.debug import SimpleFlag, CompoundFlag
-from _m5.debug import schedBreak, setRemoteGDBPort
+from _m5.debug import schedBreak
 from m5.util import printList
 
 
diff --git a/src/python/m5/main.py b/src/python/m5/main.py
index 205f3f1..458e143 100644
--- a/src/python/m5/main.py
+++ b/src/python/m5/main.py
@@ -519,8 +519,6 @@
     if not options.allow_remote_connections:
         m5.listenersLoopbackOnly()
 
-    # set debugging options
-    debug.setRemoteGDBPort(options.remote_gdb_port)
     for when in options.debug_break:
         debug.schedBreak(int(when))
 
diff --git a/src/python/pybind11/debug.cc b/src/python/pybind11/debug.cc
index 9ac8724..313ca81 100644
--- a/src/python/pybind11/debug.cc
+++ b/src/python/pybind11/debug.cc
@@ -86,7 +86,6 @@
         .def("allFlags", &debug::allFlags, py::return_value_policy::reference)
 
         .def("schedBreak", &schedBreak)
-        .def("setRemoteGDBPort", &setRemoteGDBPort)
         ;
 
     py::class_<debug::Flag> c_flag(m_debug, "Flag");
diff --git a/src/sim/Workload.py b/src/sim/Workload.py
index b46c32f..f5139e1 100644
--- a/src/sim/Workload.py
+++ b/src/sim/Workload.py
@@ -36,6 +36,9 @@
     abstract = True
 
     wait_for_remote_gdb = Param.Bool(False, "Wait for a remote GDB connection")
+    remote_gdb_port = Param.Int(
+        7000, "Default port number used for remote GDB connection"
+    )
 
     @cxxMethod
     def sendToGdb(self, message):
diff --git a/src/sim/debug.cc b/src/sim/debug.cc
index 85bfb97..55b28f7 100644
--- a/src/sim/debug.cc
+++ b/src/sim/debug.cc
@@ -114,20 +114,4 @@
     }
 }
 
-int remote_gdb_base_port = 7000;
-
-int
-getRemoteGDBPort()
-{
-    return remote_gdb_base_port;
-}
-
-// Set remote GDB base port.  0 means disable remote GDB.
-// Callable from python.
-void
-setRemoteGDBPort(int port)
-{
-    remote_gdb_base_port = port;
-}
-
 } // namespace gem5
diff --git a/src/sim/debug.hh b/src/sim/debug.hh
index ed59304..e1c537d 100644
--- a/src/sim/debug.hh
+++ b/src/sim/debug.hh
@@ -60,10 +60,6 @@
  */
 void eventqDump();
 
-int getRemoteGDBPort();
-// Remote gdb base port.  0 disables remote gdb.
-void setRemoteGDBPort(int port);
-
 } // namespace gem5
 
 #endif // __SIM_DEBUG_HH__
diff --git a/util/systemc/gem5_within_systemc/sc_gem5_control.cc b/util/systemc/gem5_within_systemc/sc_gem5_control.cc
index db2f00f..a9b9fd5 100644
--- a/util/systemc/gem5_within_systemc/sc_gem5_control.cc
+++ b/util/systemc/gem5_within_systemc/sc_gem5_control.cc
@@ -174,12 +174,6 @@
     ::gem5::clearDebugFlag(flag);
 }
 
-void
-Gem5Control::setRemoteGDBPort(unsigned int port)
-{
-    ::gem5::setRemoteGDBPort(port);
-}
-
 Gem5System *
 Gem5Control::makeSystem(const std::string &system_name,
     const std::string &instance_name)
diff --git a/util/systemc/gem5_within_systemc/sc_gem5_control.hh b/util/systemc/gem5_within_systemc/sc_gem5_control.hh
index f74e001..2959ba2 100644
--- a/util/systemc/gem5_within_systemc/sc_gem5_control.hh
+++ b/util/systemc/gem5_within_systemc/sc_gem5_control.hh
@@ -142,10 +142,6 @@
     virtual void setDebugFlag(const char *flag);
     virtual void clearDebugFlag(const char *flag);
 
-    /** Choose a base port number for GDB to connect to the model
-     *  (0 disables connections) */
-    virtual void setRemoteGDBPort(unsigned int port);
-
     /* Register an action to happen at the end of elaboration */
     virtual void registerEndOfElaboration(void (*func)());