--- xc/programs/Xserver/hw/xfree86/loader/elf.h.orig Tue Jan 15 03:16:52 2002 +++ xc/programs/Xserver/hw/xfree86/loader/elf.h Sat Jan 26 05:26:30 2002 @@ -49,6 +49,7 @@ #define EM_PARISC 15 #define EM_SPARC32PLUS 18 #define EM_PPC 20 +#define EM_SH 42 /* Hitachi SH */ #define EM_SPARCV9 43 #define EM_IA_64 50 #define EM_ALPHA 0x9026 @@ -474,6 +475,37 @@ #define R_ARM_RPC24 254 #define R_ARM_RBASE 255 +/* SH relocs. */ +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 + typedef struct elf32_rel { Elf32_Addr r_offset; Elf32_Word r_info; --- xc/programs/Xserver/hw/xfree86/loader/elfloader.c.orig Tue Jan 15 03:16:52 2002 +++ xc/programs/Xserver/hw/xfree86/loader/elfloader.c Sat Jan 26 08:41:52 2002 @@ -150,6 +150,7 @@ defined(__mc68000__) || \ defined(__alpha__) || \ defined(__sparc__) || \ + defined(__sh__) || \ defined(__ia64__) typedef Elf_Rela Elf_Rel_t; #else @@ -2096,6 +2097,39 @@ #endif /* (__arm__) */ +#if defined(__sh__) + case R_SH_DIR32: + dest32=(unsigned long *)(secp+rel->r_offset); +#ifdef ELFDEBUG + ELFDEBUG( "R_SH_DIR_32\t", dest32 ); + ELFDEBUG( "dest32=%x\t", dest32 ); + ELFDEBUG( "*dest32=%8.8x\t", *dest32 ); +#endif + *dest32=symval+(*dest32); /* S + A */ +#ifdef ELFDEBUG + ELFDEBUG( "*dest32=%8.8x\n", *dest32 ); +#endif + break; + case R_SH_REL32: + dest32=(unsigned long *)(secp+rel->r_offset); +#ifdef ELFDEBUG + ELFDEBUG( "R_SH_REL32 %s\t", + ElfGetSymbolName(elffile,ELF_R_SYM(rel->r_info)) ); + ELFDEBUG( "secp=%x\t", secp ); + ELFDEBUG( "symval=%x\t", symval ); + ELFDEBUG( "dest32=%x\t", dest32 ); + ELFDEBUG( "*dest32=%8.8x\t", *dest32 ); +#endif + + *dest32=symval+(*dest32)-(Elf_Addr)dest32; /* S + A - P */ + +#ifdef ELFDEBUG + ELFDEBUG( "*dest32=%8.8x\n", *dest32 ); +#endif + + break; +#endif /* __sh__ */ + default: ErrorF("Elf_RelocateEntry() Unsupported relocation type %d\n", ELF_R_TYPE(rel->r_info)); @@ -2512,7 +2546,7 @@ continue; } #endif /* i386/alpha */ -#if defined(__powerpc__) || defined(__mc68000__) || defined(__alpha__) || defined(__sparc__) || defined(__ia64__) +#if defined(__powerpc__) || defined(__mc68000__) || defined(__alpha__) || defined(__sparc__) || defined(__ia64__) || defined(__sh__) /* .rela.text */ if( strcmp(ElfGetSectionName(elffile, elffile->sections[i].sh_name), ".rela.text" ) == 0 ) { --- xc/programs/Xserver/hw/xfree86/loader/xf86sym.c.orig Sat Jan 26 08:51:02 2002 +++ xc/programs/Xserver/hw/xfree86/loader/xf86sym.c Sat Jan 26 08:58:45 2002 @@ -115,6 +115,14 @@ extern long __umodsi3(long, long); #endif +#if defined(__sh__) +extern long __udivsi3_i4(long, long); +extern long __sdivsi3_i4(long, long); +extern long __movstr_i4_even(long, long); +extern long __movstr_i4_odd(long, long); +extern long __fpscr_values[2]; +#endif + #if defined(__powerpc__) && (defined(Lynx) || defined(linux)) void _restf14(); void _restf17(); @@ -1007,6 +1015,12 @@ SYMFUNC(inw) SYMFUNC(inl) #endif +#if defined(__sh__) + SYMFUNC(__udivsi3_i4) + SYMFUNC(__sdivsi3_i4) + SYMFUNC(__movstr_i4_even) + SYMFUNC(__movstr_i4_odd) +#endif #ifdef __FreeBSD__ SYMFUNC(sysctlbyname) @@ -1058,6 +1072,9 @@ #if defined(__powerpc__) && (!defined(NO_INLINE) || defined(Lynx)) SYMVAR(ioBase) #endif +#if defined(__sh__) + SYMVAR(__fpscr_values) +#endif /* Globals from xf86Globals.c and xf86Priv.h */ SYMVAR(xf86ConfigDRI)