From fc1ab1a0ff3e33a36f7f9d02e3a2e478f4ddfee1 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 17 Jan 2012 17:22:10 +0000 Subject: 2012-01-17 Pedro Alves * tracepoint.c (initialize_tracepoint): Use mmap instead of memalign plus mprotect to allocate the scratch buffer. --- gdb/gdbserver/ChangeLog | 5 +++++ 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 + + * tracepoint.c (initialize_tracepoint): Use mmap instead of + memalign plus mprotect to allocate the scratch buffer. + 2012-01-13 Pedro Alves * 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; -- cgit v1.1