1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

mips: Fix bracktrace result for signal frames

MIPS fallback code handle a frame where its FDE can not be obtained
(for instance a signal frame) by reading the kernel allocated signal frame
and adding '2' to the value of 'sc_pc' [1].  The added value is used to
recognize an end of an EH region on mips16 [2].

The fix adjust the obtained signal frame value and remove the libgcc added
value by checking if the previous frame is a signal frame one.

Checked with backtrace and tst-sigcontext-get_pc tests on mips-linux-gnu
and mips64-linux-gnu.

[1] libgcc/config/mips/linux-unwind.h from gcc code.
[2] gcc/config/mips/mips.h from gcc code.  */
This commit is contained in:
Adhemerval Zanella
2020-02-17 10:57:56 -03:00
parent 631cf64bc1
commit 6e05978f0c
3 changed files with 102 additions and 0 deletions

View File

@ -23,6 +23,7 @@
#include <gnu/lib-names.h>
#include <stdlib.h>
#include <unwind.h>
#include <unwind-arch.h>
struct trace_arg
{
@ -78,6 +79,10 @@ backtrace_helper (struct _Unwind_Context *ctx, void *a)
if (arg->cnt != -1)
{
arg->array[arg->cnt] = (void *) unwind_getip (ctx);
if (arg->cnt > 0)
arg->array[arg->cnt]
= unwind_arch_adjustment (arg->array[arg->cnt - 1],
arg->array[arg->cnt]);
/* Check whether we make any progress. */
_Unwind_Word cfa = unwind_getcfa (ctx);