X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=sim%2Fcommon%2Fhw-properties.c;h=944f2b75b7b750c799f85f2b5eda161c17aa81ce;hb=05e682e3be7e3d9d63ec358dcf8943fd200545cb;hp=a42c0c9188e29a7a9f8c538109f02eda5dd4d3fd;hpb=fa803dc60f0bf01297674c41d001798e18ade4dc;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/hw-properties.c b/sim/common/hw-properties.c index a42c0c9188..944f2b75b7 100644 --- a/sim/common/hw-properties.c +++ b/sim/common/hw-properties.c @@ -1,28 +1,28 @@ -/* This file is part of the program psim. +/* The common simulator framework for GDB, the GNU Debugger. - Copyright (C) 1994-1998, Andrew Cagney + Copyright 2002-2020 Free Software Foundation, Inc. - 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 of the License, or - (at your option) any later version. + Contributed by Andrew Cagney and Red Hat. - 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. - - */ + This file is part of GDB. -#include "sim-main.h" + 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. -#include "hw-device.h" -#include "hw-properties.h" + 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 . */ + +#include "hw-main.h" +#include "hw-base.h" + +#include "sim-io.h" #include "sim-assert.h" #ifdef HAVE_STRING_H @@ -33,17 +33,27 @@ #endif #endif -#define TRACE(A,B) - /* property entries */ -struct hw_property_data { +struct hw_property_data +{ struct hw_property_data *next; struct hw_property *property; const void *init_array; unsigned sizeof_init_array; }; +void +create_hw_property_data (struct hw *me) +{ +} + +void +delete_hw_property_data (struct hw *me) +{ +} + + /* Device Properties: */ static struct hw_property_data * @@ -76,7 +86,7 @@ hw_add_property (struct hw *me, { struct hw_property_data *new_entry = NULL; struct hw_property *new_value = NULL; - + /* find the list end */ struct hw_property_data **insertion_point = &me->properties_of_hw; while (*insertion_point != NULL) @@ -85,7 +95,7 @@ hw_add_property (struct hw *me, return; insertion_point = &(*insertion_point)->next; } - + /* create a new value */ new_value = HW_ZALLOC (me, struct hw_property); new_value->name = (char *) strdup (property); @@ -100,7 +110,7 @@ hw_add_property (struct hw *me, new_value->owner = me; new_value->original = original; new_value->disposition = disposition; - + /* insert the value into the list */ new_entry = HW_ZALLOC (me, struct hw_property_data); *insertion_point = new_entry; @@ -201,7 +211,7 @@ hw_init_static_properties (SIM_DESC sd, { ASSERT (property->init_array != NULL); ASSERT (property->property->array == NULL); - ASSERT(property->property->disposition == permenant_object); + ASSERT (property->property->disposition == permenant_object); switch (property->property->type) { case array_property: @@ -347,9 +357,10 @@ hw_find_array_property (struct hw *me, { const struct hw_property *node; node = hw_find_property (me, property); - if (node == NULL - || node->type != array_property) - hw_abort(me, "property %s not found or of wrong type", property); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != array_property) + hw_abort (me, "property \"%s\" of wrong type (array)", property); return node; } @@ -362,8 +373,8 @@ hw_add_boolean_property (struct hw *me, { signed32 new_boolean = (boolean ? -1 : 0); hw_add_property (me, property, boolean_property, - &new_boolean, sizeof(new_boolean), - &new_boolean, sizeof(new_boolean), + &new_boolean, sizeof (new_boolean), + &new_boolean, sizeof (new_boolean), NULL, permenant_object); } @@ -374,8 +385,10 @@ hw_find_boolean_property (struct hw *me, const struct hw_property *node; unsigned_cell boolean; node = hw_find_property (me, property); - if (node == NULL || node->type != boolean_property) - hw_abort (me, "property %s not found or of wrong type", property); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != boolean_property) + hw_abort (me, "property \"%s\" of wrong type (boolean)", property); ASSERT (sizeof (boolean) == node->sizeof_array); memcpy (&boolean, node->array, sizeof (boolean)); return boolean; @@ -391,7 +404,7 @@ hw_add_ihandle_runtime_property (struct hw *me, { /* enter the full path as the init array */ hw_add_property (me, property, ihandle_property, - ihandle->full_path, strlen(ihandle->full_path) + 1, + ihandle->full_path, strlen (ihandle->full_path) + 1, NULL, 0, NULL, permenant_object); } @@ -404,13 +417,11 @@ hw_find_ihandle_runtime_property (struct hw *me, ihandle_runtime_property_spec *ihandle) { struct hw_property_data *entry = find_property_data (me, property); - TRACE (trace_devices, - ("hw_find_ihandle_runtime_property(me=0x%lx, property=%s)\n", - (long)me, property)); - if (entry == NULL - || entry->property->type != ihandle_property + if (entry == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (entry->property->type != ihandle_property || entry->property->disposition != permenant_object) - hw_abort (me, "property %s not found or of wrong type", property); + hw_abort (me, "property \"%s\" of wrong type", property); ASSERT (entry->init_array != NULL); /* the full path */ ihandle->full_path = entry->init_array; @@ -429,7 +440,7 @@ hw_set_ihandle_property (struct hw *me, cells = H2BE_cell (hw_instance_to_external (ihandle)); hw_set_property (me, property, ihandle_property, &cells, sizeof (cells)); - + } #endif @@ -443,14 +454,16 @@ hw_find_ihandle_property (struct hw *me, hw_instance *instance; node = hw_find_property (me, property); - if (node == NULL || node->type != ihandle_property) - hw_abort(me, "property %s not found or of wrong type", property); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != ihandle_property) + hw_abort (me, "property \"%s\" of wrong type (ihandle)", property); if (node->array == NULL) - hw_abort(me, "runtime property %s not yet initialized", property); + hw_abort (me, "runtime property \"%s\" not yet initialized", property); - ASSERT (sizeof(ihandle) == node->sizeof_array); - memcpy (&ihandle, node->array, sizeof(ihandle)); - instance = external_to_hw_instance (me, BE2H_cell(ihandle)); + ASSERT (sizeof (ihandle) == node->sizeof_array); + memcpy (&ihandle, node->array, sizeof (ihandle)); + instance = external_to_hw_instance (me, BE2H_cell (ihandle)); ASSERT (instance != NULL); return instance; } @@ -464,8 +477,8 @@ hw_add_integer_property (struct hw *me, { H2BE (integer); hw_add_property (me, property, integer_property, - &integer, sizeof(integer), - &integer, sizeof(integer), + &integer, sizeof (integer), + &integer, sizeof (integer), NULL, permenant_object); } @@ -475,13 +488,12 @@ hw_find_integer_property (struct hw *me, { const struct hw_property *node; signed_cell integer; - TRACE (trace_devices, - ("hw_find_integer(me=0x%lx, property=%s)\n", - (long)me, property)); node = hw_find_property (me, property); - if (node == NULL || node->type != integer_property) - hw_abort (me, "property %s not found or of wrong type", property); - ASSERT (sizeof(integer) == node->sizeof_array); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != integer_property) + hw_abort (me, "property \"%s\" of wrong type (integer)", property); + ASSERT (sizeof (integer) == node->sizeof_array); memcpy (&integer, node->array, sizeof (integer)); return BE2H_cell (integer); } @@ -495,25 +507,23 @@ hw_find_integer_array_property (struct hw *me, const struct hw_property *node; int sizeof_integer = sizeof (*integer); signed_cell *cell; - TRACE (trace_devices, - ("hw_find_integer(me=0x%lx, property=%s)\n", - (long)me, property)); - + /* check things sane */ node = hw_find_property (me, property); - if (node == NULL - || (node->type != integer_property - && node->type != array_property)) - hw_abort (me, "property %s not found or of wrong type", property); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != integer_property + && node->type != array_property) + hw_abort (me, "property \"%s\" of wrong type (integer or array)", property); if ((node->sizeof_array % sizeof_integer) != 0) - hw_abort (me, "property %s contains an incomplete number of cells", property); + hw_abort (me, "property \"%s\" contains an incomplete number of cells", property); if (node->sizeof_array <= sizeof_integer * index) return 0; - + /* Find and convert the value */ cell = ((signed_cell*)node->array) + index; *integer = BE2H_cell (*cell); - + return node->sizeof_array / sizeof_integer; } @@ -524,7 +534,7 @@ unit_address_to_cells (const hw_unit *unit, int nr_cells) { int i; - ASSERT(nr_cells == unit->nr_cells); + ASSERT (nr_cells == unit->nr_cells); for (i = 0; i < unit->nr_cells; i++) { *cell = H2BE_cell (unit->cells[i]); @@ -540,7 +550,7 @@ cells_to_unit_address (const unsigned_cell *cell, int nr_cells) { int i; - memset(unit, 0, sizeof(*unit)); + memset (unit, 0, sizeof (*unit)); unit->nr_cells = nr_cells; for (i = 0; i < unit->nr_cells; i++) { @@ -572,7 +582,7 @@ hw_add_range_array_property (struct hw *me, unsigned_cell *cells = hw_zalloc (me, sizeof_cells); unsigned_cell *cell; int i; - + /* copy the property elements over */ cell = cells; for (i = 0; i < nr_ranges; i++) @@ -582,20 +592,20 @@ hw_add_range_array_property (struct hw *me, cell = unit_address_to_cells (&range->child_address, cell, hw_unit_nr_address_cells (me)); /* copy the parent address */ - cell = unit_address_to_cells (&range->parent_address, cell, + cell = unit_address_to_cells (&range->parent_address, cell, hw_unit_nr_address_cells (hw_parent (me))); /* copy the size */ - cell = unit_address_to_cells (&range->size, cell, + cell = unit_address_to_cells (&range->size, cell, hw_unit_nr_size_cells (me)); } ASSERT (cell == &cells[nr_range_property_cells (me, nr_ranges)]); - + /* add it */ hw_add_property (me, property, range_array_property, cells, sizeof_cells, cells, sizeof_cells, NULL, permenant_object); - + hw_free (me, cells); } @@ -609,36 +619,38 @@ hw_find_range_array_property (struct hw *me, unsigned sizeof_entry = (nr_range_property_cells (me, 1) * sizeof (unsigned_cell)); const unsigned_cell *cells; - + /* locate the property */ node = hw_find_property (me, property); - if (node == NULL || node->type != range_array_property) - hw_abort (me, "property %s not found or of wrong type", property); - + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != range_array_property) + hw_abort (me, "property \"%s\" of wrong type (range array)", property); + /* aligned ? */ if ((node->sizeof_array % sizeof_entry) != 0) - hw_abort (me, "property %s contains an incomplete number of entries", + hw_abort (me, "property \"%s\" contains an incomplete number of entries", property); - + /* within bounds? */ if (node->sizeof_array < sizeof_entry * (index + 1)) return 0; - + /* find the range of interest */ cells = (unsigned_cell*)((char*)node->array + sizeof_entry * index); - + /* copy the child address out - converting as we go */ cells = cells_to_unit_address (cells, &range->child_address, hw_unit_nr_address_cells (me)); - + /* copy the parent address out - converting as we go */ cells = cells_to_unit_address (cells, &range->parent_address, hw_unit_nr_address_cells (hw_parent (me))); - + /* copy the size - converting as we go */ cells = cells_to_unit_address (cells, &range->size, hw_unit_nr_size_cells (me)); - + return node->sizeof_array / sizeof_entry; } @@ -647,8 +659,8 @@ static unsigned nr_reg_property_cells (struct hw *me, int nr_regs) { - return (hw_unit_nr_address_cells (hw_parent(me)) - + hw_unit_nr_size_cells (hw_parent(me)) + return (hw_unit_nr_address_cells (hw_parent (me)) + + hw_unit_nr_size_cells (hw_parent (me)) ) * nr_regs; } @@ -663,7 +675,7 @@ hw_add_reg_array_property (struct hw *me, unsigned_cell *cells = hw_zalloc (me, sizeof_cells); unsigned_cell *cell; int i; - + /* copy the property elements over */ cell = cells; for (i = 0; i < nr_regs; i++) @@ -677,13 +689,13 @@ hw_add_reg_array_property (struct hw *me, hw_unit_nr_size_cells (hw_parent (me))); } ASSERT (cell == &cells[nr_reg_property_cells (me, nr_regs)]); - + /* add it */ hw_add_property (me, property, reg_array_property, cells, sizeof_cells, cells, sizeof_cells, NULL, permenant_object); - + hw_free (me, cells); } @@ -697,32 +709,34 @@ hw_find_reg_array_property (struct hw *me, unsigned sizeof_entry = (nr_reg_property_cells (me, 1) * sizeof (unsigned_cell)); const unsigned_cell *cells; - + /* locate the property */ node = hw_find_property (me, property); - if (node == NULL || node->type != reg_array_property) - hw_abort (me, "property %s not found or of wrong type", property); - + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != reg_array_property) + hw_abort (me, "property \"%s\" of wrong type (reg array)", property); + /* aligned ? */ if ((node->sizeof_array % sizeof_entry) != 0) - hw_abort (me, "property %s contains an incomplete number of entries", + hw_abort (me, "property \"%s\" contains an incomplete number of entries", property); - + /* within bounds? */ if (node->sizeof_array < sizeof_entry * (index + 1)) return 0; - + /* find the range of interest */ cells = (unsigned_cell*)((char*)node->array + sizeof_entry * index); - + /* copy the address out - converting as we go */ cells = cells_to_unit_address (cells, ®->address, hw_unit_nr_address_cells (hw_parent (me))); - + /* copy the size out - converting as we go */ cells = cells_to_unit_address (cells, ®->size, hw_unit_nr_size_cells (hw_parent (me))); - + return node->sizeof_array / sizeof_entry; } @@ -733,8 +747,8 @@ hw_add_string_property (struct hw *me, const char *string) { hw_add_property (me, property, string_property, - string, strlen(string) + 1, - string, strlen(string) + 1, + string, strlen (string) + 1, + string, strlen (string) + 1, NULL, permenant_object); } @@ -745,10 +759,12 @@ hw_find_string_property (struct hw *me, const struct hw_property *node; const char *string; node = hw_find_property (me, property); - if (node == NULL || node->type != string_property) - hw_abort (me, "property %s not found or of wrong type", property); + if (node == NULL) + hw_abort (me, "property \"%s\" not found", property); + if (node->type != string_property) + hw_abort (me, "property \"%s\" of wrong type (string)", property); string = node->array; - ASSERT (strlen(string) + 1 == node->sizeof_array); + ASSERT (strlen (string) + 1 == node->sizeof_array); return string; } @@ -763,7 +779,7 @@ hw_add_string_array_property (struct hw *me, char *array; char *chp; if (nr_strings == 0) - hw_abort (me, "property %s must be non-null", property); + hw_abort (me, "property \"%s\" must be non-null", property); /* total up the size of the needed array */ for (sizeof_array = 0, string_nr = 0; string_nr < nr_strings; @@ -798,24 +814,24 @@ hw_find_string_array_property (struct hw *me, const struct hw_property *node; node = hw_find_property (me, property); if (node == NULL) - hw_abort (me, "property %s not found", property); + hw_abort (me, "property \"%s\" not found", property); switch (node->type) { default: - hw_abort (me, "property %s of wrong type", property); + hw_abort (me, "property \"%s\" of wrong type", property); break; case string_property: if (index == 0) { *string = node->array; - ASSERT (strlen(*string) + 1 == node->sizeof_array); + ASSERT (strlen (*string) + 1 == node->sizeof_array); return 1; } break; case array_property: if (node->sizeof_array == 0 || ((char*)node->array)[node->sizeof_array - 1] != '\0') - hw_abort (me, "property %s invalid for string array", property); + hw_abort (me, "property \"%s\" invalid for string array", property); /* FALL THROUGH */ case string_array_property: ASSERT (node->sizeof_array > 0); @@ -860,9 +876,6 @@ hw_add_duplicate_property (struct hw *me, const struct hw_property *original) { struct hw_property_data *master; - TRACE (trace_devices, - ("hw_add_duplicate_property(me=0x%lx, property=%s, ...)\n", - (long)me, property)); if (original->disposition != permenant_object) hw_abort (me, "Can only duplicate permenant objects"); /* find the original's master */ @@ -870,7 +883,7 @@ hw_add_duplicate_property (struct hw *me, while (master->property != original) { master = master->next; - ASSERT(master != NULL); + ASSERT (master != NULL); } /* now duplicate it */ hw_add_property (me, property,