Add builtin symbols to locate fixup section and use them
instead of locating sections through elf headers at runtime.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/kernel/vdso.c              | 55 +++++++------------------
 arch/powerpc/kernel/vdso32/vdso32.lds.S |  8 ++++
 arch/powerpc/kernel/vdso64/vdso64.lds.S |  8 ++++
 3 files changed, 30 insertions(+), 41 deletions(-)

diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index 7042e9edfb96..ba2b935a67f6 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -437,6 +437,12 @@ static int __init vdso_do_func_patch64(struct 
lib32_elfinfo *v32,
 
 #endif /* CONFIG_PPC64 */
 
+#define VDSO_DO_FIXUPS(type, value, bits, sec) do {                            
        \
+       void *__start = (void *)VDSO##bits##_SYMBOL(&vdso##bits##_start, 
sec##_start);  \
+       void *__end = (void *)VDSO##bits##_SYMBOL(&vdso##bits##_start, 
sec##_end);      \
+                                                                               
        \
+       do_##type##_fixups((value), __start, __end);                            
        \
+} while (0)
 
 static __init int vdso_do_find_sections(struct lib32_elfinfo *v32,
                                        struct lib64_elfinfo *v64)
@@ -533,53 +539,20 @@ static __init int vdso_fixup_datapage(struct 
lib32_elfinfo *v32,
 static __init int vdso_fixup_features(struct lib32_elfinfo *v32,
                                      struct lib64_elfinfo *v64)
 {
-       unsigned long size;
-       void *start;
-
 #ifdef CONFIG_PPC64
-       start = find_section64(v64->hdr, "__ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(cur_cpu_spec->cpu_features,
-                                 start, start + size);
-
-       start = find_section64(v64->hdr, "__mmu_ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(cur_cpu_spec->mmu_features,
-                                 start, start + size);
-
-       start = find_section64(v64->hdr, "__fw_ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(powerpc_firmware_features,
-                                 start, start + size);
-
-       start = find_section64(v64->hdr, "__lwsync_fixup", &size);
-       if (start)
-               do_lwsync_fixups(cur_cpu_spec->cpu_features,
-                                start, start + size);
+       VDSO_DO_FIXUPS(feature, cur_cpu_spec->cpu_features, 64, ftr_fixup);
+       VDSO_DO_FIXUPS(feature, cur_cpu_spec->mmu_features, 64, mmu_ftr_fixup);
+       VDSO_DO_FIXUPS(feature, powerpc_firmware_features, 64, fw_ftr_fixup);
+       VDSO_DO_FIXUPS(lwsync, cur_cpu_spec->cpu_features, 64, lwsync_fixup);
 #endif /* CONFIG_PPC64 */
 
 #ifdef CONFIG_VDSO32
-       start = find_section32(v32->hdr, "__ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(cur_cpu_spec->cpu_features,
-                                 start, start + size);
-
-       start = find_section32(v32->hdr, "__mmu_ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(cur_cpu_spec->mmu_features,
-                                 start, start + size);
-
+       VDSO_DO_FIXUPS(feature, cur_cpu_spec->cpu_features, 32, ftr_fixup);
+       VDSO_DO_FIXUPS(feature, cur_cpu_spec->mmu_features, 32, mmu_ftr_fixup);
 #ifdef CONFIG_PPC64
-       start = find_section32(v32->hdr, "__fw_ftr_fixup", &size);
-       if (start)
-               do_feature_fixups(powerpc_firmware_features,
-                                 start, start + size);
+       VDSO_DO_FIXUPS(feature, powerpc_firmware_features, 32, fw_ftr_fixup);
 #endif /* CONFIG_PPC64 */
-
-       start = find_section32(v32->hdr, "__lwsync_fixup", &size);
-       if (start)
-               do_lwsync_fixups(cur_cpu_spec->cpu_features,
-                                start, start + size);
+       VDSO_DO_FIXUPS(lwsync, cur_cpu_spec->cpu_features, 32, lwsync_fixup);
 #endif
 
        return 0;
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S 
b/arch/powerpc/kernel/vdso32/vdso32.lds.S
index a4494a998f58..dd9f262e07c6 100644
--- a/arch/powerpc/kernel/vdso32/vdso32.lds.S
+++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S
@@ -38,17 +38,25 @@ SECTIONS
        PROVIDE(etext = .);
 
        . = ALIGN(8);
+       VDSO_ftr_fixup_start = .;
        __ftr_fixup     : { *(__ftr_fixup) }
+       VDSO_ftr_fixup_end = .;
 
        . = ALIGN(8);
+       VDSO_mmu_ftr_fixup_start = .;
        __mmu_ftr_fixup : { *(__mmu_ftr_fixup) }
+       VDSO_mmu_ftr_fixup_end = .;
 
        . = ALIGN(8);
+       VDSO_lwsync_fixup_start = .;
        __lwsync_fixup  : { *(__lwsync_fixup) }
+       VDSO_lwsync_fixup_end = .;
 
 #ifdef CONFIG_PPC64
        . = ALIGN(8);
+       VDSO_fw_ftr_fixup_start = .;
        __fw_ftr_fixup  : { *(__fw_ftr_fixup) }
+       VDSO_fw_ftr_fixup_end = .;
 #endif
 
        /*
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S 
b/arch/powerpc/kernel/vdso64/vdso64.lds.S
index 2113bf79ccda..e950bf68783a 100644
--- a/arch/powerpc/kernel/vdso64/vdso64.lds.S
+++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S
@@ -39,16 +39,24 @@ SECTIONS
        PROVIDE(etext = .);
 
        . = ALIGN(8);
+       VDSO_ftr_fixup_start = .;
        __ftr_fixup     : { *(__ftr_fixup) }
+       VDSO_ftr_fixup_end = .;
 
        . = ALIGN(8);
+       VDSO_mmu_ftr_fixup_start = .;
        __mmu_ftr_fixup : { *(__mmu_ftr_fixup) }
+       VDSO_mmu_ftr_fixup_end = .;
 
        . = ALIGN(8);
+       VDSO_lwsync_fixup_start = .;
        __lwsync_fixup  : { *(__lwsync_fixup) }
+       VDSO_lwsync_fixup_end = .;
 
        . = ALIGN(8);
+       VDSO_fw_ftr_fixup_start = .;
        __fw_ftr_fixup  : { *(__fw_ftr_fixup) }
+       VDSO_fw_ftr_fixup_end = .;
 
        /*
         * Other stuff is appended to the text segment:
-- 
2.25.0

Reply via email to