Commit b66ed500234bfcac1387742f2e7e07c6ac471db5
authorMichel Pollet <buserror@gmail.com>
Fri, 29 Nov 2013 16:25:52 +0000 (16:25 +0000)
committerMichel Pollet <buserror@gmail.com>
Fri, 29 Nov 2013 16:25:52 +0000 (16:25 +0000)
Somehow the vector list was erased at avr_reset time, luckily only the
trace code in run_avr was using it.

Signed-off-by: Michel Pollet <buserror@gmail.com>
4 files changed:
simavr/sim/run_avr.c
simavr/sim/sim_avr.c
simavr/sim/sim_interrupts.c
simavr/sim/sim_interrupts.h

index e18f1cdd84d1f5d931f1c1bcac241cc11486adf0..57fa05e89f8395c8401722f344b1de9570c52834 100644 (file)
@@ -161,9 +161,11 @@ int main(int argc, char *argv[])
        }
        avr->log = (log > LOG_TRACE ? LOG_TRACE : log);
        avr->trace = trace;
-       for (int ti = 0; ti < trace_vectors_count; ti++)
-               if (avr->interrupts.vector[trace_vectors[ti]])
-                       avr->interrupts.vector[trace_vectors[ti]]->trace = 1;
+       for (int ti = 0; ti < trace_vectors_count; ti++) {
+               for (int vi = 0; vi < avr->interrupts.vector_count; vi++)
+                       if (avr->interrupts.vector[vi]->vector == trace_vectors[ti])
+                               avr->interrupts.vector[vi]->trace = 1;
+       }
 
        // even if not setup at startup, activate gdb if crashing
        avr->gdb_port = 1234;
index fe53d1806f3249d64b35d45ebcce8bec2ce4932f..d020a7246d99181c5acc9e0323b4cdffdbefa85a 100644 (file)
@@ -81,6 +81,7 @@ int avr_init(avr_t * avr)
        // cpu is in limbo before init is finished.
        avr->state = cpu_Limbo;
        avr->frequency = 1000000;       // can be overridden via avr_mcu_section
+       avr_interrupt_init(avr);
        if (avr->special_init)
                avr->special_init(avr);
        if (avr->init)
@@ -122,10 +123,10 @@ void avr_reset(avr_t * avr)
        avr->pc = 0;
        for (int i = 0; i < 8; i++)
                avr->sreg[i] = 0;
-       if (avr->reset)
-               avr->reset(avr);
        avr_interrupt_reset(avr);
        avr_cycle_timer_reset(avr);
+       if (avr->reset)
+               avr->reset(avr);
        avr_io_t * port = avr->io_port;
        while (port) {
                if (port->reset)
index a2f3758709dad1f15c3844a1f5e5591942c13a23..7f21b8a294ef2f5508f25af8023dfd09d4517f42 100644 (file)
 #define INT_FIFO_MOD(_v) ((_v) &  (INT_FIFO_SIZE - 1))
 
 void
-avr_interrupt_reset(
+avr_interrupt_init(
                avr_t * avr )
 {
        avr_int_table_p table = &avr->interrupts;
        memset(table, 0, sizeof(*table));
 }
 
+void
+avr_interrupt_reset(
+               avr_t * avr )
+{
+       printf("%s\n", __func__);
+       avr_int_table_p table = &avr->interrupts;
+       table->pending_r = table->pending_w = 0;
+       table->pending_wait = 0;
+       for (int i = 0; i < table->vector_count; i++)
+               table->vector[i]->pending = 0;
+}
+
 void
 avr_register_vector(
                avr_t *avr,
index 2e86882ef14d2ed6177c024085ae7b4736a39701..f86dfb145142c7a97422e95c3f8c63f6aaa1b135 100644 (file)
@@ -99,6 +99,11 @@ avr_get_interrupt_irq(
                struct avr_t * avr,
                uint8_t v);
 
+// Initializes the interrupt table
+void
+avr_interrupt_init(
+               struct avr_t * avr );
+
 // reset the interrupt table and the fifo
 void
 avr_interrupt_reset(