#ifndef _SAVE_STATE_AH__
  #define _SAVE_STATE_AH__

#include "config/VariantConfig.hpp"
#include "config/FailConfig.hpp"

#if defined(BUILD_BOCHS) && defined(CONFIG_SR_SAVE)

#include "bochs.h"

#include "../SALInst.hpp"

aspect SaveState {
	pointcut cpuLoop()  = "void defineCPULoopJoinPoint(...)";

	// make sure the "SaveState" aspect comes *after* the breakpoint stuff: In
	// an "after" advice this means it must get a *higher* precedence,
	// therefore it's first in the order list.
	advice execution (cpuLoop()) : order ("SaveState", "Breakpoints");

	advice execution (cpuLoop()) : after () {
		if (!fail::save_bochs_request)
			return;
		assert(fail::sr_path.size() > 0 && "FATAL ERROR: tried to save state without valid path");
		SIM->save_state(fail::sr_path.c_str());
		std::cout << "[FAIL] Save finished" << std::endl;
		// TODO: Log-Level?
		fail::simulator.saveDone();
	}
};

#endif // CONFIG_SR_SAVE
#endif // _SAVE_STATE_AH__
