This is the mail archive of the
ecos-discuss@sourceware.cygnus.com
mailing list for the eCos project.
Re: psim - assertion failed / unmaped address
- To: Per Oestergaard <per at k64 dot dk>
- Subject: Re: [ECOS] psim - assertion failed / unmaped address
- From: Jonathan Larmour <jlarmour at redhat dot co dot uk>
- Date: Thu, 22 Jun 2000 22:16:39 +0100
- CC: ecos-discuss at sourceware dot cygnus dot com
- Organization: Red Hat UK Ltd.
- References: <004201bfdc8e$504c2ee0$3d59f9c3@hk.kollegie6400.dk>
Per Oestergaard wrote:
> [per@v19 testProgram]$ powerpc-eabi-run -o '/iobus/pal@0xf0001000/reg
> 0xf0001000 32' a.out Entering twothreads' cyg_user_start()
> function
> Beginning execution; thread data is 0
> Beginning execution; thread data is 1
> events.c:165: assertion failed - (events->time_from_event >= 0) ==
> (events->queue != NULL)
Try applying the attached patch to your gdb/insight sources and rebuilding.
Ignore the ChangeLog patch failure.
This patch is in CVS GDB, but not GDB 5.0.
Jifl
--
Red Hat, 35 Cambridge Place, Cambridge, UK. CB2 1NS Tel: +44 (1223) 728762
"Plan to be spontaneous tomorrow." || These opinions are all my own fault
Index: ChangeLog
===================================================================
RCS file: /cvs/cvsfiles/devo/sim/ppc/ChangeLog,v
retrieving revision 1.193.4.1.2.2
diff -u -5 -p -r1.193.4.1.2.2 ChangeLog
--- ChangeLog 2000/05/23 20:09:05 1.193.4.1.2.2
+++ ChangeLog 2000/05/23 20:13:12
@@ -1,5 +1,19 @@
+Fri Apr 28 15:59:27 2000 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * events.c (event_queue_process): Call update_time_from_event
+ every time an event is removed from the queue.
+ (update_time_from_event): Delete assertion that a negative
+ time_from_event implies an empty event queue.
+
+Fri Apr 28 15:53:54 2000 Andrew Cagney <cagney@b1.cygnus.com>
+
+ * interrupts.c (deliver_hardware_interrupt): Print time trace in
+ decimal.
+ * events.c (event_queue_process): Cleanup trace message.
+ (update_time_from_event): Trace full event queue.
+
1999-04-02 Keith Seitz <keiths@cygnus.com>
* sim_calls.c (POLL_QUIT_INTERVAL): Define. Used to tweak
the frequency at which the poll_quit callback is called.
(poll_quit_count): New global.
Index: events.c
===================================================================
RCS file: /cvs/cvsfiles/devo/sim/ppc/events.c,v
retrieving revision 1.8.44.2
diff -u -5 -p -r1.8.44.2 events.c
--- events.c 2000/05/23 20:09:06 1.8.44.2
+++ events.c 2000/05/23 20:13:13
@@ -159,12 +159,29 @@ update_time_from_event(event_queue *even
}
else {
events->time_of_event = current_time - 1;
events->time_from_event = -1;
}
+ if (WITH_TRACE && ppc_trace[trace_events])
+ {
+ event_entry *event;
+ int i;
+ for (event = events->queue, i = 0;
+ event != NULL;
+ event = event->next, i++)
+ {
+ TRACE(trace_events, ("event time-from-event - time %ld, delta %ld - event %d, tag 0x%lx, time %ld, handler 0x%lx, data 0x%lx\n",
+ (long)current_time,
+ (long)events->time_from_event,
+ i,
+ (long)event,
+ (long)event->time_of_event,
+ (long)event->handler,
+ (long)event->data));
+ }
+ }
ASSERT(current_time == event_queue_time(events));
- ASSERT((events->time_from_event >= 0) == (events->queue != NULL));
}
STATIC_INLINE_EVENTS\
(void)
insert_event_entry(event_queue *events,
@@ -367,21 +384,25 @@ event_queue_process(event_queue *events)
&& events->queue->time_of_event <= event_time) {
event_entry *to_do = events->queue;
event_handler *handler = to_do->handler;
void *data = to_do->data;
events->queue = to_do->next;
- TRACE(trace_events, ("event issued at %ld - tag 0x%lx - handler 0x%lx, data 0x%lx\n",
+ TRACE(trace_events, ("event issued at %ld - tag 0x%lx - time %ld, handler 0x%lx, data 0x%lx\n",
(long)event_time,
(long)to_do,
+ (long)to_do->time_of_event,
(long)handler,
(long)data));
zfree(to_do);
+ /* Always re-compute the time to the next event so that HANDLER()
+ can safely insert new events into the queue. */
+ update_time_from_event(events);
handler(data);
}
events->processing = 0;
- /* re-caculate time for new events */
- update_time_from_event(events);
+ ASSERT(events->time_from_event > 0);
+ ASSERT(events->queue != NULL); /* always poll event */
}
#endif /* _EVENTS_C_ */
Index: interrupts.c
===================================================================
RCS file: /cvs/cvsfiles/devo/sim/ppc/interrupts.c,v
retrieving revision 1.15.2.1.8.2
diff -u -5 -p -r1.15.2.1.8.2 interrupts.c
--- interrupts.c 2000/05/23 20:09:06 1.15.2.1.8.2
+++ interrupts.c 2000/05/23 20:13:13
@@ -467,11 +467,11 @@ deliver_hardware_interrupt(void *data)
/* decrementer interrupts have a lower priority and are once only */
else if (ints->pending_interrupts & decrementer_interrupt_pending) {
unsigned_word cia = cpu_get_program_counter(processor);
unsigned_word nia = perform_oea_interrupt(processor,
cia, 0x00900, 0, 0, 0, 0);
- TRACE(trace_interrupts, ("decrementer interrupt - cia=0x%lx time=0x%lx\n",
+ TRACE(trace_interrupts, ("decrementer interrupt - cia 0x%lx, time %ld\n",
(unsigned long)cia,
(unsigned long)event_queue_time(psim_event_queue(cpu_system(processor)))
));
cpu_set_program_counter(processor, nia);
ints->pending_interrupts &= ~decrementer_interrupt_pending;