* linux-low.c (linux_prepare_to_access_memory): New.
(linux_unprepare_to_access_memory): New. (linux_target_ops): Install them. * server.c (read_memory): Rename to ... (gdb_read_memory): ... this. Use prepare_to_access_memory/prepare_to_access_memory. (write_memory): Rename to ... (gdb_write_memory): ... this. Use prepare_to_access_memory/prepare_to_access_memory. (handle_search_memory_1): Adjust. (process_serial_event): Adjust. * target.h (struct target_ops): New fields prepare_to_access_memory and unprepare_to_access_memory. (prepare_to_access_memory, unprepare_to_access_memory): New. * linux-x86-low.c (x86_insert_point, x86_remove_point): Use prepare_to_access_memory/prepare_to_access_memory. * nto-low.c (nto_target_ops): Adjust. * spu-low.c (spu_target_ops): Adjust. * win32-low.c (win32_target_ops): Adjust.
This commit is contained in:
parent
ae53ffa4b6
commit
90d74c301f
8 changed files with 128 additions and 13 deletions
|
@ -1,3 +1,25 @@
|
||||||
|
2010-08-26 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
|
* linux-low.c (linux_prepare_to_access_memory): New.
|
||||||
|
(linux_unprepare_to_access_memory): New.
|
||||||
|
(linux_target_ops): Install them.
|
||||||
|
* server.c (read_memory): Rename to ...
|
||||||
|
(gdb_read_memory): ... this. Use
|
||||||
|
prepare_to_access_memory/prepare_to_access_memory.
|
||||||
|
(write_memory): Rename to ...
|
||||||
|
(gdb_write_memory): ... this. Use
|
||||||
|
prepare_to_access_memory/prepare_to_access_memory.
|
||||||
|
(handle_search_memory_1): Adjust.
|
||||||
|
(process_serial_event): Adjust.
|
||||||
|
* target.h (struct target_ops): New fields
|
||||||
|
prepare_to_access_memory and unprepare_to_access_memory.
|
||||||
|
(prepare_to_access_memory, unprepare_to_access_memory): New.
|
||||||
|
* linux-x86-low.c (x86_insert_point, x86_remove_point): Use
|
||||||
|
prepare_to_access_memory/prepare_to_access_memory.
|
||||||
|
* nto-low.c (nto_target_ops): Adjust.
|
||||||
|
* spu-low.c (spu_target_ops): Adjust.
|
||||||
|
* win32-low.c (win32_target_ops): Adjust.
|
||||||
|
|
||||||
2010-08-26 Pedro Alves <pedro@codesourcery.com>
|
2010-08-26 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* Makefile.in (WARN_CFLAGS): Get it from configure.
|
* Makefile.in (WARN_CFLAGS): Get it from configure.
|
||||||
|
|
|
@ -5005,6 +5005,25 @@ linux_unpause_all (int unfreeze)
|
||||||
unstop_all_lwps (unfreeze, NULL);
|
unstop_all_lwps (unfreeze, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
linux_prepare_to_access_memory (void)
|
||||||
|
{
|
||||||
|
/* Neither ptrace nor /proc/PID/mem allow accessing memory through a
|
||||||
|
running LWP. */
|
||||||
|
if (non_stop)
|
||||||
|
linux_pause_all (1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
linux_unprepare_to_access_memory (void)
|
||||||
|
{
|
||||||
|
/* Neither ptrace nor /proc/PID/mem allow accessing memory through a
|
||||||
|
running LWP. */
|
||||||
|
if (non_stop)
|
||||||
|
linux_unpause_all (1);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
linux_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr,
|
linux_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr,
|
||||||
CORE_ADDR collector,
|
CORE_ADDR collector,
|
||||||
|
@ -5043,6 +5062,8 @@ static struct target_ops linux_target_ops = {
|
||||||
linux_wait,
|
linux_wait,
|
||||||
linux_fetch_registers,
|
linux_fetch_registers,
|
||||||
linux_store_registers,
|
linux_store_registers,
|
||||||
|
linux_prepare_to_access_memory,
|
||||||
|
linux_unprepare_to_access_memory,
|
||||||
linux_read_memory,
|
linux_read_memory,
|
||||||
linux_write_memory,
|
linux_write_memory,
|
||||||
linux_look_up_symbols,
|
linux_look_up_symbols,
|
||||||
|
|
|
@ -546,7 +546,7 @@ i386_dr_low_get_status (void)
|
||||||
return x86_linux_dr_get (ptid, DR_STATUS);
|
return x86_linux_dr_get (ptid, DR_STATUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Watchpoint support. */
|
/* Breakpoint/Watchpoint support. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
x86_insert_point (char type, CORE_ADDR addr, int len)
|
x86_insert_point (char type, CORE_ADDR addr, int len)
|
||||||
|
@ -555,7 +555,16 @@ x86_insert_point (char type, CORE_ADDR addr, int len)
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case '0':
|
case '0':
|
||||||
return set_gdb_breakpoint_at (addr);
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = prepare_to_access_memory ();
|
||||||
|
if (ret)
|
||||||
|
return -1;
|
||||||
|
ret = set_gdb_breakpoint_at (addr);
|
||||||
|
unprepare_to_access_memory ();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
case '2':
|
case '2':
|
||||||
case '3':
|
case '3':
|
||||||
case '4':
|
case '4':
|
||||||
|
@ -574,7 +583,16 @@ x86_remove_point (char type, CORE_ADDR addr, int len)
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case '0':
|
case '0':
|
||||||
return delete_gdb_breakpoint_at (addr);
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = prepare_to_access_memory ();
|
||||||
|
if (ret)
|
||||||
|
return -1;
|
||||||
|
ret = delete_gdb_breakpoint_at (addr);
|
||||||
|
unprepare_to_access_memory ();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
case '2':
|
case '2':
|
||||||
case '3':
|
case '3':
|
||||||
case '4':
|
case '4':
|
||||||
|
|
|
@ -913,6 +913,8 @@ static struct target_ops nto_target_ops = {
|
||||||
nto_wait,
|
nto_wait,
|
||||||
nto_fetch_registers,
|
nto_fetch_registers,
|
||||||
nto_store_registers,
|
nto_store_registers,
|
||||||
|
NULL, /* prepare_to_access_memory */
|
||||||
|
NULL, /* unprepare_to_access_memory */
|
||||||
nto_read_memory,
|
nto_read_memory,
|
||||||
nto_write_memory,
|
nto_write_memory,
|
||||||
NULL, /* nto_look_up_symbols */
|
NULL, /* nto_look_up_symbols */
|
||||||
|
|
|
@ -539,8 +539,10 @@ monitor_show_help (void)
|
||||||
/* Read trace frame or inferior memory. */
|
/* Read trace frame or inferior memory. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
|
gdb_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (current_traceframe >= 0)
|
if (current_traceframe >= 0)
|
||||||
{
|
{
|
||||||
ULONGEST nbytes;
|
ULONGEST nbytes;
|
||||||
|
@ -558,19 +560,36 @@ read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
|
||||||
/* (assume no half-trace half-real blocks for now) */
|
/* (assume no half-trace half-real blocks for now) */
|
||||||
}
|
}
|
||||||
|
|
||||||
return read_inferior_memory (memaddr, myaddr, len);
|
ret = prepare_to_access_memory ();
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
ret = read_inferior_memory (memaddr, myaddr, len);
|
||||||
|
unprepare_to_access_memory ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write trace frame or inferior memory. Actually, writing to trace
|
/* Write trace frame or inferior memory. Actually, writing to trace
|
||||||
frames is forbidden. */
|
frames is forbidden. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
|
gdb_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
|
||||||
{
|
{
|
||||||
if (current_traceframe >= 0)
|
if (current_traceframe >= 0)
|
||||||
return EIO;
|
return EIO;
|
||||||
else
|
else
|
||||||
return write_inferior_memory (memaddr, myaddr, len);
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = prepare_to_access_memory ();
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
ret = write_inferior_memory (memaddr, myaddr, len);
|
||||||
|
unprepare_to_access_memory ();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Subroutine of handle_search_memory to simplify it. */
|
/* Subroutine of handle_search_memory to simplify it. */
|
||||||
|
@ -584,7 +603,7 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len,
|
||||||
{
|
{
|
||||||
/* Prime the search buffer. */
|
/* Prime the search buffer. */
|
||||||
|
|
||||||
if (read_memory (start_addr, search_buf, search_buf_size) != 0)
|
if (gdb_read_memory (start_addr, search_buf, search_buf_size) != 0)
|
||||||
{
|
{
|
||||||
warning ("Unable to access target memory at 0x%lx, halting search.",
|
warning ("Unable to access target memory at 0x%lx, halting search.",
|
||||||
(long) start_addr);
|
(long) start_addr);
|
||||||
|
@ -635,8 +654,8 @@ handle_search_memory_1 (CORE_ADDR start_addr, CORE_ADDR search_space_len,
|
||||||
? search_space_len - keep_len
|
? search_space_len - keep_len
|
||||||
: chunk_size);
|
: chunk_size);
|
||||||
|
|
||||||
if (read_memory (read_addr, search_buf + keep_len,
|
if (gdb_read_memory (read_addr, search_buf + keep_len,
|
||||||
nr_to_read) != 0)
|
nr_to_read) != 0)
|
||||||
{
|
{
|
||||||
warning ("Unable to access target memory at 0x%lx, halting search.",
|
warning ("Unable to access target memory at 0x%lx, halting search.",
|
||||||
(long) read_addr);
|
(long) read_addr);
|
||||||
|
@ -2924,7 +2943,7 @@ process_serial_event (void)
|
||||||
case 'm':
|
case 'm':
|
||||||
require_running (own_buf);
|
require_running (own_buf);
|
||||||
decode_m_packet (&own_buf[1], &mem_addr, &len);
|
decode_m_packet (&own_buf[1], &mem_addr, &len);
|
||||||
if (read_memory (mem_addr, mem_buf, len) == 0)
|
if (gdb_read_memory (mem_addr, mem_buf, len) == 0)
|
||||||
convert_int_to_ascii (mem_buf, own_buf, len);
|
convert_int_to_ascii (mem_buf, own_buf, len);
|
||||||
else
|
else
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
|
@ -2932,7 +2951,7 @@ process_serial_event (void)
|
||||||
case 'M':
|
case 'M':
|
||||||
require_running (own_buf);
|
require_running (own_buf);
|
||||||
decode_M_packet (&own_buf[1], &mem_addr, &len, &mem_buf);
|
decode_M_packet (&own_buf[1], &mem_addr, &len, &mem_buf);
|
||||||
if (write_memory (mem_addr, mem_buf, len) == 0)
|
if (gdb_write_memory (mem_addr, mem_buf, len) == 0)
|
||||||
write_ok (own_buf);
|
write_ok (own_buf);
|
||||||
else
|
else
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
|
@ -2941,7 +2960,7 @@ process_serial_event (void)
|
||||||
require_running (own_buf);
|
require_running (own_buf);
|
||||||
if (decode_X_packet (&own_buf[1], packet_len - 1,
|
if (decode_X_packet (&own_buf[1], packet_len - 1,
|
||||||
&mem_addr, &len, &mem_buf) < 0
|
&mem_addr, &len, &mem_buf) < 0
|
||||||
|| write_memory (mem_addr, mem_buf, len) != 0)
|
|| gdb_write_memory (mem_addr, mem_buf, len) != 0)
|
||||||
write_enn (own_buf);
|
write_enn (own_buf);
|
||||||
else
|
else
|
||||||
write_ok (own_buf);
|
write_ok (own_buf);
|
||||||
|
|
|
@ -653,6 +653,8 @@ static struct target_ops spu_target_ops = {
|
||||||
spu_wait,
|
spu_wait,
|
||||||
spu_fetch_registers,
|
spu_fetch_registers,
|
||||||
spu_store_registers,
|
spu_store_registers,
|
||||||
|
NULL, /* prepare_to_access_memory */
|
||||||
|
NULL, /* unprepare_to_access_memory */
|
||||||
spu_read_memory,
|
spu_read_memory,
|
||||||
spu_write_memory,
|
spu_write_memory,
|
||||||
spu_look_up_symbols,
|
spu_look_up_symbols,
|
||||||
|
|
|
@ -181,6 +181,23 @@ struct target_ops
|
||||||
|
|
||||||
void (*store_registers) (struct regcache *regcache, int regno);
|
void (*store_registers) (struct regcache *regcache, int regno);
|
||||||
|
|
||||||
|
/* Prepare to read or write memory from the inferior process.
|
||||||
|
Targets use this to do what is necessary to get the state of the
|
||||||
|
inferior such that it is possible to access memory.
|
||||||
|
|
||||||
|
This should generally only be called from client facing routines,
|
||||||
|
such as gdb_read_memory/gdb_write_memory, or the insert_point
|
||||||
|
callbacks.
|
||||||
|
|
||||||
|
Like `read_memory' and `write_memory' below, returns 0 on success
|
||||||
|
and errno on failure. */
|
||||||
|
|
||||||
|
int (*prepare_to_access_memory) (void);
|
||||||
|
|
||||||
|
/* Undo the effects of prepare_to_access_memory. */
|
||||||
|
|
||||||
|
void (*unprepare_to_access_memory) (void);
|
||||||
|
|
||||||
/* Read memory from the inferior process. This should generally be
|
/* Read memory from the inferior process. This should generally be
|
||||||
called through read_inferior_memory, which handles breakpoint shadowing.
|
called through read_inferior_memory, which handles breakpoint shadowing.
|
||||||
|
|
||||||
|
@ -469,6 +486,18 @@ int start_non_stop (int nonstop);
|
||||||
ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
|
ptid_t mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options,
|
||||||
int connected_wait);
|
int connected_wait);
|
||||||
|
|
||||||
|
#define prepare_to_access_memory() \
|
||||||
|
(the_target->prepare_to_access_memory \
|
||||||
|
? (*the_target->prepare_to_access_memory) () \
|
||||||
|
: 0)
|
||||||
|
|
||||||
|
#define unprepare_to_access_memory() \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (the_target->unprepare_to_access_memory) \
|
||||||
|
(*the_target->unprepare_to_access_memory) (); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);
|
int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);
|
||||||
|
|
||||||
int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
|
int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
|
||||||
|
|
|
@ -1781,6 +1781,8 @@ static struct target_ops win32_target_ops = {
|
||||||
win32_wait,
|
win32_wait,
|
||||||
win32_fetch_inferior_registers,
|
win32_fetch_inferior_registers,
|
||||||
win32_store_inferior_registers,
|
win32_store_inferior_registers,
|
||||||
|
NULL, /* prepare_to_access_memory */
|
||||||
|
NULL, /* unprepare_to_access_memory */
|
||||||
win32_read_inferior_memory,
|
win32_read_inferior_memory,
|
||||||
win32_write_inferior_memory,
|
win32_write_inferior_memory,
|
||||||
NULL, /* lookup_symbols */
|
NULL, /* lookup_symbols */
|
||||||
|
|
Loading…
Reference in a new issue