|  | /* The common simulator framework for GDB, the GNU Debugger. | 
|  |  | 
|  | Copyright 2002-2023 Free Software Foundation, Inc. | 
|  |  | 
|  | Contributed by Andrew Cagney and Red Hat. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | 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 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, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  |  | 
|  | #ifndef HW_INSTANCES_H | 
|  | #define HW_INSTANCES_H | 
|  |  | 
|  | /* Instances: | 
|  |  | 
|  | As with IEEE1275, a device can be opened, creating an instance. | 
|  | Instances provide more abstract interfaces to the underlying | 
|  | hardware.  For example, the instance methods for a disk may include | 
|  | code that is able to interpret file systems found on disks.  Such | 
|  | methods would there for allow the manipulation of files on the | 
|  | disks file system.  The operations would be implemented using the | 
|  | basic block I/O model provided by the disk. | 
|  |  | 
|  | This model includes methods that faciliate the creation of device | 
|  | instance and (should a given device support it) standard operations | 
|  | on those instances. | 
|  |  | 
|  | */ | 
|  |  | 
|  |  | 
|  | struct hw_instance; | 
|  |  | 
|  |  | 
|  | typedef void (hw_finish_instance_method) | 
|  | (struct hw *hw, | 
|  | struct hw_instance *); | 
|  |  | 
|  | extern void set_hw_finish_instance | 
|  | (struct hw *hw, | 
|  | hw_finish_instance_method *method); | 
|  |  | 
|  |  | 
|  | /* construct an instance of the hardware */ | 
|  |  | 
|  | struct hw_instance *hw_instance_create | 
|  | (struct hw *hw, | 
|  | struct hw_instance *parent, | 
|  | const char *path, | 
|  | const char *args); | 
|  |  | 
|  | struct hw_instance *hw_instance_interceed | 
|  | (struct hw_instance *parent, | 
|  | const char *path, | 
|  | const char *args); | 
|  |  | 
|  | void hw_instance_delete | 
|  | (struct hw_instance *instance); | 
|  |  | 
|  |  | 
|  | /* methods applied to an instance of the hw */ | 
|  |  | 
|  | typedef int (hw_instance_read_method) | 
|  | (struct hw_instance *instance, | 
|  | void *addr, | 
|  | unsigned_cell len); | 
|  |  | 
|  | #define hw_instance_read(instance, addr, len) \ | 
|  | ((instance)->to_instance_read ((instance), (addr), (len))) | 
|  |  | 
|  | #define set_hw_instance_read(instance, method) \ | 
|  | ((instance)->to_instance_read = (method)) | 
|  |  | 
|  |  | 
|  | typedef int (hw_instance_write_method) | 
|  | (struct hw_instance *instance, | 
|  | const void *addr, | 
|  | unsigned_cell len); | 
|  |  | 
|  | #define hw_instance_write(instance, addr, len) \ | 
|  | ((instance)->to_instance_write ((instance), (addr), (len))) | 
|  |  | 
|  | #define set_hw_instance_write(instance, method) \ | 
|  | ((instance)->to_instance_write = (method)) | 
|  |  | 
|  |  | 
|  | typedef int (hw_instance_seek_method) | 
|  | (struct hw_instance *instance, | 
|  | unsigned_cell pos_hi, | 
|  | unsigned_cell pos_lo); | 
|  |  | 
|  | #define hw_instance_seek(instance, pos_hi, pos_lo) \ | 
|  | ((instance)->to_instance_seek ((instance), (pos_hi), (pos_lo))); | 
|  |  | 
|  | #define set_hw_instance_seek(instance, method) \ | 
|  | ((instance)->to_instance_seek = (method)) | 
|  |  | 
|  |  | 
|  | int hw_instance_call_method | 
|  | (struct hw_instance *instance, | 
|  | const char *method, | 
|  | int n_stack_args, | 
|  | unsigned_cell stack_args[/*n_stack_args + 1(NULL)*/], | 
|  | int n_stack_returns, | 
|  | unsigned_cell stack_returns[/*n_stack_returns + 1(NULL)*/]); | 
|  |  | 
|  |  | 
|  |  | 
|  | /* the definition of the instance */ | 
|  |  | 
|  | #define hw_instance_hw(instance) ((instance)->hw_of_instance + 0) | 
|  |  | 
|  | #define hw_instance_path(instance) ((instance)->path_of_instance + 0) | 
|  |  | 
|  | #define hw_instance_args(instance) ((instance)->args_of_instance) | 
|  |  | 
|  | #define hw_instance_data(instance) ((instance)->data_of_instance) | 
|  |  | 
|  | #define hw_instance_system(instance) (hw_system (hw_instance_hw (instance))) | 
|  |  | 
|  |  | 
|  |  | 
|  | /* Finally an instance of a hardware device - keep your grubby little | 
|  | mits off of these internals! :-) */ | 
|  |  | 
|  | struct hw_instance | 
|  | { | 
|  |  | 
|  | void *data_of_instance; | 
|  | char *args_of_instance; | 
|  | char *path_of_instance; | 
|  |  | 
|  | /* the device that owns the instance */ | 
|  | struct hw *hw_of_instance; | 
|  | struct hw_instance *sibling_of_instance; | 
|  |  | 
|  | /* interposed instance */ | 
|  | struct hw_instance *parent_of_instance; | 
|  | struct hw_instance *child_of_instance; | 
|  |  | 
|  | /* methods */ | 
|  | hw_instance_read_method *to_instance_read; | 
|  | hw_instance_write_method *to_instance_write; | 
|  | hw_instance_seek_method *to_instance_seek; | 
|  |  | 
|  | }; | 
|  |  | 
|  | #endif |