2012-01-17 Pedro Alves <palves@redhat.com>
authorPedro Alves <palves@redhat.com>
Tue, 17 Jan 2012 17:22:10 +0000 (17:22 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 17 Jan 2012 17:22:10 +0000 (17:22 +0000)
* tracepoint.c (initialize_tracepoint): Use mmap instead of
memalign plus mprotect to allocate the scratch buffer.

gdb/gdbserver/ChangeLog
gdb/gdbserver/tracepoint.c

index 14950fb..901a990 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-17  Pedro Alves  <palves@redhat.com>
+
+       * tracepoint.c (initialize_tracepoint): Use mmap instead of
+       memalign plus mprotect to allocate the scratch buffer.
+
 2012-01-13  Pedro Alves  <palves@redhat.com>
 
        * server.c (attach_inferior): Clear `cont_thread'.
index 3e6dac0..3dc0073 100644 (file)
@@ -8251,23 +8251,35 @@ initialize_tracepoint (void)
 
 #ifdef IN_PROCESS_AGENT
   {
+    uintptr_t addr;
     int pagesize;
+
     pagesize = sysconf (_SC_PAGE_SIZE);
     if (pagesize == -1)
       fatal ("sysconf");
 
     gdb_tp_heap_buffer = xmalloc (5 * 1024 * 1024);
 
-    /* Allocate scratch buffer aligned on a page boundary.  */
-    gdb_jump_pad_buffer = memalign (pagesize, pagesize * 20);
-    gdb_jump_pad_buffer_end = gdb_jump_pad_buffer + pagesize * 20;
+#define SCRATCH_BUFFER_NPAGES 20
+
+    /* Allocate scratch buffer aligned on a page boundary, at a low
+       address (close to the main executable's code).  */
+    for (addr = pagesize; addr != 0; addr += pagesize)
+      {
+       gdb_jump_pad_buffer = mmap ((void *) addr, pagesize * SCRATCH_BUFFER_NPAGES,
+                                   PROT_READ | PROT_WRITE | PROT_EXEC,
+                                   MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+                                   -1, 0);
+       if (gdb_jump_pad_buffer != MAP_FAILED)
+         break;
+      }
 
-    /* Make it writable and executable.  */
-    if (mprotect (gdb_jump_pad_buffer, pagesize * 20,
-                 PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
+    if (addr == 0)
       fatal ("\
-initialize_tracepoint: mprotect(%p, %d, PROT_READ|PROT_EXEC) failed with %s",
-            gdb_jump_pad_buffer, pagesize * 20, strerror (errno));
+initialize_tracepoint: mmap'ing jump pad buffer failed with %s",
+            strerror (errno));
+
+    gdb_jump_pad_buffer_end = gdb_jump_pad_buffer + pagesize * SCRATCH_BUFFER_NPAGES;
   }
 
   gdb_trampoline_buffer = gdb_trampoline_buffer_end = 0;