allow interrupts from multiple sources
This commit is contained in:
parent
d3fca27481
commit
16960d9d07
@ -310,33 +310,42 @@ static void armv7m_systick_register_types(void)
|
||||
type_init(armv7m_systick_register_types)
|
||||
|
||||
/* Begin LibAFL instrumentation */
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast"
|
||||
#include "qemu/seqlock.h"
|
||||
#include "sysemu/cpu-timers-internal.h"
|
||||
#define NUM_INTERRUPT_SOURCES 6
|
||||
#define MAX_NUM_INTERRUPT 128
|
||||
extern void libafl_send_irq(int irqn);
|
||||
volatile uint32_t libafl_interrupt_offsets[MAX_NUM_INTERRUPT];
|
||||
volatile uint64_t libafl_num_interrupts = 0;
|
||||
static ptimer_state* libafl_interrupt_timers[MAX_NUM_INTERRUPT] = {0};
|
||||
volatile uint32_t libafl_interrupt_offsets[NUM_INTERRUPT_SOURCES][MAX_NUM_INTERRUPT];
|
||||
volatile uint64_t libafl_num_interrupts[NUM_INTERRUPT_SOURCES] = {0};
|
||||
static ptimer_state* libafl_interrupt_timers[NUM_INTERRUPT_SOURCES][MAX_NUM_INTERRUPT] = {0};
|
||||
/* This can be moved to a helper function later */
|
||||
static void libafl_timed_int_hook(void*);
|
||||
static void libafl_timed_int_hook(void* arg)
|
||||
{
|
||||
libafl_send_irq(0);
|
||||
libafl_send_irq((int)arg);
|
||||
}
|
||||
void libafl_start_int_timer( void );
|
||||
void libafl_start_int_timer( void ) {
|
||||
if (libafl_num_interrupts == 0) {return;}
|
||||
for (int i=0; i<libafl_num_interrupts && i<MAX_NUM_INTERRUPT; i++) {
|
||||
if (libafl_interrupt_offsets[i] == 0) {continue;}
|
||||
if (!libafl_interrupt_timers[i]) {
|
||||
libafl_interrupt_timers[i] = ptimer_init(&libafl_timed_int_hook, NULL, 0);
|
||||
for (int source=0; source<NUM_INTERRUPT_SOURCES; source++) {
|
||||
if (libafl_num_interrupts[source] == 0) {continue;}
|
||||
for (int i=0; i<libafl_num_interrupts[source] && i<MAX_NUM_INTERRUPT; i++) {
|
||||
if (libafl_interrupt_offsets[source][i] == 0) {continue;}
|
||||
if (!libafl_interrupt_timers[source][i]) {
|
||||
libafl_interrupt_timers[source][i] = ptimer_init(&libafl_timed_int_hook, (void*)source, 0);
|
||||
}
|
||||
ptimer_transaction_begin(libafl_interrupt_timers[source][i]);
|
||||
ptimer_stop(libafl_interrupt_timers[source][i]);
|
||||
ptimer_set_period(libafl_interrupt_timers[source][i], libafl_interrupt_offsets[source][i]);
|
||||
ptimer_set_count(libafl_interrupt_timers[source][i], 1 << timers_state.icount_time_shift); // needs to be in sync with shift
|
||||
ptimer_run(libafl_interrupt_timers[source][i], 1);
|
||||
ptimer_transaction_commit(libafl_interrupt_timers[source][i]);
|
||||
}
|
||||
ptimer_transaction_begin(libafl_interrupt_timers[i]);
|
||||
ptimer_stop(libafl_interrupt_timers[i]);
|
||||
ptimer_set_period(libafl_interrupt_timers[i], libafl_interrupt_offsets[i]);
|
||||
ptimer_set_count(libafl_interrupt_timers[i], 1 << timers_state.icount_time_shift); // needs to be in sync with shift
|
||||
ptimer_run(libafl_interrupt_timers[i], 1);
|
||||
ptimer_transaction_commit(libafl_interrupt_timers[i]);
|
||||
}
|
||||
}
|
||||
#pragma GCC diagnostic pop
|
||||
#pragma GCC diagnostic pop
|
||||
/* End LibAFL instrumentation */
|
Loading…
x
Reference in New Issue
Block a user