X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=sim%2Fcommon%2Fdv-glue.c;h=fb693443d9b0b4cc04fde268fee5054d91d8d618;hb=f3c469b95b9f1f635668660c5041df9513a47a02;hp=b99487dbd784684c56650f7015a0c1f334a71e44;hpb=0e31da218e04915bca80802b87fa418b49780378;p=deliverable%2Fbinutils-gdb.git diff --git a/sim/common/dv-glue.c b/sim/common/dv-glue.c index b99487dbd7..fb693443d9 100644 --- a/sim/common/dv-glue.c +++ b/sim/common/dv-glue.c @@ -1,6 +1,6 @@ /* The common simulator framework for GDB, the GNU Debugger. - Copyright 2002, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright 2002-2020 Free Software Foundation, Inc. Contributed by Andrew Cagney and Red Hat. @@ -195,6 +195,7 @@ static void hw_glue_finish (struct hw *me) { struct hw_glue *glue = HW_ZALLOC (me, struct hw_glue); + const char *name = hw_name (me); /* establish our own methods */ set_hw_data (me, glue); @@ -207,39 +208,49 @@ hw_glue_finish (struct hw *me) do_hw_attach_regs (me); /* establish the output registers */ - { - reg_property_spec unit; - int reg_nr; - - /* find a relevant reg entry */ - reg_nr = 0; - while (hw_find_reg_array_property (me, "reg", reg_nr, &unit) - && !hw_unit_size_to_attach_size (hw_parent (me), - &unit.size, - &glue->sizeof_output, - me)) - reg_nr++; - - /* check out the size */ - if (glue->sizeof_output == 0) - hw_abort (me, "at least one reg property size must be nonzero"); - if (glue->sizeof_output % sizeof (unsigned_word) != 0) - hw_abort (me, "reg property size must be %ld aligned", - (long) sizeof (unsigned_word)); - - /* and the address */ - hw_unit_address_to_attach_address (hw_parent (me), - &unit.address, - &glue->space, - &glue->address, - me); - if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0) - hw_abort (me, "reg property address must be %ld aligned", - (long) (sizeof (unsigned_word) * max_nr_ports)); - - glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word); - glue->output = hw_zalloc (me, glue->sizeof_output); - } + if (hw_find_property (me, "reg")) + { + reg_property_spec unit; + int reg_nr; + + /* Find a relevant reg entry. */ + reg_nr = 0; + while (hw_find_reg_array_property (me, "reg", reg_nr, &unit) + && !hw_unit_size_to_attach_size (hw_parent (me), + &unit.size, + &glue->sizeof_output, + me)) + reg_nr++; + + /* Check out the size ... */ + if (glue->sizeof_output == 0) + hw_abort (me, "at least one reg property size must be nonzero"); + if (glue->sizeof_output % sizeof (unsigned_word) != 0) + hw_abort (me, "reg property size must be %ld aligned", + (long) sizeof (unsigned_word)); + + /* ... and the address. */ + hw_unit_address_to_attach_address (hw_parent (me), + &unit.address, + &glue->space, + &glue->address, + me); + if (glue->address % (sizeof (unsigned_word) * max_nr_ports) != 0) + hw_abort (me, "reg property address must be %ld aligned", + (long) (sizeof (unsigned_word) * max_nr_ports)); + + glue->nr_outputs = glue->sizeof_output / sizeof (unsigned_word); + } + else + { + /* Allow bitwise glue devices to declare only ports. */ + if (!strcmp (name, "glue")) + hw_abort (me, "Missing \"reg\" property"); + + glue->nr_outputs = 1; + glue->sizeof_output = sizeof (unsigned_word); + } + glue->output = hw_zalloc (me, glue->sizeof_output); /* establish the input ports */ { @@ -267,20 +278,16 @@ hw_glue_finish (struct hw *me) } /* determine our type */ - { - const char *name = hw_name(me); - - if (strcmp (name, "glue") == 0) - glue->type = glue_io; - else if (strcmp (name, "glue-and") == 0) - glue->type = glue_and; - else if (strcmp (name, "glue-or") == 0) - glue->type = glue_or; - else if (strcmp (name, "glue-xor") == 0) - glue->type = glue_xor; - else - hw_abort (me, "unimplemented glue type"); - } + if (strcmp (name, "glue") == 0) + glue->type = glue_io; + else if (strcmp (name, "glue-and") == 0) + glue->type = glue_and; + else if (strcmp (name, "glue-or") == 0) + glue->type = glue_or; + else if (strcmp (name, "glue-xor") == 0) + glue->type = glue_xor; + else + hw_abort (me, "unimplemented glue type"); HW_TRACE ((me, "int-number %d, nr_inputs %d, nr_outputs %d", glue->int_number, glue->nr_inputs, glue->nr_outputs));