1 /* This file is part of the program psim.
3 Copyright (C) 1994-1997, Andrew Cagney <cagney@highland.com.au>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 #ifndef _SIM_EVENTS_C_
23 #define _SIM_EVENTS_C_
26 #include "sim-assert.h"
42 /* core - target byte order */
47 /* core - big-endian */
52 /* core - little-endian */
58 /* sim - host byte order */
63 /* sim - big-endian */
68 /* sim - little-endian */
79 } sim_event_watchpoints
;
83 sim_event_watchpoints watching
;
85 sim_event_handler
*handler
;
87 signed64 time_of_event
;
88 /* watch wallclock event */
90 /* watch core address */
91 address_word core_addr
;
92 sim_core_maps core_map
;
95 /* watch core/sim range */
96 int is_within
; /* 0/1 */
106 /* The event queue maintains a single absolute time using two
109 TIME_OF_EVENT: this holds the time at which the next event is ment
110 to occure. If no next event it will hold the time of the last
113 TIME_FROM_EVENT: The current distance from TIME_OF_EVENT. If an
114 event is pending, this will be positive. If no future event is
115 pending (eg when poll-event is being processed) this will be
116 negative. This variable is decremented once for each iteration of
119 Initially, the clock is started at time one (0) with TIME_OF_EVENT
120 == 0 and TIME_FROM_EVENT == 0.
122 Clearly there is a bug in that this code assumes that the absolute
123 time counter will never become greater than 2^62.
125 To avoid the need to use 64bit arithmetic, the event queue always
126 contains at least one event scheduled every 16 000 ticks. This
127 limits the time from event counter to values less than
131 #if !defined (SIM_EVENTS_POLL_RATE)
132 #define SIM_EVENTS_POLL_RATE 0x1000
136 #define _ETRACE sd, NULL
139 #define ETRACE(ARGS) \
144 if (STATE_EVENTS (sd)->trace) \
147 SIM_FILTER_PATH (file, __FILE__); \
148 trace_printf (sd, NULL, "%s:%d: ", file, __LINE__); \
156 /* event queue iterator - don't iterate over the held queue. */
158 STATIC_INLINE_SIM_EVENTS\
160 next_event_queue (SIM_DESC sd
,
164 return &STATE_EVENTS (sd
)->queue
;
165 else if (queue
== &STATE_EVENTS (sd
)->queue
)
166 return &STATE_EVENTS (sd
)->watchpoints
;
167 else if (queue
== &STATE_EVENTS (sd
)->watchpoints
)
168 return &STATE_EVENTS (sd
)->watchedpoints
;
169 else if (queue
== &STATE_EVENTS (sd
)->watchedpoints
)
172 sim_io_error (sd
, "next_event_queue - bad queue");
177 STATIC_INLINE_SIM_EVENTS\
179 sim_events_poll (SIM_DESC sd
,
182 /* just re-schedule in 1000 million ticks time */
183 sim_events_schedule (sd
, SIM_EVENTS_POLL_RATE
, sim_events_poll
, sd
);
184 sim_io_poll_quit (sd
);
188 /* "events" module install handler.
189 This is called via sim_module_install to install the "events" subsystem
190 into the simulator. */
192 STATIC_SIM_EVENTS (MODULE_UNINSTALL_FN
) sim_events_uninstall
;
193 STATIC_SIM_EVENTS (MODULE_INIT_FN
) sim_events_init
;
194 STATIC_SIM_EVENTS (MODULE_RESUME_FN
) sim_events_resume
;
195 STATIC_SIM_EVENTS (MODULE_SUSPEND_FN
) sim_events_suspend
;
199 sim_events_install (SIM_DESC sd
)
201 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
202 sim_module_add_uninstall_fn (sd
, sim_events_uninstall
);
203 sim_module_add_init_fn (sd
, sim_events_init
);
204 sim_module_add_resume_fn (sd
, sim_events_resume
);
205 sim_module_add_suspend_fn (sd
, sim_events_suspend
);
210 /* Suspend/resume the event queue manager when the simulator is not
215 sim_events_resume (SIM_DESC sd
)
217 sim_events
*events
= STATE_EVENTS (sd
);
218 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
219 SIM_ASSERT (events
->resume_wallclock
== 0);
220 events
->resume_wallclock
= sim_elapsed_time_get ();
226 sim_events_suspend (SIM_DESC sd
)
228 sim_events
*events
= STATE_EVENTS (sd
);
229 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
230 SIM_ASSERT (events
->resume_wallclock
!= 0);
231 events
->elapsed_wallclock
+= sim_elapsed_time_since (events
->resume_wallclock
);
232 events
->resume_wallclock
= 0;
237 /* Uninstall the "events" subsystem from the simulator. */
241 sim_events_uninstall (SIM_DESC sd
)
243 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
244 /* FIXME: free buffers, etc. */
250 STATIC_INLINE_SIM_EVENTS\
252 sim_events_zalloc (SIM_DESC sd
)
254 sim_events
*events
= STATE_EVENTS (sd
);
255 sim_event
*new = events
->free_list
;
258 events
->free_list
= new->next
;
259 memset (new, 0, sizeof (*new));
263 #if defined (HAVE_SIGPROCMASK) && defined (SIG_SETMASK)
267 sigfillset(&new_mask
);
268 sigprocmask (SIG_SETMASK
, &new_mask
, &old_mask
);
270 new = ZALLOC (sim_event
);
271 #if defined (HAVE_SIGPROCMASK) && defined (SIG_SETMASK)
273 sigprocmask (SIG_SETMASK
, &old_mask
, NULL
);
279 STATIC_INLINE_SIM_EVENTS\
281 sim_events_free (SIM_DESC sd
,
284 sim_events
*events
= STATE_EVENTS (sd
);
285 dead
->next
= events
->free_list
;
286 events
->free_list
= dead
;
290 /* Initialize the simulator event manager */
294 sim_events_init (SIM_DESC sd
)
296 sim_events
*events
= STATE_EVENTS (sd
);
298 /* drain the interrupt queue */
300 if (events
->held
== NULL
)
301 events
->held
= zalloc (sizeof (sim_event
) * MAX_NR_SIGNAL_SIM_EVENTS
);
303 /* drain the normal queues */
305 sim_event
**queue
= NULL
;
306 while ((queue
= next_event_queue (sd
, queue
)) != NULL
)
308 if (queue
== NULL
) break;
309 while (*queue
!= NULL
)
311 sim_event
*dead
= *queue
;
313 sim_events_free (sd
, dead
);
319 /* wind time back to zero */
320 events
->nr_ticks_to_process
= 1; /* start by doing queue */
321 events
->time_of_event
= 0;
322 events
->time_from_event
= 0;
323 events
->elapsed_wallclock
= 0;
324 events
->resume_wallclock
= 0;
326 /* schedule our initial counter event */
327 sim_events_schedule (sd
, 0, sim_events_poll
, sd
);
329 /* from now on, except when the large-int event is being processed
330 the event queue is non empty */
331 SIM_ASSERT (events
->queue
!= NULL
);
339 sim_events_time (SIM_DESC sd
)
341 sim_events
*events
= STATE_EVENTS (sd
);
342 return events
->time_of_event
- events
->time_from_event
;
348 sim_events_elapsed_time (SIM_DESC sd
)
350 return (sim_elapsed_time_since (STATE_EVENTS (sd
)->resume_wallclock
)
351 + STATE_EVENTS (sd
)->elapsed_wallclock
);
355 STATIC_INLINE_SIM_EVENTS\
357 update_time_from_event (SIM_DESC sd
)
359 sim_events
*events
= STATE_EVENTS (sd
);
360 signed64 current_time
= sim_events_time (sd
);
361 if (events
->queue
!= NULL
)
363 events
->time_from_event
= (events
->queue
->time_of_event
- current_time
);
364 events
->time_of_event
= events
->queue
->time_of_event
;
368 events
->time_of_event
= current_time
- 1;
369 events
->time_from_event
= -1;
371 SIM_ASSERT (current_time
== sim_events_time (sd
));
372 SIM_ASSERT ((events
->time_from_event
>= 0) == (events
->queue
!= NULL
));
376 STATIC_INLINE_SIM_EVENTS\
378 insert_sim_event (SIM_DESC sd
,
379 sim_event
*new_event
,
382 sim_events
*events
= STATE_EVENTS (sd
);
385 signed64 time_of_event
;
388 sim_io_error (sd
, "what is past is past!\n");
390 /* compute when the event should occure */
391 time_of_event
= sim_events_time (sd
) + delta
;
393 /* find the queue insertion point - things are time ordered */
394 prev
= &events
->queue
;
395 curr
= events
->queue
;
396 while (curr
!= NULL
&& time_of_event
>= curr
->time_of_event
)
398 SIM_ASSERT (curr
->next
== NULL
399 || curr
->time_of_event
<= curr
->next
->time_of_event
);
403 SIM_ASSERT (curr
== NULL
|| time_of_event
< curr
->time_of_event
);
406 new_event
->next
= curr
;
408 new_event
->time_of_event
= time_of_event
;
410 /* adjust the time until the first event */
411 update_time_from_event (sd
);
417 sim_events_schedule (SIM_DESC sd
,
419 sim_event_handler
*handler
,
422 sim_event
*new_event
= sim_events_zalloc (sd
);
423 new_event
->data
= data
;
424 new_event
->handler
= handler
;
425 new_event
->watching
= watch_timer
;
426 insert_sim_event(sd
, new_event
, delta_time
);
428 "event scheduled at %ld - tag 0x%lx - time %ld, handler 0x%lx, data 0x%lx\n",
429 (long)sim_events_time(sd
),
431 (long)new_event
->time_of_event
,
432 (long)new_event
->handler
,
433 (long)new_event
->data
));
440 sim_events_schedule_after_signal (SIM_DESC sd
,
442 sim_event_handler
*handler
,
445 sim_events
*events
= STATE_EVENTS (sd
);
446 sim_event
*new_event
;
447 #if defined (HAVE_SIGPROCMASK) && defined (SIG_SETMASK)
451 sigfillset(&new_mask
);
452 sigprocmask (SIG_SETMASK
, &new_mask
, &old_mask
);
455 /* allocate an event entry from the signal buffer */
456 new_event
= &events
->held
[events
->nr_held
];
458 if (events
->nr_held
> MAX_NR_SIGNAL_SIM_EVENTS
)
460 sim_engine_abort (NULL
, NULL
, NULL_CIA
,
461 "sim_events_schedule_after_signal - buffer oveflow");
464 new_event
->data
= data
;
465 new_event
->handler
= handler
;
466 new_event
->time_of_event
= delta_time
; /* work it out later */
467 new_event
->next
= NULL
;
469 events
->work_pending
= 1; /* notify main process */
471 #if defined (HAVE_SIGPROCMASK) && defined (SIG_SETMASK)
473 sigprocmask (SIG_SETMASK
, &old_mask
, NULL
);
477 "signal scheduled at %ld - tag 0x%lx - time %ld, handler 0x%lx, data 0x%lx\n",
478 (long)sim_events_time(sd
),
480 (long)new_event
->time_of_event
,
481 (long)new_event
->handler
,
482 (long)new_event
->data
));
488 sim_events_watch_clock (SIM_DESC sd
,
489 unsigned delta_ms_time
,
490 sim_event_handler
*handler
,
493 sim_events
*events
= STATE_EVENTS (sd
);
494 sim_event
*new_event
= sim_events_zalloc (sd
);
496 new_event
->watching
= watch_clock
;
498 new_event
->data
= data
;
499 new_event
->handler
= handler
;
501 if (events
->resume_wallclock
== 0)
502 new_event
->wallclock
= (events
->elapsed_wallclock
+ delta_ms_time
);
504 new_event
->wallclock
= (events
->elapsed_wallclock
505 + sim_elapsed_time_since (events
->resume_wallclock
)
508 new_event
->next
= events
->watchpoints
;
509 events
->watchpoints
= new_event
;
510 events
->work_pending
= 1;
512 "event watching clock at %ld - tag 0x%lx - wallclock %ld, handler 0x%lx, data 0x%lx\n",
513 (long)sim_events_time (sd
),
515 (long)new_event
->wallclock
,
516 (long)new_event
->handler
,
517 (long)new_event
->data
));
524 sim_events_watch_sim (SIM_DESC sd
,
531 sim_event_handler
*handler
,
534 sim_events
*events
= STATE_EVENTS (sd
);
535 sim_event
*new_event
= sim_events_zalloc (sd
);
542 case 1: new_event
->watching
= watch_sim_host_1
; break;
543 case 2: new_event
->watching
= watch_sim_host_2
; break;
544 case 4: new_event
->watching
= watch_sim_host_4
; break;
545 case 8: new_event
->watching
= watch_sim_host_8
; break;
546 default: sim_io_error (sd
, "sim_events_watch_sim - invalid nr bytes");
552 case 1: new_event
->watching
= watch_sim_be_1
; break;
553 case 2: new_event
->watching
= watch_sim_be_2
; break;
554 case 4: new_event
->watching
= watch_sim_be_4
; break;
555 case 8: new_event
->watching
= watch_sim_be_8
; break;
556 default: sim_io_error (sd
, "sim_events_watch_sim - invalid nr bytes");
562 case 1: new_event
->watching
= watch_sim_le_1
; break;
563 case 2: new_event
->watching
= watch_sim_le_2
; break;
564 case 4: new_event
->watching
= watch_sim_le_4
; break;
565 case 8: new_event
->watching
= watch_sim_le_8
; break;
566 default: sim_io_error (sd
, "sim_events_watch_sim - invalid nr bytes");
570 sim_io_error (sd
, "sim_events_watch_sim - invalid byte order");
573 new_event
->data
= data
;
574 new_event
->handler
= handler
;
576 new_event
->host_addr
= host_addr
;
578 new_event
->lb64
= lb
;
580 new_event
->ub64
= ub
;
581 new_event
->is_within
= (is_within
!= 0);
583 new_event
->next
= events
->watchpoints
;
584 events
->watchpoints
= new_event
;
585 events
->work_pending
= 1;
587 "event watching host at %ld - tag 0x%lx - host-addr 0x%lx, 0x%lx..0x%lx, handler 0x%lx, data 0x%lx\n",
588 (long)sim_events_time (sd
),
590 (long)new_event
->host_addr
,
593 (long)new_event
->handler
,
594 (long)new_event
->data
));
601 sim_events_watch_core (SIM_DESC sd
,
602 address_word core_addr
,
603 sim_core_maps core_map
,
609 sim_event_handler
*handler
,
612 sim_events
*events
= STATE_EVENTS (sd
);
613 sim_event
*new_event
= sim_events_zalloc (sd
);
620 case 1: new_event
->watching
= watch_core_targ_1
; break;
621 case 2: new_event
->watching
= watch_core_targ_2
; break;
622 case 4: new_event
->watching
= watch_core_targ_4
; break;
623 case 8: new_event
->watching
= watch_core_targ_8
; break;
624 default: sim_io_error (sd
, "sim_events_watch_core - invalid nr bytes");
630 case 1: new_event
->watching
= watch_core_be_1
; break;
631 case 2: new_event
->watching
= watch_core_be_2
; break;
632 case 4: new_event
->watching
= watch_core_be_4
; break;
633 case 8: new_event
->watching
= watch_core_be_8
; break;
634 default: sim_io_error (sd
, "sim_events_watch_core - invalid nr bytes");
640 case 1: new_event
->watching
= watch_core_le_1
; break;
641 case 2: new_event
->watching
= watch_core_le_2
; break;
642 case 4: new_event
->watching
= watch_core_le_4
; break;
643 case 8: new_event
->watching
= watch_core_le_8
; break;
644 default: sim_io_error (sd
, "sim_events_watch_core - invalid nr bytes");
648 sim_io_error (sd
, "sim_events_watch_core - invalid byte order");
651 new_event
->data
= data
;
652 new_event
->handler
= handler
;
654 new_event
->core_addr
= core_addr
;
655 new_event
->core_map
= core_map
;
657 new_event
->lb64
= lb
;
659 new_event
->ub64
= ub
;
660 new_event
->is_within
= (is_within
!= 0);
662 new_event
->next
= events
->watchpoints
;
663 events
->watchpoints
= new_event
;
664 events
->work_pending
= 1;
666 "event watching host at %ld - tag 0x%lx - host-addr 0x%lx, 0x%lx..0x%lx, handler 0x%lx, data 0x%lx\n",
667 (long)sim_events_time (sd
),
669 (long)new_event
->host_addr
,
672 (long)new_event
->handler
,
673 (long)new_event
->data
));
680 sim_events_deschedule (SIM_DESC sd
,
681 sim_event
*event_to_remove
)
683 sim_events
*events
= STATE_EVENTS (sd
);
684 sim_event
*to_remove
= (sim_event
*)event_to_remove
;
685 SIM_ASSERT ((events
->time_from_event
>= 0) == (events
->queue
!= NULL
));
686 if (event_to_remove
!= NULL
)
688 sim_event
**queue
= NULL
;
689 while ((queue
= next_event_queue (sd
, queue
)) != NULL
)
691 sim_event
**ptr_to_current
;
692 for (ptr_to_current
= queue
;
693 *ptr_to_current
!= NULL
&& *ptr_to_current
!= to_remove
;
694 ptr_to_current
= &(*ptr_to_current
)->next
);
695 if (*ptr_to_current
== to_remove
)
697 sim_event
*dead
= *ptr_to_current
;
698 *ptr_to_current
= dead
->next
;
700 "event/watch descheduled at %ld - tag 0x%lx - time %ld, handler 0x%lx, data 0x%lx\n",
701 (long) sim_events_time (sd
),
702 (long) event_to_remove
,
703 (long) dead
->time_of_event
,
704 (long) dead
->handler
,
706 sim_events_free (sd
, dead
);
707 update_time_from_event (sd
);
708 SIM_ASSERT ((events
->time_from_event
>= 0) == (events
->queue
!= NULL
));
714 "event/watch descheduled at %ld - tag 0x%lx - not found\n",
715 (long) sim_events_time (sd
),
716 (long) event_to_remove
));
720 STATIC_INLINE_SIM_EVENTS\
722 sim_watch_valid (SIM_DESC sd
,
725 switch (to_do
->watching
)
728 #define WATCH_CORE(N,OP,EXT) \
730 unsigned_##N word = 0; \
731 int nr_read = sim_core_read_buffer (sd, NULL, to_do->core_map, &word, \
732 to_do->core_addr, sizeof (word)); \
734 ok = (nr_read == sizeof (unsigned_##N) \
735 && (to_do->is_within \
736 == (word >= to_do->lb##EXT \
737 && word <= to_do->ub##EXT)));
739 case watch_core_targ_1
:
741 WATCH_CORE (1, T2H
,);
744 case watch_core_targ_2
:
746 WATCH_CORE (2, T2H
,);
749 case watch_core_targ_4
:
751 WATCH_CORE (4, T2H
,);
754 case watch_core_targ_8
:
756 WATCH_CORE (8, T2H
,64);
760 case watch_core_be_1
:
762 WATCH_CORE (1, BE2H
,);
765 case watch_core_be_2
:
767 WATCH_CORE (2, BE2H
,);
770 case watch_core_be_4
:
772 WATCH_CORE (4, BE2H
,);
775 case watch_core_be_8
:
777 WATCH_CORE (8, BE2H
,64);
781 case watch_core_le_1
:
783 WATCH_CORE (1, LE2H
,);
786 case watch_core_le_2
:
788 WATCH_CORE (2, LE2H
,);
791 case watch_core_le_4
:
793 WATCH_CORE (4, LE2H
,);
796 case watch_core_le_8
:
798 WATCH_CORE (8, LE2H
,64);
803 #define WATCH_SIM(N,OP,EXT) \
805 unsigned_##N word = *(unsigned_##N*)to_do->host_addr; \
807 ok = (to_do->is_within \
808 == (word >= to_do->lb##EXT \
809 && word <= to_do->ub##EXT));
811 case watch_sim_host_1
:
813 WATCH_SIM (1, word
= ,);
816 case watch_sim_host_2
:
818 WATCH_SIM (2, word
= ,);
821 case watch_sim_host_4
:
823 WATCH_SIM (4, word
= ,);
826 case watch_sim_host_8
:
828 WATCH_SIM (8, word
= ,64);
834 WATCH_SIM (1, BE2H
,);
839 WATCH_SIM (2, BE2H
,);
844 WATCH_SIM (4, BE2H
,);
849 WATCH_SIM (8, BE2H
,64);
855 WATCH_SIM (1, LE2H
,);
860 WATCH_SIM (1, LE2H
,);
865 WATCH_SIM (1, LE2H
,);
870 WATCH_SIM (1, LE2H
,64);
875 case watch_clock
: /* wallclock */
877 unsigned long elapsed_time
= sim_events_elapsed_time (sd
);
878 return (elapsed_time
>= to_do
->wallclock
);
882 sim_io_error (sd
, "sim_watch_valid - bad switch");
892 sim_events_tick (SIM_DESC sd
)
894 sim_events
*events
= STATE_EVENTS (sd
);
895 SIM_ASSERT (events
->nr_ticks_to_process
== 0);
897 /* this should only be called after the previous ticks have been
900 /* Advance the time but *only* if there is nothing to process */
901 if (events
->work_pending
902 || events
->time_from_event
== 0)
904 events
->nr_ticks_to_process
+= 1;
908 events
->time_from_event
-= 1;
916 sim_events_tickn (SIM_DESC sd
,
919 sim_events
*events
= STATE_EVENTS (sd
);
922 /* this should only be called after the previous ticks have been
925 /* Advance the time but *only* if there is nothing to process */
926 if (events
->work_pending
927 || events
->time_from_event
< n
)
929 events
->nr_ticks_to_process
+= n
;
933 events
->time_from_event
-= n
;
941 sim_events_slip (SIM_DESC sd
,
944 sim_events
*events
= STATE_EVENTS (sd
);
945 SIM_ASSERT (slip
> 0);
947 /* Advance either TIME_FROM_EVENT or NR_TICKS_TO_PROCESS dependant
948 on which is closer for this SLIP. While previous slips may have
949 advanced a different counter is sitll valid as the accumulative
950 effect is still the same. */
951 if (events
->time_from_event
< slip
)
953 events
->nr_ticks_to_process
+= slip
;
954 events
->work_pending
= 1;
958 events
->time_from_event
-= slip
;
965 sim_events_preprocess (SIM_DESC sd
,
966 int events_were_last
,
967 int events_were_next
)
969 sim_events
*events
= STATE_EVENTS(sd
);
970 if (events_were_last
)
972 /* Halted part way through event processing */
973 ASSERT (events
->nr_ticks_to_process
!= 0);
974 /* The external world can't tell if the event that stopped the
975 simulator was the last event to process. */
976 ASSERT (events_were_next
);
977 sim_events_process (sd
);
979 else if (events_were_next
)
981 /* Halted by the last processor */
982 if (sim_events_tick (sd
))
983 sim_events_process (sd
);
990 sim_events_process (SIM_DESC sd
)
992 sim_events
*events
= STATE_EVENTS(sd
);
993 signed64 event_time
= sim_events_time(sd
);
995 ASSERT (events
->nr_ticks_to_process
!= 0);
997 /* Clear work_pending before checking nr_held. Clearing
998 work_pending after nr_held (with out a lock could loose an
1000 events
->work_pending
= 0;
1002 /* move any events that were asynchronously queued by any signal
1003 handlers onto the real event queue. */
1004 if (events
->nr_held
> 0)
1008 #if defined(HAVE_SIGPROCMASK) && defined(SIG_SETMASK)
1012 sigfillset(&new_mask
);
1013 sigprocmask(SIG_SETMASK
, &new_mask
, &old_mask
);
1016 for (i
= 0; i
< events
->nr_held
; i
++)
1018 sim_event
*entry
= &events
->held
[i
];
1019 sim_events_schedule (sd
,
1020 entry
->time_of_event
,
1024 events
->nr_held
= 0;
1026 #if defined(HAVE_SIGPROCMASK) && defined(SIG_SETMASK)
1028 sigprocmask(SIG_SETMASK
, &old_mask
, NULL
);
1033 /* Process any watchpoints. Be careful to allow a watchpoint to
1034 appear/disappear under our feet.
1035 To ensure that watchpoints are processed only once per cycle,
1036 they are moved onto a watched queue, this returned to the
1037 watchpoint queue when all queue processing has been
1039 while (events
->watchpoints
!= NULL
)
1041 sim_event
*to_do
= events
->watchpoints
;
1042 events
->watchpoints
= to_do
->next
;
1043 if (sim_watch_valid (sd
, to_do
))
1045 sim_event_handler
*handler
= to_do
->handler
;
1046 void *data
= to_do
->data
;
1048 "event issued at %ld - tag 0x%lx - handler 0x%lx, data 0x%lx\n",
1053 sim_events_free (sd
, to_do
);
1058 to_do
->next
= events
->watchedpoints
;
1059 events
->watchedpoints
= to_do
;
1063 /* consume all events for this or earlier times. Be careful to
1064 allow an event to appear/disappear under our feet */
1065 while (events
->queue
->time_of_event
<
1066 (event_time
+ events
->nr_ticks_to_process
))
1068 sim_event
*to_do
= events
->queue
;
1069 sim_event_handler
*handler
= to_do
->handler
;
1070 void *data
= to_do
->data
;
1071 events
->queue
= to_do
->next
;
1073 "event issued at %ld - tag 0x%lx - handler 0x%lx, data 0x%lx\n",
1078 sim_events_free (sd
, to_do
);
1082 /* put things back where they belong ready for the next iteration */
1083 events
->watchpoints
= events
->watchedpoints
;
1084 events
->watchedpoints
= NULL
;
1085 if (events
->watchpoints
!= NULL
)
1086 events
->work_pending
= 1;
1088 /* re-caculate time for new events then advance the time */
1089 update_time_from_event(sd
);
1090 SIM_ASSERT (events
->time_from_event
>= events
->nr_ticks_to_process
);
1091 SIM_ASSERT (events
->queue
!= NULL
); /* always poll event */
1092 events
->time_from_event
-= events
->nr_ticks_to_process
;
1094 /* this round of processing complete */
1095 events
->nr_ticks_to_process
= 0;