X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fcommon%2Fsim-hw.c;h=7621ab92236411b2d8644fac090460ef3fa71fce;hb=3061113bf336048d538241282c39baf684de31bf;hp=51b7b0fbaf59abebafe9452163177786e8039870;hpb=643878d01705dbc37908583984ab14da155a8b28;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/sim-hw.c b/sim/common/sim-hw.c index 51b7b0fbaf..7621ab9223 100644 --- a/sim/common/sim-hw.c +++ b/sim/common/sim-hw.c @@ -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 . */ #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 #endif #include -#include +#include 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 } } - - -/* 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)); -}