aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@ZenIV.linux.org.uk>2005-09-11 23:14:07 -0400
committerDavid S. Miller <davem@davemloft.net>2005-09-11 23:14:07 -0400
commit7caaeabb17758295edff9703c18a840073c5b8f4 (patch)
treea33a4bcc77be6077fd8b787380bf13a38828d211
parent357d596bd552ad157a906289ab13ea6ba7e66e3d (diff)
[SPARC]: Fix dot-symbol exporting for good.
From: Al Viro <viro@ZenIV.linux.org.uk> Instead of playing all of these hand-coded assembler aliasing games, just translate symbol names in the name space ".sym" to "_Sym" at module load time. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc/kernel/module.c9
-rw-r--r--arch/sparc/kernel/sparc_ksyms.c31
-rw-r--r--arch/sparc/lib/mul.S2
-rw-r--r--arch/sparc/lib/rem.S2
-rw-r--r--arch/sparc/lib/sdiv.S2
-rw-r--r--arch/sparc/lib/udiv.S2
-rw-r--r--arch/sparc/lib/umul.S2
-rw-r--r--arch/sparc/lib/urem.S2
-rw-r--r--scripts/mod/modpost.c6
9 files changed, 36 insertions, 22 deletions
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c
index 7931d6f92819..787d5f1347ec 100644
--- a/arch/sparc/kernel/module.c
+++ b/arch/sparc/kernel/module.c
@@ -10,6 +10,7 @@
10#include <linux/vmalloc.h> 10#include <linux/vmalloc.h>
11#include <linux/fs.h> 11#include <linux/fs.h>
12#include <linux/string.h> 12#include <linux/string.h>
13#include <linux/ctype.h>
13 14
14void *module_alloc(unsigned long size) 15void *module_alloc(unsigned long size)
15{ 16{
@@ -37,7 +38,7 @@ void module_free(struct module *mod, void *module_region)
37} 38}
38 39
39/* Make generic code ignore STT_REGISTER dummy undefined symbols, 40/* Make generic code ignore STT_REGISTER dummy undefined symbols,
40 * and replace references to .func with func as in ppc64's dedotify. 41 * and replace references to .func with _Func
41 */ 42 */
42int module_frob_arch_sections(Elf_Ehdr *hdr, 43int module_frob_arch_sections(Elf_Ehdr *hdr,
43 Elf_Shdr *sechdrs, 44 Elf_Shdr *sechdrs,
@@ -64,8 +65,10 @@ int module_frob_arch_sections(Elf_Ehdr *hdr,
64 sym[i].st_shndx = SHN_ABS; 65 sym[i].st_shndx = SHN_ABS;
65 else { 66 else {
66 char *name = strtab + sym[i].st_name; 67 char *name = strtab + sym[i].st_name;
67 if (name[0] == '.') 68 if (name[0] == '.') {
68 memmove(name, name+1, strlen(name)); 69 name[0] = '_';
70 name[1] = toupper(name[1]);
71 }
69 } 72 }
70 } 73 }
71 } 74 }
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
index f84809333624..1c8fd0fd9305 100644
--- a/arch/sparc/kernel/sparc_ksyms.c
+++ b/arch/sparc/kernel/sparc_ksyms.c
@@ -97,19 +97,12 @@ extern void ___rw_write_enter(void);
97/* Alias functions whose names begin with "." and export the aliases. 97/* Alias functions whose names begin with "." and export the aliases.
98 * The module references will be fixed up by module_frob_arch_sections. 98 * The module references will be fixed up by module_frob_arch_sections.
99 */ 99 */
100#define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \ 100extern int _Div(int, int);
101 extern __ret __x(__arg1, __arg2); \ 101extern int _Mul(int, int);
102 asm(".weak " #__x);\ 102extern int _Rem(int, int);
103 asm(#__x "=." #__x); 103extern unsigned _Udiv(unsigned, unsigned);
104 104extern unsigned _Umul(unsigned, unsigned);
105DOT_ALIAS2(int, div, int, int) 105extern unsigned _Urem(unsigned, unsigned);
106DOT_ALIAS2(int, mul, int, int)
107DOT_ALIAS2(int, rem, int, int)
108DOT_ALIAS2(unsigned, udiv, unsigned, unsigned)
109DOT_ALIAS2(unsigned, umul, unsigned, unsigned)
110DOT_ALIAS2(unsigned, urem, unsigned, unsigned)
111
112#undef DOT_ALIAS2
113 106
114/* used by various drivers */ 107/* used by various drivers */
115EXPORT_SYMBOL(sparc_cpu_model); 108EXPORT_SYMBOL(sparc_cpu_model);
@@ -320,12 +313,12 @@ EXPORT_SYMBOL(__lshrdi3);
320EXPORT_SYMBOL(__muldi3); 313EXPORT_SYMBOL(__muldi3);
321EXPORT_SYMBOL(__divdi3); 314EXPORT_SYMBOL(__divdi3);
322 315
323EXPORT_SYMBOL(rem); 316EXPORT_SYMBOL(_Rem);
324EXPORT_SYMBOL(urem); 317EXPORT_SYMBOL(_Urem);
325EXPORT_SYMBOL(mul); 318EXPORT_SYMBOL(_Mul);
326EXPORT_SYMBOL(umul); 319EXPORT_SYMBOL(_Umul);
327EXPORT_SYMBOL(div); 320EXPORT_SYMBOL(_Div);
328EXPORT_SYMBOL(udiv); 321EXPORT_SYMBOL(_Udiv);
329 322
330#ifdef CONFIG_DEBUG_BUGVERBOSE 323#ifdef CONFIG_DEBUG_BUGVERBOSE
331EXPORT_SYMBOL(do_BUG); 324EXPORT_SYMBOL(do_BUG);
diff --git a/arch/sparc/lib/mul.S b/arch/sparc/lib/mul.S
index 83dffbc2f62f..da693560d878 100644
--- a/arch/sparc/lib/mul.S
+++ b/arch/sparc/lib/mul.S
@@ -16,7 +16,9 @@
16 */ 16 */
17 17
18 .globl .mul 18 .globl .mul
19 .globl _Mul
19.mul: 20.mul:
21_Mul: /* needed for export */
20 mov %o0, %y ! multiplier -> Y 22 mov %o0, %y ! multiplier -> Y
21 andncc %o0, 0xfff, %g0 ! test bits 12..31 23 andncc %o0, 0xfff, %g0 ! test bits 12..31
22 be Lmul_shortway ! if zero, can do it the short way 24 be Lmul_shortway ! if zero, can do it the short way
diff --git a/arch/sparc/lib/rem.S b/arch/sparc/lib/rem.S
index 44508148d055..bf015a90d07e 100644
--- a/arch/sparc/lib/rem.S
+++ b/arch/sparc/lib/rem.S
@@ -43,7 +43,9 @@
43 43
44 44
45 .globl .rem 45 .globl .rem
46 .globl _Rem
46.rem: 47.rem:
48_Rem: /* needed for export */
47 ! compute sign of result; if neither is negative, no problem 49 ! compute sign of result; if neither is negative, no problem
48 orcc %o1, %o0, %g0 ! either negative? 50 orcc %o1, %o0, %g0 ! either negative?
49 bge 2f ! no, go do the divide 51 bge 2f ! no, go do the divide
diff --git a/arch/sparc/lib/sdiv.S b/arch/sparc/lib/sdiv.S
index e0ad80b6f63d..af9451629d0b 100644
--- a/arch/sparc/lib/sdiv.S
+++ b/arch/sparc/lib/sdiv.S
@@ -43,7 +43,9 @@
43 43
44 44
45 .globl .div 45 .globl .div
46 .globl _Div
46.div: 47.div:
48_Div: /* needed for export */
47 ! compute sign of result; if neither is negative, no problem 49 ! compute sign of result; if neither is negative, no problem
48 orcc %o1, %o0, %g0 ! either negative? 50 orcc %o1, %o0, %g0 ! either negative?
49 bge 2f ! no, go do the divide 51 bge 2f ! no, go do the divide
diff --git a/arch/sparc/lib/udiv.S b/arch/sparc/lib/udiv.S
index 2abfc6b0f3e9..169e01da6715 100644
--- a/arch/sparc/lib/udiv.S
+++ b/arch/sparc/lib/udiv.S
@@ -43,7 +43,9 @@
43 43
44 44
45 .globl .udiv 45 .globl .udiv
46 .globl _Udiv
46.udiv: 47.udiv:
48_Udiv: /* needed for export */
47 49
48 ! Ready to divide. Compute size of quotient; scale comparand. 50 ! Ready to divide. Compute size of quotient; scale comparand.
49 orcc %o1, %g0, %o5 51 orcc %o1, %g0, %o5
diff --git a/arch/sparc/lib/umul.S b/arch/sparc/lib/umul.S
index a784720a8a22..f0e5b20a2536 100644
--- a/arch/sparc/lib/umul.S
+++ b/arch/sparc/lib/umul.S
@@ -21,7 +21,9 @@
21 */ 21 */
22 22
23 .globl .umul 23 .globl .umul
24 .globl _Umul
24.umul: 25.umul:
26_Umul: /* needed for export */
25 or %o0, %o1, %o4 27 or %o0, %o1, %o4
26 mov %o0, %y ! multiplier -> Y 28 mov %o0, %y ! multiplier -> Y
27 29
diff --git a/arch/sparc/lib/urem.S b/arch/sparc/lib/urem.S
index ec7f0c502c56..6b92bdc8b04c 100644
--- a/arch/sparc/lib/urem.S
+++ b/arch/sparc/lib/urem.S
@@ -41,7 +41,9 @@
41 */ 41 */
42 42
43 .globl .urem 43 .globl .urem
44 .globl _Urem
44.urem: 45.urem:
46_Urem: /* needed for export */
45 47
46 ! Ready to divide. Compute size of quotient; scale comparand. 48 ! Ready to divide. Compute size of quotient; scale comparand.
47 orcc %o1, %g0, %o5 49 orcc %o1, %g0, %o5
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 09ffca54b373..3bed09e625c0 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -370,6 +370,12 @@ handle_modversions(struct module *mod, struct elf_info *info,
370 /* Ignore register directives. */ 370 /* Ignore register directives. */
371 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) 371 if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
372 break; 372 break;
373 if (symname[0] == '.') {
374 char *munged = strdup(symname);
375 munged[0] = '_';
376 munged[1] = toupper(munged[1]);
377 symname = munged;
378 }
373 } 379 }
374#endif 380#endif
375 381