From 4b48dc411a11fd38b7e5d0e8aeecf1bb1f7b90d8 Mon Sep 17 00:00:00 2001 From: Fredrik Hederstierna Date: Tue, 27 Sep 2016 02:02:47 +0100 Subject: Detect the magic address of EXC_RETURN in ARM coretx-m profile On ARMv6-M and ARMv7-M, the exception return address is sort of magic address defined by the manual. This patch is to let GDB well handle these magic addresses. 2016-09-27 Fredrik Hederstierna * arm-tdep.c (arm_m_addr_is_magic): New function. (arm_addr_bits_remove): Call arm_m_addr_is_magic. (arm_m_exception_unwind_sniffer): Likewise. --- gdb/ChangeLog | 6 ++++++ gdb/arm-tdep.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 65 insertions(+), 9 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 63359d4..39d8202 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2016-09-27 Fredrik Hederstierna + + * arm-tdep.c (arm_m_addr_is_magic): New function. + (arm_addr_bits_remove): Call arm_m_addr_is_magic. + (arm_m_exception_unwind_sniffer): Likewise. + 2016-09-21 Yao Qi * aarch32-linux-nat.c (aarch32_gp_regcache_collect): Keep diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index d2661cb..2525bd8 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -464,6 +464,62 @@ arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr) return 0; } +/* Determine if the address specified equals any of these magic return + values, called EXC_RETURN, defined by the ARM v6-M and v7-M + architectures. + + From ARMv6-M Reference Manual B1.5.8 + Table B1-5 Exception return behavior + + EXC_RETURN Return To Return Stack + 0xFFFFFFF1 Handler mode Main + 0xFFFFFFF9 Thread mode Main + 0xFFFFFFFD Thread mode Process + + From ARMv7-M Reference Manual B1.5.8 + Table B1-8 EXC_RETURN definition of exception return behavior, no FP + + EXC_RETURN Return To Return Stack + 0xFFFFFFF1 Handler mode Main + 0xFFFFFFF9 Thread mode Main + 0xFFFFFFFD Thread mode Process + + Table B1-9 EXC_RETURN definition of exception return behavior, with + FP + + EXC_RETURN Return To Return Stack Frame Type + 0xFFFFFFE1 Handler mode Main Extended + 0xFFFFFFE9 Thread mode Main Extended + 0xFFFFFFED Thread mode Process Extended + 0xFFFFFFF1 Handler mode Main Basic + 0xFFFFFFF9 Thread mode Main Basic + 0xFFFFFFFD Thread mode Process Basic + + For more details see "B1.5.8 Exception return behavior" + in both ARMv6-M and ARMv7-M Architecture Reference Manuals. */ + +static int +arm_m_addr_is_magic (CORE_ADDR addr) +{ + switch (addr) + { + /* Values from Tables in B1.5.8 the EXC_RETURN definitions of + the exception return behavior. */ + case 0xffffffe1: + case 0xffffffe9: + case 0xffffffed: + case 0xfffffff1: + case 0xfffffff9: + case 0xfffffffd: + /* Address is magic. */ + return 1; + + default: + /* Address is not magic. */ + return 0; + } +} + /* Remove useless bits from addresses in a running program. */ static CORE_ADDR arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val) @@ -471,7 +527,7 @@ arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val) /* On M-profile devices, do not strip the low bit from EXC_RETURN (the magic exception return address). */ if (gdbarch_tdep (gdbarch)->is_m - && (val & 0xfffffff0) == 0xfffffff0) + && arm_m_addr_is_magic (val)) return val; if (arm_apcs_32) @@ -2990,14 +3046,8 @@ arm_m_exception_unwind_sniffer (const struct frame_unwind *self, /* No need to check is_m; this sniffer is only registered for M-profile architectures. */ - /* Exception frames return to one of these magic PCs. Other values - are not defined as of v7-M. See details in "B1.5.8 Exception - return behavior" in "ARMv7-M Architecture Reference Manual". */ - if (this_pc == 0xfffffff1 || this_pc == 0xfffffff9 - || this_pc == 0xfffffffd) - return 1; - - return 0; + /* Check if exception frame returns to a magic PC value. */ + return arm_m_addr_is_magic (this_pc); } /* Frame unwinder for M-profile exceptions. */ -- cgit v1.1