fix async thread cancellation on powerpc64
authorRich Felker <dalias@aerifal.cx>
Wed, 29 Aug 2018 16:48:42 +0000 (12:48 -0400)
committerRich Felker <dalias@aerifal.cx>
Wed, 29 Aug 2018 16:48:42 +0000 (12:48 -0400)
entering the local entry point for __cancel from __cp_cancel is valid
if __cp_cancel was reached from __syscall_cp, since both are in libc
and share the same TOC pointer, but it is not valid if __cp_cancel was
reached when cancel_handler rewrote the program counter for
asynchronous cancellation of code outside libc.

to ensure __cancel is entered with a valid TOC pointer, recompute the
correct value in a PC-relative manner before jumping.

src/thread/powerpc64/syscall_cp.s

index d420dbdef51017cd4d282e9e2a54941960386961..ef50ed0073c48bcbc029fd82b3625e0eef8275b8 100644 (file)
@@ -34,4 +34,11 @@ __cp_end:
        blr
 
 __cp_cancel:
+       mflr 0
+       bl 1f
+       .long .TOC.-.
+1:     mflr 3
+       lwa 2, 0(3)
+       add 2, 2, 3
+       mtlr 0
        b __cancel