@@ -69,7 +69,9 @@ void InterruptEvent::initialize()
6969void InterruptEvent::teardown ()
7070{
7171 disableEvent ();
72- interruptGuard->teardown ();
72+
73+ if (interruptGuard)
74+ interruptGuard->teardown ();
7375}
7476
7577InterruptEvent::~InterruptEvent ()
@@ -89,33 +91,32 @@ void InterruptEvent::setupVmiInterruptEvent()
8991
9092void InterruptEvent::enableEvent ()
9193{
94+ #if defined(X86_64)
9295 vmiInterface->write8PA (targetPA, INT3_BREAKPOINT );
96+ #elif defined(ARM64)
97+ vmiInterface->write32PA (targetPA, BRK64_BREAKPOINT );
98+ #endif
9399 logger->debug (" Enabled interrupt event" , {logfield::create (" targetPA" , targetPAString)});
94100}
95101
96102void InterruptEvent::disableEvent ()
97103{
104+ #if defined(X86_64)
98105 vmiInterface->write8PA (targetPA, originalValue);
106+ #elif defined(ARM64)
107+ vmiInterface->write32PA (targetPA, originalValue);
108+ #endif
99109 logger->debug (" Disabled interrupt event" , {logfield::create (" targetPA" , targetPAString)});
100110}
101111
102- uint64_t InterruptEvent::getRcx ()
103- {
104- return event.x86_regs ->rcx ;
105- }
106-
107- uint64_t InterruptEvent::getRdi ()
108- {
109- return event.x86_regs ->rdi ;
110- }
111-
112- uint64_t InterruptEvent::getR8 ()
112+ registers_t * InterruptEvent::getRegisters ()
113113{
114- return event.x86_regs -> r8 ;
114+ return ( registers_t *) event.x86_regs ;
115115}
116116
117117void InterruptEvent::storeOriginalValue ()
118118{
119+ #if defined(X86_64)
119120 originalValue = vmiInterface->read8PA (targetPA);
120121 logger->debug (" Save original value" ,
121122 {logfield::create (" targetPA" , targetPAString),
@@ -125,16 +126,34 @@ void InterruptEvent::storeOriginalValue()
125126 throw VmiException (fmt::format (
126127 " {}: InterruptEvent originalValue @ {} is already an INT3 breakpoint." , __func__, targetPAString));
127128 }
129+ #elif defined(ARM64)
130+ originalValue = vmiInterface->read32PA (targetPA);
131+ logger->debug (" Save original value" ,
132+ {logfield::create (" targetPA" , targetPAString),
133+ logfield::create (" originalValue" , fmt::format (" {:#x}" , originalValue))});
134+ if (originalValue == BRK64_BREAKPOINT )
135+ {
136+ throw VmiException (fmt::format (
137+ " {}: InterruptEvent originalValue @ {} is already an BRK64 breakpoint." , __func__, targetPAString));
138+ }
139+ #endif
128140}
129141
130- event_response_t InterruptEvent::_defaultInterruptCallback (__attribute__((unused)) vmi_instance_t vmi,
131- vmi_event_t* event)
142+ event_response_t InterruptEvent::_defaultInterruptCallback (vmi_instance_t vmi, vmi_event_t * event)
132143{
133144 auto eventResponse = VMI_EVENT_RESPONSE_NONE ;
134145 try
135146 {
147+ #if defined(X86_64)
148+ (void )(vmi);
136149 auto eventPA =
137150 (event->interrupt_event .gfn << PagingDefinitions::numberOfPageIndexBits) + event->interrupt_event .offset ;
151+ #elif defined(ARM64)
152+ addr_t eventPA;
153+ if (VMI_SUCCESS !=
154+ vmi_pagetable_lookup (vmi, event->arm_regs ->ttbr1 & VMI_BIT_MASK (12 , 47 ), event->arm_regs ->pc , &eventPA))
155+ throw std::runtime_error (" Failed address translation of breakpoint hit." );
156+ #endif
138157 auto interruptEventIterator = interruptsByPA.find (eventPA);
139158 if (interruptEventIterator != interruptsByPA.end ())
140159 {
0 commit comments