Author: jhb
Date: Mon Sep 11 22:18:01 2017
New Revision: 323466
URL: https://svnweb.freebsd.org/changeset/base/323466

Log:
  Add CFI directives for _rtld_bind_start.
  
  This allows debuggers to unwind back into the caller when stopped in the
  runtime linker.
  
  Sponsored by: DARPA / AFRL

Modified:
  head/libexec/rtld-elf/mips/rtld_start.S

Modified: head/libexec/rtld-elf/mips/rtld_start.S
==============================================================================
--- head/libexec/rtld-elf/mips/rtld_start.S     Mon Sep 11 21:49:38 2017        
(r323465)
+++ head/libexec/rtld-elf/mips/rtld_start.S     Mon Sep 11 22:18:01 2017        
(r323466)
@@ -104,26 +104,39 @@ END(rtld_start)
        .ent    _rtld_bind_start
 _rtld_bind_start:
        .frame  sp, XCALLFRAME_SIZ, $15
+       .cfi_startproc simple
+       .cfi_register ra, $15
        move    v1, gp                  /* save old GP */
 #if defined(__mips_o32) || defined(__mips_o64)
        PTR_ADDU t9, 8                  /* modify T9 to point at .cpload */
 #endif
        SETUP_GP
        PTR_SUBU sp, XCALLFRAME_SIZ     /* save arguments and sp value in stack 
*/
+       .cfi_def_cfa sp, XCALLFRAME_SIZ
        SETUP_GP64(XCALLFRAME_GP, _rtld_bind_start)
        SAVE_GP(XCALLFRAME_GP)
 #if defined(__mips_n32) || defined(__mips_n64)
        REG_S   a4,  XCALLFRAME_A4(sp)
+       .cfi_rel_offset a4, XCALLFRAME_A4
        REG_S   a5,  XCALLFRAME_A5(sp)
+       .cfi_rel_offset a5, XCALLFRAME_A5
        REG_S   a6,  XCALLFRAME_A6(sp)
+       .cfi_rel_offset a6, XCALLFRAME_A6
        REG_S   a7,  XCALLFRAME_A7(sp)
+       .cfi_rel_offset a7, XCALLFRAME_A7
 #endif
        REG_S   a0,  XCALLFRAME_A0(sp)
+       .cfi_rel_offset a0, XCALLFRAME_A0
        REG_S   a1,  XCALLFRAME_A1(sp)
+       .cfi_rel_offset a1, XCALLFRAME_A1
        REG_S   a2,  XCALLFRAME_A2(sp)
+       .cfi_rel_offset a2, XCALLFRAME_A2
        REG_S   a3,  XCALLFRAME_A3(sp)
+       .cfi_rel_offset a3, XCALLFRAME_A3
        REG_S   $15,  XCALLFRAME_RA(sp) /* ra is in t7/t3 */
+       .cfi_rel_offset ra, XCALLFRAME_RA
        REG_S   s0,  XCALLFRAME_S0(sp)
+       .cfi_rel_offset s0, XCALLFRAME_S0
        move    s0, sp
 
        move    a0, v1                  /* old GP */
@@ -147,20 +160,31 @@ _rtld_bind_start:
 
        move    sp, s0
        REG_L   ra, XCALLFRAME_RA(sp)
+       .cfi_restore ra
        REG_L   s0, XCALLFRAME_S0(sp)
+       .cfi_restore s0
        REG_L   a0, XCALLFRAME_A0(sp)
+       .cfi_restore a0
        REG_L   a1, XCALLFRAME_A1(sp)
+       .cfi_restore a1
        REG_L   a2, XCALLFRAME_A2(sp)
+       .cfi_restore a2
        REG_L   a3, XCALLFRAME_A3(sp)
+       .cfi_restore a3
 #if defined(__mips_n32) || defined(__mips_n64)
        REG_L   a4, XCALLFRAME_A4(sp)
+       .cfi_restore a4
        REG_L   a5, XCALLFRAME_A5(sp)
+       .cfi_restore a5
        REG_L   a6, XCALLFRAME_A6(sp)
+       .cfi_restore a6
        REG_L   a7, XCALLFRAME_A7(sp)
+       .cfi_restore a7
 #endif
        RESTORE_GP64
        PTR_ADDU sp, XCALLFRAME_SIZ
        move    t9, v0
        jr      t9
        nop
+       .cfi_endproc
 END(_rtld_bind_start)
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to