This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Memory fencing problem in pthread cancellation


On 01/14/2013 03:58 PM, Carlos O'Donell wrote:
You are correct, we need another entry for libgcc_s_resume, and we need
to load that after the barrier, otherwise we won't call libgcc_s_resume.

Something like this:

diff --git a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
index 58ca9ac..1e03b13 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
+++ b/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
@@ -104,7 +104,12 @@ asm (
  "      mov     r6, r0\n"
  "      cmp     r3, #0\n"
  "      beq     4f\n"
-"5:    mov     r0, r6\n"
+       atomic_asm_full_barrier()
+"5:    ldr     r4, 6f\n"
+"      ldr     r5, 7f\n"
+"8:    add     r4, pc, r4\n"
+"      ldr     r3, [r4, r5]\n"
+"      mov     r0, r6\n"
  "      ldmfd   sp!, {r4, r5, r6, lr}\n"
  "      " CFI_ADJUST_CFA_OFFSET (-16) "\n"
  "      " CFI_RESTORE (r4) "\n"
@@ -123,7 +128,13 @@ asm (
  #else
  "1:    .word   _GLOBAL_OFFSET_TABLE_ - 3b - 8\n"
  #endif
-"2:    .word   libgcc_s_resume(GOTOFF)\n"
+"2:    .word   libgcc_s_handle(GOTOFF)\n"
+#ifdef __thumb2__
+"6:    .word   _GLOBAL_OFFSET_TABLE_ - 8b - 4\n"
+#else
+"6:    .word   _GLOBAL_OFFSET_TABLE_ - 8b - 8\n"
+#endif
+"7:    .word   libgcc_s_resume(GOTOFF)\n"
  "      .size   _Unwind_Resume, .-_Unwind_Resume\n"
  );
Added. Likewise for the other changes. With one tweak:

[ ... ]

@@ -76,7 +92,7 @@ asm (
  "      " CFI_RESTORE (lr) "\n"
  "      bx      r3\n"
  "      " CFI_RESTORE_STATE "\n"
-"4:    bl      init\n"
+"4:    bl      pthread_cancel_init\n"
  "      ldr     r3, [r4, r5]\n"
  "      b       5b\n"
  "      " CFI_ENDPROC "\n"
I got the impression via a later message from Joseph that this code was supposed to call init rather than pthread_cancel_init. So I didn't apply that hunk.

Updated patch with all the updates/fixes to be posted tomorrow AM.

Jeff


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]