aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2012-01-17 17:22:10 +0000
committerPedro Alves <palves@redhat.com>2012-01-17 17:22:10 +0000
commitfc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1 (patch)
tree95cb00429461d6803dbf12e1e1db9530933c1db1
parentc0bf857debe9fdbde5374c2e43e817ebe8f2c4ec (diff)
downloadgdb-fc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1.zip
gdb-fc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1.tar.gz
gdb-fc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1.tar.bz2
2012-01-17 Pedro Alves <palves@redhat.com>
* tracepoint.c (initialize_tracepoint): Use mmap instead of memalign plus mprotect to allocate the scratch buffer.
-rw-r--r--gdb/gdbserver/ChangeLog5
-rw-r--r--gdb/gdbserver/tracepoint.c28
2 files changed, 25 insertions, 8 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 14950fb..901a990 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -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'.
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 3e6dac0..3dc0073 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -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;