From eb17e9ef8260b2799f8edf7de86e2d8fa97da85c Mon Sep 17 00:00:00 2001 From: Horst Schirmeier Date: Thu, 14 Mar 2013 22:29:43 +0100 Subject: [PATCH 1/4] core/sal: move command-line parameter passing to SC::startup() --- src/core/sal/SimulatorController.cc | 7 ++++++- src/core/sal/SimulatorController.hpp | 5 ++++- src/core/sal/bochs/BochsController.cc | 6 ------ src/core/sal/bochs/BochsController.hpp | 14 -------------- src/core/sal/bochs/FailBochsInit.ah | 3 +-- src/core/sal/gem5/Gem5Controller.cc | 1 + src/core/sal/ovp/FailOVPInit.ah | 1 + src/core/sal/qemu/wrappers.cc | 1 + src/core/sal/t32/T32Controller.cc | 1 + 9 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/core/sal/SimulatorController.cc b/src/core/sal/SimulatorController.cc index a832dc0a..9a71f3e2 100644 --- a/src/core/sal/SimulatorController.cc +++ b/src/core/sal/SimulatorController.cc @@ -2,6 +2,7 @@ #include "SALInst.hpp" #include "Event.hpp" #include "Listener.hpp" +#include "util/CommandLine.hpp" namespace fail { @@ -35,12 +36,16 @@ BaseListener* SimulatorController::resume(void) return m_LstList.getLastFired(); } -void SimulatorController::startup() +void SimulatorController::startup(int argc, char **argv) { // Some greetings to the user: std::cout << "[SimulatorController] Initializing..." << std::endl; // TODO: Log-Level? + if (argv) { + CommandLine::Inst().collect_args(bx_startup_flags.argc, bx_startup_flags.argv); + } + // Activate previously added experiments to allow initialization: initExperiments(); } diff --git a/src/core/sal/SimulatorController.hpp b/src/core/sal/SimulatorController.hpp index 22c22a76..b2b42d1e 100644 --- a/src/core/sal/SimulatorController.hpp +++ b/src/core/sal/SimulatorController.hpp @@ -48,8 +48,11 @@ public: * This function needs to be invoked once the simulator starts, and * allows the SimulatorController to instantiate all needed experiment * components. + * + * @param argc main()'s argument counter + * @param argv main()'s argument value vector */ - void startup(); + void startup(int argc = 0, char **argv = 0); /** * Experiments need to hook here. */ diff --git a/src/core/sal/bochs/BochsController.cc b/src/core/sal/bochs/BochsController.cc index 1a3c14aa..6095f71f 100644 --- a/src/core/sal/bochs/BochsController.cc +++ b/src/core/sal/bochs/BochsController.cc @@ -4,7 +4,6 @@ #include "BochsMemory.hpp" #include "../SALInst.hpp" #include "../Listener.hpp" -#include "util/CommandLine.hpp" namespace fail { @@ -174,9 +173,4 @@ ConcreteCPU& BochsController::detectCPU(BX_CPU_C* pCPU) const return getCPU(i); } -void BochsController::collectCommandLineArguments(int argc, char **argv) const -{ - CommandLine::Inst().collect_args(bx_startup_flags.argc, bx_startup_flags.argv); -} - } // end-of-namespace: fail diff --git a/src/core/sal/bochs/BochsController.hpp b/src/core/sal/bochs/BochsController.hpp index 05cb7877..f3de852e 100644 --- a/src/core/sal/bochs/BochsController.hpp +++ b/src/core/sal/bochs/BochsController.hpp @@ -150,20 +150,6 @@ public: * @see The uses SimulatorController::getCPU(). */ ConcreteCPU& detectCPU(BX_CPU_C* pCPU) const; - -protected: - /** - * Hack: Indirection for commandline argument collection - * - * This prevents CommandLine.hpp (and optionparser.h) from being pulled - * inbe to every single Bochs translation unit via FailBochsInit.ah, - * leading to compilation errors in some of them. - * TODO: Move this upwards to SimulatorController? - * - * @param argc main()'s argument counter - * @param argv main()'s argument value vector - */ - void collectCommandLineArguments(int argc, char **argv) const; }; } // end-of-namespace: fail diff --git a/src/core/sal/bochs/FailBochsInit.ah b/src/core/sal/bochs/FailBochsInit.ah index 63a82082..c4366c16 100644 --- a/src/core/sal/bochs/FailBochsInit.ah +++ b/src/core/sal/bochs/FailBochsInit.ah @@ -10,8 +10,7 @@ aspect FailBochsInit { advice call("int bxmain()") : before () { - fail::simulator.collectCommandLineArguments(bx_startup_flags.argc, bx_startup_flags.argv); - fail::simulator.startup(); + fail::simulator.startup(bx_startup_flags.argc, bx_startup_flags.argv); } }; diff --git a/src/core/sal/gem5/Gem5Controller.cc b/src/core/sal/gem5/Gem5Controller.cc index 6658caaa..c4095ab4 100644 --- a/src/core/sal/gem5/Gem5Controller.cc +++ b/src/core/sal/gem5/Gem5Controller.cc @@ -19,6 +19,7 @@ void Gem5Controller::startup() addCPU(cpu); } + // TODO pass on command-line parameters SimulatorController::startup(); } diff --git a/src/core/sal/ovp/FailOVPInit.ah b/src/core/sal/ovp/FailOVPInit.ah index ca79042f..fe7ed613 100644 --- a/src/core/sal/ovp/FailOVPInit.ah +++ b/src/core/sal/ovp/FailOVPInit.ah @@ -14,6 +14,7 @@ aspect FailOVPInit { { std::cout << "OVP init aspect!" << std::endl; // TODO: Log-Level? + // TODO pass on command-line parameters fail::simulator.startup(); } }; diff --git a/src/core/sal/qemu/wrappers.cc b/src/core/sal/qemu/wrappers.cc index 24a31abe..4ae66729 100644 --- a/src/core/sal/qemu/wrappers.cc +++ b/src/core/sal/qemu/wrappers.cc @@ -14,6 +14,7 @@ void fail_init(struct CPUX86State *env) { std::cout << "FailQEMU v" FAIL_VERSION << std::endl; fail::simulator.setCPUEnv(env); + // TODO pass on command-line parameters fail::simulator.startup(); } diff --git a/src/core/sal/t32/T32Controller.cc b/src/core/sal/t32/T32Controller.cc index bf41278c..b9a394e9 100644 --- a/src/core/sal/t32/T32Controller.cc +++ b/src/core/sal/t32/T32Controller.cc @@ -7,6 +7,7 @@ void T32Controller::startup(){ // Do some T32-specific startup addCPU(new ConcreteCPU(0)); // Startup generic SimulatorController + // TODO pass on command-line parameters SimulatorController::startup(); } From f844eb0e985a1dafb487e860d76d502a80f9a1d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20B=C3=B6ckenkamp?= Date: Tue, 19 Mar 2013 13:37:18 +0100 Subject: [PATCH 2/4] Rename GenericTimerEvent -> TimerEvent --- doc/class-diagram.dia | 38 +++++++++++++++++++------------------- src/core/sal/Event.hpp | 8 ++++---- src/core/sal/Listener.hpp | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/doc/class-diagram.dia b/doc/class-diagram.dia index 0f237c0b..8ca3d8ab 100644 --- a/doc/class-diagram.dia +++ b/doc/class-diagram.dia @@ -6199,7 +6199,7 @@ - + @@ -9786,8 +9786,8 @@ - - + + @@ -17241,7 +17241,7 @@ - #GenericTimerEvent# + #TimerEvent# ## @@ -18919,8 +18919,8 @@ - - + + @@ -19135,16 +19135,16 @@ - + - - - + + + @@ -20852,7 +20852,7 @@ - + @@ -21078,17 +21078,17 @@ - + - + - - + + @@ -21119,17 +21119,17 @@ - + - + - - + + diff --git a/src/core/sal/Event.hpp b/src/core/sal/Event.hpp index f47b9fd4..fb196527 100644 --- a/src/core/sal/Event.hpp +++ b/src/core/sal/Event.hpp @@ -334,18 +334,18 @@ public: }; /** - * \class GenericTimerEvent + * \class TimerEvent * This event type is used to encapsulate timeout-specific data. */ -class GenericTimerEvent : public BaseEvent { +class TimerEvent : public BaseEvent { protected: timer_id_t m_Id; //!< internal timer id (sim-specific) public: /** * Creates a new timer event. */ - GenericTimerEvent(timer_id_t id = INVALID_TIMER) : m_Id(id) { } - ~GenericTimerEvent() { } + TimerEvent(timer_id_t id = INVALID_TIMER) : m_Id(id) { } + ~TimerEvent() { } /** * Retrieves the internal timer id. Maybe useful for debug output. * @return the timer id or \c INVALID_TIMER if the timer is invalid diff --git a/src/core/sal/Listener.hpp b/src/core/sal/Listener.hpp index 2d4e9e5e..61f0c5d4 100644 --- a/src/core/sal/Listener.hpp +++ b/src/core/sal/Listener.hpp @@ -653,7 +653,7 @@ public: class TimerListener : public BaseListener { protected: unsigned m_Timeout; //!< timeout interval in microseconds - GenericTimerEvent m_Data; + TimerEvent m_Data; public: /** * Creates a new timer listener. This can be used to implement a timeout- From 794466d7d760d937cd7e796669e39c6a9c4fb4f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20B=C3=B6ckenkamp?= Date: Tue, 19 Mar 2013 13:39:18 +0100 Subject: [PATCH 3/4] ~Gem5Controller() should delete it's MemoryManager object --- src/core/sal/gem5/Gem5Controller.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/sal/gem5/Gem5Controller.cc b/src/core/sal/gem5/Gem5Controller.cc index c4095ab4..36421a7d 100644 --- a/src/core/sal/gem5/Gem5Controller.cc +++ b/src/core/sal/gem5/Gem5Controller.cc @@ -30,6 +30,7 @@ Gem5Controller::~Gem5Controller() delete *it; it = m_CPUs.erase(it); } + delete m_Mem; } bool Gem5Controller::save(const std::string &path) From 96ac7494e08ea6cebecbd340e4101f84c6f6fb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20B=C3=B6ckenkamp?= Date: Tue, 19 Mar 2013 13:43:50 +0100 Subject: [PATCH 4/4] Moved get*Flag() methods from BochsCPU to X86CPUState class --- src/core/sal/x86/CPUState.hpp | 40 +++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/core/sal/x86/CPUState.hpp b/src/core/sal/x86/CPUState.hpp index 4485e991..4bb7af27 100644 --- a/src/core/sal/x86/CPUState.hpp +++ b/src/core/sal/x86/CPUState.hpp @@ -23,6 +23,46 @@ public: * @return the current (E)FLAGS processor register content */ virtual regdata_t getFlagsRegister() const = 0; + + /** + * Returns \c true if the corresponding flag is set, or \c false + * otherwise. + */ + virtual bool getCarryFlag() const = 0; + virtual bool getParityFlag() const = 0; + virtual bool getZeroFlag() const = 0; + virtual bool getSignFlag() const = 0; + virtual bool getOverflowFlag() const = 0; + virtual bool getTrapFlag() const = 0; + virtual bool getInterruptFlag() const = 0; + virtual bool getDirectionFlag() const = 0; + virtual unsigned getIOPrivilegeLevel() const = 0; + virtual bool getNestedTaskFlag() const = 0; + virtual bool getResumeFlag() const = 0; + virtual bool getVMFlag() const = 0; + virtual bool getAlignmentCheckFlag() const = 0; + virtual bool getVInterruptFlag() const = 0; + virtual bool getVInterruptPendingFlag() const = 0; + virtual bool getIdentificationFlag() const = 0; + /** + * Sets/resets various status FLAGS. + */ + virtual void setCarryFlag(bool bit) = 0; + virtual void setParityFlag(bool bit) = 0; + virtual void setZeroFlag(bool bit) = 0; + virtual void setSignFlag(bool bit) = 0; + virtual void setOverflowFlag(bool bit) = 0; + virtual void setTrapFlag(bool bit) = 0; + virtual void setInterruptFlag(bool bit) = 0; + virtual void setDirectionFlag(bool bit) = 0; + virtual void setIOPrivilegeLevel(unsigned lvl) = 0; + virtual void setNestedTaskFlag(bool bit) = 0; + virtual void setResumeFlag(bool bit) = 0; + virtual void setVMFlag(bool bit) = 0; + virtual void setAlignmentCheckFlag(bool bit) = 0; + virtual void setVInterruptFlag(bool bit) = 0; + virtual void setVInterruptPendingFlag(bool bit) = 0; + virtual void setIdentificationFlag(bool bit) = 0; }; } // end-of-namespace: fail