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>
This commit is contained in:
Earl Ou
2022-10-31 22:36:29 -07:00
parent 540e6515de
commit 5bf88bf7a1
20 changed files with 36 additions and 53 deletions

View File

@@ -153,7 +153,8 @@ class FsWorkload : public KernelWorkload
setSystem(System *sys) override
{
KernelWorkload::setSystem(sys);
gdb = BaseRemoteGDB::build<RemoteGDB>(system);
gdb = BaseRemoteGDB::build<RemoteGDB>(
params().remote_gdb_port, system);
}
Addr

View File

@@ -42,7 +42,7 @@ namespace ArmISA
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 @@ class SEWorkload : public gem5::SEWorkload
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; }

View File

@@ -44,7 +44,7 @@ namespace MipsISA
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 @@ class SEWorkload : public gem5::SEWorkload
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; }

View File

@@ -45,7 +45,7 @@ namespace PowerISA
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 @@ class SEWorkload : public gem5::SEWorkload
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; }

View File

@@ -60,7 +60,8 @@ class BareMetal : public Workload
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(); }

View File

@@ -51,7 +51,8 @@ class FsLinux : public KernelWorkload
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; }

View File

@@ -44,7 +44,7 @@ namespace RiscvISA
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 @@ class SEWorkload : public gem5::SEWorkload
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; }

View File

@@ -46,6 +46,7 @@ class FsWorkload : public Workload
loader::SymbolTable defaultSymtab;
public:
PARAMS(SparcFsWorkload);
FsWorkload(const SparcFsWorkloadParams &params) : Workload(params) {}
void initState() override;
@@ -53,7 +54,8 @@ class FsWorkload : public Workload
setSystem(System *sys) override
{
Workload::setSystem(sys);
gdb = BaseRemoteGDB::build<RemoteGDB>(system);
gdb = BaseRemoteGDB::build<RemoteGDB>(
params().remote_gdb_port, system);
}
Addr

View File

@@ -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 @@ namespace SparcISA
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);

View File

@@ -78,7 +78,7 @@ void installSegDesc(ThreadContext *tc, int seg, SegDescriptor desc,
class FsWorkload : public KernelWorkload
{
public:
using Params = X86FsWorkloadParams;
PARAMS(X86FsWorkload);
FsWorkload(const Params &p);
public:
@@ -88,7 +88,8 @@ class FsWorkload : public KernelWorkload
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; }

View File

@@ -57,7 +57,7 @@ namespace X86ISA
class EmuLinux : public SEWorkload
{
public:
using Params = X86EmuLinuxParams;
PARAMS(X86EmuLinux);
EmuLinux(const Params &p);
@@ -65,7 +65,8 @@ class EmuLinux : public SEWorkload
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; }

View File

@@ -180,9 +180,8 @@ class BaseRemoteGDB
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

View File

@@ -28,7 +28,7 @@ from collections.abc import Mapping
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

View File

@@ -519,8 +519,6 @@ def main():
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))

View File

@@ -86,7 +86,6 @@ pybind_init_debug(py::module_ &m_native)
.def("allFlags", &debug::allFlags, py::return_value_policy::reference)
.def("schedBreak", &schedBreak)
.def("setRemoteGDBPort", &setRemoteGDBPort)
;
py::class_<debug::Flag> c_flag(m_debug, "Flag");

View File

@@ -36,6 +36,9 @@ class Workload(SimObject):
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):

View File

@@ -114,20 +114,4 @@ eventqDump()
}
}
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

View File

@@ -60,10 +60,6 @@ void takeCheckpoint(Tick when);
*/
void eventqDump();
int getRemoteGDBPort();
// Remote gdb base port. 0 disables remote gdb.
void setRemoteGDBPort(int port);
} // namespace gem5
#endif // __SIM_DEBUG_HH__

View File

@@ -174,12 +174,6 @@ Gem5Control::clearDebugFlag(const char *flag)
::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)

View File

@@ -142,10 +142,6 @@ class Gem5Control
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)());