2005-04-17 02:20:36 +04:00
# ifndef __ASM_SH_ELF_H
# define __ASM_SH_ELF_H
2006-09-27 13:22:53 +04:00
# include <asm/processor.h>
# include <asm/auxvec.h>
# include <asm/ptrace.h>
# include <asm/user.h>
2005-04-17 02:20:36 +04:00
/* SH relocation types */
# 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_TLS_GD_32 144
# define R_SH_TLS_LD_32 145
# define R_SH_TLS_LDO_32 146
# define R_SH_TLS_IE_32 147
# define R_SH_TLS_LE_32 148
# define R_SH_TLS_DTPMOD32 149
# define R_SH_TLS_DTPOFF32 150
# define R_SH_TLS_TPOFF32 151
# 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
/* Keep this the last entry. */
# define R_SH_NUM 256
/*
* ELF register definitions . .
*/
typedef unsigned long elf_greg_t ;
# define ELF_NGREG (sizeof (struct pt_regs) / sizeof(elf_greg_t))
typedef elf_greg_t elf_gregset_t [ ELF_NGREG ] ;
typedef struct user_fpu_struct elf_fpregset_t ;
/*
* This is used to ensure we don ' t load something for the wrong architecture .
*/
# define elf_check_arch(x) ( (x)->e_machine == EM_SH )
/*
* These are used to set parameters in the core dumps .
*/
# define ELF_CLASS ELFCLASS32
# ifdef __LITTLE_ENDIAN__
# define ELF_DATA ELFDATA2LSB
# else
# define ELF_DATA ELFDATA2MSB
# endif
# define ELF_ARCH EM_SH
# define USE_ELF_CORE_DUMP
# define ELF_EXEC_PAGESIZE 4096
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
use of this is to invoke " ./ld.so someprog " to test out a new version of
the loader . We need to make sure that it is out of the way of the program
that it will " exec " , and that there is sufficient room for the brk . */
# define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3)
# define ELF_CORE_COPY_REGS(_dest,_regs) \
memcpy ( ( char * ) & _dest , ( char * ) _regs , \
sizeof ( struct pt_regs ) ) ;
/* This yields a mask that user programs can use to figure out what
instruction set this CPU supports . This could be done in user space ,
but it ' s not easy , and we ' ve already done it here . */
2006-09-27 13:22:53 +04:00
# define ELF_HWCAP (boot_cpu_data.flags)
2005-04-17 02:20:36 +04:00
/* This yields a string that ld.so will use to load implementation
specific libraries for optimization . This is more specific in
intent than poking at uname or / proc / cpuinfo .
For the moment , we have only optimizations for the Intel generations ,
but that could change . . . */
# define ELF_PLATFORM (NULL)
# define ELF_PLAT_INIT(_r, load_addr) \
do { _r - > regs [ 0 ] = 0 ; _r - > regs [ 1 ] = 0 ; _r - > regs [ 2 ] = 0 ; _r - > regs [ 3 ] = 0 ; \
_r - > regs [ 4 ] = 0 ; _r - > regs [ 5 ] = 0 ; _r - > regs [ 6 ] = 0 ; _r - > regs [ 7 ] = 0 ; \
_r - > regs [ 8 ] = 0 ; _r - > regs [ 9 ] = 0 ; _r - > regs [ 10 ] = 0 ; _r - > regs [ 11 ] = 0 ; \
_r - > regs [ 12 ] = 0 ; _r - > regs [ 13 ] = 0 ; _r - > regs [ 14 ] = 0 ; \
_r - > sr = SR_FD ; } while ( 0 )
# ifdef __KERNEL__
# define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX_32BIT)
2005-11-07 11:59:43 +03:00
struct task_struct ;
2005-04-17 02:20:36 +04:00
extern int dump_task_regs ( struct task_struct * , elf_gregset_t * ) ;
extern int dump_task_fpu ( struct task_struct * , elf_fpregset_t * ) ;
# define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
# define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs)
# endif
2006-09-27 13:33:49 +04:00
# ifdef CONFIG_VSYSCALL
/* vDSO has arch_setup_additional_pages */
# define ARCH_HAS_SETUP_ADDITIONAL_PAGES
struct linux_binprm ;
extern int arch_setup_additional_pages ( struct linux_binprm * bprm ,
int executable_stack ) ;
extern unsigned int vdso_enabled ;
extern void __kernel_vsyscall ;
# define VDSO_BASE ((unsigned long)current->mm->context.vdso)
# define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x))
# define ARCH_DLINFO \
do { \
if ( vdso_enabled ) \
NEW_AUX_ENT ( AT_SYSINFO_EHDR , VDSO_BASE ) ; \
} while ( 0 )
# endif /* CONFIG_VSYSCALL */
2005-04-17 02:20:36 +04:00
# endif /* __ASM_SH_ELF_H */