/* The common simulator framework for GDB, the GNU Debugger. Copyright 2002-2019 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 . */ #ifndef HW_PROPERTIES_H #define HW_PROPERTIES_H /* The following are valid property types. The property `array' is for generic untyped data. */ typedef enum { array_property, boolean_property, #if 0 ihandle_property, /*runtime*/ #endif integer_property, range_array_property, reg_array_property, string_property, string_array_property, } hw_property_type; struct hw_property { struct hw *owner; const char *name; hw_property_type type; unsigned sizeof_array; const void *array; const struct hw_property *original; object_disposition disposition; }; #define hw_property_owner(p) ((p)->owner + 0) #define hw_property_name(p) ((p)->name + 0) #define hw_property_type(p) ((p)->type + 0) #define hw_property_array(p) ((p)->array + 0) #define hw_property_sizeof_array(p) ((p)->sizeof_array + 0) #define hw_property_original(p) ((p)->original + 0) #define hw_property_disposition(p) ((p)->disposition + 0) /* Find/iterate over properites attached to a device. To iterate over all properties attached to a device, call hw_find_property (.., NULL) and then hw_property_next. */ const struct hw_property *hw_find_property (struct hw *me, const char *property); const struct hw_property *hw_next_property (const struct hw_property *previous); /* Manipulate the properties belonging to a given device. HW_ADD_* will, if the property is not already present, add a property to the device. Adding a property to a device after it has been created is a checked run-time error (use HW_SET_*). HW_SET_* will always update (or create) the property so that it has the specified value. Changing the type of a property is a checked run-time error. FIND returns the specified properties value. It is a checked runtime error to either request a nonexistant property or to request a property using the wrong type. Code locating a property should first check its type (using hw_find_property above) and then obtain its value using the below. Naming convention: void hw_add__property(struct hw *, const char *, ) void hw_add_*_array_property(struct hw *, const char *, const *, int) void hw_set_*_property(struct hw *, const char *, ) void hw_set_*_array_property(struct hw *, const char *, const *, int) hw_find_*_property(struct hw *, const char *) int hw_find_*_array_property(struct hw *, const char *, int, *) */ void hw_add_array_property (struct hw *me, const char *property, const void *array, int sizeof_array); void hw_set_array_property (struct hw *me, const char *property, const void *array, int sizeof_array); const struct hw_property *hw_find_array_property (struct hw *me, const char *property); void hw_add_boolean_property (struct hw *me, const char *property, int boolean); int hw_find_boolean_property (struct hw *me, const char *property); #if 0 typedef struct _ihandle_runtime_property_spec { const char *full_path; } ihandle_runtime_property_spec; void hw_add_ihandle_runtime_property (struct hw *me, const char *property, const ihandle_runtime_property_spec *ihandle); void hw_find_ihandle_runtime_property (struct hw *me, const char *property, ihandle_runtime_property_spec *ihandle); void hw_set_ihandle_property (struct hw *me, const char *property, hw_instance *ihandle); hw_instance * hw_find_ihandle_property (struct hw *me, const char *property); #endif void hw_add_integer_property (struct hw *me, const char *property, signed_cell integer); signed_cell hw_find_integer_property (struct hw *me, const char *property); int hw_find_integer_array_property (struct hw *me, const char *property, unsigned index, signed_cell *integer); typedef struct _range_property_spec { hw_unit child_address; hw_unit parent_address; hw_unit size; } range_property_spec; void hw_add_range_array_property (struct hw *me, const char *property, const range_property_spec *ranges, unsigned nr_ranges); int hw_find_range_array_property (struct hw *me, const char *property, unsigned index, range_property_spec *range); typedef struct _reg_property_spec { hw_unit address; hw_unit size; } reg_property_spec; void hw_add_reg_array_property (struct hw *me, const char *property, const reg_property_spec *reg, unsigned nr_regs); int hw_find_reg_array_property (struct hw *me, const char *property, unsigned index, reg_property_spec *reg); void hw_add_string_property (struct hw *me, const char *property, const char *string); const char *hw_find_string_property (struct hw *me, const char *property); typedef const char *string_property_spec; void hw_add_string_array_property (struct hw *me, const char *property, const string_property_spec *strings, unsigned nr_strings); int hw_find_string_array_property (struct hw *me, const char *property, unsigned index, string_property_spec *string); void hw_add_duplicate_property (struct hw *me, const char *property, const struct hw_property *original); #endif