svn commit: r295561 - in head: include sys/mips/include sys/powerpc/include sys/sparc64/include sys/sys sys/x86/include
Konstantin Belousov
kib at FreeBSD.org
Fri Feb 12 07:38:22 UTC 2016
Author: kib
Date: Fri Feb 12 07:38:19 2016
New Revision: 295561
URL: https://svnweb.freebsd.org/changeset/base/295561
Log:
POSIX states that #include <signal.h> shall make both mcontext_t and
ucontext_t available. Our code even has XXX comment about this.
Add a bit of compliance by moving struct __ucontext definition into
sys/_ucontext.h and including it into signal.h and sys/ucontext.h.
Several machine/ucontext.h headers were changed to use namespace-safe
types (like uint64_t->__uint64_t) to not depend on sys/types.h.
struct __stack_t from sys/signal.h is made always visible in private
namespace to satisfy sys/_ucontext.h requirements.
Apparently mips _types.h pollutes global namespace with f_register_t
type definition. This commit does not try to fix the issue.
PR: 207079
Reported and tested by: Ting-Wei Lan <lantw44 at gmail.com>
Sponsored by: The FreeBSD Foundation
MFC after: 2 weeks
Added:
head/sys/sys/_ucontext.h
- copied, changed from r295560, head/sys/sys/ucontext.h
Modified:
head/include/signal.h
head/sys/mips/include/ucontext.h
head/sys/powerpc/include/ucontext.h
head/sys/sparc64/include/ucontext.h
head/sys/sys/signal.h
head/sys/sys/ucontext.h
head/sys/x86/include/ucontext.h
Modified: head/include/signal.h
==============================================================================
--- head/include/signal.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/include/signal.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -36,6 +36,8 @@
#include <sys/cdefs.h>
#include <sys/_types.h>
#include <sys/signal.h>
+#include <machine/ucontext.h>
+#include <sys/_ucontext.h>
#if __BSD_VISIBLE
/*
@@ -114,7 +116,6 @@ void psignal(unsigned int, const char *)
#if __BSD_VISIBLE
int sigblock(int);
-struct __ucontext; /* XXX spec requires a complete declaration. */
int sigreturn(const struct __ucontext *);
int sigsetmask(int);
int sigstack(const struct sigstack *, struct sigstack *);
Modified: head/sys/mips/include/ucontext.h
==============================================================================
--- head/sys/mips/include/ucontext.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/mips/include/ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -50,13 +50,13 @@ typedef struct __mcontext {
* struct sigcontext and ucontext_t at the same time.
*/
int mc_onstack; /* sigstack state to restore */
- register_t mc_pc; /* pc at time of signal */
- register_t mc_regs[32]; /* processor regs 0 to 31 */
- register_t sr; /* status register */
- register_t mullo, mulhi; /* mullo and mulhi registers... */
+ __register_t mc_pc; /* pc at time of signal */
+ __register_t mc_regs[32]; /* processor regs 0 to 31 */
+ __register_t sr; /* status register */
+ __register_t mullo, mulhi; /* mullo and mulhi registers... */
int mc_fpused; /* fp has been used */
f_register_t mc_fpregs[33]; /* fp regs 0 to 31 and csr */
- register_t mc_fpc_eir; /* fp exception instruction reg */
+ __register_t mc_fpc_eir; /* fp exception instruction reg */
void *mc_tls; /* pointer to TLS area */
int __spare__[8]; /* XXX reserved */
} mcontext_t;
Modified: head/sys/powerpc/include/ucontext.h
==============================================================================
--- head/sys/powerpc/include/ucontext.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/powerpc/include/ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -42,11 +42,11 @@ typedef struct __mcontext {
#define _MC_AV_VALID 0x02
int mc_onstack; /* saved onstack flag */
int mc_len; /* sizeof(__mcontext) */
- uint64_t mc_avec[32*2]; /* vector register file */
- uint32_t mc_av[2];
- register_t mc_frame[42];
- uint64_t mc_fpreg[33];
- uint64_t mc_vsxfpreg[32]; /* low-order half of VSR0-31 */
+ __uint64_t mc_avec[32*2]; /* vector register file */
+ __uint32_t mc_av[2];
+ __register_t mc_frame[42];
+ __uint64_t mc_fpreg[33];
+ __uint64_t mc_vsxfpreg[32]; /* low-order half of VSR0-31 */
} mcontext_t __aligned(16);
#if defined(_KERNEL) && defined(__powerpc64__)
Modified: head/sys/sparc64/include/ucontext.h
==============================================================================
--- head/sys/sparc64/include/ucontext.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/sparc64/include/ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -33,11 +33,11 @@
#define _MACHINE_UCONTEXT_H_
struct __mcontext {
- uint64_t mc_global[8];
- uint64_t mc_out[8];
- uint64_t mc_local[8];
- uint64_t mc_in[8];
- uint32_t mc_fp[64];
+ __uint64_t mc_global[8];
+ __uint64_t mc_out[8];
+ __uint64_t mc_local[8];
+ __uint64_t mc_in[8];
+ __uint32_t mc_fp[64];
} __aligned(64);
typedef struct __mcontext mcontext_t;
Copied and modified: head/sys/sys/_ucontext.h (from r295560, head/sys/sys/ucontext.h)
==============================================================================
--- head/sys/sys/ucontext.h Fri Feb 12 07:27:24 2016 (r295560, copy source)
+++ head/sys/sys/_ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -28,11 +28,8 @@
* $FreeBSD$
*/
-#ifndef _SYS_UCONTEXT_H_
-#define _SYS_UCONTEXT_H_
-
-#include <sys/signal.h>
-#include <machine/ucontext.h>
+#ifndef _SYS__UCONTEXT_H_
+#define _SYS__UCONTEXT_H_
typedef struct __ucontext {
/*
@@ -43,64 +40,13 @@ typedef struct __ucontext {
* support them both at the same time.
* note: the union is not defined, though.
*/
- sigset_t uc_sigmask;
+ __sigset_t uc_sigmask;
mcontext_t uc_mcontext;
struct __ucontext *uc_link;
- stack_t uc_stack;
+ struct __stack_t uc_stack;
int uc_flags;
-#define UCF_SWAPPED 0x00000001 /* Used by swapcontext(3). */
int __spare__[4];
} ucontext_t;
-#if defined(_KERNEL) && defined(COMPAT_FREEBSD4)
-#if defined(__i386__)
-struct ucontext4 {
- sigset_t uc_sigmask;
- struct mcontext4 uc_mcontext;
- struct ucontext4 *uc_link;
- stack_t uc_stack;
- int __spare__[8];
-};
-#else /* __i386__ */
-#define ucontext4 ucontext
-#endif /* __i386__ */
-#endif /* _KERNEL */
-
-#ifndef _KERNEL
-
-__BEGIN_DECLS
-
-int getcontext(ucontext_t *) __returns_twice;
-ucontext_t *getcontextx(void);
-int setcontext(const ucontext_t *);
-void makecontext(ucontext_t *, void (*)(void), int, ...);
-int signalcontext(ucontext_t *, int, __sighandler_t *);
-int swapcontext(ucontext_t *, const ucontext_t *);
-
-#if __BSD_VISIBLE
-int __getcontextx_size(void);
-int __fillcontextx(char *ctx) __returns_twice;
-int __fillcontextx2(char *ctx);
-#endif
-
-__END_DECLS
-
-#else /* _KERNEL */
-
-struct thread;
-
-/*
- * Flags for get_mcontext(). The low order 4 bits (i.e a mask of 0x0f) are
- * reserved for use by machine independent code. All other bits are for use
- * by machine dependent code.
- */
-#define GET_MC_CLEAR_RET 1
-
-/* Machine-dependent functions: */
-int get_mcontext(struct thread *, mcontext_t *, int);
-int set_mcontext(struct thread *, mcontext_t *);
-
-#endif /* !_KERNEL */
-
-#endif /* !_SYS_UCONTEXT_H_ */
+#endif /* _SYS__UCONTEXT_H */
Modified: head/sys/sys/signal.h
==============================================================================
--- head/sys/sys/signal.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/sys/signal.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -354,18 +354,10 @@ typedef void __siginfohandler_t(int, str
#endif
#if __XSI_VISIBLE
-/*
- * Structure used in sigaltstack call.
- */
#if __BSD_VISIBLE
-typedef struct sigaltstack {
-#else
-typedef struct {
+#define __stack_t sigaltstack
#endif
- void *ss_sp; /* signal stack base */
- __size_t ss_size; /* signal stack length */
- int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */
-} stack_t;
+typedef struct __stack_t stack_t;
#define SS_ONSTACK 0x0001 /* take signal on alternate stack */
#define SS_DISABLE 0x0004 /* disable taking signals on alternate stack */
@@ -373,6 +365,17 @@ typedef struct {
#define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */
#endif
+/*
+ * Structure used in sigaltstack call. Its definition is always
+ * needed for __ucontext. If __BSD_VISIBLE is defined, the structure
+ * tag is actually sigaltstack.
+ */
+struct __stack_t {
+ void *ss_sp; /* signal stack base */
+ __size_t ss_size; /* signal stack length */
+ int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */
+};
+
#if __BSD_VISIBLE
/*
* 4.3 compatibility:
Modified: head/sys/sys/ucontext.h
==============================================================================
--- head/sys/sys/ucontext.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/sys/ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -33,25 +33,9 @@
#include <sys/signal.h>
#include <machine/ucontext.h>
+#include <sys/_ucontext.h>
-typedef struct __ucontext {
- /*
- * Keep the order of the first two fields. Also,
- * keep them the first two fields in the structure.
- * This way we can have a union with struct
- * sigcontext and ucontext_t. This allows us to
- * support them both at the same time.
- * note: the union is not defined, though.
- */
- sigset_t uc_sigmask;
- mcontext_t uc_mcontext;
-
- struct __ucontext *uc_link;
- stack_t uc_stack;
- int uc_flags;
#define UCF_SWAPPED 0x00000001 /* Used by swapcontext(3). */
- int __spare__[4];
-} ucontext_t;
#if defined(_KERNEL) && defined(COMPAT_FREEBSD4)
#if defined(__i386__)
Modified: head/sys/x86/include/ucontext.h
==============================================================================
--- head/sys/x86/include/ucontext.h Fri Feb 12 07:27:24 2016 (r295560)
+++ head/sys/x86/include/ucontext.h Fri Feb 12 07:38:19 2016 (r295561)
@@ -162,4 +162,9 @@ typedef struct __mcontext {
} mcontext_t;
#endif /* __amd64__ */
+#ifdef __LINT__
+typedef struct __mcontext {
+} mcontext_t;
+#endif /* __LINT__ */
+
#endif /* !_X86_UCONTEXT_H_ */
More information about the svn-src-all
mailing list