This source file includes following definitions.
- exec_aout_prep_oldzmagic
- exec_aout_prep_oldnmagic
- exec_aout_prep_oldomagic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #include <sys/param.h>
35 #include <sys/systm.h>
36 #include <sys/proc.h>
37 #include <sys/malloc.h>
38 #include <sys/vnode.h>
39 #include <sys/exec.h>
40 #include <sys/resourcevar.h>
41 #include <uvm/uvm_extern.h>
42
43
44
45
46
47
48
49
50
51
52 int
53 exec_aout_prep_oldzmagic(p, epp)
54 struct proc *p;
55 struct exec_package *epp;
56 {
57 struct exec *execp = epp->ep_hdr;
58
59 epp->ep_taddr = 0;
60 epp->ep_tsize = execp->a_text;
61 epp->ep_daddr = epp->ep_taddr + execp->a_text;
62 epp->ep_dsize = execp->a_data + execp->a_bss;
63 epp->ep_entry = execp->a_entry;
64
65
66
67
68
69
70 if ((execp->a_text != 0 || execp->a_data != 0) &&
71 epp->ep_vp->v_writecount != 0) {
72 #ifdef DIAGNOSTIC
73 if (epp->ep_vp->v_flag & VTEXT)
74 panic("exec: a VTEXT vnode has writecount != 0");
75 #endif
76 return ETXTBSY;
77 }
78 vn_marktext(epp->ep_vp);
79
80
81 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, execp->a_text,
82 epp->ep_taddr, epp->ep_vp, PAGE_SIZE,
83 VM_PROT_READ|VM_PROT_EXECUTE);
84
85
86 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_pagedvn, execp->a_data,
87 epp->ep_daddr, epp->ep_vp,
88 execp->a_text + PAGE_SIZE,
89 VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
90
91
92 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, execp->a_bss,
93 epp->ep_daddr + execp->a_data, NULLVP, 0,
94 VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
95
96 return exec_setup_stack(p, epp);
97 }
98
99
100
101
102
103
104
105
106
107
108
109 int
110 exec_aout_prep_oldnmagic(p, epp)
111 struct proc *p;
112 struct exec_package *epp;
113 {
114 struct exec *execp = epp->ep_hdr;
115 long bsize, baddr;
116
117 epp->ep_taddr = 0;
118 epp->ep_tsize = execp->a_text;
119 epp->ep_daddr = roundup(epp->ep_taddr + execp->a_text, __LDPGSZ);
120 epp->ep_dsize = execp->a_data + execp->a_bss;
121 epp->ep_entry = execp->a_entry;
122
123
124 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_readvn, execp->a_text,
125 epp->ep_taddr, epp->ep_vp, sizeof(struct exec),
126 VM_PROT_READ|VM_PROT_EXECUTE);
127
128
129 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_readvn, execp->a_data,
130 epp->ep_daddr, epp->ep_vp, execp->a_text + sizeof(struct exec),
131 VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
132
133
134 baddr = round_page(epp->ep_daddr + execp->a_data);
135 bsize = epp->ep_daddr + epp->ep_dsize - baddr;
136 if (bsize > 0)
137 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, bsize, baddr,
138 NULLVP, 0, VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
139
140 return exec_setup_stack(p, epp);
141 }
142
143
144
145
146
147
148
149
150
151
152
153 int
154 exec_aout_prep_oldomagic(p, epp)
155 struct proc *p;
156 struct exec_package *epp;
157 {
158 struct exec *execp = epp->ep_hdr;
159 long dsize, bsize, baddr;
160
161 epp->ep_taddr = 0;
162 epp->ep_tsize = execp->a_text;
163 epp->ep_daddr = epp->ep_taddr + execp->a_text;
164 epp->ep_dsize = execp->a_data + execp->a_bss;
165 epp->ep_entry = execp->a_entry;
166
167
168 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_readvn,
169 execp->a_text + execp->a_data, epp->ep_taddr, epp->ep_vp,
170 sizeof(struct exec), VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
171
172
173 baddr = round_page(epp->ep_daddr + execp->a_data);
174 bsize = epp->ep_daddr + epp->ep_dsize - baddr;
175 if (bsize > 0)
176 NEW_VMCMD(&epp->ep_vmcmds, vmcmd_map_zero, bsize, baddr,
177 NULLVP, 0, VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE);
178
179
180
181
182
183
184
185
186
187 dsize = epp->ep_dsize + execp->a_text - round_page(execp->a_text);
188 epp->ep_dsize = (dsize > 0) ? dsize : 0;
189 return exec_setup_stack(p, epp);
190 }