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:
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -46,6 +46,7 @@ class FsWorkload : public Workload
|
||||
loader::SymbolTable defaultSymtab;
|
||||
|
||||
public:
|
||||
PARAMS(SparcFsWorkload);
|
||||
FsWorkload(const SparcFsWorkloadParams ¶ms) : 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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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__
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user