From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Apple's Open Firmware has a funny bug when creating the /cpus nodes where
it leaves a dangling '\0' character in the CPU name which ends up appearing
in the full path of the node.  This is bogus and confuses /proc/device-tree
badly.

This patch strips those bogus zero's from the node full path when reading
the device-tree from Open Firmware.  The "name" property is not modified
and still contains the spurrious 0 (it basically contains 0 tailing 0
instead of one) but that shouldn't be a problem.

An equivalent patch for ppc32 will follow shortly

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/ppc64/kernel/prom_init.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletion(-)

diff -puN arch/ppc64/kernel/prom_init.c~ppc64-fix-a-device-tree-bug-on-apples arch/ppc64/kernel/prom_init.c
--- 25/arch/ppc64/kernel/prom_init.c~ppc64-fix-a-device-tree-bug-on-apples	2005-06-01 01:16:18.000000000 -0700
+++ 25-akpm/arch/ppc64/kernel/prom_init.c	2005-06-01 01:16:18.000000000 -0700
@@ -1566,7 +1566,7 @@ static void __init scan_dt_build_struct(
 {
 	int l, align;
 	phandle child;
-	char *namep, *prev_name, *sstart;
+	char *namep, *prev_name, *sstart, *p, *ep;
 	unsigned long soff;
 	unsigned char *valp;
 	unsigned long offset = reloc_offset();
@@ -1588,6 +1588,14 @@ static void __init scan_dt_build_struct(
 			call_prom("package-to-path", 3, 1, node, namep, l);
 		}
 		namep[l] = '\0';
+		/* Fixup an Apple bug where they have bogus \0 chars in the
+		 * middle of the path in some properties
+		 */
+		for (p = namep, ep = namep + l; p < ep; p++)
+			if (*p == '\0') {
+				memmove(p, p+1, ep - p);
+				ep--; l--;
+			}
 		*mem_start = _ALIGN(((unsigned long) namep) + strlen(namep) + 1, 4);
 	}
 
_