diff options
author | Pedro Alves <palves@redhat.com> | 2012-01-17 17:22:10 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2012-01-17 17:22:10 +0000 |
commit | fc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1 (patch) | |
tree | 95cb00429461d6803dbf12e1e1db9530933c1db1 | |
parent | c0bf857debe9fdbde5374c2e43e817ebe8f2c4ec (diff) | |
download | gdb-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/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/tracepoint.c | 28 |
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; |