37 |
37 |
|
38 |
38 |
#ifdef DEBUG_MMAP
|
39 |
39 |
printf("mprotect: start=0x" TARGET_FMT_lx
|
40 |
|
"len=0x" TARGET_FMT_lx " prot=%c%c%c\n", start, len,
|
|
40 |
"len=0x" TARGET_FMT_lx " prot=%c%c%c\n", start, len,
|
41 |
41 |
prot & PROT_READ ? 'r' : '-',
|
42 |
42 |
prot & PROT_WRITE ? 'w' : '-',
|
43 |
43 |
prot & PROT_EXEC ? 'x' : '-');
|
... | ... | |
100 |
100 |
abi_ulong start, abi_ulong end,
|
101 |
101 |
int prot, int flags, int fd, abi_ulong offset)
|
102 |
102 |
{
|
103 |
|
abi_ulong real_end, ret, addr;
|
|
103 |
abi_ulong real_end, addr;
|
104 |
104 |
void *host_start;
|
105 |
105 |
int prot1, prot_new;
|
106 |
106 |
|
... | ... | |
116 |
116 |
|
117 |
117 |
if (prot1 == 0) {
|
118 |
118 |
/* no page was there, so we allocate one */
|
119 |
|
ret = (long)mmap(host_start, qemu_host_page_size, prot,
|
120 |
|
flags | MAP_ANONYMOUS, -1, 0);
|
121 |
|
if (ret == -1)
|
122 |
|
return ret;
|
|
119 |
void *p = mmap(host_start, qemu_host_page_size, prot,
|
|
120 |
flags | MAP_ANONYMOUS, -1, 0);
|
|
121 |
if (p == MAP_FAILED)
|
|
122 |
return -1;
|
123 |
123 |
prot1 = prot;
|
124 |
124 |
}
|
125 |
125 |
prot1 &= PAGE_BITS;
|
... | ... | |
168 |
168 |
#ifdef DEBUG_MMAP
|
169 |
169 |
{
|
170 |
170 |
printf("mmap: start=0x" TARGET_FMT_lx
|
171 |
|
" len=0x" TARGET_FMT_lx " prot=%c%c%c flags=",
|
|
171 |
" len=0x" TARGET_FMT_lx " prot=%c%c%c flags=",
|
172 |
172 |
start, len,
|
173 |
173 |
prot & PROT_READ ? 'r' : '-',
|
174 |
174 |
prot & PROT_WRITE ? 'w' : '-',
|
... | ... | |
230 |
230 |
*/
|
231 |
231 |
abi_ulong host_end;
|
232 |
232 |
unsigned long host_aligned_start;
|
|
233 |
void *p;
|
233 |
234 |
|
234 |
235 |
host_len = HOST_PAGE_ALIGN(host_len + qemu_host_page_size
|
235 |
236 |
- qemu_real_host_page_size);
|
236 |
|
host_start = (unsigned long) mmap(real_start ?
|
237 |
|
g2h(real_start) : NULL,
|
238 |
|
host_len, prot, flags,
|
239 |
|
fd, host_offset);
|
240 |
|
if (host_start == -1)
|
|
237 |
p = mmap(real_start ? g2h(real_start) : NULL,
|
|
238 |
host_len, prot, flags, fd, host_offset);
|
|
239 |
if (p == MAP_FAILED)
|
241 |
240 |
return -1;
|
242 |
241 |
|
|
242 |
host_start = (unsigned long)p;
|
243 |
243 |
host_end = host_start + host_len;
|
244 |
244 |
|
245 |
245 |
/* Find start and end, aligned to the targets pagesize with-in the
|
... | ... | |
260 |
260 |
goto the_end1;
|
261 |
261 |
} else {
|
262 |
262 |
/* if not fixed, no need to do anything */
|
263 |
|
host_start = (long)mmap(real_start ? g2h(real_start) : NULL,
|
|
263 |
void *p = mmap(real_start ? g2h(real_start) : NULL,
|
264 |
264 |
host_len, prot, flags, fd, host_offset);
|
265 |
|
if (host_start == -1)
|
|
265 |
if (p == MAP_FAILED)
|
266 |
266 |
return -1;
|
267 |
267 |
/* update start so that it points to the file position at 'offset' */
|
|
268 |
host_start = (unsigned long)p;
|
268 |
269 |
if (!(flags & MAP_ANONYMOUS))
|
269 |
270 |
host_start += offset - host_offset;
|
270 |
271 |
start = h2g(host_start);
|
... | ... | |
333 |
334 |
|
334 |
335 |
/* map the middle (easier) */
|
335 |
336 |
if (real_start < real_end) {
|
|
337 |
void *p;
|
336 |
338 |
unsigned long offset1;
|
337 |
|
if (flags & MAP_ANONYMOUS)
|
338 |
|
offset1 = 0;
|
339 |
|
else
|
340 |
|
offset1 = offset + real_start - start;
|
341 |
|
ret = (long)mmap(g2h(real_start), real_end - real_start,
|
342 |
|
prot, flags, fd, offset1);
|
343 |
|
if (ret == -1)
|
|
339 |
if (flags & MAP_ANONYMOUS)
|
|
340 |
offset1 = 0;
|
|
341 |
else
|
|
342 |
offset1 = offset + real_start - start;
|
|
343 |
p = mmap(g2h(real_start), real_end - real_start,
|
|
344 |
prot, flags, fd, offset1);
|
|
345 |
if (p == MAP_FAILED)
|
344 |
346 |
return -1;
|
345 |
347 |
}
|
346 |
348 |
the_end1:
|