diff --git a/core/SAL/bochs/fireInterrupt.ah b/core/SAL/bochs/fireInterrupt.ah new file mode 100644 index 00000000..6039f5e7 --- /dev/null +++ b/core/SAL/bochs/fireInterrupt.ah @@ -0,0 +1,48 @@ +#ifndef __FIREINTERRUPT_AH__ + #define __FIREINTERRUPT_AH__ + +#include "config/AspectConfig.hpp" + +#ifdef CONFIG_FIRE_INTERRUPTS + +#include "../../../bochs/bochs.h" +#include "../../../bochs/cpu/cpu.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__ */