#ifndef __FIREINTERRUPT_AH__ #define __FIREINTERRUPT_AH__ #include "config/FailConfig.hpp" #ifdef CONFIG_FIRE_INTERRUPTS #include "../../../bochs/bochs.h" #include "../../../bochs/cpu/cpu.h" #include "../../../bochs/iodev/iodev.h" #include "../SALInst.hpp" aspect fireInterrupt { pointcut cpuLoop() = "void defineCPULoopJoinPoint(...)"; advice execution (cpuLoop()) : before () { if (!fail::interrupt_injection_request) { return; }else{ BX_SET_INTR(fail::interrupt_to_fire); DEV_pic_raise_irq(fail::interrupt_to_fire); } } }; aspect InterruptDone { pointcut interrupt_method() = "void bx_cpu_c::interrupt(...)"; advice execution (interrupt_method()) : before () { if (!fail::interrupt_injection_request) { return; }else{ if(*(tjp->arg<0>()) == 32 + fail::interrupt_to_fire){ DEV_pic_lower_irq(fail::interrupt_to_fire); fail::simulator.fireInterruptDone(); } } } }; #endif // CONFIG_FIRE_INTERRUPTS #endif // __FIREINTERRUPT_AH__