Patchwork [v2,21/21] nptl: riscv: Fix Race conditions in pthread cancellation (BZ#12683)

login
register
mail settings
Submitter Adhemerval Zanella Netto
Date Feb. 26, 2018, 9:03 p.m.
Message ID <1519679016-12241-22-git-send-email-adhemerval.zanella@linaro.org>
Download mbox | patch
Permalink /patch/26095/
State New
Headers show

Comments

Adhemerval Zanella Netto - Feb. 26, 2018, 9:03 p.m.
This patch adds the riscv modifications required for the BZ#12683.
It basically adds the required ucontext_get_pc function.

The default syscall_cancel.c should be as expected for RISCV. With
GCC 7.3.1 syscall_cancel.c generates the following code:

0000000000000000 <__GI___syscall_cancel_arch>:
   0:   8346                    mv      t1,a7

0000000000000002 <__syscall_cancel_arch_start>:
   2:   00052883                lw      a7,0(a0)
   6:   0048f893                andi    a7,a7,4
   a:   00089c63                bnez    a7,22 <.L0 >
   e:   88ae                    mv      a7,a1
  10:   8532                    mv      a0,a2
  12:   85b6                    mv      a1,a3
  14:   863a                    mv      a2,a4
  16:   86be                    mv      a3,a5
  18:   8742                    mv      a4,a6
  1a:   879a                    mv      a5,t1
  1c:   00000073                ecall

0000000000000020 <__syscall_cancel_arch_end>:
  20:   8082                    ret

  22:   1141                    addi    sp,sp,-16
  24:   e406                    sd      ra,8(sp)
  26:   00000097                auipc   ra,0x0
  2a:   000080e7                jalr    ra # 26 <.L0 >

Checked with a build for riscv64-linux-gnu with run-built-tests=no.

	[BZ #12683]
	* sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h (ucontext_get_pc):
	New fuction.
---
 ChangeLog                                      |  4 ++++
 sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h | 12 ++++++++++++
 2 files changed, 16 insertions(+)

Patch

diff --git a/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h b/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
index 3ca8a80..5a68ff8 100644
--- a/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
@@ -16,6 +16,10 @@ 
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
+#ifndef _SIGCONTEXTINFO_H
+#define _SIGCONTEXTINFO_H
+
+#include <stdint.h>
 #include <sys/ucontext.h>
 
 #define SIGCONTEXT siginfo_t *_si, ucontext_t *
@@ -26,3 +30,11 @@ 
 
 #define CALL_SIGHANDLER(handler, signo, ctx) \
   (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx))
+
+static inline uintptr_t
+ucontext_get_pc (const ucontext_t *uc)
+{
+  return uc->uc_mcontext.__gregs[REG_PC];
+}
+
+#endif /* _SIGCONTEXTINFO_H  */