#ifndef __GUEST_SYS_COM_AH__ #define __GUEST_SYS_COM_AH__ #include "config/VariantConfig.hpp" #include "config/FailConfig.hpp" #if defined(BUILD_BOCHS) && defined(CONFIG_EVENT_GUESTSYS) #include "bochs.h" #include "cpu/cpu.h" #include "../SALInst.hpp" #include "BochsHelpers.hpp" // Fixed "port number" for "Guest system >> Bochs" communication #define BOCHS_COM_PORT 0x378 // FIXME: This #define should be located in a config or passed within the event object... aspect GuestSysCom { pointcut outInstructions() = "% ...::bx_cpu_c::OUT_DX%(...)"; advice execution (outInstructions()) : after () // Listener source: "guest system" { unsigned rDX = getCPU(tjp->that())->gen_reg[2].word.rx; // port number unsigned rAL = getCPU(tjp->that())->gen_reg[0].word.byte.rl; // data if (rDX == BOCHS_COM_PORT) fail::simulator.onGuestSystem((char)rAL, rDX); } }; #endif // CONFIG_EVENT_GUESTSYS #endif // __GUEST_SYS_COM_AH__