diff options
| author | James Hogan <james.hogan@imgtec.com> | 2013-02-20 08:59:13 -0500 |
|---|---|---|
| committer | James Hogan <james.hogan@imgtec.com> | 2013-03-02 15:11:17 -0500 |
| commit | 2270e6d30bb6601ffd42e9d972442df0499ad547 (patch) | |
| tree | c72e32a15d041cfe38560dca277f335da3f6e7cf | |
| parent | d7900504480ea9d49a6b5f8811f2678ad08d3255 (diff) | |
metag: copy devicetree to non-init memory
Make a copy of the device tree blob in non-init memory. It is required
when using built-in device tree files that the platform code copies the
blob to non-init memory prior to calling unflatten_device_tree(),
otherwise the strings that the device tree refer to will get poisoned
and potentially reused, breaking later reading of the device tree
post-init (such as compatible matching in modules, debugfs, and the
procfs interface).
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Reviewed-by: Vineet Gupta <vgupta@synopsys.com>
| -rw-r--r-- | arch/metag/include/asm/prom.h | 1 | ||||
| -rw-r--r-- | arch/metag/kernel/devtree.c | 17 | ||||
| -rw-r--r-- | arch/metag/kernel/setup.c | 2 |
3 files changed, 20 insertions, 0 deletions
diff --git a/arch/metag/include/asm/prom.h b/arch/metag/include/asm/prom.h index d881396c392c..ccac97e865d0 100644 --- a/arch/metag/include/asm/prom.h +++ b/arch/metag/include/asm/prom.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #define HAVE_ARCH_DEVTREE_FIXUPS | 18 | #define HAVE_ARCH_DEVTREE_FIXUPS |
| 19 | 19 | ||
| 20 | extern struct machine_desc *setup_machine_fdt(void *dt); | 20 | extern struct machine_desc *setup_machine_fdt(void *dt); |
| 21 | extern void copy_fdt(void); | ||
| 21 | extern void metag_dt_memblock_reserve(void); | 22 | extern void metag_dt_memblock_reserve(void); |
| 22 | 23 | ||
| 23 | #endif /* __ASM_METAG_PROM_H */ | 24 | #endif /* __ASM_METAG_PROM_H */ |
diff --git a/arch/metag/kernel/devtree.c b/arch/metag/kernel/devtree.c index 5b6b1d855492..7cd02529636e 100644 --- a/arch/metag/kernel/devtree.c +++ b/arch/metag/kernel/devtree.c | |||
| @@ -95,3 +95,20 @@ struct machine_desc * __init setup_machine_fdt(void *dt) | |||
| 95 | 95 | ||
| 96 | return mdesc_best; | 96 | return mdesc_best; |
| 97 | } | 97 | } |
| 98 | |||
| 99 | /** | ||
| 100 | * copy_fdt - Copy device tree into non-init memory. | ||
| 101 | * | ||
| 102 | * We must copy the flattened device tree blob into non-init memory because the | ||
| 103 | * unflattened device tree will reference the strings in it directly. | ||
| 104 | */ | ||
| 105 | void __init copy_fdt(void) | ||
| 106 | { | ||
| 107 | void *alloc = early_init_dt_alloc_memory_arch( | ||
| 108 | be32_to_cpu(initial_boot_params->totalsize), 0x40); | ||
| 109 | if (alloc) { | ||
| 110 | memcpy(alloc, initial_boot_params, | ||
| 111 | be32_to_cpu(initial_boot_params->totalsize)); | ||
| 112 | initial_boot_params = alloc; | ||
| 113 | } | ||
| 114 | } | ||
diff --git a/arch/metag/kernel/setup.c b/arch/metag/kernel/setup.c index dd6c5ad73917..879246170aec 100644 --- a/arch/metag/kernel/setup.c +++ b/arch/metag/kernel/setup.c | |||
| @@ -406,6 +406,8 @@ void __init setup_arch(char **cmdline_p) | |||
| 406 | cpu_2_hwthread_id[smp_processor_id()] = hard_processor_id(); | 406 | cpu_2_hwthread_id[smp_processor_id()] = hard_processor_id(); |
| 407 | hwthread_id_2_cpu[hard_processor_id()] = smp_processor_id(); | 407 | hwthread_id_2_cpu[hard_processor_id()] = smp_processor_id(); |
| 408 | 408 | ||
| 409 | /* Copy device tree blob into non-init memory before unflattening */ | ||
| 410 | copy_fdt(); | ||
| 409 | unflatten_device_tree(); | 411 | unflatten_device_tree(); |
| 410 | 412 | ||
| 411 | #ifdef CONFIG_SMP | 413 | #ifdef CONFIG_SMP |
