aboutsummaryrefslogtreecommitdiff
path: root/sim/ppc/tree.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2001-11-14 19:54:59 +0000
committerAndrew Cagney <cagney@redhat.com>2001-11-14 19:54:59 +0000
commitbebd2b3536bce3bb1d50eff76e51a50310fb29e5 (patch)
tree49ca3ddb5436ed239e6392fd38edd846263d6844 /sim/ppc/tree.c
parent378af1d671c4ac1e6501c740ba97bbfe1964bf44 (diff)
downloadgdb-bebd2b3536bce3bb1d50eff76e51a50310fb29e5.zip
gdb-bebd2b3536bce3bb1d50eff76e51a50310fb29e5.tar.gz
gdb-bebd2b3536bce3bb1d50eff76e51a50310fb29e5.tar.bz2
when #size-cells is zero, don't expect a size.
Diffstat (limited to 'sim/ppc/tree.c')
-rw-r--r--sim/ppc/tree.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sim/ppc/tree.c b/sim/ppc/tree.c
index 3600593..c5106f4 100644
--- a/sim/ppc/tree.c
+++ b/sim/ppc/tree.c
@@ -463,6 +463,7 @@ parse_address(device *current,
const char *chp,
device_unit *address)
{
+ ASSERT(device_nr_address_cells(bus) > 0);
if (device_decode_unit(bus, chp, address) < 0)
device_error(current, "invalid unit address in %s", chp);
return skip_token(chp);
@@ -485,6 +486,7 @@ parse_size(device *current,
/* parse the numeric list */
size->nr_cells = device_nr_size_cells(bus);
nr = 0;
+ ASSERT(size->nr_cells > 0);
while (1) {
char *next;
size->cells[nr] = strtoul(curr, &next, 0);
@@ -521,9 +523,11 @@ parse_reg_property(device *current,
int reg_nr;
reg_property_spec *regs;
const char *chp;
+ device *bus = device_parent(current);
/* determine the number of reg entries by counting tokens */
- nr_regs = count_entries(current, property_name, property_value, 2);
+ nr_regs = count_entries(current, property_name, property_value,
+ 1 + (device_nr_size_cells(bus) > 0));
/* create working space */
regs = zalloc(nr_regs * sizeof(*regs));
@@ -531,10 +535,11 @@ parse_reg_property(device *current,
/* fill it in */
chp = property_value;
for (reg_nr = 0; reg_nr < nr_regs; reg_nr++) {
- chp = parse_address(current, device_parent(current),
- chp, &regs[reg_nr].address);
- chp = parse_size(current, device_parent(current),
- chp, &regs[reg_nr].size);
+ chp = parse_address(current, bus, chp, &regs[reg_nr].address);
+ if (device_nr_size_cells(bus) > 0)
+ chp = parse_size(current, bus, chp, &regs[reg_nr].size);
+ else
+ memset(&regs[reg_nr].size, sizeof (&regs[reg_nr].size), 0);
}
/* create it */