diff mbox series

RISC-V: Mark RA as undefined at the start of execution

Message ID 20180519004953.19860-1-palmer@dabbelt.com
State New
Headers show
Series RISC-V: Mark RA as undefined at the start of execution | expand

Commit Message

Palmer Dabbelt May 19, 2018, 12:49 a.m. UTC
glibc bug 23125 (originally GCC bug 85492) demonstrates an infinate loop
in exception handling that results from RA as being undefined at the
start of program execution.  This patch uses a CFI directive to mark RA
as undefined, which allows the backtrace to terminate.

There is no explicit glibc test case for this, but I thought I'd send
the patch out anyway as it is fixing a bug.  I'd like to have a test
before committing this.

I have not even compiled this.  I will do that before committing... :)

Thanks to Aurelian Jarno for finding the bug, and Jim Wilson for fixing
it.

ChangeLog

2018-05-18  Palmer Dabbelt  <palmer@sifive.com>

        PR 23125
        * sysdeps/riscv/start.S (ENTRY_POINT): Mark ra as undefined so
        backtraces can terminate if they reach this point.
---
 sysdeps/riscv/start.S | 2 ++
 1 file changed, 2 insertions(+)

Comments

Andreas Schwab Sept. 25, 2018, 11:42 a.m. UTC | #1
On Mai 18 2018, Palmer Dabbelt <palmer@dabbelt.com> wrote:

> diff --git a/sysdeps/riscv/start.S b/sysdeps/riscv/start.S
> index 4635ddb5eb8c..93a80bc4a760 100644
> --- a/sysdeps/riscv/start.S
> +++ b/sysdeps/riscv/start.S
> @@ -43,6 +43,8 @@
>     __libc_start_main wants this in a5.  */
>  
>  ENTRY (ENTRY_POINT)
> +	/* Mark ra as undefined in order to stop unwinding here!  */
> +	cfi_undefined (ra)
>  	call  .Lload_gp
>  	mv    a5, a0  /* rtld_fini.  */
>  	/* main may be in a shared library.  */

This will put the DW_CFA_undefined into the CIE, not the FDE, since it
isn't associated with an insn.  You problably want to move it after the
call (CFI directives are always associated with the preceding insn).

The same issue exists with sysdeps/unix/sysv/linux/riscv/setcontext.S.

Andreas.
diff mbox series

Patch

diff --git a/sysdeps/riscv/start.S b/sysdeps/riscv/start.S
index 4635ddb5eb8c..93a80bc4a760 100644
--- a/sysdeps/riscv/start.S
+++ b/sysdeps/riscv/start.S
@@ -43,6 +43,8 @@ 
    __libc_start_main wants this in a5.  */
 
 ENTRY (ENTRY_POINT)
+	/* Mark ra as undefined in order to stop unwinding here!  */
+	cfi_undefined (ra)
 	call  .Lload_gp
 	mv    a5, a0  /* rtld_fini.  */
 	/* main may be in a shared library.  */