Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[linux-2.6] / include / linux / som.h
1 #ifndef _LINUX_SOM_H
2 #define _LINUX_SOM_H
3
4 /* File format definition for SOM executables / shared libraries */
5
6 /* we need struct timespec */
7 #include <linux/time.h>
8
9 #define SOM_PAGESIZE 4096
10
11 /* this is the SOM header */
12 struct som_hdr {
13         short           system_id;              /* magic number - system */
14         short           a_magic;                /* magic number - file type */
15         unsigned int    version_id;             /* versiod ID: YYMMDDHH */
16         struct timespec file_time;              /* system clock */
17         unsigned int    entry_space;            /* space for entry point */
18         unsigned int    entry_subspace;         /* subspace for entry point */
19         unsigned int    entry_offset;           /* offset of entry point */
20         unsigned int    aux_header_location;    /* auxiliary header location */
21         unsigned int    aux_header_size;        /* auxiliary header size */
22         unsigned int    som_length;             /* length of entire SOM */
23         unsigned int    presumed_dp;            /* compiler's DP value */
24         unsigned int    space_location;         /* space dictionary location */
25         unsigned int    space_total;            /* number of space entries */
26         unsigned int    subspace_location;      /* subspace entries location */
27         unsigned int    subspace_total;         /* number of subspace entries */
28         unsigned int    loader_fixup_location;  /* MPE/iX loader fixup */
29         unsigned int    loader_fixup_total;     /* number of fixup records */
30         unsigned int    space_strings_location; /* (sub)space names */
31         unsigned int    space_strings_size;     /* size of strings area */
32         unsigned int    init_array_location;    /* reserved */
33         unsigned int    init_array_total;       /* reserved */
34         unsigned int    compiler_location;      /* module dictionary */
35         unsigned int    compiler_total;         /* number of modules */
36         unsigned int    symbol_location;        /* symbol dictionary */
37         unsigned int    symbol_total;           /* number of symbols */
38         unsigned int    fixup_request_location; /* fixup requests */
39         unsigned int    fixup_request_total;    /* number of fixup requests */
40         unsigned int    symbol_strings_location;/* module & symbol names area */
41         unsigned int    symbol_strings_size;    /* size of strings area */
42         unsigned int    unloadable_sp_location; /* unloadable spaces location */
43         unsigned int    unloadable_sp_size;     /* size of data */
44         unsigned int    checksum;
45 };
46
47 /* values for system_id */
48
49 #define SOM_SID_PARISC_1_0      0x020b
50 #define SOM_SID_PARISC_1_1      0x0210
51 #define SOM_SID_PARISC_2_0      0x0214
52
53 /* values for a_magic */
54
55 #define SOM_LIB_EXEC            0x0104
56 #define SOM_RELOCATABLE         0x0106
57 #define SOM_EXEC_NONSHARE       0x0107
58 #define SOM_EXEC_SHARE          0x0108
59 #define SOM_EXEC_DEMAND         0x010B
60 #define SOM_LIB_DYN             0x010D
61 #define SOM_LIB_SHARE           0x010E
62 #define SOM_LIB_RELOC           0x0619
63
64 /* values for version_id.  Decimal not hex, yes.  Grr. */
65
66 #define SOM_ID_OLD              85082112
67 #define SOM_ID_NEW              87102412
68
69 struct aux_id {
70         unsigned int    mandatory :1;   /* the linker must understand this */
71         unsigned int    copy      :1;   /* Must be copied by the linker */
72         unsigned int    append    :1;   /* Must be merged by the linker */
73         unsigned int    ignore    :1;   /* Discard section if unknown */
74         unsigned int    reserved  :12;
75         unsigned int    type      :16;  /* Header type */
76         unsigned int    length;         /* length of _following_ data */
77 };
78
79 /* The Exec Auxiliary Header.  Called The HP-UX Header within HP apparently. */
80 struct som_exec_auxhdr {
81         struct aux_id   som_auxhdr;
82         int             exec_tsize;     /* Text size in bytes */
83         int             exec_tmem;      /* Address to load text at */
84         int             exec_tfile;     /* Location of text in file */
85         int             exec_dsize;     /* Data size in bytes */
86         int             exec_dmem;      /* Address to load data at */
87         int             exec_dfile;     /* Location of data in file */
88         int             exec_bsize;     /* Uninitialised data (bss) */
89         int             exec_entry;     /* Address to start executing */
90         int             exec_flags;     /* loader flags */
91         int             exec_bfill;     /* initialisation value for bss */
92 };
93
94 /* Oh, the things people do to avoid casts.  Shame it'll break with gcc's
95  * new aliasing rules really.
96  */
97 union name_pt {
98         char *          n_name;
99         unsigned int    n_strx;
100 };
101
102 /* The Space Dictionary */
103 struct space_dictionary_record {
104         union name_pt   name;                   /* index to subspace name */
105         unsigned int    is_loadable     :1;     /* loadable */
106         unsigned int    is_defined      :1;     /* defined within file */
107         unsigned int    is_private      :1;     /* not sharable */
108         unsigned int    has_intermediate_code :1; /* contains intermediate code */
109         unsigned int    is_tspecific    :1;     /* thread specific */
110         unsigned int    reserved        :11;    /* for future expansion */
111         unsigned int    sort_key        :8;     /* for linker */
112         unsigned int    reserved2       :8;     /* for future expansion */
113
114         int             space_number;           /* index */
115         int             subspace_index;         /* index into subspace dict */
116         unsigned int    subspace_quantity;      /* number of subspaces */
117         int             loader_fix_index;       /* for loader */
118         unsigned int    loader_fix_quantity;    /* for loader */
119         int             init_pointer_index;     /* data pointer array index */
120         unsigned int    init_pointer_quantity;  /* number of data pointers */
121 };
122
123 /* The Subspace Dictionary */
124 struct subspace_dictionary_record {
125         int             space_index;
126         unsigned int    access_control_bits :7;
127         unsigned int    memory_resident :1;
128         unsigned int    dup_common      :1;
129         unsigned int    is_common       :1;
130         unsigned int    quadrant        :2;
131         unsigned int    initially_frozen :1;
132         unsigned int    is_first        :1;
133         unsigned int    code_only       :1;
134         unsigned int    sort_key        :8;
135         unsigned int    replicate_init  :1;
136         unsigned int    continuation    :1;
137         unsigned int    is_tspecific    :1;
138         unsigned int    is_comdat       :1;
139         unsigned int    reserved        :4;
140
141         int             file_loc_init_value;
142         unsigned int    initialization_length;
143         unsigned int    subspace_start;
144         unsigned int    subspace_length;
145
146         unsigned int    reserved2       :5;
147         unsigned int    alignment       :27;
148
149         union name_pt   name;
150         int             fixup_request_index;
151         unsigned int    fixup_request_quantity;
152 };
153
154 #endif /* _LINUX_SOM_H */