clear ptimers before each run

This commit is contained in:
Alwin Berger 2025-02-26 10:55:34 +01:00
parent ff8c538b93
commit fead70c87b
2 changed files with 20 additions and 1 deletions

View File

@ -325,13 +325,31 @@ static void libafl_timed_int_hook(void* arg)
{ {
libafl_send_irq((int)arg); libafl_send_irq((int)arg);
} }
/* The state after snapshot reloads is unlcear, try every possible option to disable existing timers */
void libafl_clear_int_timer( void ) {
for (int source=0; source<LIBAFL_MAX_INTERRUPT_SOURCES; source++) {
for (int i=0; i<LIBAFL_MAX_INTERRUPTS; i++) {
if (libafl_interrupt_timers[source][i]) {
// Try stopping the existing timer
ptimer_transaction_begin(libafl_interrupt_timers[source][i]);
ptimer_stop(libafl_interrupt_timers[source][i]);
ptimer_transaction_commit(libafl_interrupt_timers[source][i]);
// Try freeing the existing timer
ptimer_free(libafl_interrupt_timers[source][i]);
libafl_interrupt_timers[source][i] = NULL;
}
}
}
}
void libafl_start_int_timer( void ) { void libafl_start_int_timer( void ) {
libafl_clear_int_timer();
for (int source=0; source<LIBAFL_MAX_INTERRUPT_SOURCES; source++) { for (int source=0; source<LIBAFL_MAX_INTERRUPT_SOURCES; source++) {
if (libafl_num_interrupts[source] == 0) {continue;} if (libafl_num_interrupts[source] == 0) {continue;}
for (int i=0; i<libafl_num_interrupts[source] && i<LIBAFL_MAX_INTERRUPTS; i++) { for (int i=0; i<libafl_num_interrupts[source] && i<LIBAFL_MAX_INTERRUPTS; i++) {
if (libafl_interrupt_offsets[source][i] == 0) {continue;} if (libafl_interrupt_offsets[source][i] == 0) {continue;}
if (!libafl_interrupt_timers[source][i]) { if (!libafl_interrupt_timers[source][i]) {
libafl_interrupt_timers[source][i] = ptimer_init(&libafl_timed_int_hook, (void*)source, 0); libafl_interrupt_timers[source][i] = ptimer_init(&libafl_timed_int_hook, (void*)source, PTIMER_POLICY_LEGACY);
} }
ptimer_transaction_begin(libafl_interrupt_timers[source][i]); ptimer_transaction_begin(libafl_interrupt_timers[source][i]);
ptimer_stop(libafl_interrupt_timers[source][i]); ptimer_stop(libafl_interrupt_timers[source][i]);

View File

@ -5,5 +5,6 @@ extern volatile uint32_t libafl_interrupt_offsets[LIBAFL_MAX_INTERRUPT_SOURCES][
extern volatile uint64_t libafl_num_interrupts[LIBAFL_MAX_INTERRUPT_SOURCES]; extern volatile uint64_t libafl_num_interrupts[LIBAFL_MAX_INTERRUPT_SOURCES];
static void libafl_timed_int_hook(void*); static void libafl_timed_int_hook(void*);
void libafl_clear_int_timer( void );
void libafl_start_int_timer( void ); void libafl_start_int_timer( void );
void libafl_send_irq(int irqn); void libafl_send_irq(int irqn);