Commit a72cdb76 authored by Keith M. Wesolowski's avatar Keith M. Wesolowski

[SPARC32]: Fix sparc32 module support.

parent d619064c
...@@ -12,7 +12,7 @@ obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o $(IRQ_OBJS) \ ...@@ -12,7 +12,7 @@ obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o $(IRQ_OBJS) \
sys_sparc.o sunos_asm.o systbls.o \ sys_sparc.o sunos_asm.o systbls.o \
time.o windows.o cpu.o devices.o sclow.o \ time.o windows.o cpu.o devices.o sclow.o \
tadpole.o tick14.o ptrace.o sys_solaris.o \ tadpole.o tick14.o ptrace.o sys_solaris.o \
unaligned.o muldiv.o semaphore.o sparc_ksyms.o unaligned.o muldiv.o semaphore.o
obj-$(CONFIG_PCI) += pcic.o obj-$(CONFIG_PCI) += pcic.o
obj-$(CONFIG_SUN4) += sun4setup.o obj-$(CONFIG_SUN4) += sun4setup.o
...@@ -20,7 +20,7 @@ obj-$(CONFIG_SMP) += trampoline.o smp.o sun4m_smp.o sun4d_smp.o ...@@ -20,7 +20,7 @@ obj-$(CONFIG_SMP) += trampoline.o smp.o sun4m_smp.o sun4d_smp.o
obj-$(CONFIG_SUN_AUXIO) += auxio.o obj-$(CONFIG_SUN_AUXIO) += auxio.o
obj-$(CONFIG_PCI) += ebus.o obj-$(CONFIG_PCI) += ebus.o
obj-$(CONFIG_SUN_PM) += apc.o pmc.o obj-$(CONFIG_SUN_PM) += apc.o pmc.o
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o sparc_ksyms.o
ifdef CONFIG_SUNOS_EMUL ifdef CONFIG_SUNOS_EMUL
obj-y += sys_sunos.o sunos_ioctl.o obj-y += sys_sunos.o sunos_ioctl.o
......
...@@ -85,22 +85,38 @@ extern int __divdi3(int, int); ...@@ -85,22 +85,38 @@ extern int __divdi3(int, int);
extern void dump_thread(struct pt_regs *, struct user *); extern void dump_thread(struct pt_regs *, struct user *);
/* Private functions with odd calling conventions. */
extern void ___atomic_add(void);
extern void ___atomic_sub(void);
extern void ___set_bit(void);
extern void ___clear_bit(void);
extern void ___change_bit(void);
/* One thing to note is that the way the symbols of the mul/div /* One thing to note is that the way the symbols of the mul/div
* support routines are named is a mess, they all start with * support routines are named is a mess, they all start with
* a '.' which makes it a bitch to export, here is the trick: * a '.' which makes it a bitch to export, here is the trick:
*/ */
#define EXPORT_SYMBOL_DOT(sym) \ /* If the interface of any of these special functions does ever
extern int __sparc_dot_ ## sym (int) __asm__("." #sym); \ * change in an incompatible way, you must modify this.
const struct kernel_symbol __ksymtab___sparc_dot_##sym \ */
__attribute__((section("__ksymtab"))) \ #define DOT_PROTO(sym) extern int __dot_##sym(int, int)
= { (unsigned long)&__sparc_dot_##sym , "." #sym }
#ifdef __GENKSYMS__
#define EXPORT_SYMBOL_PRIVATE(sym) \ #define EXPORT_SYMBOL_DOT(sym) \
extern int __sparc_priv_ ## sym (int) __asm__("__" #sym); \ DOT_PROTO(sym); \
const struct kernel_symbol __export_priv_##sym \ EXPORT_SYMBOL(__dot_ ## sym)
__attribute__((section("__ksymtab"))) = \ #else /* !__GENKSYMS__ */
{ (unsigned long) &__sparc_priv_ ## sym, "__" #sym } #define EXPORT_SYMBOL_DOT(sym) \
DOT_PROTO(sym) __asm__("." # sym); \
__CRC_SYMBOL(__dot_##sym, "") \
static const char __kstrtab___dot_##sym[] \
__attribute__((section("__ksymtab_strings"))) \
= "." #sym; \
static const struct kernel_symbol __ksymtab___dot_##sym \
__attribute__((section("__ksymtab"))) \
= { (unsigned long)&__dot_##sym, __kstrtab___dot_##sym }
#endif
/* used by various drivers */ /* used by various drivers */
EXPORT_SYMBOL(sparc_cpu_model); EXPORT_SYMBOL(sparc_cpu_model);
...@@ -131,13 +147,13 @@ EXPORT_SYMBOL(sparc_valid_addr_bitmap); ...@@ -131,13 +147,13 @@ EXPORT_SYMBOL(sparc_valid_addr_bitmap);
EXPORT_SYMBOL(phys_base); EXPORT_SYMBOL(phys_base);
/* Atomic operations. */ /* Atomic operations. */
EXPORT_SYMBOL_PRIVATE(_atomic_add); EXPORT_SYMBOL(___atomic_add);
EXPORT_SYMBOL_PRIVATE(_atomic_sub); EXPORT_SYMBOL(___atomic_sub);
/* Bit operations. */ /* Bit operations. */
EXPORT_SYMBOL_PRIVATE(_set_bit); EXPORT_SYMBOL(___set_bit);
EXPORT_SYMBOL_PRIVATE(_clear_bit); EXPORT_SYMBOL(___clear_bit);
EXPORT_SYMBOL_PRIVATE(_change_bit); EXPORT_SYMBOL(___change_bit);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* IRQ implementation. */ /* IRQ implementation. */
......
...@@ -141,14 +141,26 @@ new_symbol(const char *name, struct module *module, unsigned int *crc) ...@@ -141,14 +141,26 @@ new_symbol(const char *name, struct module *module, unsigned int *crc)
symbolhash[hash] = new; symbolhash[hash] = new;
} }
#define DOTSYM_PFX "__dot_"
struct symbol * struct symbol *
find_symbol(const char *name) find_symbol(const char *name)
{ {
struct symbol *s; struct symbol *s;
char dotname[64 + sizeof(DOTSYM_PFX)];
/* For our purposes, .foo matches foo. PPC64 needs this. */ /* .foo matches foo. PPC64 needs this. */
if (name[0] == '.') if (name[0] == '.') {
name++; name++;
strcpy(dotname, DOTSYM_PFX);
strncat(dotname, name, sizeof(dotname) - sizeof(DOTSYM_PFX) - 1);
dotname[sizeof(dotname)-1] = 0;
/* Sparc32 wants .foo to match __dot_foo, try this first. */
for (s = symbolhash[tdb_hash(dotname) % SYMBOL_HASH_SIZE]; s; s=s->next) {
if (strcmp(s->name, dotname) == 0)
return s;
}
}
for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s=s->next) { for (s = symbolhash[tdb_hash(name) % SYMBOL_HASH_SIZE]; s; s=s->next) {
if (strcmp(s->name, name) == 0) if (strcmp(s->name, name) == 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment