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