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