aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2005-05-01 11:58:46 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-01 11:58:46 -0400
commitc4005e4f661a9ec8d91720a6b570865d060afcaf (patch)
tree28fef4260af585b8fc708662eddefef9bdb828de
parent4b88e927e8c38f4053680a3098325142017a37f0 (diff)
[PATCH] ppc64: firmware workaround
Recent gcc 4.0 testing uncovered a firmware issue. Some properties are larger than 31 bytes and due to gcc 4.0s better stack allocation this overflow ran over non volatile register storage. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/ppc64/kernel/prom_init.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/ppc64/kernel/prom_init.c b/arch/ppc64/kernel/prom_init.c
index b0b784f9a4ea..35ec42de962e 100644
--- a/arch/ppc64/kernel/prom_init.c
+++ b/arch/ppc64/kernel/prom_init.c
@@ -1555,6 +1555,12 @@ static void __init scan_dt_build_strings(phandle node, unsigned long *mem_start,
1555 } 1555 }
1556} 1556}
1557 1557
1558/*
1559 * The Open Firmware 1275 specification states properties must be 31 bytes or
1560 * less, however not all firmwares obey this. Make it 64 bytes to be safe.
1561 */
1562#define MAX_PROPERTY_NAME 64
1563
1558static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start, 1564static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1559 unsigned long *mem_end) 1565 unsigned long *mem_end)
1560{ 1566{
@@ -1564,7 +1570,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
1564 unsigned long soff; 1570 unsigned long soff;
1565 unsigned char *valp; 1571 unsigned char *valp;
1566 unsigned long offset = reloc_offset(); 1572 unsigned long offset = reloc_offset();
1567 char pname[32]; 1573 char pname[MAX_PROPERTY_NAME];
1568 char *path; 1574 char *path;
1569 1575
1570 path = RELOC(prom_scratch); 1576 path = RELOC(prom_scratch);