diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2017-08-27 18:36:25 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2017-08-27 18:36:25 +0200 |
commit | ba569a7ebe749ea925008baf2b8ff4d1e4cd6cef (patch) | |
tree | b02d38133b9798c402e43897164a67094b4665d1 | |
parent | 7913f633c6fea18d8c6683ad465617d54c9eb535 (diff) | |
download | gnumach-ba569a7ebe749ea925008baf2b8ff4d1e4cd6cef.tar.gz gnumach-ba569a7ebe749ea925008baf2b8ff4d1e4cd6cef.tar.bz2 gnumach-ba569a7ebe749ea925008baf2b8ff4d1e4cd6cef.zip |
ddb: More gracefully handle address errors
* i386/i386/db_interface.h (db_read_bytes): Return boolean_t instead of
void.
* i386/i386/db_interface.c (db_user_to_kernel_address): Return -1
instead of calling db_error() if address is bogus.
(db_read_bytes): Return FALSE instead of calling db_error() if address
is bogus.
* ddb/db_access.c (db_get_task_value): Return 0 if db_read_bytes failed.
* ddb/db_examine.c (db_xcdump): Only print * if db_read_bytes failed.
-rw-r--r-- | ddb/db_access.c | 3 | ||||
-rw-r--r-- | ddb/db_examine.c | 5 | ||||
-rw-r--r-- | i386/i386/db_interface.c | 12 | ||||
-rw-r--r-- | i386/i386/db_interface.h | 2 |
4 files changed, 12 insertions, 10 deletions
diff --git a/ddb/db_access.c b/ddb/db_access.c index 16d4d3ef..509c1ba4 100644 --- a/ddb/db_access.c +++ b/ddb/db_access.c @@ -72,7 +72,8 @@ db_get_task_value( db_expr_t value; int i; - db_read_bytes(addr, size, data, task); + if (!db_read_bytes(addr, size, data, task)) + return 0; value = 0; #if BYTE_MSF diff --git a/ddb/db_examine.c b/ddb/db_examine.c index 836b0e89..6f94b686 100644 --- a/ddb/db_examine.c +++ b/ddb/db_examine.c @@ -473,7 +473,10 @@ db_xcdump( if (!DB_CHECK_ACCESS(next_page_addr, sizeof(int), task)) bcount = next_page_addr - addr; } - db_read_bytes(addr, bcount, data, task); + if (!db_read_bytes(addr, bcount, data, task)) { + db_printf("*\n"); + continue; + } for (i = 0; i < bcount && off != 0; i += size) { if (i % 4 == 0) db_printf(" "); diff --git a/i386/i386/db_interface.c b/i386/i386/db_interface.c index b3fac0bb..aac29395 100644 --- a/i386/i386/db_interface.c +++ b/i386/i386/db_interface.c @@ -446,8 +446,6 @@ db_user_to_kernel_address( } if (flag) { db_printf("\nno memory is assigned to address %08x\n", addr); - db_error(0); - /* NOTREACHED */ } return(-1); } @@ -459,7 +457,7 @@ db_user_to_kernel_address( * Read bytes from kernel address space for debugger. */ -void +boolean_t db_read_bytes( vm_offset_t addr, int size, @@ -477,17 +475,16 @@ db_read_bytes( while (--size >= 0) { if (addr < VM_MIN_KERNEL_ADDRESS && task == TASK_NULL) { db_printf("\nbad address %x\n", addr); - db_error(0); - /* NOTREACHED */ + return FALSE; } addr++; *data++ = *src++; } - return; + return TRUE; } while (size > 0) { if (db_user_to_kernel_address(task, addr, &kern_addr, 1) < 0) - return; + return FALSE; src = (char *)kern_addr; n = intel_trunc_page(addr+INTEL_PGBYTES) - addr; if (n > size) @@ -497,6 +494,7 @@ db_read_bytes( while (--n >= 0) *data++ = *src++; } + return TRUE; } /* diff --git a/i386/i386/db_interface.h b/i386/i386/db_interface.h index 9ffb6a60..18ee3291 100644 --- a/i386/i386/db_interface.h +++ b/i386/i386/db_interface.h @@ -32,7 +32,7 @@ extern boolean_t kdb_trap ( int code, struct i386_saved_state *regs); -extern void db_read_bytes ( +extern boolean_t db_read_bytes ( vm_offset_t addr, int size, char *data, |