diff options
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/cputable.c | 11 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_32.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/vdso.c | 43 | ||||
-rw-r--r-- | arch/powerpc/kernel/vdso32/vdso32.lds.S | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/vdso64/vdso64.lds.S | 10 |
6 files changed, 73 insertions, 9 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 6fdfaa4a82b8..bfd499ee3753 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -1202,14 +1202,13 @@ struct cpu_spec *identify_cpu(unsigned long offset) | |||
1202 | return NULL; | 1202 | return NULL; |
1203 | } | 1203 | } |
1204 | 1204 | ||
1205 | void do_feature_fixups(unsigned long offset, unsigned long value, | 1205 | void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end) |
1206 | void *fixup_start, void *fixup_end) | ||
1207 | { | 1206 | { |
1208 | struct fixup_entry { | 1207 | struct fixup_entry { |
1209 | unsigned long mask; | 1208 | unsigned long mask; |
1210 | unsigned long value; | 1209 | unsigned long value; |
1211 | unsigned int *start; | 1210 | long start_off; |
1212 | unsigned int *end; | 1211 | long end_off; |
1213 | } *fcur, *fend; | 1212 | } *fcur, *fend; |
1214 | 1213 | ||
1215 | fcur = fixup_start; | 1214 | fcur = fixup_start; |
@@ -1224,8 +1223,8 @@ void do_feature_fixups(unsigned long offset, unsigned long value, | |||
1224 | /* These PTRRELOCs will disappear once the new scheme for | 1223 | /* These PTRRELOCs will disappear once the new scheme for |
1225 | * modules and vdso is implemented | 1224 | * modules and vdso is implemented |
1226 | */ | 1225 | */ |
1227 | pstart = PTRRELOC(fcur->start); | 1226 | pstart = ((unsigned int *)fcur) + (fcur->start_off / 4); |
1228 | pend = PTRRELOC(fcur->end); | 1227 | pend = ((unsigned int *)fcur) + (fcur->end_off / 4); |
1229 | 1228 | ||
1230 | for (p = pstart; p < pend; p++) { | 1229 | for (p = pstart; p < pend; p++) { |
1231 | *p = 0x60000000u; | 1230 | *p = 0x60000000u; |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 769e511783b0..a4c2964a3ca6 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -103,7 +103,7 @@ unsigned long __init early_init(unsigned long dt_ptr) | |||
103 | */ | 103 | */ |
104 | spec = identify_cpu(offset); | 104 | spec = identify_cpu(offset); |
105 | 105 | ||
106 | do_feature_fixups(offset, spec->cpu_features, | 106 | do_feature_fixups(spec->cpu_features, |
107 | PTRRELOC(&__start___ftr_fixup), | 107 | PTRRELOC(&__start___ftr_fixup), |
108 | PTRRELOC(&__stop___ftr_fixup)); | 108 | PTRRELOC(&__stop___ftr_fixup)); |
109 | 109 | ||
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 1969b5686eee..16278968dab6 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -354,9 +354,9 @@ void __init setup_system(void) | |||
354 | /* Apply the CPUs-specific and firmware specific fixups to kernel | 354 | /* Apply the CPUs-specific and firmware specific fixups to kernel |
355 | * text (nop out sections not relevant to this CPU or this firmware) | 355 | * text (nop out sections not relevant to this CPU or this firmware) |
356 | */ | 356 | */ |
357 | do_feature_fixups(0, cur_cpu_spec->cpu_features, | 357 | do_feature_fixups(cur_cpu_spec->cpu_features, |
358 | &__start___ftr_fixup, &__stop___ftr_fixup); | 358 | &__start___ftr_fixup, &__stop___ftr_fixup); |
359 | do_feature_fixups(0, powerpc_firmware_features, | 359 | do_feature_fixups(powerpc_firmware_features, |
360 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); | 360 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); |
361 | 361 | ||
362 | /* | 362 | /* |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 1a7e19cdab39..c913ad5cad29 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <asm/vdso.h> | 36 | #include <asm/vdso.h> |
37 | #include <asm/vdso_datapage.h> | 37 | #include <asm/vdso_datapage.h> |
38 | 38 | ||
39 | #include "setup.h" | ||
40 | |||
39 | #undef DEBUG | 41 | #undef DEBUG |
40 | 42 | ||
41 | #ifdef DEBUG | 43 | #ifdef DEBUG |
@@ -586,6 +588,43 @@ static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, | |||
586 | return 0; | 588 | return 0; |
587 | } | 589 | } |
588 | 590 | ||
591 | |||
592 | static __init int vdso_fixup_features(struct lib32_elfinfo *v32, | ||
593 | struct lib64_elfinfo *v64) | ||
594 | { | ||
595 | void *start32; | ||
596 | unsigned long size32; | ||
597 | |||
598 | #ifdef CONFIG_PPC64 | ||
599 | void *start64; | ||
600 | unsigned long size64; | ||
601 | |||
602 | start64 = find_section64(v64->hdr, "__ftr_fixup", &size64); | ||
603 | if (start64) | ||
604 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
605 | start64, start64 + size64); | ||
606 | |||
607 | start64 = find_section64(v64->hdr, "__fw_ftr_fixup", &size64); | ||
608 | if (start64) | ||
609 | do_feature_fixups(powerpc_firmware_features, | ||
610 | start64, start64 + size64); | ||
611 | #endif /* CONFIG_PPC64 */ | ||
612 | |||
613 | start32 = find_section32(v32->hdr, "__ftr_fixup", &size32); | ||
614 | if (start32) | ||
615 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
616 | start32, start32 + size32); | ||
617 | |||
618 | #ifdef CONFIG_PPC64 | ||
619 | start32 = find_section32(v32->hdr, "__fw_ftr_fixup", &size32); | ||
620 | if (start32) | ||
621 | do_feature_fixups(powerpc_firmware_features, | ||
622 | start32, start32 + size32); | ||
623 | #endif /* CONFIG_PPC64 */ | ||
624 | |||
625 | return 0; | ||
626 | } | ||
627 | |||
589 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, | 628 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, |
590 | struct lib64_elfinfo *v64) | 629 | struct lib64_elfinfo *v64) |
591 | { | 630 | { |
@@ -634,6 +673,9 @@ static __init int vdso_setup(void) | |||
634 | if (vdso_fixup_datapage(&v32, &v64)) | 673 | if (vdso_fixup_datapage(&v32, &v64)) |
635 | return -1; | 674 | return -1; |
636 | 675 | ||
676 | if (vdso_fixup_features(&v32, &v64)) | ||
677 | return -1; | ||
678 | |||
637 | if (vdso_fixup_alt_funcs(&v32, &v64)) | 679 | if (vdso_fixup_alt_funcs(&v32, &v64)) |
638 | return -1; | 680 | return -1; |
639 | 681 | ||
@@ -714,6 +756,7 @@ void __init vdso_init(void) | |||
714 | * Setup the syscall map in the vDOS | 756 | * Setup the syscall map in the vDOS |
715 | */ | 757 | */ |
716 | vdso_setup_syscall_map(); | 758 | vdso_setup_syscall_map(); |
759 | |||
717 | /* | 760 | /* |
718 | * Initialize the vDSO images in memory, that is do necessary | 761 | * Initialize the vDSO images in memory, that is do necessary |
719 | * fixups of vDSO symbols, locate trampolines, etc... | 762 | * fixups of vDSO symbols, locate trampolines, etc... |
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S index 6187af2d54c3..26e138c4ce17 100644 --- a/arch/powerpc/kernel/vdso32/vdso32.lds.S +++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S | |||
@@ -32,6 +32,18 @@ SECTIONS | |||
32 | PROVIDE (_etext = .); | 32 | PROVIDE (_etext = .); |
33 | PROVIDE (etext = .); | 33 | PROVIDE (etext = .); |
34 | 34 | ||
35 | . = ALIGN(8); | ||
36 | __ftr_fixup : { | ||
37 | *(__ftr_fixup) | ||
38 | } | ||
39 | |||
40 | #ifdef CONFIG_PPC64 | ||
41 | . = ALIGN(8); | ||
42 | __fw_ftr_fixup : { | ||
43 | *(__fw_ftr_fixup) | ||
44 | } | ||
45 | #endif | ||
46 | |||
35 | /* Other stuff is appended to the text segment: */ | 47 | /* Other stuff is appended to the text segment: */ |
36 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 48 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
37 | .rodata1 : { *(.rodata1) } | 49 | .rodata1 : { *(.rodata1) } |
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 4a2b6dc0960c..2d70f35d50b5 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S | |||
@@ -31,6 +31,16 @@ SECTIONS | |||
31 | PROVIDE (_etext = .); | 31 | PROVIDE (_etext = .); |
32 | PROVIDE (etext = .); | 32 | PROVIDE (etext = .); |
33 | 33 | ||
34 | . = ALIGN(8); | ||
35 | __ftr_fixup : { | ||
36 | *(__ftr_fixup) | ||
37 | } | ||
38 | |||
39 | . = ALIGN(8); | ||
40 | __fw_ftr_fixup : { | ||
41 | *(__fw_ftr_fixup) | ||
42 | } | ||
43 | |||
34 | /* Other stuff is appended to the text segment: */ | 44 | /* Other stuff is appended to the text segment: */ |
35 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 45 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
36 | .rodata1 : { *(.rodata1) } | 46 | .rodata1 : { *(.rodata1) } |