Deleted Added
full compact
imgact_linux.c (111797) imgact_linux.c (111798)
1/*-
2 * Copyright (c) 1994-1996 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Based heavily on /sys/kern/imgact_aout.c which is:
6 * Copyright (c) 1993, David Greenman
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
1/*-
2 * Copyright (c) 1994-1996 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Based heavily on /sys/kern/imgact_aout.c which is:
6 * Copyright (c) 1993, David Greenman
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer
12 * notice, this list of conditions and the following disclaimer
13 * in this position and unchanged.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
13 * in this position and unchanged.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 *
31 * $FreeBSD: head/sys/i386/linux/imgact_linux.c 111797 2003-03-03 09:14:26Z des $
31 * $FreeBSD: head/sys/i386/linux/imgact_linux.c 111798 2003-03-03 09:17:12Z des $
32 */
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/exec.h>
37#include <sys/imgact.h>
38#include <sys/imgact_aout.h>
39#include <sys/kernel.h>

--- 92 unchanged lines hidden (view full) ---

132#ifdef DEBUG
133 printf("imgact: Non page aligned binary %lu\n", file_offset);
134#endif
135 /*
136 * Map text+data+bss read/write/execute
137 */
138 vmaddr = virtual_offset;
139 error = vm_map_find(&vmspace->vm_map, NULL, 0, &vmaddr,
32 */
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/exec.h>
37#include <sys/imgact.h>
38#include <sys/imgact_aout.h>
39#include <sys/kernel.h>

--- 92 unchanged lines hidden (view full) ---

132#ifdef DEBUG
133 printf("imgact: Non page aligned binary %lu\n", file_offset);
134#endif
135 /*
136 * Map text+data+bss read/write/execute
137 */
138 vmaddr = virtual_offset;
139 error = vm_map_find(&vmspace->vm_map, NULL, 0, &vmaddr,
140 a_out->a_text + a_out->a_data + bss_size, FALSE,
140 a_out->a_text + a_out->a_data + bss_size, FALSE,
141 VM_PROT_ALL, VM_PROT_ALL, 0);
142 if (error)
143 goto fail;
144
145 error = vm_mmap(kernel_map, &buffer,
146 round_page(a_out->a_text + a_out->a_data + file_offset),
147 VM_PROT_READ, VM_PROT_READ, 0,
148 (caddr_t) imgp->vp, trunc_page(file_offset));
149 if (error)
150 goto fail;
151
152 error = copyout((void *)(buffer + file_offset),
141 VM_PROT_ALL, VM_PROT_ALL, 0);
142 if (error)
143 goto fail;
144
145 error = vm_mmap(kernel_map, &buffer,
146 round_page(a_out->a_text + a_out->a_data + file_offset),
147 VM_PROT_READ, VM_PROT_READ, 0,
148 (caddr_t) imgp->vp, trunc_page(file_offset));
149 if (error)
150 goto fail;
151
152 error = copyout((void *)(buffer + file_offset),
153 (void *)vmaddr, a_out->a_text + a_out->a_data);
153 (void *)vmaddr, a_out->a_text + a_out->a_data);
154
155 vm_map_remove(kernel_map, buffer,
156 buffer + round_page(a_out->a_text + a_out->a_data + file_offset));
157
158 if (error)
159 goto fail;
160
161 /*
162 * remove write enable on the 'text' part
163 */
164 error = vm_map_protect(&vmspace->vm_map,
165 vmaddr,
154
155 vm_map_remove(kernel_map, buffer,
156 buffer + round_page(a_out->a_text + a_out->a_data + file_offset));
157
158 if (error)
159 goto fail;
160
161 /*
162 * remove write enable on the 'text' part
163 */
164 error = vm_map_protect(&vmspace->vm_map,
165 vmaddr,
166 vmaddr + a_out->a_text,
167 VM_PROT_EXECUTE|VM_PROT_READ,
168 TRUE);
166 vmaddr + a_out->a_text,
167 VM_PROT_EXECUTE|VM_PROT_READ,
168 TRUE);
169 if (error)
170 goto fail;
171 }
172 else {
173#ifdef DEBUG
174 printf("imgact: Page aligned binary %lu\n", file_offset);
175#endif
176 /*
177 * Map text+data read/execute
178 */
179 vmaddr = virtual_offset;
180 error = vm_mmap(&vmspace->vm_map, &vmaddr,
181 a_out->a_text + a_out->a_data,
169 if (error)
170 goto fail;
171 }
172 else {
173#ifdef DEBUG
174 printf("imgact: Page aligned binary %lu\n", file_offset);
175#endif
176 /*
177 * Map text+data read/execute
178 */
179 vmaddr = virtual_offset;
180 error = vm_mmap(&vmspace->vm_map, &vmaddr,
181 a_out->a_text + a_out->a_data,
182 VM_PROT_READ | VM_PROT_EXECUTE,
183 VM_PROT_ALL,
184 MAP_PRIVATE | MAP_FIXED,
185 (caddr_t)imgp->vp, file_offset);
182 VM_PROT_READ | VM_PROT_EXECUTE,
183 VM_PROT_ALL,
184 MAP_PRIVATE | MAP_FIXED,
185 (caddr_t)imgp->vp, file_offset);
186 if (error)
187 goto fail;
186 if (error)
187 goto fail;
188
188
189#ifdef DEBUG
190 printf("imgact: startaddr=%08lx, length=%08lx\n",
191 (u_long)vmaddr, a_out->a_text + a_out->a_data);
192#endif
193 /*
194 * allow read/write of data
195 */
196 error = vm_map_protect(&vmspace->vm_map,
197 vmaddr + a_out->a_text,
198 vmaddr + a_out->a_text + a_out->a_data,
199 VM_PROT_ALL,
200 FALSE);
201 if (error)
202 goto fail;
189#ifdef DEBUG
190 printf("imgact: startaddr=%08lx, length=%08lx\n",
191 (u_long)vmaddr, a_out->a_text + a_out->a_data);
192#endif
193 /*
194 * allow read/write of data
195 */
196 error = vm_map_protect(&vmspace->vm_map,
197 vmaddr + a_out->a_text,
198 vmaddr + a_out->a_text + a_out->a_data,
199 VM_PROT_ALL,
200 FALSE);
201 if (error)
202 goto fail;
203
203
204 /*
205 * Allocate anon demand-zeroed area for uninitialized data
206 */
207 if (bss_size != 0) {
208 vmaddr = virtual_offset + a_out->a_text + a_out->a_data;
204 /*
205 * Allocate anon demand-zeroed area for uninitialized data
206 */
207 if (bss_size != 0) {
208 vmaddr = virtual_offset + a_out->a_text + a_out->a_data;
209 error = vm_map_find(&vmspace->vm_map, NULL, 0, &vmaddr,
209 error = vm_map_find(&vmspace->vm_map, NULL, 0, &vmaddr,
210 bss_size, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0);
211 if (error)
212 goto fail;
213#ifdef DEBUG
214 printf("imgact: bssaddr=%08lx, length=%08lx\n",
215 (u_long)vmaddr, bss_size);
216#endif
217

--- 6 unchanged lines hidden (view full) ---

224 vmspace->vm_tsize = round_page(a_out->a_text) >> PAGE_SHIFT;
225 vmspace->vm_dsize = round_page(a_out->a_data + bss_size) >> PAGE_SHIFT;
226 vmspace->vm_taddr = (caddr_t)virtual_offset;
227 vmspace->vm_daddr = (caddr_t)(virtual_offset + a_out->a_text);
228
229 /* Fill in image_params */
230 imgp->interpreted = 0;
231 imgp->entry_addr = a_out->a_entry;
210 bss_size, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0);
211 if (error)
212 goto fail;
213#ifdef DEBUG
214 printf("imgact: bssaddr=%08lx, length=%08lx\n",
215 (u_long)vmaddr, bss_size);
216#endif
217

--- 6 unchanged lines hidden (view full) ---

224 vmspace->vm_tsize = round_page(a_out->a_text) >> PAGE_SHIFT;
225 vmspace->vm_dsize = round_page(a_out->a_data + bss_size) >> PAGE_SHIFT;
226 vmspace->vm_taddr = (caddr_t)virtual_offset;
227 vmspace->vm_daddr = (caddr_t)(virtual_offset + a_out->a_text);
228
229 /* Fill in image_params */
230 imgp->interpreted = 0;
231 imgp->entry_addr = a_out->a_entry;
232
232
233 imgp->proc->p_sysent = &linux_sysvec;
234
235fail:
236 vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY, td);
237 return (error);
238}
239
240/*
241 * Tell kern_execve.c about it, with a little help from the linker.
242 */
243static struct execsw linux_execsw = { exec_linux_imgact, "linux a.out" };
244EXEC_SET(linuxaout, linux_execsw);
233 imgp->proc->p_sysent = &linux_sysvec;
234
235fail:
236 vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY, td);
237 return (error);
238}
239
240/*
241 * Tell kern_execve.c about it, with a little help from the linker.
242 */
243static struct execsw linux_execsw = { exec_linux_imgact, "linux a.out" };
244EXEC_SET(linuxaout, linux_execsw);