This is the mail archive of the ecos-discuss@sourceware.cygnus.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: psim - assertion failed / unmaped address


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;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]