root/sys/arch/x68k/stand/aout2hux/aout68k.h
/*
 *      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))