diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S | 18 |
2 files changed, 27 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S index 32fc47c3f3..a7b0a18108 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S @@ -129,6 +129,10 @@ L(noparms): the cpu link stack used to predict blr return addresses. */ bcl 20,31,L(gotexitcodeaddr); + /* End FDE now, because while executing on the context's stack + the unwind info would be wrong otherwise. */ + cfi_endproc + /* This is the helper code which gets called if a function which is registered with 'makecontext' returns. In this case we have to install the context listed in the uc_link element of @@ -157,6 +161,11 @@ L(do_exit): #endif b L(do_exit) + /* Re-establish FDE for the rest of the actual makecontext routine. */ + cfi_startproc + cfi_offset (lr, FRAME_LR_SAVE) + cfi_adjust_cfa_offset (128) + /* The address of the exit code is in the link register. Store the lr in the ucontext as LNK so the target function will return to our exit code. */ diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S index e1f0b8624c..5ec19ba561 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S @@ -129,6 +129,10 @@ ENTRY(__novec_setcontext) lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31) lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31) + /* End FDE now, because the unwind info would be wrong while + we're reloading registers to switch to the new context. */ + cfi_endproc + ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31) ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31) mtlr r0 @@ -177,6 +181,11 @@ ENTRY(__novec_setcontext) ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31) bctr + /* Re-establish FDE for the rest of the actual setcontext routine. */ + cfi_startproc + cfi_offset (lr, FRAME_LR_SAVE) + cfi_adjust_cfa_offset (128) + L(nv_error_exit): ld r0,128+FRAME_LR_SAVE(r1) addi r1,r1,128 @@ -403,6 +412,10 @@ L(has_no_vec): lfd fp1,(SIGCONTEXT_FP_REGS+(PT_R1*8))(r31) lfd fp0,(SIGCONTEXT_FP_REGS+(PT_R0*8))(r31) + /* End FDE now, because the unwind info would be wrong while + we're reloading registers to switch to the new context. */ + cfi_endproc + ld r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r31) ld r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r31) mtlr r0 @@ -451,6 +464,11 @@ L(has_no_vec): ld r31,(SIGCONTEXT_GP_REGS+(PT_R31*8))(r31) bctr + /* Re-establish FDE for the rest of the actual setcontext routine. */ + cfi_startproc + cfi_offset (lr, FRAME_LR_SAVE) + cfi_adjust_cfa_offset (128) + L(error_exit): ld r0,128+FRAME_LR_SAVE(r1) addi r1,r1,128 |