Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
[sfrench/cifs-2.6.git] / include / asm-sparc / a.out.h
1 /* $Id: a.out.h,v 1.13 2000/01/09 10:46:53 anton Exp $ */
2 #ifndef __SPARC_A_OUT_H__
3 #define __SPARC_A_OUT_H__
4
5 #define SPARC_PGSIZE    0x2000        /* Thanks to the sun4 architecture... */
6 #define SEGMENT_SIZE    SPARC_PGSIZE  /* whee... */
7
8 struct exec {
9         unsigned char a_dynamic:1;      /* A __DYNAMIC is in this image */
10         unsigned char a_toolversion:7;
11         unsigned char a_machtype;
12         unsigned short a_info;
13         unsigned long a_text;           /* length of text, in bytes */
14         unsigned long a_data;           /* length of data, in bytes */
15         unsigned long a_bss;            /* length of bss, in bytes */
16         unsigned long a_syms;           /* length of symbol table, in bytes */
17         unsigned long a_entry;          /* where program begins */
18         unsigned long a_trsize;
19         unsigned long a_drsize;
20 };
21
22 /* Where in the file does the text information begin? */
23 #define N_TXTOFF(x)     (N_MAGIC(x) == ZMAGIC ? 0 : sizeof (struct exec))
24
25 /* Where do the Symbols start? */
26 #define N_SYMOFF(x)     (N_TXTOFF(x) + (x).a_text +   \
27                          (x).a_data + (x).a_trsize +  \
28                          (x).a_drsize)
29
30 /* Where does text segment go in memory after being loaded? */
31 #define N_TXTADDR(x)    (((N_MAGIC(x) == ZMAGIC) &&        \
32                          ((x).a_entry < SPARC_PGSIZE)) ?   \
33                           0 : SPARC_PGSIZE)
34
35 /* And same for the data segment.. */
36 #define N_DATADDR(x) (N_MAGIC(x)==OMAGIC ?         \
37                       (N_TXTADDR(x) + (x).a_text)  \
38                        : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
39
40 #define N_TRSIZE(a)     ((a).a_trsize)
41 #define N_DRSIZE(a)     ((a).a_drsize)
42 #define N_SYMSIZE(a)    ((a).a_syms)
43
44 /*
45  * Sparc relocation types
46  */
47 enum reloc_type
48 {
49         RELOC_8,
50         RELOC_16,
51         RELOC_32,       /* simplest relocs */
52         RELOC_DISP8,
53         RELOC_DISP16,
54         RELOC_DISP32,   /* Disp's (pc-rel) */
55         RELOC_WDISP30,
56         RELOC_WDISP22,  /* SR word disp's */
57         RELOC_HI22,
58         RELOC_22,       /* SR 22-bit relocs */
59         RELOC_13,
60         RELOC_LO10,     /* SR 13&10-bit relocs */
61         RELOC_SFA_BASE,
62         RELOC_SFA_OFF13, /* SR S.F.A. relocs */
63         RELOC_BASE10,
64         RELOC_BASE13,
65         RELOC_BASE22,   /* base_relative pic */
66         RELOC_PC10,
67         RELOC_PC22,     /* special pc-rel pic */
68         RELOC_JMP_TBL,  /* jmp_tbl_rel in pic */
69         RELOC_SEGOFF16, /* ShLib offset-in-seg */
70         RELOC_GLOB_DAT,
71         RELOC_JMP_SLOT,
72         RELOC_RELATIVE  /* rtld relocs */
73 };
74
75 /*
76  * Format of a relocation datum.
77  */
78 struct relocation_info /* used when header.a_machtype == M_SPARC */
79 {
80         unsigned long   r_address;  /* relocation addr */
81         unsigned int    r_index:24; /* segment index or symbol index */
82         unsigned int    r_extern:1; /* if F, r_index==SEG#; if T, SYM idx */
83         unsigned int    r_pad:2;    /* <unused> */
84         enum reloc_type r_type:5;   /* type of relocation to perform */
85         long            r_addend;   /* addend for relocation value */
86 };
87
88 #define N_RELOCATION_INFO_DECLARED 1
89
90 #endif /* __SPARC_A_OUT_H__ */