#include <asm/processor.h>
 #include <asm/spitfire.h>
 
+#ifdef CONFIG_SPARC64
 static void *module_map(unsigned long size)
 {
        struct vm_struct *area;
        return __vmalloc_area(area, GFP_KERNEL, PAGE_KERNEL);
 }
 
+static char *dot2underscore(char *name)
+{
+       return name;
+}
+#endif /* CONFIG_SPARC64 */
+
 void *module_alloc(unsigned long size)
 {
        void *ret;
 {
        unsigned int symidx;
        Elf_Sym *sym;
-       const char *strtab;
+       char *strtab;
        int i;
 
        for (symidx = 0; sechdrs[symidx].sh_type != SHT_SYMTAB; symidx++) {
        strtab = (char *)sechdrs[sechdrs[symidx].sh_link].sh_addr;
 
        for (i = 1; i < sechdrs[symidx].sh_size / sizeof(Elf_Sym); i++) {
-               if (sym[i].st_shndx == SHN_UNDEF &&
-                   ELF_ST_TYPE(sym[i].st_info) == STT_REGISTER)
-                       sym[i].st_shndx = SHN_ABS;
+               if (sym[i].st_shndx == SHN_UNDEF) {
+                       if (ELF_ST_TYPE(sym[i].st_info) == STT_REGISTER) {
+                               sym[i].st_shndx = SHN_ABS;
+                       } else {
+                               char *name = strtab + sym[i].st_name;
+                               dot2underscore(name);
+                       }
+               }
        }
        return 0;
 }
                        + rel[i].r_offset;
                loc32 = (u32 *) location;
 
+#ifdef CONFIG_SPARC64
                BUG_ON(((u64)location >> (u64)32) != (u64)0);
+#endif /* CONFIG_SPARC64 */
 
                /* This is the symbol it is referring to.  Note that all
                   undefined symbols have been resolved.  */
                v = sym->st_value + rel[i].r_addend;
 
                switch (ELF_R_TYPE(rel[i].r_info) & 0xff) {
+#ifdef CONFIG_SPARC64
                case R_SPARC_64:
                        location[0] = v >> 56;
                        location[1] = v >> 48;
                        location[7] = v >>  0;
                        break;
 
+               case R_SPARC_DISP32:
+                       v -= (Elf_Addr) location;
+                       *loc32 = v;
+                       break;
+
+               case R_SPARC_WDISP19:
+                       v -= (Elf_Addr) location;
+                       *loc32 = (*loc32 & ~0x7ffff) |
+                               ((v >> 2) & 0x7ffff);
+                       break;
+
+               case R_SPARC_OLO10:
+                       *loc32 = (*loc32 & ~0x1fff) |
+                               (((v & 0x3ff) +
+                                 (ELF_R_TYPE(rel[i].r_info) >> 8))
+                                & 0x1fff);
+                       break;
+#endif /* CONFIG_SPARC64 */
+
                case R_SPARC_32:
                        location[0] = v >> 24;
                        location[1] = v >> 16;
                        location[3] = v >>  0;
                        break;
 
-               case R_SPARC_DISP32:
-                       v -= (Elf_Addr) location;
-                       *loc32 = v;
-                       break;
-
                case R_SPARC_WDISP30:
                        v -= (Elf_Addr) location;
                        *loc32 = (*loc32 & ~0x3fffffff) |
                                ((v >> 2) & 0x3fffff);
                        break;
 
-               case R_SPARC_WDISP19:
-                       v -= (Elf_Addr) location;
-                       *loc32 = (*loc32 & ~0x7ffff) |
-                               ((v >> 2) & 0x7ffff);
-                       break;
-
                case R_SPARC_LO10:
                        *loc32 = (*loc32 & ~0x3ff) | (v & 0x3ff);
                        break;
                                ((v >> 10) & 0x3fffff);
                        break;
 
-               case R_SPARC_OLO10:
-                       *loc32 = (*loc32 & ~0x1fff) |
-                               (((v & 0x3ff) +
-                                 (ELF_R_TYPE(rel[i].r_info) >> 8))
-                                & 0x1fff);
-                       break;
-
                default:
                        printk(KERN_ERR "module %s: Unknown relocation: %x\n",
                               me->name,
        return 0;
 }
 
+#ifdef CONFIG_SPARC64
 int module_finalize(const Elf_Ehdr *hdr,
                    const Elf_Shdr *sechdrs,
                    struct module *me)
 
        return 0;
 }
+#endif /* CONFIG_SPARC64 */
 
 void module_arch_cleanup(struct module *mod)
 {