about summary refs log tree commit diff
path: root/arch/riscv64
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2019-09-29 18:20:40 -0400
committerRich Felker <dalias@aerifal.cx>2019-09-29 18:53:32 -0400
commitab3eb89a8b83353cdaab12ed017a67a7730f90e9 (patch)
treeb91deb687c7004417207e4b0a6077522211d2a95 /arch/riscv64
parent33bc7f05fc856d8819083afe4668907a9d262e4c (diff)
downloadmusl-ab3eb89a8b83353cdaab12ed017a67a7730f90e9.tar.gz
musl-ab3eb89a8b83353cdaab12ed017a67a7730f90e9.tar.xz
musl-ab3eb89a8b83353cdaab12ed017a67a7730f90e9.zip
fix riscv64 signal.h namespace violations and ucontext API mismatches
the top-level mcontext_t member names were namespace-violating in
standards profiles before, and nested-level member names (some of them
single-letter) were egregiously bad namespace impositions even in
non-strict profiles. moreover, they mismatched those used in the
public API first defined in glibc, breaking any code making use of
them.

unlike most archs, the public API used in glibc for riscv mcontext_t
members was designed to be namespace-safe, so we can and should expose
the members regardless of feature test macros. only the typedefs for
greg_t, gregset_t, and fpregset_t need to be protected behind FTMs.

the struct tags for mcontext_t and ucontext_t are also changed. for
mcontext_t this is necessary to make the common definition across
profiles namespace-safe. for ucontext_t, it's just a matter of
matching the tag from the glibc-defined API.

these changes are split off and expanded from a patch by Khem Raj.
Diffstat (limited to 'arch/riscv64')
-rw-r--r--arch/riscv64/bits/signal.h45
-rw-r--r--arch/riscv64/pthread_arch.h2
2 files changed, 20 insertions, 27 deletions
diff --git a/arch/riscv64/bits/signal.h b/arch/riscv64/bits/signal.h
index 76d7ad80..03fe48c1 100644
--- a/arch/riscv64/bits/signal.h
+++ b/arch/riscv64/bits/signal.h
@@ -6,47 +6,40 @@
 # define SIGSTKSZ 8192
 #endif
 
-/* gregs[0] holds the program counter. */
-
 #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
 typedef unsigned long greg_t;
 typedef unsigned long gregset_t[32];
+typedef union __riscv_mc_fp_state fpregset_t;
+#endif
+
+typedef unsigned long __riscv_mc_gp_state[32];
 
 struct __riscv_mc_f_ext_state {
-	unsigned int f[32];
-	unsigned int fcsr;
+	unsigned int __f[32];
+	unsigned int __fcsr;
 };
 
 struct __riscv_mc_d_ext_state {
-	unsigned long long f[32];
-	unsigned int fcsr;
+	unsigned long long __f[32];
+	unsigned int __fcsr;
 };
 
 struct __riscv_mc_q_ext_state {
-	unsigned long long f[64] __attribute__((aligned(16)));
-	unsigned int fcsr;
-	unsigned int reserved[3];
+	unsigned long long __f[64] __attribute__((aligned(16)));
+	unsigned int __fcsr;
+	unsigned int __reserved[3];
 };
 
 union __riscv_mc_fp_state {
-	struct __riscv_mc_f_ext_state f;
-	struct __riscv_mc_d_ext_state d;
-	struct __riscv_mc_q_ext_state q;
+	struct __riscv_mc_f_ext_state __f;
+	struct __riscv_mc_d_ext_state __d;
+	struct __riscv_mc_q_ext_state __q;
 };
 
-typedef union __riscv_mc_fp_state fpregset_t;
-
-typedef struct sigcontext {
-	gregset_t gregs;
-	fpregset_t fpregs;
-} mcontext_t;
-
-#else
-typedef struct {
-	unsigned long gregs[32];
-	unsigned long long fpregs[66];
+typedef struct mcontext_t {
+	__riscv_mc_gp_state __gregs;
+	union __riscv_mc_fp_state __fpregs;
 } mcontext_t;
-#endif
 
 struct sigaltstack {
 	void *ss_sp;
@@ -54,10 +47,10 @@ struct sigaltstack {
 	size_t ss_size;
 };
 
-typedef struct __ucontext
+typedef struct ucontext_t
 {
 	unsigned long uc_flags;
-	struct __ucontext *uc_link;
+	struct ucontext_t *uc_link;
 	stack_t uc_stack;
 	sigset_t uc_sigmask;
 	mcontext_t uc_mcontext;
diff --git a/arch/riscv64/pthread_arch.h b/arch/riscv64/pthread_arch.h
index 1268b72d..db414b17 100644
--- a/arch/riscv64/pthread_arch.h
+++ b/arch/riscv64/pthread_arch.h
@@ -11,4 +11,4 @@ static inline struct pthread *__pthread_self()
 
 #define DTP_OFFSET 0x800
 
-#define MC_PC gregs[0]
+#define MC_PC __gregs[0]