Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*
 *	m68k a.out / ELF file structure definitions
 *
 *	written by ITOH Yasufumi
 *	public domain
 *
 *	$NetBSD: aout68k.h,v 1.4 2011/02/21 02:31:58 itohy Exp $
 */
/*
 * NetBSD/m68k a.out format (OMAGIC, NMAGIC)
 *
 *	----------------------------
 *	|  file header (32 bytes)  |
 *	|--------------------------|
 *	|  text                    |
 *	|--------------------------|
 *	|  data                    |
 *	|--------------------------|
 *	|  text relocation table   |
 *	|--------------------------|
 *	|  data relocation table   |
 *	|--------------------------|
 *	|  symbol table            |
 *	|--------------------------|
 *	|  string table            |
 *	----------------------------
 *
 * OMAGIC: text and data segments are loaded contiguous
 * NMAGIC: data segment is loaded at the next page of the text
 */

struct aout_m68k {
	be_uint32_t	a_magic;	/* encoded magic number */
	be_uint32_t	a_text;		/* size of text section */
	be_uint32_t	a_data;		/* size of data section */
	be_uint32_t	a_bss;		/* size of bss */
	be_uint32_t	a_syms;		/* size of symbol table */
	be_uint32_t	a_entry;	/* entry point address */
	be_uint32_t	a_trsize;	/* size of text relocation */
	be_uint32_t	a_drsize;	/* size of data relocation */
};

#define AOUT_GET_MAGIC(e)	(((e)->a_magic.val[2]<<8) | (e)->a_magic.val[3])
#define	AOUT_OMAGIC	0407
#define	AOUT_NMAGIC	0410
#define	AOUT_ZMAGIC	0413	/* demand paging --- header is in the text */

#define AOUT_GET_FLAGS(e)	((e)->a_magic.val[0] >> 2)
#define AOUT_FLAG_PIC		0x10
#define AOUT_FLAG_DYNAMIC	0x20

/* machine ID */
#define AOUT_GET_MID(e)		((((e)->a_magic.val[0] & 0x03) << 8) |	\
					(e)->a_magic.val[1])
#define	AOUT_MID_M68K	135	/* m68k BSD binary, 8KB page */
#define	AOUT_MID_M68K4K	136	/* m68k BSD binary, 4KB page */

#define AOUT_PAGESIZE(e)	(AOUT_GET_MAGIC(e) == AOUT_OMAGIC ? 1 :	\
				AOUT_GET_MID(e) == AOUT_MID_M68K ? 8192 : 4096)

/*
 * m68k ELF executable format
 *
 *	--------------------------------------
 *	|  ELF header     (52 bytes)         |
 *	|------------------------------------|
 *	|  Program header (32bytes x 1 or 2) |
 *	|------------------------------------|
 *	|  section 1 (text)                  |
 *	|------------------------------------|
 *	|  section 2 (data)                  |
 *	|------------------------------------|
 *	|  ...                               |
 *	|------------------------------------|
 *	|  section header table (optional)   |
 *	--------------------------------------
 */

/*
 * ELF header for m68k
 */
struct elf_m68k_hdr {
#define EI_MAG0		0
#define EI_MAG1		1
#define EI_MAG2		2
#define EI_MAG3		3
#define EI_CLASS	4
#define EI_DATA		5
#define EI_VERSION	6
#define EL_NIDENT	16
	u_int8_t	e_ident[EL_NIDENT];	/* ELF magic */
#define ELFMAG0		0x7f
#define ELFMAG1		0x45	/* 'E' */
#define ELFMAG2		0x4c	/* 'L' */
#define ELFMAG3		0x46	/* 'F' */
#define ELFCLASS32	1	/* 32bit */
#define ELFDATA2MSB	2	/* big endian */
	be_uint16_t	e_type;		/* type of this file */
#define ET_EXEC		2
	be_uint16_t	e_machine;	/* architecture id */
#define EM_68K		4
	be_uint32_t	e_version;
#define EV_CURRENT	1
	be_uint32_t	e_entry;	/* entry address */
	be_uint32_t	e_phoff;	/* program header address */
	be_uint32_t	e_shoff;
	be_uint32_t	e_flags;
	be_uint16_t	e_ehsize;
	be_uint16_t	e_phentsize;	/* program header entry size */
	be_uint16_t	e_phnum;	/* number of program header entries */
	be_uint16_t	e_shentsize;	/* section header entry size */
	be_uint16_t	e_shnum;	/* number of section header entries */
	be_uint16_t	e_shstrndx;
};

#define SIZE_ELF68K_HDR		(sizeof(struct elf_m68k_hdr))

/*
 * Section header for m68k ELF
 */
struct elf_m68k_shdr {
	be_uint32_t	sh_name;
	be_uint32_t	sh_type;
#define SHT_PROGBITS	1
	be_uint32_t	sh_flags;
#define SHF_WRITE	1
#define SHF_ALLOC	2
#define SHF_EXECINSTR	4
	be_uint32_t	sh_addr;
	be_uint32_t	sh_offset;
	be_uint32_t	sh_size;
	be_uint32_t	sh_link;
	be_uint32_t	sh_info;
	be_uint32_t	sh_addralign;
	be_uint32_t	sh_entsize;
};

#define ELF68K_ISDATASEG(sh)	\
	(get_uint32(&(sh)->sh_type) == SHT_PROGBITS &&		\
	 (get_uint32(&(sh)->sh_flags) &				\
		(SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR)) ==	\
			(SHF_WRITE | SHF_ALLOC))	/* no SHF_EXECINSTR */

#define SIZE_ELF68K_SHDR	(sizeof(struct elf_m68k_shdr))

/*
 * Program header for m68k ELF
 */
struct elf_m68k_phdr {
	be_uint32_t	p_type;		/* type of segment */
#define PT_LOAD		1
	be_uint32_t	p_offset;	/* file offset */
	be_uint32_t	p_vaddr;	/* virtual address */
	be_uint32_t	p_paddr;	/* physical address (ignored) */
	be_uint32_t	p_filesz;	/* size on file */
	be_uint32_t	p_memsz;	/* size on memory */
	be_uint32_t	p_flags;
#define PF_R		4
#define PF_W		2
#define PF_X		1
	be_uint32_t	p_align;
};

#define SIZE_ELF68K_PHDR	(sizeof(struct elf_m68k_phdr))