struct vki_timespec *rem );
/* system/mman.h */
-extern void* VG_(mmap)( void* start, UInt length,
- UInt prot, UInt flags, UInt fd, UInt offset );
+extern void* VG_(mmap)( void* start, UInt length, UInt prot, UInt flags,
+ UInt sf_flags, UInt fd, UInt offset );
extern Int VG_(munmap)( void* start, Int length );
extern Int VG_(mprotect)( void *start, Int length, UInt prot );
/*--------------------------------------------------------------------*/
// Returns 0 on failure.
-Addr VG_(client_alloc)(Addr addr, UInt len, UInt prot, UInt flags)
+Addr VG_(client_alloc)(Addr addr, UInt len, UInt prot, UInt sf_flags)
{
len = PGROUNDUP(len);
- if (!(flags & SF_FIXED))
+ if (!(sf_flags & SF_FIXED))
addr = VG_(find_map_space)(addr, len, True);
// Don't do the mapping if we couldn't find space!
if (0 == addr)
return 0;
- flags |= SF_CORE;
-
if (VG_(mmap)((void *)addr, len, prot,
VKI_MAP_FIXED | VKI_MAP_PRIVATE | VKI_MAP_ANONYMOUS | VKI_MAP_CLIENT,
- -1, 0) == (void *)addr) {
- VG_(map_segment)(addr, len, prot, flags);
+ sf_flags | SF_CORE, -1, 0) == (void *)addr)
+ {
return addr;
}
}
/* Returns -1 on failure. */
-void* VG_(mmap)( void* start, UInt length,
- UInt prot, UInt flags, UInt fd, UInt offset)
+void* VG_(mmap)( void* start, UInt length,
+ UInt prot, UInt flags, UInt sf_flags, UInt fd, UInt offset)
{
Addr res;
if (!(flags & VKI_MAP_FIXED)) {
start = (void *)VG_(find_map_space)((Addr)start, length, !!(flags & VKI_MAP_CLIENT));
- if (start == 0)
- return (void *)-1;
flags |= VKI_MAP_FIXED;
}
+ if (start == 0)
+ return (void *)-1;
res = mmap_inner(start, length, prot, flags, fd, offset);
+ // Check it ended up in the right place.
if (!VG_(is_kerror)(res)) {
- UInt sf_flags = SF_MMAP;
-
- if (flags & VKI_MAP_FIXED)
- sf_flags |= SF_FIXED;
- if (flags & VKI_MAP_SHARED)
- sf_flags |= SF_SHARED;
- if (!(flags & VKI_MAP_ANONYMOUS))
- sf_flags |= SF_FILE;
- if (!(flags & VKI_MAP_CLIENT))
- sf_flags |= SF_VALGRIND;
- if (flags & VKI_MAP_NOSYMS)
- sf_flags |= SF_NOSYMS;
-
- /* placeholder - caller will update flags etc if they want */
- VG_(map_fd_segment)(res, length, prot, sf_flags, fd, offset, NULL);
-
if (flags & VKI_MAP_CLIENT) {
- if (res < VG_(client_base) || res >= VG_(client_end)) {
- VG_(munmap)((void *)res, length);
- res = -1;
- }
+ vg_assert(VG_(client_base) <= res && res+length < VG_(client_end));
} else {
- if (res < VG_(valgrind_base) || res >= VG_(valgrind_end)) {
- VG_(munmap)((void *)res, length);
- res = -1;
- }
+ vg_assert(VG_(valgrind_base) <= res && res+length < VG_(valgrind_end));
}
}
-
+ if (!VG_(is_kerror)(res)) {
+ sf_flags |= SF_MMAP;
+ if ( flags & VKI_MAP_FIXED) sf_flags |= SF_FIXED;
+ if ( flags & VKI_MAP_SHARED) sf_flags |= SF_SHARED;
+ if (!(flags & VKI_MAP_ANONYMOUS)) sf_flags |= SF_FILE;
+ if (!(flags & VKI_MAP_CLIENT)) sf_flags |= SF_VALGRIND;
+ if ( flags & VKI_MAP_NOSYMS) sf_flags |= SF_NOSYMS;
+
+ VG_(map_fd_segment)(res, length, prot, sf_flags, fd, offset, NULL);
+ }
return VG_(is_kerror)(res) ? ((void*)(-1)) : (void*)res;
}
then extend the stack segment.
*/
Addr base = PGROUNDDN(esp);
- Char *ret = VG_(mmap)((Char *)base, seg->addr - base,
- VKI_PROT_READ | VKI_PROT_WRITE | VKI_PROT_EXEC,
- VKI_MAP_PRIVATE | VKI_MAP_FIXED | VKI_MAP_ANONYMOUS | VKI_MAP_CLIENT,
- -1, 0);
- if ((Addr)ret == base) {
- VG_(map_segment)(base, seg->addr - base,
- VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC,
- SF_STACK|SF_GROWDOWN);
- return; /* restart instruction */
+ if ((void*)-1 != VG_(mmap)((Char *)base, seg->addr - base,
+ VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC,
+ VKI_MAP_PRIVATE|VKI_MAP_FIXED|VKI_MAP_ANONYMOUS|VKI_MAP_CLIENT,
+ SF_STACK|SF_GROWDOWN,
+ -1, 0))
+ {
+ return; // extension succeeded, restart instruction
}
/* Otherwise fall into normal signal handling */
} else if (info->si_code == 2 && /* SEGV_ACCERR */
*size = stat_buf.st_size;
if ((addr = (Addr)VG_(mmap)(NULL, *size, VKI_PROT_READ,
- VKI_MAP_PRIVATE|VKI_MAP_NOSYMS, fd, 0)) == (Addr)-1) {
+ VKI_MAP_PRIVATE|VKI_MAP_NOSYMS,
+ 0, fd, 0)) == (Addr)-1)
+ {
VG_(close)(fd);
return 0;
}
}
oimage = (Addr)VG_(mmap)( NULL, n_oimage,
- VKI_PROT_READ, VKI_MAP_PRIVATE|VKI_MAP_NOSYMS, fd, 0 );
+ VKI_PROT_READ, VKI_MAP_PRIVATE|VKI_MAP_NOSYMS,
+ 0, fd, 0 );
VG_(close)(fd);
if (newaddr == current) {
ret = newbrk;
- } else if (VG_(mmap)((void *)current , newaddr-current,
- VKI_PROT_READ | VKI_PROT_WRITE | VKI_PROT_EXEC,
- VKI_MAP_PRIVATE | VKI_MAP_ANONYMOUS | VKI_MAP_FIXED | VKI_MAP_CLIENT,
- -1, 0) >= 0) {
- VG_(map_segment)(current, newaddr-current, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC,
- SF_FIXED|SF_BRK);
+ } else if ((void*)-1 != VG_(mmap)((void*)current, newaddr-current,
+ VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC,
+ VKI_MAP_PRIVATE|VKI_MAP_ANONYMOUS|VKI_MAP_FIXED|VKI_MAP_CLIENT,
+ SF_FIXED|SF_BRK, -1, 0))
+ {
ret = newbrk;
}
} else {
POST(mmap2)
{
if (!VG_(is_kerror)(res)) {
- if (!valid_client_addr(res, arg2, tid, "mmap2")) {
- VG_(munmap)((void *)res, arg2);
- res = -VKI_ENOMEM;
- } else
- mmap_segment( (Addr)res, arg2, arg3, arg4, arg5, arg6 * (ULong)VKI_BYTES_PER_PAGE );
+ vg_assert(valid_client_addr(res, arg2, tid, "mmap2"));
+ mmap_segment( (Addr)res, arg2, arg3, arg4, arg5, arg6 * (ULong)VKI_BYTES_PER_PAGE );
}
}
res = VG_(do_syscall)(__NR_mmap, new_arg_block);
if (!VG_(is_kerror)(res)) {
- if (!valid_client_addr(res, a2, tid, "mmap")) {
- VG_(munmap)((void *)res, a2);
- res = -VKI_ENOMEM;
- } else
- mmap_segment( (Addr)res, a2, a3, a4, a5, a6 );
+ vg_assert(valid_client_addr(res, a2, tid, "mmap"));
+ mmap_segment( (Addr)res, a2, a3, a4, a5, a6 );
}
}
}