[SPARC64]: Minor bug fix to obp_read_memory().
authorDavid S. Miller <davem@sunset.davemloft.net>
Thu, 22 Jun 2006 07:00:00 +0000 (00:00 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sat, 24 Jun 2006 06:15:19 +0000 (23:15 -0700)
If we end up zero'ing out the size of one of the entries,
pop it out of the array completely because some code that
examines these things cannot handle a zero length element
properly.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/mm/init.c

index 45a70d6..9d2b0da 100644 (file)
@@ -102,8 +102,6 @@ static void __init read_obp_memory(const char *property,
                prom_halt();
        }
 
-       *num_ents = ents;
-
        /* Sanitize what we got from the firmware, by page aligning
         * everything.
         */
@@ -125,6 +123,25 @@ static void __init read_obp_memory(const char *property,
                regs[i].phys_addr = base;
                regs[i].reg_size = size;
        }
+
+       for (i = 0; i < ents; i++) {
+               if (regs[i].reg_size == 0UL) {
+                       int j;
+
+                       for (j = i; j < ents - 1; j++) {
+                               regs[j].phys_addr =
+                                       regs[j+1].phys_addr;
+                               regs[j].reg_size =
+                                       regs[j+1].reg_size;
+                       }
+
+                       ents--;
+                       i--;
+               }
+       }
+
+       *num_ents = ents;
+
        sort(regs, ents, sizeof(struct linux_prom64_registers),
             cmp_p64, NULL);
 }