From: Julian Seward Date: Thu, 17 Mar 2005 02:14:44 +0000 (+0000) Subject: Fix VG_({un}pad_address_space) so as to make sys_io_setup work again. X-Git-Tag: svn/VALGRIND_3_0_0~935 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a5c020b4fc6151aa3a8b4bbb719c927772972d5;p=thirdparty%2Fvalgrind.git Fix VG_({un}pad_address_space) so as to make sys_io_setup work again. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3383 --- diff --git a/coregrind/linux/syscalls.c b/coregrind/linux/syscalls.c index bd5fc07d8e..e0edc4afe8 100644 --- a/coregrind/linux/syscalls.c +++ b/coregrind/linux/syscalls.c @@ -519,6 +519,7 @@ PRE(sys_io_setup, Special) VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED); VG_(pad_address_space)(0); + SET_RESULT( VG_(do_syscall2)(SYSNO, ARG1, ARG2) ); VG_(unpad_address_space)(0); if (RES == 0) { diff --git a/coregrind/vg_memory.c b/coregrind/vg_memory.c index 1eaa98ab0a..81cc934d57 100644 --- a/coregrind/vg_memory.c +++ b/coregrind/vg_memory.c @@ -948,11 +948,11 @@ Addr VG_(find_map_space)(Addr addr, SizeT len, Bool for_client) kernel has no choice but to put the memory where we want it. */ void VG_(pad_address_space)(Addr start) { - vg_assert(0); -#if 0 - Addr addr = (start == 0) ? VG_(client_base) : start; - Segment *s = VG_(SkipNode_First)(&sk_segments); - Addr ret; + Addr addr = (start == 0) ? VG_(client_base) : start; + Addr ret; + + Int i = 0; + Segment* s = i >= segments_used ? NULL : &segments[i]; while (s && addr <= VG_(valgrind_last)) { if (addr < s->addr) { @@ -960,9 +960,9 @@ void VG_(pad_address_space)(Addr start) VKI_MAP_FIXED | VKI_MAP_PRIVATE | VKI_MAP_ANONYMOUS, -1, 0); } - addr = s->addr + s->len; - s = VG_(SkipNode_Next)(&sk_segments, s); + i++; + s = i >= segments_used ? NULL : &segments[i]; } if (addr <= VG_(valgrind_last)) { @@ -970,36 +970,31 @@ void VG_(pad_address_space)(Addr start) VKI_MAP_FIXED | VKI_MAP_PRIVATE | VKI_MAP_ANONYMOUS, -1, 0); } - - return; -#endif } /* Remove the address space padding added by VG_(pad_address_space) by removing any mappings that it created. */ void VG_(unpad_address_space)(Addr start) { -vg_assert(0); -#if 0 - Addr addr = (start == 0) ? VG_(client_base) : start; - Segment *s = VG_(SkipNode_First)(&sk_segments); - Int ret; + Addr addr = (start == 0) ? VG_(client_base) : start; + Int ret; + + Int i = 0; + Segment* s = i >= segments_used ? NULL : &segments[i]; while (s && addr <= VG_(valgrind_last)) { if (addr < s->addr) { ret = VG_(do_syscall2)(__NR_munmap, addr, s->addr - addr); } - addr = s->addr + s->len; - s = VG_(SkipNode_Next)(&sk_segments, s); + i++; + s = i >= segments_used ? NULL : &segments[i]; } if (addr <= VG_(valgrind_last)) { - ret = VG_(do_syscall2)(__NR_munmap, addr, (VG_(valgrind_last) - addr) + 1); + ret = VG_(do_syscall2)(__NR_munmap, addr, + (VG_(valgrind_last) - addr) + 1); } - - return; -#endif } /* Find the segment holding 'a', or NULL if none. */