diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2016-03-27 20:45:54 +0300 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gmail.com> | 2016-03-30 02:17:24 +0300 |
commit | a08b52b5c45195c0b095215f19422d2ab67a3a8d (patch) | |
tree | 4d6d903cebc3f9f321160b29fbd304bbbb241d93 /gdb | |
parent | c37c0ba69b670f0994b53078abdb07737f816a5a (diff) | |
download | binutils-a08b52b5c45195c0b095215f19422d2ab67a3a8d.zip binutils-a08b52b5c45195c0b095215f19422d2ab67a3a8d.tar.gz binutils-a08b52b5c45195c0b095215f19422d2ab67a3a8d.tar.bz2 |
gdb: xtensa: fix frame initialization when PC is invalid
When gdb is used on core dump and PC is not pointing to a readable
memory read_memory_integer call in the xtensa_frame_cache throws an
error, making register inspection/backtracing impossible in that thread.
Use safe_read_memory_integer instead.
2016-03-29 Max Filippov <jcmvbkbc@gmail.com>
gdb/
* xtensa-tdep.c (xtensa_frame_cache): Change op1 type to LONGEST.
Use safe_read_memory_integer instead of read_memory_integer.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/xtensa-tdep.c | 6 |
2 files changed, 8 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 25afbef..0c76434 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2016-03-29 Max Filippov <jcmvbkbc@gmail.com> + + * xtensa-tdep.c (xtensa_frame_cache): Change op1 type to LONGEST. + Use safe_read_memory_integer instead of read_memory_integer. + 2016-03-29 Marcin KoĆcielnicki <koriakin@0x04.net> * NEWS: Mention support for tracepoints on s390*-linux. diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c index 9e87fa5..3a3bada 100644 --- a/gdb/xtensa-tdep.c +++ b/gdb/xtensa-tdep.c @@ -1285,7 +1285,7 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache) if (windowed) { - char op1; + LONGEST op1; /* Get WINDOWBASE, WINDOWSTART, and PS registers. */ wb = get_frame_register_unsigned (this_frame, @@ -1293,8 +1293,8 @@ xtensa_frame_cache (struct frame_info *this_frame, void **this_cache) ws = get_frame_register_unsigned (this_frame, gdbarch_tdep (gdbarch)->ws_regnum); - op1 = read_memory_integer (pc, 1, byte_order); - if (XTENSA_IS_ENTRY (gdbarch, op1)) + if (safe_read_memory_integer (pc, 1, byte_order, &op1) + && XTENSA_IS_ENTRY (gdbarch, op1)) { int callinc = CALLINC (ps); ra = get_frame_register_unsigned |