1 #define _SYSTEM 1
2
3 #include <minix/type.h>
4 #include <minix/const.h>
5 #include <sys/param.h>
6 #include <assert.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <libexec.h>
10 #include <string.h>
11 #include <assert.h>
12 #include <minix/ipc.h>
13 #include <minix/com.h>
14 #include <minix/callnr.h>
15 #include <minix/vm.h>
16 #include <minix/ipc.h>
17 #include <minix/syslib.h>
18 #include <sys/mman.h>
19 #include <machine/elf.h>
20
libexec_alloc_mmap_prealloc_junk(struct exec_info * execi,vir_bytes vaddr,size_t len)21 int libexec_alloc_mmap_prealloc_junk(struct exec_info *execi, vir_bytes vaddr, size_t len)
22 {
23 if(minix_mmap_for(execi->proc_e, (void *) vaddr, len,
24 PROT_READ|PROT_WRITE|PROT_EXEC,
25 MAP_ANON|MAP_PREALLOC|MAP_UNINITIALIZED|MAP_FIXED, -1, 0) == MAP_FAILED) {
26 return ENOMEM;
27 }
28
29 return OK;
30 }
31
libexec_alloc_mmap_prealloc_cleared(struct exec_info * execi,vir_bytes vaddr,size_t len)32 int libexec_alloc_mmap_prealloc_cleared(struct exec_info *execi, vir_bytes vaddr, size_t len)
33 {
34 if(minix_mmap_for(execi->proc_e, (void *) vaddr, len,
35 PROT_READ|PROT_WRITE|PROT_EXEC,
36 MAP_ANON|MAP_PREALLOC|MAP_FIXED, -1, 0) == MAP_FAILED) {
37 return ENOMEM;
38 }
39
40 return OK;
41 }
42
libexec_alloc_mmap_ondemand(struct exec_info * execi,vir_bytes vaddr,size_t len)43 int libexec_alloc_mmap_ondemand(struct exec_info *execi, vir_bytes vaddr, size_t len)
44 {
45 if(minix_mmap_for(execi->proc_e, (void *) vaddr, len,
46 PROT_READ|PROT_WRITE|PROT_EXEC,
47 MAP_ANON|MAP_FIXED, -1, 0) == MAP_FAILED) {
48 return ENOMEM;
49 }
50
51 return OK;
52 }
53
libexec_clearproc_vm_procctl(struct exec_info * execi)54 int libexec_clearproc_vm_procctl(struct exec_info *execi)
55 {
56 return vm_procctl_clear(execi->proc_e);
57 }
58
libexec_clear_sys_memset(struct exec_info * execi,vir_bytes vaddr,size_t len)59 int libexec_clear_sys_memset(struct exec_info *execi, vir_bytes vaddr, size_t len)
60 {
61 return sys_memset(execi->proc_e, 0, vaddr, len);
62 }
63
libexec_copy_memcpy(struct exec_info * execi,off_t off,vir_bytes vaddr,size_t len)64 int libexec_copy_memcpy(struct exec_info *execi,
65 off_t off, vir_bytes vaddr, size_t len)
66 {
67 assert(off + len <= execi->hdr_len);
68 memcpy((char *) vaddr, (char *) execi->hdr + off, len);
69 return OK;
70 }
71
libexec_clear_memset(struct exec_info * execi,vir_bytes vaddr,size_t len)72 int libexec_clear_memset(struct exec_info *execi, vir_bytes vaddr, size_t len)
73 {
74 memset((char *) vaddr, 0, len);
75 return OK;
76 }
77
libexec_pm_newexec(endpoint_t proc_e,struct exec_info * e)78 int libexec_pm_newexec(endpoint_t proc_e, struct exec_info *e)
79 {
80 int r;
81 message m;
82
83 memset(&m, 0, sizeof(m));
84 m.m_type = PM_EXEC_NEW;
85 m.m_lexec_pm_exec_new.endpt = proc_e;
86 m.m_lexec_pm_exec_new.ptr = (vir_bytes)e;
87 if ((r = ipc_sendrec(PM_PROC_NR, &m)) != OK) return(r);
88
89 e->allow_setuid = !!m.m_pm_lexec_exec_new.suid;
90
91 return(m.m_type);
92 }
93