From afd0cd3fc15852600db10b246ff5ed1dbb48fc66 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Tue, 4 Aug 2009 18:19:52 +0000 Subject: [PATCH] 2009-08-04 Hui Zhu Michael Snyder * record.c (record_mem_entry): New field 'mem_entry_not_accessible'. (record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'. (record_wait): Set 'mem_entry_not_accessible' flag if target memory not readable. Don't try to change target memory if 'mem_entry_not_accessible' is set. --- gdb/ChangeLog | 9 ++++++ gdb/record.c | 77 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 25 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 42c5a2d103..71d73c65ff 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2009-08-04 Hui Zhu + Michael Snyder + + * record.c (record_mem_entry): New field 'mem_entry_not_accessible'. + (record_arch_list_add_mem): Initialize 'mem_entry_not_accessible'. + (record_wait): Set 'mem_entry_not_accessible' flag if target + memory not readable. Don't try to change target memory if + 'mem_entry_not_accessible' is set. + 2009-08-03 Richard Guenther Jan Kratochvil diff --git a/gdb/record.c b/gdb/record.c index 85e75a09ca..e5b8a37cc3 100644 --- a/gdb/record.c +++ b/gdb/record.c @@ -51,6 +51,9 @@ struct record_mem_entry { CORE_ADDR addr; int len; + /* Set this flag if target memory for this entry + can no longer be accessed. */ + int mem_entry_not_accessible; gdb_byte *val; }; @@ -275,6 +278,7 @@ record_arch_list_add_mem (CORE_ADDR addr, int len) rec->type = record_mem; rec->u.mem.addr = addr; rec->u.mem.len = len; + rec->u.mem.mem_entry_not_accessible = 0; if (target_read_memory (addr, rec->u.mem.val, len)) { @@ -727,32 +731,55 @@ record_wait (struct target_ops *ops, else if (record_list->type == record_mem) { /* mem */ - gdb_byte *mem = alloca (record_list->u.mem.len); - if (record_debug > 1) - fprintf_unfiltered (gdb_stdlog, - "Process record: record_mem %s to " - "inferior addr = %s len = %d.\n", - host_address_to_string (record_list), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); + /* Nothing to do if the entry is flagged not_accessible. */ + if (!record_list->u.mem.mem_entry_not_accessible) + { + gdb_byte *mem = alloca (record_list->u.mem.len); + if (record_debug > 1) + fprintf_unfiltered (gdb_stdlog, + "Process record: record_mem %s to " + "inferior addr = %s len = %d.\n", + host_address_to_string (record_list), + paddress (gdbarch, + record_list->u.mem.addr), + record_list->u.mem.len); - if (target_read_memory - (record_list->u.mem.addr, mem, record_list->u.mem.len)) - error (_("Process record: error reading memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - if (target_write_memory - (record_list->u.mem.addr, record_list->u.mem.val, - record_list->u.mem.len)) - error (_ - ("Process record: error writing memory at " - "addr = %s len = %d."), - paddress (gdbarch, record_list->u.mem.addr), - record_list->u.mem.len); - - memcpy (record_list->u.mem.val, mem, record_list->u.mem.len); + if (target_read_memory (record_list->u.mem.addr, mem, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error reading memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + /* Read failed -- + flag entry as not_accessible. */ + record_list->u.mem.mem_entry_not_accessible = 1; + } + else + { + if (target_write_memory (record_list->u.mem.addr, + record_list->u.mem.val, + record_list->u.mem.len)) + { + if (execution_direction != EXEC_REVERSE) + error (_("Process record: error writing memory at " + "addr = %s len = %d."), + paddress (gdbarch, record_list->u.mem.addr), + record_list->u.mem.len); + else + /* Write failed -- + flag entry as not_accessible. */ + record_list->u.mem.mem_entry_not_accessible = 1; + } + else + { + memcpy (record_list->u.mem.val, mem, + record_list->u.mem.len); + } + } + } } else {