xref: /minix/minix/lib/libexec/libexec.h (revision 65f76edb)
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