#ifndef __FIREINTERRUPT_AH__ #define __FIREINTERRUPT_AH__ #include "config/AspectConfig.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 (!sal::interrupt_injection_request) { return; }else{ BX_SET_INTR(sal::interrupt_to_fire); DEV_pic_raise_irq(sal::interrupt_to_fire); } } }; aspect InterruptDone { pointcut interrupt_method() = "void bx_cpu_c::interrupt(...)"; advice execution (interrupt_method()) : before () { if (!sal::interrupt_injection_request) { return; }else{ if(*(tjp->arg<0>()) == 32 + sal::interrupt_to_fire){ DEV_pic_lower_irq(sal::interrupt_to_fire); sal::simulator.fireInterruptDone(); } } } }; #endif // CONFIG_FIRE_INTERRUPTS #endif /* __FIREINTERRUPT_AH__ */