tic4x: sign extension using shifts
[deliverable/binutils-gdb.git] / sim / common / sim-hw.c
index 51b7b0fbaf59abebafe9452163177786e8039870..7621ab92236411b2d8644fac090460ef3fa71fce 100644 (file)
@@ -1,22 +1,21 @@
 /* Simulator hardware option handling.
-   Copyright (C) 1998 Free Software Foundation, Inc.
+   Copyright (C) 1998-2020 Free Software Foundation, Inc.
    Contributed by Cygnus Support and Andrew Cagney.
 
 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.
+the Free Software Foundation; either version 3 of the License, 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.  */
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "sim-main.h"
 #include "sim-assert.h"
@@ -26,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "hw-tree.h"
 #include "hw-device.h"
+#include "hw-main.h"
 #include "hw-base.h"
 
 
@@ -40,7 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <stdlib.h>
 #endif
 #include <ctype.h>
-#include <sys/errno.h>
+#include <errno.h>
 
 
 struct sim_hw {
@@ -53,15 +53,17 @@ struct sim_hw {
 };
 
 
-void
+struct hw *
 sim_hw_parse (struct sim_state *sd,
              const char *fmt,
              ...)
 {
+  struct hw *current;
   va_list ap;
   va_start (ap, fmt);
-  hw_tree_vparse (STATE_HW (sd)->tree, fmt, ap);
+  current = hw_tree_vparse (STATE_HW (sd)->tree, fmt, ap);
   va_end (ap);
+  return current;
 }
 
 struct printer {
@@ -98,6 +100,7 @@ enum {
   OPTION_HW_INFO = OPTION_START,
   OPTION_HW_TRACE,
   OPTION_HW_DEVICE,
+  OPTION_HW_LIST,
   OPTION_HW_FILE,
 };
 
@@ -107,27 +110,31 @@ static const OPTION hw_options[] =
 {
   { {"hw-info", no_argument, NULL, OPTION_HW_INFO },
       '\0', NULL, "List configurable hw regions",
-      hw_option_handler },
+      hw_option_handler, NULL },
   { {"info-hw", no_argument, NULL, OPTION_HW_INFO },
       '\0', NULL, NULL,
-      hw_option_handler },
+      hw_option_handler, NULL },
 
   { {"hw-trace", optional_argument, NULL, OPTION_HW_TRACE },
       '\0', "on|off", "Trace all hardware devices",
-      hw_option_handler },
+      hw_option_handler, NULL },
   { {"trace-hw", optional_argument, NULL, OPTION_HW_TRACE },
       '\0', NULL, NULL,
-      hw_option_handler },
+      hw_option_handler, NULL },
 
   { {"hw-device", required_argument, NULL, OPTION_HW_DEVICE },
       '\0', "DEVICE", "Add the specified device",
-      hw_option_handler },
+      hw_option_handler, NULL },
+
+  { {"hw-list", no_argument, NULL, OPTION_HW_LIST },
+      '\0', NULL, "List the device tree",
+      hw_option_handler, NULL },
 
   { {"hw-file", required_argument, NULL, OPTION_HW_FILE },
       '\0', "FILE", "Add the devices listed in the file",
-      hw_option_handler },
+      hw_option_handler, NULL },
 
-  { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL }
+  { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
 };
 
 
@@ -142,7 +149,7 @@ merge_device_file (struct sim_state *sd,
   struct hw *current = STATE_HW (sd)->tree;
   int line_nr;
   char device_path[1000];
-  
+
   /* try opening the file */
   description = fopen (file_name, "r");
   if (description == NULL)
@@ -150,9 +157,9 @@ merge_device_file (struct sim_state *sd,
       perror (file_name);
       return SIM_RC_FAIL;
     }
-  
+
   line_nr = 0;
-  while (fgets (device_path, sizeof(device_path), description))
+  while (fgets (device_path, sizeof (device_path), description))
     {
       char *device;
       /* check that a complete line was read */
@@ -187,13 +194,13 @@ merge_device_file (struct sim_state *sd,
              sim_io_eprintf (sd, "%s:%d: unexpected eof", file_name, line_nr);
              return SIM_RC_FAIL;
            }
-         if (strchr(device_path, '\n') == NULL)
+         if (strchr (device_path, '\n') == NULL)
            {
-             fclose(description);
+             fclose (description);
              sim_io_eprintf (sd, "%s:%d: line to long", file_name, line_nr);
              return SIM_RC_FAIL;
            }
-         *strchr(device_path, '\n') = '\0';
+         *strchr (device_path, '\n') = '\0';
          line_nr++;
        }
       /* parse this line */
@@ -250,7 +257,13 @@ hw_option_handler (struct sim_state *sd, sim_cpu *cpu, int opt,
 
     case OPTION_HW_DEVICE:
       {
-       hw_tree_parse (STATE_HW (sd)->tree, arg);
+       hw_tree_parse (STATE_HW (sd)->tree, "%s", arg);
+       return SIM_RC_OK;
+      }
+
+    case OPTION_HW_LIST:
+      {
+       sim_hw_print (sd, sim_io_vprintf);
        return SIM_RC_OK;
       }
 
@@ -305,8 +318,8 @@ sim_hw_init (struct sim_state *sd)
 static void
 sim_hw_uninstall (struct sim_state *sd)
 {
-  /* hw_tree_delete (STATE_HW (sd)->tree); */
-  zfree (STATE_HW (sd));
+  hw_tree_delete (STATE_HW (sd)->tree);
+  free (STATE_HW (sd));
   STATE_HW (sd) = NULL;
 }
 
@@ -319,7 +332,7 @@ sim_hw_uninstall (struct sim_state *sd)
 /* CPU: The simulation is running and the current CPU/CIA
    initiates a data transfer. */
 
-void 
+void
 sim_cpu_hw_io_read_buffer (sim_cpu *cpu,
                           sim_cia cia,
                           struct hw *hw,
@@ -335,7 +348,7 @@ sim_cpu_hw_io_read_buffer (sim_cpu *cpu,
     sim_engine_abort (sd, cpu, cia, "broken CPU read");
 }
 
-void 
+void
 sim_cpu_hw_io_write_buffer (sim_cpu *cpu,
                            sim_cia cia,
                            struct hw *hw,
@@ -356,7 +369,7 @@ sim_cpu_hw_io_write_buffer (sim_cpu *cpu,
 
 /* SYSTEM: A data transfer is being initiated by the system. */
 
-unsigned 
+unsigned
 sim_hw_io_read_buffer (struct sim_state *sd,
                       struct hw *hw,
                       void *dest,
@@ -503,62 +516,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));
-}
This page took 0.029374 seconds and 4 git commands to generate.