diff options
| -rw-r--r-- | scripts/mod/modpost.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 3db4edcc5a12..ee58ded021d7 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -640,7 +640,7 @@ static int data_section(const char *name) | |||
| 640 | * Pattern 0: | 640 | * Pattern 0: |
| 641 | * Do not warn if funtion/data are marked with __init_refok/__initdata_refok. | 641 | * Do not warn if funtion/data are marked with __init_refok/__initdata_refok. |
| 642 | * The pattern is identified by: | 642 | * The pattern is identified by: |
| 643 | * fromsec = .text.init.refok | .data.init.refok | 643 | * fromsec = .text.init.refok* | .data.init.refok* |
| 644 | * | 644 | * |
| 645 | * Pattern 1: | 645 | * Pattern 1: |
| 646 | * If a module parameter is declared __initdata and permissions=0 | 646 | * If a module parameter is declared __initdata and permissions=0 |
| @@ -675,11 +675,18 @@ static int data_section(const char *name) | |||
| 675 | * This pattern is identified by | 675 | * This pattern is identified by |
| 676 | * refsymname = __init_begin, _sinittext, _einittext | 676 | * refsymname = __init_begin, _sinittext, _einittext |
| 677 | * | 677 | * |
| 678 | * Pattern 5: | ||
| 679 | * Xtensa uses literal sections for constants that are accessed PC-relative. | ||
| 680 | * Literal sections may safely reference their text sections. | ||
| 681 | * (Note that the name for the literal section omits any trailing '.text') | ||
| 682 | * tosec = <section>[.text] | ||
| 683 | * fromsec = <section>.literal | ||
| 678 | **/ | 684 | **/ |
| 679 | static int secref_whitelist(const char *modname, const char *tosec, | 685 | static int secref_whitelist(const char *modname, const char *tosec, |
| 680 | const char *fromsec, const char *atsym, | 686 | const char *fromsec, const char *atsym, |
| 681 | const char *refsymname) | 687 | const char *refsymname) |
| 682 | { | 688 | { |
| 689 | int len; | ||
| 683 | const char **s; | 690 | const char **s; |
| 684 | const char *pat2sym[] = { | 691 | const char *pat2sym[] = { |
| 685 | "driver", | 692 | "driver", |
| @@ -701,8 +708,8 @@ static int secref_whitelist(const char *modname, const char *tosec, | |||
| 701 | }; | 708 | }; |
| 702 | 709 | ||
| 703 | /* Check for pattern 0 */ | 710 | /* Check for pattern 0 */ |
| 704 | if ((strcmp(fromsec, ".text.init.refok") == 0) || | 711 | if ((strncmp(fromsec, ".text.init.refok", strlen(".text.init.refok")) == 0) || |
| 705 | (strcmp(fromsec, ".data.init.refok") == 0)) | 712 | (strncmp(fromsec, ".data.init.refok", strlen(".data.init.refok")) == 0)) |
| 706 | return 1; | 713 | return 1; |
| 707 | 714 | ||
| 708 | /* Check for pattern 1 */ | 715 | /* Check for pattern 1 */ |
| @@ -728,6 +735,15 @@ static int secref_whitelist(const char *modname, const char *tosec, | |||
| 728 | if (strcmp(refsymname, *s) == 0) | 735 | if (strcmp(refsymname, *s) == 0) |
| 729 | return 1; | 736 | return 1; |
| 730 | 737 | ||
| 738 | /* Check for pattern 5 */ | ||
| 739 | if (strrcmp(tosec, ".text") == 0) | ||
| 740 | len = strlen(tosec) - strlen(".text"); | ||
| 741 | else | ||
| 742 | len = strlen(tosec); | ||
| 743 | if ((strncmp(tosec, fromsec, len) == 0) && (strlen(fromsec) > len) && | ||
| 744 | (strcmp(fromsec + len, ".literal") == 0)) | ||
| 745 | return 1; | ||
| 746 | |||
| 731 | return 0; | 747 | return 0; |
| 732 | } | 748 | } |
| 733 | 749 | ||
| @@ -856,9 +872,9 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec, | |||
| 856 | refsymname = elf->strtab + refsym->st_name; | 872 | refsymname = elf->strtab + refsym->st_name; |
| 857 | 873 | ||
| 858 | /* check whitelist - we may ignore it */ | 874 | /* check whitelist - we may ignore it */ |
| 859 | if (before && | 875 | if (secref_whitelist(modname, secname, fromsec, |
| 860 | secref_whitelist(modname, secname, fromsec, | 876 | before ? elf->strtab + before->st_name : "", |
| 861 | elf->strtab + before->st_name, refsymname)) | 877 | refsymname)) |
| 862 | return; | 878 | return; |
| 863 | 879 | ||
| 864 | if (before && after) { | 880 | if (before && after) { |
| @@ -1111,6 +1127,8 @@ static int initexit_section_ref_ok(const char *name) | |||
| 1111 | ".smp_locks", | 1127 | ".smp_locks", |
| 1112 | ".stab", | 1128 | ".stab", |
| 1113 | ".m68k_fixup", | 1129 | ".m68k_fixup", |
| 1130 | ".xt.prop", /* xtensa informational section */ | ||
| 1131 | ".xt.lit", /* xtensa informational section */ | ||
| 1114 | NULL | 1132 | NULL |
| 1115 | }; | 1133 | }; |
| 1116 | /* Start of section names */ | 1134 | /* Start of section names */ |
