Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6-block.git] / include / asm-sparc64 / elf.h
1 /* $Id: elf.h,v 1.32 2002/02/09 19:49:31 davem Exp $ */
2 #ifndef __ASM_SPARC64_ELF_H
3 #define __ASM_SPARC64_ELF_H
4
5 /*
6  * ELF register definitions..
7  */
8
9 #include <asm/ptrace.h>
10 #include <asm/processor.h>
11 #include <asm/uaccess.h>
12 #include <asm/spitfire.h>
13
14 /*
15  * Sparc section types
16  */
17 #define STT_REGISTER            13
18
19 /*
20  * Sparc ELF relocation types
21  */
22 #define R_SPARC_NONE            0
23 #define R_SPARC_8               1
24 #define R_SPARC_16              2
25 #define R_SPARC_32              3
26 #define R_SPARC_DISP8           4
27 #define R_SPARC_DISP16          5
28 #define R_SPARC_DISP32          6
29 #define R_SPARC_WDISP30         7
30 #define R_SPARC_WDISP22         8
31 #define R_SPARC_HI22            9
32 #define R_SPARC_22              10
33 #define R_SPARC_13              11
34 #define R_SPARC_LO10            12
35 #define R_SPARC_GOT10           13
36 #define R_SPARC_GOT13           14
37 #define R_SPARC_GOT22           15
38 #define R_SPARC_PC10            16
39 #define R_SPARC_PC22            17
40 #define R_SPARC_WPLT30          18
41 #define R_SPARC_COPY            19
42 #define R_SPARC_GLOB_DAT        20
43 #define R_SPARC_JMP_SLOT        21
44 #define R_SPARC_RELATIVE        22
45 #define R_SPARC_UA32            23
46 #define R_SPARC_PLT32           24
47 #define R_SPARC_HIPLT22         25
48 #define R_SPARC_LOPLT10         26
49 #define R_SPARC_PCPLT32         27
50 #define R_SPARC_PCPLT22         28
51 #define R_SPARC_PCPLT10         29
52 #define R_SPARC_10              30
53 #define R_SPARC_11              31
54 #define R_SPARC_64              32
55 #define R_SPARC_OLO10           33
56 #define R_SPARC_WDISP16         40
57 #define R_SPARC_WDISP19         41
58 #define R_SPARC_7               43
59 #define R_SPARC_5               44
60 #define R_SPARC_6               45
61
62 /* Bits present in AT_HWCAP, primarily for Sparc32.  */
63
64 #define HWCAP_SPARC_FLUSH       1    /* CPU supports flush instruction. */
65 #define HWCAP_SPARC_STBAR       2
66 #define HWCAP_SPARC_SWAP        4
67 #define HWCAP_SPARC_MULDIV      8
68 #define HWCAP_SPARC_V9          16
69 #define HWCAP_SPARC_ULTRA3      32
70 #define HWCAP_SPARC_BLKINIT     64
71 #define HWCAP_SPARC_N2          128
72
73 #define CORE_DUMP_USE_REGSET
74
75 /*
76  * These are used to set parameters in the core dumps.
77  */
78 #ifndef ELF_ARCH
79 #define ELF_ARCH                EM_SPARCV9
80 #define ELF_CLASS               ELFCLASS64
81 #define ELF_DATA                ELFDATA2MSB
82
83 /* Format of 64-bit elf_gregset_t is:
84  *      G0 --> G7
85  *      O0 --> O7
86  *      L0 --> L7
87  *      I0 --> I7
88  *      TSTATE
89  *      TPC
90  *      TNPC
91  *      Y
92  */
93 typedef unsigned long elf_greg_t;
94 #define ELF_NGREG 36
95 typedef elf_greg_t elf_gregset_t[ELF_NGREG];
96
97 typedef struct {
98         unsigned long   pr_regs[32];
99         unsigned long   pr_fsr;
100         unsigned long   pr_gsr;
101         unsigned long   pr_fprs;
102 } elf_fpregset_t;
103 #endif
104
105 /*
106  * This is used to ensure we don't load something for the wrong architecture.
107  */
108 #ifndef elf_check_arch
109 #define elf_check_arch(x) ((x)->e_machine == ELF_ARCH)  /* Might be EM_SPARCV9 or EM_SPARC */
110 #endif
111
112 #define USE_ELF_CORE_DUMP
113 #define ELF_EXEC_PAGESIZE       PAGE_SIZE
114
115 /* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
116    use of this is to invoke "./ld.so someprog" to test out a new version of
117    the loader.  We need to make sure that it is out of the way of the program
118    that it will "exec", and that there is sufficient room for the brk.  */
119
120 #ifndef ELF_ET_DYN_BASE
121 #define ELF_ET_DYN_BASE         0x0000010000000000UL
122 #endif
123
124
125 /* This yields a mask that user programs can use to figure out what
126    instruction set this cpu supports.  */
127
128 /* On Ultra, we support all of the v8 capabilities. */
129 static inline unsigned int sparc64_elf_hwcap(void)
130 {
131         unsigned int cap = (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR |
132                             HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV |
133                             HWCAP_SPARC_V9);
134
135         if (tlb_type == cheetah || tlb_type == cheetah_plus)
136                 cap |= HWCAP_SPARC_ULTRA3;
137         else if (tlb_type == hypervisor) {
138                 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 ||
139                     sun4v_chip_type == SUN4V_CHIP_NIAGARA2)
140                         cap |= HWCAP_SPARC_BLKINIT;
141                 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2)
142                         cap |= HWCAP_SPARC_N2;
143         }
144
145         return cap;
146 }
147
148 #define ELF_HWCAP       sparc64_elf_hwcap();
149
150 /* This yields a string that ld.so will use to load implementation
151    specific libraries for optimization.  This is more specific in
152    intent than poking at uname or /proc/cpuinfo.  */
153
154 #define ELF_PLATFORM    (NULL)
155
156 #define SET_PERSONALITY(ex, ibcs2)                      \
157 do {    unsigned long new_flags = current_thread_info()->flags; \
158         new_flags &= _TIF_32BIT;                        \
159         if ((ex).e_ident[EI_CLASS] == ELFCLASS32)       \
160                 new_flags |= _TIF_32BIT;                \
161         else                                            \
162                 new_flags &= ~_TIF_32BIT;               \
163         if ((current_thread_info()->flags & _TIF_32BIT) \
164             != new_flags)                               \
165                 set_thread_flag(TIF_ABI_PENDING);       \
166         else                                            \
167                 clear_thread_flag(TIF_ABI_PENDING);     \
168         /* flush_thread will update pgd cache */        \
169         if (ibcs2)                                      \
170                 set_personality(PER_SVR4);              \
171         else if (current->personality != PER_LINUX32)   \
172                 set_personality(PER_LINUX);             \
173 } while (0)
174
175 #endif /* !(__ASM_SPARC64_ELF_H) */