1433d6423SLionel Sambuc #ifndef _LIBEXEC_H_ 2433d6423SLionel Sambuc #define _LIBEXEC_H_ 1 3433d6423SLionel Sambuc 4433d6423SLionel Sambuc #include <sys/exec_elf.h> 5433d6423SLionel Sambuc 6433d6423SLionel Sambuc struct exec_info; 7433d6423SLionel Sambuc 8433d6423SLionel Sambuc typedef int (*libexec_loadfunc_t)(struct exec_info *execi, 9433d6423SLionel Sambuc off_t offset, vir_bytes vaddr, size_t len); 10433d6423SLionel Sambuc 11433d6423SLionel Sambuc typedef int (*libexec_clearfunc_t)(struct exec_info *execi, 12433d6423SLionel Sambuc vir_bytes vaddr, size_t len); 13433d6423SLionel Sambuc 14433d6423SLionel Sambuc typedef int (*libexec_allocfunc_t)(struct exec_info *execi, 15433d6423SLionel Sambuc vir_bytes vaddr, size_t len); 16433d6423SLionel Sambuc 17433d6423SLionel Sambuc typedef int (*libexec_procclearfunc_t)(struct exec_info *execi); 18433d6423SLionel Sambuc 19433d6423SLionel Sambuc typedef int (*libexec_mmap_t)(struct exec_info *execi, 20433d6423SLionel Sambuc vir_bytes vaddr, vir_bytes len, vir_bytes foffset, u16_t clearend, 21433d6423SLionel Sambuc int protflags); 22433d6423SLionel Sambuc 23433d6423SLionel Sambuc struct exec_info { 24433d6423SLionel Sambuc /* Filled in by libexec caller */ 25433d6423SLionel Sambuc endpoint_t proc_e; /* Process endpoint */ 26433d6423SLionel Sambuc char *hdr; /* Header or full image */ 27433d6423SLionel Sambuc size_t hdr_len; /* Size of hdr */ 28433d6423SLionel Sambuc vir_bytes frame_len; /* Stack size */ 29433d6423SLionel Sambuc char progname[PROC_NAME_LEN]; /* Program name */ 30433d6423SLionel Sambuc uid_t new_uid; /* Process UID after exec */ 31433d6423SLionel Sambuc gid_t new_gid; /* Process GID after exec */ 32433d6423SLionel Sambuc int allow_setuid; /* Allow set{u,g}id execution? */ 33433d6423SLionel Sambuc vir_bytes stack_size; /* Desired stack size */ 34433d6423SLionel Sambuc vir_bytes load_offset; /* Desired load offset */ 35433d6423SLionel Sambuc vir_bytes text_size; /* Text segment size */ 36433d6423SLionel Sambuc vir_bytes data_size; /* Data segment size */ 37433d6423SLionel Sambuc off_t filesize; /* How big is the file */ 38433d6423SLionel Sambuc 39433d6423SLionel Sambuc /* Callback pointers for use by libexec */ 40433d6423SLionel Sambuc libexec_loadfunc_t copymem; /* Copy callback */ 41433d6423SLionel Sambuc libexec_clearfunc_t clearmem; /* Clear callback */ 42433d6423SLionel Sambuc libexec_allocfunc_t allocmem_prealloc_cleared; /* Alloc callback */ 43433d6423SLionel Sambuc libexec_allocfunc_t allocmem_prealloc_junk; /* Alloc callback */ 44433d6423SLionel Sambuc libexec_allocfunc_t allocmem_ondemand; /* Alloc callback */ 45433d6423SLionel Sambuc libexec_procclearfunc_t clearproc; /* Clear process callback */ 46433d6423SLionel Sambuc libexec_mmap_t memmap; /* mmap callback */ 47433d6423SLionel Sambuc void *opaque; /* Callback data */ 48433d6423SLionel Sambuc 49433d6423SLionel Sambuc /* Filled in by libexec load function */ 50433d6423SLionel Sambuc vir_bytes load_base; /* Where executable is loaded */ 51433d6423SLionel Sambuc vir_bytes pc; /* Entry point of exec file */ 52433d6423SLionel Sambuc vir_bytes stack_high; /* High stack addr */ 53433d6423SLionel Sambuc }; 54433d6423SLionel Sambuc 55*65f76edbSDavid van Moolenbroek int elf_has_interpreter(char *exec_hdr, size_t hdr_len, char *interp, 56*65f76edbSDavid van Moolenbroek size_t maxsz); 57*65f76edbSDavid van Moolenbroek int elf_phdr(char *exec_hdr, size_t hdr_len, vir_bytes *phdr); 58433d6423SLionel Sambuc 59433d6423SLionel Sambuc int libexec_pm_newexec(endpoint_t proc_e, struct exec_info *execi); 60433d6423SLionel Sambuc 61433d6423SLionel Sambuc typedef int (*libexec_exec_loadfunc_t)(struct exec_info *execi); 62433d6423SLionel Sambuc int libexec_load_elf(struct exec_info *execi); 63433d6423SLionel Sambuc 64433d6423SLionel Sambuc /* Default callbacks for kernel. */ 65433d6423SLionel Sambuc int libexec_copy_memcpy(struct exec_info *execi, off_t offset, vir_bytes vaddr, size_t len); 66433d6423SLionel Sambuc int libexec_clear_memset(struct exec_info *execi, vir_bytes vaddr, size_t len); 67433d6423SLionel Sambuc 68433d6423SLionel Sambuc /* Default callbacks. */ 69433d6423SLionel Sambuc int libexec_alloc_mmap_prealloc_cleared(struct exec_info *execi, vir_bytes vaddr, size_t len); 70433d6423SLionel Sambuc int libexec_alloc_mmap_prealloc_junk(struct exec_info *execi, vir_bytes vaddr, size_t len); 71433d6423SLionel Sambuc int libexec_alloc_mmap_ondemand(struct exec_info *execi, vir_bytes vaddr, size_t len); 72433d6423SLionel Sambuc int libexec_clearproc_vm_procctl(struct exec_info *execi); 73433d6423SLionel Sambuc int libexec_clear_sys_memset(struct exec_info *execi, vir_bytes vaddr, size_t len); 74433d6423SLionel Sambuc 75433d6423SLionel Sambuc #endif /* !_LIBEXEC_H_ */ 76