130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _LINUX_SOM_H
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _LINUX_SOM_H
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* File format definition for SOM executables / shared libraries */
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* we need struct timespec */
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/time.h>
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_PAGESIZE 4096
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* this is the SOM header */
1230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct som_hdr {
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	short		system_id;		/* magic number - system */
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	short		a_magic;		/* magic number - file type */
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	version_id;		/* versiod ID: YYMMDDHH */
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct timespec	file_time;		/* system clock */
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	entry_space;		/* space for entry point */
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	entry_subspace;		/* subspace for entry point */
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	entry_offset;		/* offset of entry point */
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	aux_header_location;	/* auxiliary header location */
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	aux_header_size;	/* auxiliary header size */
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	som_length;		/* length of entire SOM */
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	presumed_dp;		/* compiler's DP value */
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	space_location;		/* space dictionary location */
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	space_total;		/* number of space entries */
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	subspace_location;	/* subspace entries location */
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	subspace_total;		/* number of subspace entries */
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	loader_fixup_location;	/* MPE/iX loader fixup */
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	loader_fixup_total;	/* number of fixup records */
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	space_strings_location;	/* (sub)space names */
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	space_strings_size;	/* size of strings area */
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	init_array_location;	/* reserved */
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	init_array_total;	/* reserved */
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	compiler_location;	/* module dictionary */
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	compiler_total;		/* number of modules */
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	symbol_location;	/* symbol dictionary */
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	symbol_total;		/* number of symbols */
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	fixup_request_location;	/* fixup requests */
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	fixup_request_total;	/* number of fixup requests */
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	symbol_strings_location;/* module & symbol names area */
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	symbol_strings_size;	/* size of strings area */
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	unloadable_sp_location;	/* unloadable spaces location */
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	unloadable_sp_size;	/* size of data */
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	checksum;
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* values for system_id */
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_SID_PARISC_1_0	0x020b
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_SID_PARISC_1_1	0x0210
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_SID_PARISC_2_0	0x0214
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* values for a_magic */
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_LIB_EXEC		0x0104
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_RELOCATABLE		0x0106
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_EXEC_NONSHARE	0x0107
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_EXEC_SHARE		0x0108
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_EXEC_DEMAND		0x010B
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_LIB_DYN		0x010D
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_LIB_SHARE		0x010E
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_LIB_RELOC		0x0619
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* values for version_id.  Decimal not hex, yes.  Grr. */
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_ID_OLD		85082112
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define SOM_ID_NEW		87102412
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6930692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct aux_id {
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	mandatory :1;	/* the linker must understand this */
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	copy	  :1;	/* Must be copied by the linker */
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	append	  :1;	/* Must be merged by the linker */
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	ignore	  :1;	/* Discard section if unknown */
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	reserved  :12;
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	type	  :16;	/* Header type */
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	length;		/* length of _following_ data */
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* The Exec Auxiliary Header.  Called The HP-UX Header within HP apparently. */
8030692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct som_exec_auxhdr {
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct aux_id	som_auxhdr;
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_tsize;	/* Text size in bytes */
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_tmem;	/* Address to load text at */
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_tfile;	/* Location of text in file */
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_dsize;	/* Data size in bytes */
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_dmem;	/* Address to load data at */
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_dfile;	/* Location of data in file */
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_bsize;	/* Uninitialised data (bss) */
8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_entry;	/* Address to start executing */
9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_flags;	/* loader flags */
9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		exec_bfill;	/* initialisation value for bss */
9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* Oh, the things people do to avoid casts.  Shame it'll break with gcc's
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * new aliasing rules really.
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
9730692c65c4174412c90e79489e98ab85c1a7412fBen Chengunion name_pt {
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	char *		n_name;
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	n_strx;
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* The Space Dictionary */
10330692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct space_dictionary_record {
10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	union name_pt	name;			/* index to subspace name */
10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_loadable	:1;	/* loadable */
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_defined	:1;	/* defined within file */
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_private	:1;	/* not sharable */
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	has_intermediate_code :1; /* contains intermediate code */
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_tspecific	:1;	/* thread specific */
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	reserved	:11;	/* for future expansion */
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	sort_key	:8;	/* for linker */
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	reserved2	:8;	/* for future expansion */
11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		space_number;		/* index */
11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		subspace_index;		/* index into subspace dict */
11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	subspace_quantity;	/* number of subspaces */
11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		loader_fix_index;	/* for loader */
11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	loader_fix_quantity;	/* for loader */
11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		init_pointer_index;	/* data pointer array index */
12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	init_pointer_quantity;	/* number of data pointers */
12130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
12230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* The Subspace Dictionary */
12430692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct subspace_dictionary_record {
12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		space_index;
12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	access_control_bits :7;
12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	memory_resident	:1;
12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	dup_common	:1;
12930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_common	:1;
13030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	quadrant	:2;
13130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	initially_frozen :1;
13230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_first	:1;
13330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	code_only	:1;
13430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	sort_key	:8;
13530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	replicate_init	:1;
13630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	continuation	:1;
13730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_tspecific	:1;
13830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	is_comdat	:1;
13930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	reserved	:4;
14030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
14130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		file_loc_init_value;
14230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	initialization_length;
14330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	subspace_start;
14430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	subspace_length;
14530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
14630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	reserved2	:5;
14730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	alignment	:27;
14830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
14930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	union name_pt	name;
15030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int		fixup_request_index;
15130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int	fixup_request_quantity;
15230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
15330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
15430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _LINUX_SOM_H */
155