]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix VG_({un}pad_address_space) so as to make sys_io_setup work again.
authorJulian Seward <jseward@acm.org>
Thu, 17 Mar 2005 02:14:44 +0000 (02:14 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 17 Mar 2005 02:14:44 +0000 (02:14 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3383

coregrind/linux/syscalls.c
coregrind/vg_memory.c

index bd5fc07d8e4c3af71f301b7fbef50ea0a2765a6b..e0edc4afe87d94f078adba2391868b4da1b0f85c 100644 (file)
@@ -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) {
index 1eaa98ab0a4aaaa225d3fb28cd0391de8b4c524f..81cc934d57a34058c6e27e03c3a2e6c0f7c54d7a 100644 (file)
@@ -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. */