xref: /netbsd/sys/arch/x68k/stand/aout2hux/aout68k.h (revision bf9ec67e)
1 /*
2  *	m68k a.out / ELF file structure definitions
3  *
4  *	written by Yasha (ITOH Yasufumi)
5  *	public domain
6  *
7  *	$NetBSD: aout68k.h,v 1.3 1999/11/19 03:54:08 itohy Exp $
8  */
9 /*
10  * NetBSD/m68k a.out format (OMAGIC, NMAGIC)
11  *
12  *	----------------------------
13  *	|  file header (32 bytes)  |
14  *	|--------------------------|
15  *	|  text                    |
16  *	|--------------------------|
17  *	|  data                    |
18  *	|--------------------------|
19  *	|  text relocation table   |
20  *	|--------------------------|
21  *	|  data relocation table   |
22  *	|--------------------------|
23  *	|  symbol table            |
24  *	|--------------------------|
25  *	|  string table            |
26  *	----------------------------
27  *
28  * OMAGIC: text and data segments are loaded contiguous
29  * NMAGIC: data segment is loaded at the next page of the text
30  */
31 
32 struct aout_m68k {
33 	be_uint32_t	a_magic;	/* encoded magic number */
34 	be_uint32_t	a_text;		/* size of text section */
35 	be_uint32_t	a_data;		/* size of data section */
36 	be_uint32_t	a_bss;		/* size of bss */
37 	be_uint32_t	a_syms;		/* size of symbol table */
38 	be_uint32_t	a_entry;	/* entry point address */
39 	be_uint32_t	a_trsize;	/* size of text relocation */
40 	be_uint32_t	a_drsize;	/* size of data relocation */
41 };
42 
43 #define AOUT_GET_MAGIC(e)	(((e)->a_magic.val[2]<<8) | (e)->a_magic.val[3])
44 #define	AOUT_OMAGIC	0407
45 #define	AOUT_NMAGIC	0410
46 #define	AOUT_ZMAGIC	0413	/* demand paging --- header is in the text */
47 
48 #define AOUT_GET_FLAGS(e)	((e)->a_magic.val[0] >> 2)
49 #define AOUT_FLAG_PIC		0x10
50 #define AOUT_FLAG_DYNAMIC	0x20
51 
52 /* machine ID */
53 #define AOUT_GET_MID(e)		((((e)->a_magic.val[0] & 0x03) << 8) |	\
54 					(e)->a_magic.val[1])
55 #define	AOUT_MID_M68K	135	/* m68k BSD binary, 8KB page */
56 #define	AOUT_MID_M68K4K	136	/* m68k BSD binary, 4KB page */
57 
58 #define AOUT_PAGESIZE(e)	(AOUT_GET_MAGIC(e) == AOUT_OMAGIC ? 1 :	\
59 				AOUT_GET_MID(e) == AOUT_MID_M68K ? 8192 : 4096)
60 
61 /*
62  * m68k ELF executable format
63  *
64  *	--------------------------------------
65  *	|  ELF header     (52 bytes)         |
66  *	|------------------------------------|
67  *	|  Program header (32bytes x 1 or 2) |
68  *	|------------------------------------|
69  *	|  section 1 (text)                  |
70  *	|------------------------------------|
71  *	|  section 2 (data)                  |
72  *	|------------------------------------|
73  *	|  ...                               |
74  *	|------------------------------------|
75  *	|  section header table (optional)   |
76  *	--------------------------------------
77  */
78 
79 /*
80  * ELF header for m68k
81  */
82 struct elf_m68k_hdr {
83 #define EI_MAG0		0
84 #define EI_MAG1		1
85 #define EI_MAG2		2
86 #define EI_MAG3		3
87 #define EI_CLASS	4
88 #define EI_DATA		5
89 #define EI_VERSION	6
90 #define EL_NIDENT	16
91 	u_int8_t	e_ident[EL_NIDENT];	/* ELF magic */
92 #define ELFMAG0		0x7f
93 #define ELFMAG1		0x45	/* 'E' */
94 #define ELFMAG2		0x4c	/* 'L' */
95 #define ELFMAG3		0x46	/* 'F' */
96 #define ELFCLASS32	1	/* 32bit */
97 #define ELFDATA2MSB	2	/* big endian */
98 	be_uint16_t	e_type;		/* type of this file */
99 #define ET_EXEC		2
100 	be_uint16_t	e_machine;	/* architecture id */
101 #define EM_68K		4
102 	be_uint32_t	e_version;
103 #define EV_CURRENT	1
104 	be_uint32_t	e_entry;	/* entry address */
105 	be_uint32_t	e_phoff;	/* program header address */
106 	be_uint32_t	e_shoff;
107 	be_uint32_t	e_flags;
108 	be_uint16_t	e_ehsize;
109 	be_uint16_t	e_phentsize;	/* program header entry size */
110 	be_uint16_t	e_phnum;	/* number of program header entries */
111 	be_uint16_t	e_shentsize;	/* section header entry size */
112 	be_uint16_t	e_shnum;	/* number of section header entries */
113 	be_uint16_t	e_shstrndx;
114 };
115 
116 #define SIZE_ELF68K_HDR		(sizeof(struct elf_m68k_hdr))
117 
118 /*
119  * Section header for m68k ELF
120  */
121 struct elf_m68k_shdr {
122 	be_uint32_t	sh_name;
123 	be_uint32_t	sh_type;
124 #define SHT_PROGBITS	1
125 	be_uint32_t	sh_flags;
126 #define SHF_WRITE	1
127 #define SHF_ALLOC	2
128 #define SHF_EXECINSTR	4
129 	be_uint32_t	sh_addr;
130 	be_uint32_t	sh_offset;
131 	be_uint32_t	sh_size;
132 	be_uint32_t	sh_link;
133 	be_uint32_t	sh_info;
134 	be_uint32_t	sh_addralign;
135 	be_uint32_t	sh_entsize;
136 };
137 
138 #define ELF68K_ISDATASEG(sh)	\
139 	(get_uint32(&(sh)->sh_type) == SHT_PROGBITS &&		\
140 	 (get_uint32(&(sh)->sh_flags) &				\
141 		(SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR)) ==	\
142 			(SHF_WRITE | SHF_ALLOC))	/* no SHF_EXECINSTR */
143 
144 #define SIZE_ELF68K_SHDR	(sizeof(struct elf_m68k_shdr))
145 
146 /*
147  * Program header for m68k ELF
148  */
149 struct elf_m68k_phdr {
150 	be_uint32_t	p_type;		/* type of segment */
151 #define PT_LOAD		1
152 	be_uint32_t	p_offset;	/* file offset */
153 	be_uint32_t	p_vaddr;	/* virtual address */
154 	be_uint32_t	p_paddr;	/* physical address (ignored) */
155 	be_uint32_t	p_filesz;	/* size on file */
156 	be_uint32_t	p_memsz;	/* size on memory */
157 	be_uint32_t	p_flags;
158 #define PF_R		4
159 #define PF_W		2
160 #define PF_X		1
161 	be_uint32_t	p_align;
162 };
163 
164 #define SIZE_ELF68K_PHDR	(sizeof(struct elf_m68k_phdr))
165