when #size-cells is zero, don't expect a size.
authorAndrew Cagney <cagney@redhat.com>
Wed, 14 Nov 2001 19:54:59 +0000 (19:54 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 14 Nov 2001 19:54:59 +0000 (19:54 +0000)
sim/ppc/ChangeLog
sim/ppc/tree.c

index 3600c79..4fae50e 100644 (file)
@@ -1,3 +1,10 @@
+2001-10-29  Andrew Cagney  <ac131313@redhat.com>
+
+       * tree.c (parse_size): Assert #size-cells > 0.
+       (parse_address): Ditto for #address-cells.
+       (parse_reg_property): Only parse the size when #size-cells is
+       non-zero.
+
 2001-10-25  Andrew Cagney  <ac131313@redhat.com>
 
        * emul_generic.c (OEA_MEMORY_SIZE): Increase to 4mb.
index 3600593..c5106f4 100644 (file)
@@ -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 */