Split out hw-event code. Clean up interface. Update all users.
authorAndrew Cagney <cagney@redhat.com>
Mon, 25 May 1998 07:37:30 +0000 (07:37 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 25 May 1998 07:37:30 +0000 (07:37 +0000)
14 files changed:
sim/common/.Sanitize
sim/common/ChangeLog
sim/common/Make-common.in
sim/common/dv-pal.c
sim/common/hw-base.c
sim/common/hw-base.h
sim/common/hw-device.h
sim/common/hw-events.c [new file with mode: 0644]
sim/common/hw-events.h [new file with mode: 0644]
sim/common/hw-ports.c
sim/common/hw-ports.h
sim/common/sim-hw.c
sim/mn10300/ChangeLog
sim/mn10300/dv-mn103cpu.c

index c765b7f60f9a6e6bdc52999fce86a2eeff1de548..c969031fd640676ab13b8b6000ba7675126933b1 100644 (file)
@@ -47,6 +47,9 @@ cgen-utils.c
 config.in
 configure.in
 configure
+dv-core.c
+dv-glue.c
+dv-pal.c
 dv-sockser.c
 dv-sockser.h
 gdbinit.in
@@ -54,6 +57,18 @@ genmloop.sh
 gennltvals.sh
 gentmap.c
 gentvals.sh
+hw-base.c
+hw-base.h
+hw-device.c
+hw-device.h
+hw-events.c
+hw-events.h
+hw-ports.c
+hw-ports.h
+hw-properties.c
+hw-properties.h
+hw-tree.c
+hw-tree.h
 nltvals.def
 nrun.c
 run.c
index d8e1cea3a588f5d6027acbee3e7eeab8da713fee..1e322378270d63d93fb9ba36cc31c51f8927b76b 100644 (file)
@@ -1,3 +1,21 @@
+Mon May 25 17:14:27 1998  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * dv-pal.c: Update.
+
+       * hw-events.h, hw-events.c: New files.  Move event code to here.
+       * sim-hw.c: From here.
+       * hw-base.h: Include "hw-events.h".
+
+       * hw-device.h (struct hw): Add struct hw_event_data events_of_hw.
+       * hw-events.h (struct hw_event): Replace typedef hw_event.
+       
+       * hw-base.h (create_hw_event_data, delete_hw_event_data): Declare.
+       * hw-base.c (hw_create, hw_delete): Call.
+       * hw-events.c (create_hw_event_data, delete_hw_event_data): Define.
+
+       * Make-common.in (SIM_NEW_COMMON_OBJS): Add hw-events.o.
+       (hw-events.o): New target.
+
 Mon May 25 16:55:16 1998  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * hw-base.c (panic_hw_port_event, empty_hw_ports): Move from here.
index aab6708df00b0753dd40e3256aaee43ca1f1f1bc..23763e193ce19c074a33fd1c516ba2f77b44b34b 100644 (file)
@@ -143,6 +143,7 @@ SIM_EXTRA_CLEAN =
 
 SIM_COMMON_HW_OBJS = \
        hw-device.o \
+       hw-events.o \
        hw-ports.o \
        hw-properties.o \
        hw-base.o \
@@ -315,6 +316,7 @@ sim-signal_h = $(srccom)/sim-signal.h
 
 hw-base_h = $(srccom)/hw-base.h
 hw-device_h = $(srccom)/hw-device.h
+hw-events_h = $(srccom)/hw-events.h
 hw-handles_h = #$(srccom)/hw-handles.h
 hw-instances_h = #$(srccom)/hw-instances.h
 hw-ports_h = $(srccom)/hw-ports.h
@@ -324,6 +326,7 @@ hw-tree_h = $(srccom)/hw-tree.h
 hw_base_headers = \
        $(hw-base_h) \
        $(hw-device_h) \
+       $(hw-events_h) \
        $(hw-instances_h) \
        $(hw-handles_h) \
        $(hw-ports_h) \
@@ -477,6 +480,10 @@ hw-device.o: $(srccom)/hw-device.c $(sim_main_headers) \
          $(hw-device_h)
        $(CC) -c $(srccom)/hw-device.c $(ALL_CFLAGS)
 
+hw-events.o: $(srccom)/hw-events.c $(sim_main_headers) \
+         $(hw-events_h)
+       $(CC) -c $(srccom)/hw-events.c $(ALL_CFLAGS)
+
 hw-instances.o: $(srccom)/hw-instances.c $(sim_main_headers) \
          $(hw_base_headers)
        $(CC) -c $(srccom)/hw-instances.c $(ALL_CFLAGS)
index 4f19ff3edb45728c4db54db4880beecc5b4e8c4f..a696d3907ab6c1b4de24ebcc85f4bf1da8542806 100644 (file)
    Specify the address (within the parent bus) that this device is to
    be located.
 
+   poll? = <boolean>
+
+   If present and true, indicates that the device should poll its
+   input.
+
 
    PORTS
 
@@ -170,7 +175,7 @@ enum {
   hw_pal_countdown_value = 0x24,
   hw_pal_timer = 0x28,
   hw_pal_timer_value = 0x2c,
-  hw_pal_address_mask = 0x2f,
+  hw_pal_address_mask = 0x3f,
 };
 
 
@@ -180,7 +185,7 @@ typedef struct _hw_pal_console_buffer {
 } hw_pal_console_buffer;
 
 typedef struct _hw_pal_counter {
-  hw_event *handler;
+  struct hw_event *handler;
   signed64 start;
   unsigned32 delta;
   int periodic_p;
@@ -193,6 +198,7 @@ typedef struct _hw_pal_device {
   hw_pal_counter countdown;
   hw_pal_counter timer;
   struct hw *disk;
+  do_hw_poll_read_method *reader;
 } hw_pal_device;
 
 enum {
@@ -220,14 +226,14 @@ do_counter_event (struct hw *me,
     {
       HW_TRACE ((me, "timer expired"));
       counter->start = hw_event_queue_time (me);
-      hw_port_event (me, TIMER_PORT, 1, NULL, NULL_CIA);
+      hw_port_event (me, TIMER_PORT, 1);
       hw_event_queue_schedule (me, counter->delta, do_counter_event, counter);
     }
   else
     {
       HW_TRACE ((me, "countdown expired"));
       counter->delta = 0;
-      hw_port_event (me, COUNTDOWN_PORT, 1, NULL, NULL_CIA);
+      hw_port_event (me, COUNTDOWN_PORT, 1);
     }
 }
 
@@ -296,17 +302,14 @@ do_counter_write (struct hw *me,
 static void
 scan_hw_pal (struct hw *me)
 {
-#if 0
-  hw_pal_struct hw *hw_pal = (hw_pal_struct hw *) hw_data (me);
-#endif
+  hw_pal_device *hw_pal = (hw_pal_device *)hw_data (me);
   char c;
   int count;
-  count = sim_io_read_stdin (hw_system (me), &c, sizeof(c));
-#if 0
+  count = do_hw_poll_read (me, hw_pal->reader, 0/*STDIN*/, &c, sizeof(c));
   switch (count)
     {
-    case sim_io_not_ready:
-    case sim_io_eof:
+    case HW_IO_NOT_READY:
+    case HW_IO_EOF:
       hw_pal->input.buffer = 0;
       hw_pal->input.status = 0;
       break;
@@ -314,7 +317,6 @@ scan_hw_pal (struct hw *me)
       hw_pal->input.buffer = c;
       hw_pal->input.status = 1;
     }
-#endif
 }
 
 /* write the character to the hw_pal */
@@ -337,9 +339,7 @@ hw_pal_io_read_buffer (struct hw *me,
                       void *dest,
                       int space,
                       unsigned_word addr,
-                      unsigned nr_bytes,
-                      sim_cpu *cpu,
-                      sim_cia cia)
+                      unsigned nr_bytes)
 {
   hw_pal_device *hw_pal = (hw_pal_device *) hw_data (me);
   unsigned_1 *byte = (unsigned_1 *) dest;
@@ -349,7 +349,7 @@ hw_pal_io_read_buffer (struct hw *me,
 
     case hw_pal_cpu_nr_register:
 #ifdef CPU_INDEX
-      *byte = CPU_INDEX (cpu);
+      *byte = CPU_INDEX (hw_system_cpu (me));
 #else
       *byte = 0;
 #endif
@@ -424,9 +424,7 @@ hw_pal_io_write_buffer (struct hw *me,
                        const void *source,
                        int space,
                        unsigned_word addr,
-                       unsigned nr_bytes,
-                       sim_cpu *cpu,
-                       sim_cia cia)
+                       unsigned nr_bytes)
 {
   hw_pal_device *hw_pal = (hw_pal_device*) hw_data (me);
   unsigned_1 *byte = (unsigned_1 *) source;
@@ -435,14 +433,13 @@ hw_pal_io_write_buffer (struct hw *me,
     {
 
     case hw_pal_reset_register:
-      sim_engine_halt (hw_system (me), cpu, NULL, cia, sim_exited, byte[0]);
+      hw_halt (me, sim_exited, byte[0]);
       break;
 
     case hw_pal_int_register:
       hw_port_event (me,
                     INT_PORT + byte[0], /*port*/
-                    (nr_bytes > 1 ? byte[1] : 0), /* val */
-                    cpu, cia);
+                    (nr_bytes > 1 ? byte[1] : 0)); /* val */
       break;
 
     case hw_pal_read_fifo:
@@ -587,7 +584,16 @@ hw_pal_finish (struct hw *hw)
   set_hw_ports (hw, hw_pal_ports);
   /* attach ourselves */
   do_hw_attach_regs (hw);
-
+  /* If so configured, enable polled input */
+  if (hw_find_property (hw, "poll?") != NULL
+      && hw_find_boolean_property (hw, "poll?"))
+    {
+      hw_pal->reader = sim_io_poll_read;
+    }
+  else
+    {
+      hw_pal->reader = sim_io_read;
+    }
   /* tag the periodic timer */
   hw_pal->timer.periodic_p = 1;
 }
index e8c09f064b7dfb858098e3341f56089c4cfc0b53..25b5c235e6e75c553009f1dda4ee6db64e19e3e4 100644 (file)
@@ -418,6 +418,7 @@ hw_create (struct sim_state *sd,
 
   /* Attach dummy ports */
   create_hw_port_data (hw);
+  create_hw_event_data (hw);
   
   return hw;
 }
@@ -469,6 +470,7 @@ hw_delete (struct hw *me)
   /* give the object a chance to tidy up */
   me->base_of_hw->to_delete (me);
 
+  delete_hw_event_data (me);
   delete_hw_port_data (me);
 
   /* now unlink us from the tree */
index 27702c8c88752993dabd299b55564a5c75854fb7..99d68ac392aac9464cfe0c80e90fb3363f23ded3 100644 (file)
@@ -27,6 +27,7 @@
 #include "hw-device.h"
 
 #include "hw-properties.h"
+#include "hw-events.h"
 /* #include "hw-instances.h" */
 /* #include "hw-handles.h" */
 #include "hw-ports.h"
@@ -140,4 +141,13 @@ extern void delete_hw_port_data
 (struct hw *hw);
 
 
+/* EVENTS */
+
+extern void create_hw_event_data
+(struct hw *hw);
+extern void delete_hw_event_data
+(struct hw *hw);
+
+
+
 #endif
index bb46beaac6b2dc37d00cefdbbbd3839cffd70c3b..558c41d8d4f6c69fc7109a098066324b94c88e0f 100644 (file)
@@ -404,28 +404,6 @@ int hw_ioctl
  ...);
 
 
-/* Event queue:
-
-   Device specific versions of certain event handlers */
-
-typedef struct _hw_event hw_event;
-typedef void (hw_event_handler) (struct hw *me, void *data);
-
-hw_event *hw_event_queue_schedule
-(struct hw *me,
- signed64 delta_time,
- hw_event_handler *handler,
- void *data);
-
-void hw_event_queue_deschedule
-(struct hw *me,
- hw_event *event_to_remove);
-
-signed64 hw_event_queue_time
-(struct hw *me);
-
-
-
 /* Error reporting::
 
    So that errors originating from devices appear in a consistent
@@ -476,6 +454,7 @@ struct hw_property_data;
 struct hw_port_data;
 struct hw_base_data;
 struct hw_alloc_data;
+struct hw_event_data;
 
 /* Finally the hardware device - keep your grubby little mits off of
    these internals! :-) */
@@ -531,6 +510,7 @@ struct hw {
   struct hw_port_data *ports_of_hw;
   struct hw_base_data *base_of_hw;
   struct hw_alloc_data *alloc_of_hw;
+  struct hw_event_data *events_of_hw;
 
 };
 
diff --git a/sim/common/hw-events.c b/sim/common/hw-events.c
new file mode 100644 (file)
index 0000000..ca6d441
--- /dev/null
@@ -0,0 +1,140 @@
+/* Hardware event manager.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   Contributed by Cygnus Support.
+
+This file is part of GDB, the GNU debugger.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+
+#include "sim-main.h"
+#include "hw-base.h"
+
+#include "sim-events.h"
+
+
+/* The hw-events object is implemented using sim-events */
+
+struct hw_event {
+  void *data;
+  struct hw *me;
+  hw_event_callback *callback;
+  sim_event *real;
+  struct hw_event_data *entry;
+};
+
+struct hw_event_data {
+  struct hw_event event;
+  struct hw_event_data *next;
+  struct hw_event_data **prev;
+};
+
+void
+create_hw_event_data (struct hw *me)
+{
+  /* NOP */
+}
+
+void
+delete_hw_event_data (struct hw *me)
+{
+  if (me->events_of_hw != NULL)
+    hw_abort (me, "stray events");
+}
+
+
+static void
+delete_hw_event (struct hw *me,
+                struct hw_event **event)
+{
+  struct hw_event_data *entry = (*event)->entry;
+  *(entry->prev) = entry->next;
+  entry->next->prev = entry->prev;
+  (*event) = NULL;
+}
+
+
+static void
+create_hw_event (struct hw *me,
+                struct hw_event **event)
+{
+  struct hw_event_data *entry = HW_ZALLOC (me, struct hw_event_data);
+  entry->next = me->events_of_hw;
+  entry->prev = &me->events_of_hw;
+  me->events_of_hw->prev = &entry->next;
+  me->events_of_hw = entry;
+  (*event) = &entry->event;
+}
+
+
+
+/* Pass the H/W event onto the real callback */
+
+static void
+bounce_hw_event (SIM_DESC sd,
+                void *data)
+{
+  /* save the data */
+  struct hw_event *event = (struct hw_event*)data;
+  struct hw *me = event->me;
+  void *event_data = event->data;
+  hw_event_callback *callback = event->callback;
+  hw_free (me, data);
+  event = NULL;
+  callback (me, event_data);
+}
+
+
+
+/* Map onto the event functions */
+
+struct hw_event *
+hw_event_queue_schedule (struct hw *me,
+                        signed64 delta_time,
+                        hw_event_callback *callback,
+                        void *data)
+{
+  struct hw_event *event;
+  create_hw_event (me, &event);
+  /* fill it in */
+  event->data = data;
+  event->callback = callback;
+  event->me = me;
+  event->real = sim_events_schedule (hw_system (me),
+                                    delta_time,
+                                    bounce_hw_event,
+                                    event);
+  return event;
+}
+
+
+void
+hw_event_queue_deschedule (struct hw *me,
+                          struct hw_event *event_to_remove)
+{
+  /* remove it from the event queue */
+  sim_events_deschedule (hw_system (me),
+                        event_to_remove->real);
+  delete_hw_event (me, &event_to_remove);
+}
+
+
+signed64
+hw_event_queue_time (struct hw *me)
+{
+  return sim_events_time (hw_system (me));
+}
+
+
diff --git a/sim/common/hw-events.h b/sim/common/hw-events.h
new file mode 100644 (file)
index 0000000..2356222
--- /dev/null
@@ -0,0 +1,44 @@
+/* Hardware event manager.
+   Copyright (C) 1998 Free Software Foundation, Inc.
+   Contributed by Cygnus Support.
+
+This file is part of GDB, the GNU debugger.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef HW_EVENTS_H
+#define HW_EVENTS_H
+
+/* Event manager customized for hardware models.
+
+   This interface is discussed further in sim-events.h. */
+
+struct hw_event;
+typedef void (hw_event_callback) (struct hw *me, void *data);
+
+struct hw_event *hw_event_queue_schedule
+(struct hw *me,
+ signed64 delta_time,
+ hw_event_callback *handler,
+ void *data);
+
+void hw_event_queue_deschedule
+(struct hw *me,
+ struct hw_event *event_to_remove);
+
+signed64 hw_event_queue_time
+(struct hw *me);
+
+#endif
index 4144bc7c15a71026baf1de383e1479fea6516846..fc28033115921fe3011831597df9afc45b81a224 100644 (file)
@@ -1,4 +1,4 @@
-/* Common hardware.
+/* Hardware ports.
    Copyright (C) 1998 Free Software Foundation, Inc.
    Contributed by Andrew Cagney and Cygnus Solutions.
 
index 79357c454666f0a8c408beeb6556c78456e962e8..c214578f9a206c2e46fe4cc0a88753ed640c1c8e 100644 (file)
@@ -1,4 +1,4 @@
-/* Common hardware.
+/* Hardware ports.
    Copyright (C) 1998 Free Software Foundation, Inc.
    Contributed by Andrew Cagney and Cygnus Solutions.
 
index 51b7b0fbaf59abebafe9452163177786e8039870..fa3ca8fa9447a2c589b6adb8158cc242800c4c88 100644 (file)
@@ -503,62 +503,3 @@ do_hw_poll_read (struct hw *me,
 #endif
     }
 }
-
-\f
-/* The event queue abstraction (for devices) */
-
-
-struct _hw_event {
-  void *data;
-  struct hw *me;
-  hw_event_handler *handler;
-  sim_event *real;
-};
-
-/* Pass the H/W event onto the real handler */
-
-static void
-bounce_hw_event (SIM_DESC sd,
-                void *data)
-{
-  hw_event event = * (hw_event*) data;
-  zfree (data);
-  /* if we are delivering an event, we don't have a CPU. */
-  STATE_HW (sd)->cpu = NULL;
-  event.handler (event.me, event.data);
-}
-
-
-/* Map onto the event functions */
-
-hw_event *
-hw_event_queue_schedule (struct hw *me,
-                        signed64 delta_time,
-                        hw_event_handler *handler,
-                        void *data)
-{
-  hw_event *event = ZALLOC (hw_event);
-  event->data = data;
-  event->handler = handler;
-  event->me = me;
-  event->real = sim_events_schedule (hw_system (me),
-                                    delta_time,
-                                    bounce_hw_event,
-                                    event);
-  return event;
-}
-
-void
-hw_event_queue_deschedule (struct hw *me,
-                          hw_event *event_to_remove)
-{
-  sim_events_deschedule (hw_system (me),
-                        event_to_remove->real);
-  zfree (event_to_remove);
-}
-
-signed64
-hw_event_queue_time (struct hw *me)
-{
-  return sim_events_time (hw_system (me));
-}
index e3e59b1e9acf0344f02c5329ecd8f5bcfa44d073..7360a731481d64c45e780f0915eeb415706c13b3 100644 (file)
@@ -1,8 +1,13 @@
+start-sanitize-am30
+Mon May 25 17:33:33 1998  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * dv-mn103cpu.c (struct mn103cpu): Change type of pending_handler
+       to struct hw_event.
+
 Fri May 22 12:17:41 1998  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * configure.in (SIM_AC_OPTION_HARDWARE): Add argument "yes".
 
-start-sanitize-am30
 Wed May  6 13:29:06 1998  Andrew Cagney  <cagney@b1.cygnus.com>
 
        * interp.c (sim_open): Create a polling PAL device.
index f85ea341975fd493aa0162a5d8400cd528cc8603..cce89f4cc196201fe0b2c91d9162273159831384 100644 (file)
@@ -107,7 +107,7 @@ struct mn103cpu_block {
 
 struct mn103cpu {
   struct mn103cpu_block block;
-  hw_event *pending_handler;
+  struct hw_event *pending_handler;
   int pending_level;
   int pending_nmi;
   int pending_reset;