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