diff options
Diffstat (limited to 'arch/powerpc/kernel/vdso.c')
| -rw-r--r-- | arch/powerpc/kernel/vdso.c | 43 |
1 files changed, 43 insertions, 0 deletions
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... |
