xref: /netbsd-src/external/gpl3/gdb/dist/sim/common/hw-instances.h (revision 0d3e0572e40d81edb4fdbff937458d47b685c34c)
14e98e3e1Schristos /* The common simulator framework for GDB, the GNU Debugger.
24e98e3e1Schristos 
3*0d3e0572Schristos    Copyright 2002-2024 Free Software Foundation, Inc.
44e98e3e1Schristos 
54e98e3e1Schristos    Contributed by Andrew Cagney and Red Hat.
64e98e3e1Schristos 
74e98e3e1Schristos    This file is part of GDB.
84e98e3e1Schristos 
94e98e3e1Schristos    This program is free software; you can redistribute it and/or modify
104e98e3e1Schristos    it under the terms of the GNU General Public License as published by
114e98e3e1Schristos    the Free Software Foundation; either version 3 of the License, or
124e98e3e1Schristos    (at your option) any later version.
134e98e3e1Schristos 
144e98e3e1Schristos    This program is distributed in the hope that it will be useful,
154e98e3e1Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
164e98e3e1Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
174e98e3e1Schristos    GNU General Public License for more details.
184e98e3e1Schristos 
194e98e3e1Schristos    You should have received a copy of the GNU General Public License
204e98e3e1Schristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
214e98e3e1Schristos 
224e98e3e1Schristos 
234e98e3e1Schristos #ifndef HW_INSTANCES_H
244e98e3e1Schristos #define HW_INSTANCES_H
254e98e3e1Schristos 
264e98e3e1Schristos /* Instances:
274e98e3e1Schristos 
284e98e3e1Schristos    As with IEEE1275, a device can be opened, creating an instance.
294e98e3e1Schristos    Instances provide more abstract interfaces to the underlying
304e98e3e1Schristos    hardware.  For example, the instance methods for a disk may include
314e98e3e1Schristos    code that is able to interpret file systems found on disks.  Such
324e98e3e1Schristos    methods would there for allow the manipulation of files on the
334e98e3e1Schristos    disks file system.  The operations would be implemented using the
344e98e3e1Schristos    basic block I/O model provided by the disk.
354e98e3e1Schristos 
364e98e3e1Schristos    This model includes methods that faciliate the creation of device
374e98e3e1Schristos    instance and (should a given device support it) standard operations
384e98e3e1Schristos    on those instances.
394e98e3e1Schristos 
404e98e3e1Schristos    */
414e98e3e1Schristos 
424e98e3e1Schristos 
434e98e3e1Schristos struct hw_instance;
444e98e3e1Schristos 
454e98e3e1Schristos 
464e98e3e1Schristos typedef void (hw_finish_instance_method)
474e98e3e1Schristos      (struct hw *hw,
484e98e3e1Schristos       struct hw_instance *);
494e98e3e1Schristos 
504e98e3e1Schristos extern void set_hw_finish_instance
514e98e3e1Schristos (struct hw *hw,
524e98e3e1Schristos  hw_finish_instance_method *method);
534e98e3e1Schristos 
544e98e3e1Schristos 
554e98e3e1Schristos /* construct an instance of the hardware */
564e98e3e1Schristos 
574e98e3e1Schristos struct hw_instance *hw_instance_create
584e98e3e1Schristos (struct hw *hw,
594e98e3e1Schristos  struct hw_instance *parent,
604e98e3e1Schristos  const char *path,
614e98e3e1Schristos  const char *args);
624e98e3e1Schristos 
634e98e3e1Schristos struct hw_instance *hw_instance_interceed
644e98e3e1Schristos (struct hw_instance *parent,
654e98e3e1Schristos  const char *path,
664e98e3e1Schristos  const char *args);
674e98e3e1Schristos 
684e98e3e1Schristos void hw_instance_delete
694e98e3e1Schristos (struct hw_instance *instance);
704e98e3e1Schristos 
714e98e3e1Schristos 
724e98e3e1Schristos /* methods applied to an instance of the hw */
734e98e3e1Schristos 
744e98e3e1Schristos typedef int (hw_instance_read_method)
754e98e3e1Schristos      (struct hw_instance *instance,
764e98e3e1Schristos       void *addr,
774e98e3e1Schristos       unsigned_cell len);
784e98e3e1Schristos 
794e98e3e1Schristos #define hw_instance_read(instance, addr, len) \
804e98e3e1Schristos ((instance)->to_instance_read ((instance), (addr), (len)))
814e98e3e1Schristos 
824e98e3e1Schristos #define set_hw_instance_read(instance, method) \
834e98e3e1Schristos ((instance)->to_instance_read = (method))
844e98e3e1Schristos 
854e98e3e1Schristos 
864e98e3e1Schristos typedef int (hw_instance_write_method)
874e98e3e1Schristos      (struct hw_instance *instance,
884e98e3e1Schristos       const void *addr,
894e98e3e1Schristos       unsigned_cell len);
904e98e3e1Schristos 
914e98e3e1Schristos #define hw_instance_write(instance, addr, len) \
924e98e3e1Schristos ((instance)->to_instance_write ((instance), (addr), (len)))
934e98e3e1Schristos 
944e98e3e1Schristos #define set_hw_instance_write(instance, method) \
954e98e3e1Schristos ((instance)->to_instance_write = (method))
964e98e3e1Schristos 
974e98e3e1Schristos 
984e98e3e1Schristos typedef int (hw_instance_seek_method)
994e98e3e1Schristos      (struct hw_instance *instance,
1004e98e3e1Schristos       unsigned_cell pos_hi,
1014e98e3e1Schristos       unsigned_cell pos_lo);
1024e98e3e1Schristos 
1034e98e3e1Schristos #define hw_instance_seek(instance, pos_hi, pos_lo) \
1044e98e3e1Schristos ((instance)->to_instance_seek ((instance), (pos_hi), (pos_lo)));
1054e98e3e1Schristos 
1064e98e3e1Schristos #define set_hw_instance_seek(instance, method) \
1074e98e3e1Schristos ((instance)->to_instance_seek = (method))
1084e98e3e1Schristos 
1094e98e3e1Schristos 
1104e98e3e1Schristos int hw_instance_call_method
1114e98e3e1Schristos (struct hw_instance *instance,
1124e98e3e1Schristos  const char *method,
1134e98e3e1Schristos  int n_stack_args,
1144e98e3e1Schristos  unsigned_cell stack_args[/*n_stack_args + 1(NULL)*/],
1154e98e3e1Schristos  int n_stack_returns,
1164e98e3e1Schristos  unsigned_cell stack_returns[/*n_stack_returns + 1(NULL)*/]);
1174e98e3e1Schristos 
1184e98e3e1Schristos 
1194e98e3e1Schristos 
1204e98e3e1Schristos /* the definition of the instance */
1214e98e3e1Schristos 
1224e98e3e1Schristos #define hw_instance_hw(instance) ((instance)->hw_of_instance + 0)
1234e98e3e1Schristos 
1244e98e3e1Schristos #define hw_instance_path(instance) ((instance)->path_of_instance + 0)
1254e98e3e1Schristos 
1264e98e3e1Schristos #define hw_instance_args(instance) ((instance)->args_of_instance)
1274e98e3e1Schristos 
1284e98e3e1Schristos #define hw_instance_data(instance) ((instance)->data_of_instance)
1294e98e3e1Schristos 
1304e98e3e1Schristos #define hw_instance_system(instance) (hw_system (hw_instance_hw (instance)))
1314e98e3e1Schristos 
1324e98e3e1Schristos 
1334e98e3e1Schristos 
1344e98e3e1Schristos /* Finally an instance of a hardware device - keep your grubby little
1354e98e3e1Schristos    mits off of these internals! :-) */
1364e98e3e1Schristos 
1374e98e3e1Schristos struct hw_instance
1384e98e3e1Schristos {
1394e98e3e1Schristos 
1404e98e3e1Schristos   void *data_of_instance;
1414e98e3e1Schristos   char *args_of_instance;
1424e98e3e1Schristos   char *path_of_instance;
1434e98e3e1Schristos 
1444e98e3e1Schristos   /* the device that owns the instance */
1454e98e3e1Schristos   struct hw *hw_of_instance;
1464e98e3e1Schristos   struct hw_instance *sibling_of_instance;
1474e98e3e1Schristos 
1484e98e3e1Schristos   /* interposed instance */
1494e98e3e1Schristos   struct hw_instance *parent_of_instance;
1504e98e3e1Schristos   struct hw_instance *child_of_instance;
1514e98e3e1Schristos 
1524e98e3e1Schristos   /* methods */
1534e98e3e1Schristos   hw_instance_read_method *to_instance_read;
1544e98e3e1Schristos   hw_instance_write_method *to_instance_write;
1554e98e3e1Schristos   hw_instance_seek_method *to_instance_seek;
1564e98e3e1Schristos 
1574e98e3e1Schristos };
1584e98e3e1Schristos 
1594e98e3e1Schristos #endif
160