|  | #pragma once | 
|  |  | 
|  | #include <process.h> | 
|  | #include <ros/common.h> | 
|  |  | 
|  | #if defined(LITTLE_ENDIAN) | 
|  | #  define ELF_MAGIC 0x464C457FU	/* "\x7FELF" in little endian */ | 
|  | #elif defined(BIG_ENDIAN) | 
|  | #  define ELF_MAGIC 0x7F454C46U	/* "\x7FELF" in big endian */ | 
|  | #else | 
|  | #  error I know not my endianness! | 
|  | #endif | 
|  |  | 
|  | #define ELF_PROT_READ			0x04 | 
|  | #define ELF_PROT_WRITE			0x02 | 
|  | #define ELF_PROT_EXEC			0x01 | 
|  |  | 
|  | typedef struct Elf32 { | 
|  | uint32_t e_magic;	// must equal ELF_MAGIC | 
|  | uint8_t e_ident[12]; | 
|  | uint16_t e_type; | 
|  | uint16_t e_machine; | 
|  | uint32_t e_version; | 
|  | uint32_t e_entry; | 
|  | uint32_t e_phoff; | 
|  | uint32_t e_shoff; | 
|  | uint32_t e_flags; | 
|  | uint16_t e_ehsize; | 
|  | uint16_t e_phentsize; | 
|  | uint16_t e_phnum; | 
|  | uint16_t e_shentsize; | 
|  | uint16_t e_shnum; | 
|  | uint16_t e_shstrndx; | 
|  | } elf32_t; | 
|  |  | 
|  | typedef struct Proghdr32 { | 
|  | uint32_t p_type; | 
|  | uint32_t p_offset; | 
|  | uint32_t p_va; | 
|  | uint32_t p_pa; | 
|  | uint32_t p_filesz; | 
|  | uint32_t p_memsz; | 
|  | uint32_t p_flags; | 
|  | uint32_t p_align; | 
|  | } proghdr32_t; | 
|  |  | 
|  | typedef struct Secthdr32 { | 
|  | uint32_t sh_name; | 
|  | uint32_t sh_type; | 
|  | uint32_t sh_flags; | 
|  | uint32_t sh_addr; | 
|  | uint32_t sh_offset; | 
|  | uint32_t sh_size; | 
|  | uint32_t sh_link; | 
|  | uint32_t sh_info; | 
|  | uint32_t sh_addralign; | 
|  | uint32_t sh_entsize; | 
|  | } secthdr32_t; | 
|  |  | 
|  | typedef struct Elf64 { | 
|  | uint32_t e_magic;	// must equal ELF_MAGIC | 
|  | uint8_t e_ident[12]; | 
|  | uint16_t e_type; | 
|  | uint16_t e_machine; | 
|  | uint32_t e_version; | 
|  | uint64_t e_entry; | 
|  | uint64_t e_phoff; | 
|  | uint64_t e_shoff; | 
|  | uint32_t e_flags; | 
|  | uint16_t e_ehsize; | 
|  | uint16_t e_phentsize; | 
|  | uint16_t e_phnum; | 
|  | uint16_t e_shentsize; | 
|  | uint16_t e_shnum; | 
|  | uint16_t e_shstrndx; | 
|  | } elf64_t; | 
|  |  | 
|  | typedef struct Proghdr64 { | 
|  | uint32_t p_type; | 
|  | uint32_t p_flags; | 
|  | uint64_t p_offset; | 
|  | uint64_t p_va; | 
|  | uint64_t p_pa; | 
|  | uint64_t p_filesz; | 
|  | uint64_t p_memsz; | 
|  | uint64_t p_align; | 
|  | } proghdr64_t; | 
|  |  | 
|  | typedef struct Secthdr64 { | 
|  | uint32_t sh_name; | 
|  | uint32_t sh_type; | 
|  | uint64_t sh_flags; | 
|  | uint64_t sh_addr; | 
|  | uint64_t sh_offset; | 
|  | uint64_t sh_size; | 
|  | uint32_t sh_link; | 
|  | uint32_t sh_info; | 
|  | uint64_t sh_addralign; | 
|  | uint64_t sh_entsize; | 
|  | } secthdr64_t; | 
|  |  | 
|  | typedef struct | 
|  | { | 
|  | long entry; | 
|  | long highest_addr; | 
|  | long phdr; | 
|  | int phnum; | 
|  | int dynamic; | 
|  | bool elf64; | 
|  | char interp[256]; | 
|  | } elf_info_t; | 
|  |  | 
|  | typedef long elf_aux_t[2]; | 
|  |  | 
|  | #define ELF_IDENT_CLASS 0 | 
|  | // Values for Elf::e_ident[ELF_IDENT_CLASS] | 
|  | #define ELFCLASS32 1 | 
|  | #define ELFCLASS64 2 | 
|  |  | 
|  | // Values for Proghdr::p_type | 
|  | #define ELF_PROG_LOAD		1 | 
|  | #define ELF_PROG_INTERP		3 | 
|  | #define ELF_PROG_PHDR		6 | 
|  |  | 
|  | // Flag bits for Proghdr::p_flags | 
|  | #define ELF_PROG_FLAG_EXEC	1 | 
|  | #define ELF_PROG_FLAG_WRITE	2 | 
|  | #define ELF_PROG_FLAG_READ	4 | 
|  |  | 
|  | // Values for Secthdr::sh_type | 
|  | #define ELF_SHT_NULL		0 | 
|  | #define ELF_SHT_PROGBITS	1 | 
|  | #define ELF_SHT_SYMTAB		2 | 
|  | #define ELF_SHT_STRTAB		3 | 
|  |  | 
|  | // Values for Secthdr::sh_name | 
|  | #define ELF_SHN_UNDEF		0 | 
|  |  | 
|  | // Values for auxiliary fields | 
|  | #define ELF_AUX_PHDR		3 | 
|  | #define ELF_AUX_PHENT		4 | 
|  | #define ELF_AUX_PHNUM		5 | 
|  | #define ELF_AUX_ENTRY		9 | 
|  | #define ELF_AUX_HWCAP		16 | 
|  |  | 
|  | // Hardware capabilities (for use with ELF_AUX_HWCAP) | 
|  | #define ELF_HWCAP_SPARC_FLUSH	1 | 
|  |  | 
|  | struct file_or_chan; | 
|  | bool is_valid_elf(struct file_or_chan *f); | 
|  | int load_elf(struct proc *p, struct file_or_chan *f, | 
|  | int argc, char *argv[], int envc, char *envp[]); | 
|  | ssize_t get_startup_argc(struct proc *p); | 
|  | char *get_startup_argv(struct proc *p, size_t idx, char *argp, size_t max_size); |