Home | History | Annotate | Download | only in linux
      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 */
    155