diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2009-10-05 16:28:47 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-10-27 01:42:39 -0400 |
commit | 171fb12570b479723c49ef9f8911e40e516f3394 (patch) | |
tree | 9d1c1c2162fab3e16caa6da0700271b922dd10a5 | |
parent | 7abb840b496f834a71a8943bb189683da320f047 (diff) |
powerpc/iseries: Remove compiler version dependent hack
The creation of the flattened device tree depended on the compiler
putting the constant strings for an object in a section with a
particular name. This was changed with recent compilers. Do this
explicitly instead.
Without this patch, iseries kernels may silently not boot when built with
some compilers.
Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/platforms/iseries/Makefile | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/iseries/dt.c | 56 |
2 files changed, 25 insertions, 42 deletions
diff --git a/arch/powerpc/platforms/iseries/Makefile b/arch/powerpc/platforms/iseries/Makefile index cc7161ff166..ce014928d46 100644 --- a/arch/powerpc/platforms/iseries/Makefile +++ b/arch/powerpc/platforms/iseries/Makefile | |||
@@ -1,18 +1,9 @@ | |||
1 | EXTRA_CFLAGS += -mno-minimal-toc | 1 | EXTRA_CFLAGS += -mno-minimal-toc |
2 | 2 | ||
3 | extra-y += dt.o | ||
4 | |||
5 | obj-y += exception.o | 3 | obj-y += exception.o |
6 | obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \ | 4 | obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt.o mf.o lpevents.o \ |
7 | hvcall.o proc.o htab.o iommu.o misc.o irq.o | 5 | hvcall.o proc.o htab.o iommu.o misc.o irq.o |
8 | obj-$(CONFIG_PCI) += pci.o | 6 | obj-$(CONFIG_PCI) += pci.o |
9 | obj-$(CONFIG_SMP) += smp.o | 7 | obj-$(CONFIG_SMP) += smp.o |
10 | obj-$(CONFIG_VIOPATH) += viopath.o vio.o | 8 | obj-$(CONFIG_VIOPATH) += viopath.o vio.o |
11 | obj-$(CONFIG_MODULES) += ksyms.o | 9 | obj-$(CONFIG_MODULES) += ksyms.o |
12 | |||
13 | quiet_cmd_dt_strings = DT_STR $@ | ||
14 | cmd_dt_strings = $(OBJCOPY) --rename-section .rodata.str1.8=.dt_strings \ | ||
15 | $< $@ | ||
16 | |||
17 | $(obj)/dt_mod.o: $(obj)/dt.o | ||
18 | $(call if_changed,dt_strings) | ||
diff --git a/arch/powerpc/platforms/iseries/dt.c b/arch/powerpc/platforms/iseries/dt.c index c5a87a72057..7f45a51fe79 100644 --- a/arch/powerpc/platforms/iseries/dt.c +++ b/arch/powerpc/platforms/iseries/dt.c | |||
@@ -51,11 +51,16 @@ | |||
51 | 51 | ||
52 | /* | 52 | /* |
53 | * These are created by the linker script at the start and end | 53 | * These are created by the linker script at the start and end |
54 | * of the section containing all the strings from this file. | 54 | * of the section containing all the strings marked with the DS macro. |
55 | */ | 55 | */ |
56 | extern char __dt_strings_start[]; | 56 | extern char __dt_strings_start[]; |
57 | extern char __dt_strings_end[]; | 57 | extern char __dt_strings_end[]; |
58 | 58 | ||
59 | #define DS(s) ({ \ | ||
60 | static const char __s[] __attribute__((section(".dt_strings"))) = s; \ | ||
61 | __s; \ | ||
62 | }) | ||
63 | |||
59 | struct iseries_flat_dt { | 64 | struct iseries_flat_dt { |
60 | struct boot_param_header header; | 65 | struct boot_param_header header; |
61 | u64 reserve_map[2]; | 66 | u64 reserve_map[2]; |
@@ -64,9 +69,8 @@ struct iseries_flat_dt { | |||
64 | static void * __initdata dt_data; | 69 | static void * __initdata dt_data; |
65 | 70 | ||
66 | /* | 71 | /* |
67 | * Putting these strings here keeps them out of the section | 72 | * Putting these strings here keeps them out of the .dt_strings section |
68 | * that we rename to .dt_strings using objcopy and capture | 73 | * that we capture for the strings blob of the flattened device tree. |
69 | * for the strings blob of the flattened device tree. | ||
70 | */ | 74 | */ |
71 | static char __initdata device_type_cpu[] = "cpu"; | 75 | static char __initdata device_type_cpu[] = "cpu"; |
72 | static char __initdata device_type_memory[] = "memory"; | 76 | static char __initdata device_type_memory[] = "memory"; |
@@ -173,7 +177,7 @@ static void __init dt_start_node(struct iseries_flat_dt *dt, const char *name) | |||
173 | 177 | ||
174 | #define dt_end_node(dt) dt_push_u32(dt, OF_DT_END_NODE) | 178 | #define dt_end_node(dt) dt_push_u32(dt, OF_DT_END_NODE) |
175 | 179 | ||
176 | static void __init dt_prop(struct iseries_flat_dt *dt, const char *name, | 180 | static void __init __dt_prop(struct iseries_flat_dt *dt, const char *name, |
177 | const void *data, int len) | 181 | const void *data, int len) |
178 | { | 182 | { |
179 | unsigned long offset; | 183 | unsigned long offset; |
@@ -191,44 +195,32 @@ static void __init dt_prop(struct iseries_flat_dt *dt, const char *name, | |||
191 | /* The actual data. */ | 195 | /* The actual data. */ |
192 | dt_push_bytes(dt, data, len); | 196 | dt_push_bytes(dt, data, len); |
193 | } | 197 | } |
198 | #define dt_prop(dt, name, data, len) __dt_prop((dt), DS(name), (data), (len)) | ||
194 | 199 | ||
195 | static void __init dt_prop_str(struct iseries_flat_dt *dt, const char *name, | 200 | #define dt_prop_str(dt, name, data) \ |
196 | const char *data) | 201 | dt_prop((dt), name, (data), strlen((data)) + 1); /* + 1 for NULL */ |
197 | { | ||
198 | dt_prop(dt, name, data, strlen(data) + 1); /* + 1 for NULL */ | ||
199 | } | ||
200 | 202 | ||
201 | static void __init dt_prop_u32(struct iseries_flat_dt *dt, const char *name, | 203 | static void __init __dt_prop_u32(struct iseries_flat_dt *dt, const char *name, |
202 | u32 data) | 204 | u32 data) |
203 | { | 205 | { |
204 | dt_prop(dt, name, &data, sizeof(u32)); | 206 | __dt_prop(dt, name, &data, sizeof(u32)); |
205 | } | 207 | } |
208 | #define dt_prop_u32(dt, name, data) __dt_prop_u32((dt), DS(name), (data)) | ||
206 | 209 | ||
207 | static void __init __maybe_unused dt_prop_u64(struct iseries_flat_dt *dt, | 210 | static void __init __maybe_unused __dt_prop_u64(struct iseries_flat_dt *dt, |
208 | const char *name, | 211 | const char *name, u64 data) |
209 | u64 data) | ||
210 | { | 212 | { |
211 | dt_prop(dt, name, &data, sizeof(u64)); | 213 | __dt_prop(dt, name, &data, sizeof(u64)); |
212 | } | 214 | } |
215 | #define dt_prop_u64(dt, name, data) __dt_prop_u64((dt), DS(name), (data)) | ||
213 | 216 | ||
214 | static void __init dt_prop_u64_list(struct iseries_flat_dt *dt, | 217 | #define dt_prop_u64_list(dt, name, data, n) \ |
215 | const char *name, u64 *data, int n) | 218 | dt_prop((dt), name, (data), sizeof(u64) * (n)) |
216 | { | ||
217 | dt_prop(dt, name, data, sizeof(u64) * n); | ||
218 | } | ||
219 | 219 | ||
220 | static void __init dt_prop_u32_list(struct iseries_flat_dt *dt, | 220 | #define dt_prop_u32_list(dt, name, data, n) \ |
221 | const char *name, u32 *data, int n) | 221 | dt_prop((dt), name, (data), sizeof(u32) * (n)) |
222 | { | ||
223 | dt_prop(dt, name, data, sizeof(u32) * n); | ||
224 | } | ||
225 | 222 | ||
226 | #ifdef notyet | 223 | #define dt_prop_empty(dt, name) dt_prop((dt), name, NULL, 0) |
227 | static void __init dt_prop_empty(struct iseries_flat_dt *dt, const char *name) | ||
228 | { | ||
229 | dt_prop(dt, name, NULL, 0); | ||
230 | } | ||
231 | #endif | ||
232 | 224 | ||
233 | static void __init dt_cpus(struct iseries_flat_dt *dt) | 225 | static void __init dt_cpus(struct iseries_flat_dt *dt) |
234 | { | 226 | { |