diff options
author | marcel <marcel@FreeBSD.org> | 2003-08-07 07:52:39 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2003-08-07 07:52:39 +0000 |
commit | 139a0b455dd26db73b3e1489e718a64ec828526f (patch) | |
tree | 9e00517f87f37af81280ea200d2d22523af76512 /sys/ia64/include/ucontext.h | |
parent | 298b52ca8772e368784f0b552f8bc8cdfb860f0c (diff) | |
download | FreeBSD-src-139a0b455dd26db73b3e1489e718a64ec828526f.zip FreeBSD-src-139a0b455dd26db73b3e1489e718a64ec828526f.tar.gz |
Better define the flags in the mcontext_t and properly set the flags
when we create contexts. The meaning of the flags are documented in
<machine/ucontext.h>. I only list them here to help browsing the
commit logs:
_MC_FLAGS_ASYNC_CONTEXT
_MC_FLAGS_HIGHFP_VALID
_MC_FLAGS_KSE_SET_MBOX
_MC_FLAGS_RETURN_VALID
_MC_FLAGS_SCRATCH_VALID
Yes, _MC_FLAGS_KSE_SET_MBOX is a hack and I'm proud of it :-)
Diffstat (limited to 'sys/ia64/include/ucontext.h')
-rw-r--r-- | sys/ia64/include/ucontext.h | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/sys/ia64/include/ucontext.h b/sys/ia64/include/ucontext.h index e5fae65..66f8fff 100644 --- a/sys/ia64/include/ucontext.h +++ b/sys/ia64/include/ucontext.h @@ -33,10 +33,60 @@ #include <machine/_regset.h> +/* + * The mc_flags field provides the necessary clues when dealing with the gory + * details of ia64 specific contexts. A comprehensive explanation is added for + * everybody's sanity, including the author's. + * + * The first and foremost variation in the context is synchronous contexts + * (= synctx) versus asynchronous contexts (= asynctx). A synctx is created + * synchronously WRT program execution and has the advantage that none of the + * scratch registers have to be saved. They are assumed to be clobbered by the + * call to the function that creates the context. An asynctx needs to have the + * scratch registers preserved because it can describe any point in a thread's + * (or process') execution. + * + * Below a description of the flags and their meaning: + * + * _MC_FLAGS_ASYNC_CONTEXT + * If set, indicates that mc_scratch and mc_scratch_fp are both + * valid. IFF not set, _MC_FLAGS_RETURN_VALID indicates if the + * return registers are valid or not. + * _MC_FLAGS_HIGHFP_VALID + * If set, indicates that the high FP registers (f32-f127) are + * valid. This flag is very likely not going to be set for any + * sensible synctx, but is not explicitly disallowed. Any synctx + * that has this flag may or may not have the high FP registers + * restored. In short: don't do it. + * _MC_FLAGS_KSE_SET_MBOX + * This flag is special to setcontext(2) and swapcontext(2). It + * instructs the kernel to write the value in mc_special.isr to + * the memory address pointed to by mc_special.ifa. This allows + * the kernel to switch to a new context in a KSE based threaded + * program. Note that this is a non-srandard extension to the + * otherwise standard system calls and use of this flag should be + * limited to KSE. + * _MC_FLAGS_RETURN_VALID + * If set and _MC_FLAGS_ASYNC_CONTEXT is not set indicates that + * the ABI defined return registers are valid. Both getcontext(2) + * and swapcontext(2) need to save the system call return values. + * Any synctx that does not have this flag may still have the + * return registers restored from the context. + * _MC_FLAGS_SCRATCH_VALID + * If set and _MC_FLAGS_ASYNC_CONTEXT is not set indicates that + * the scratch registers, but not the FP registers are valid. + * This flag is set in contexts passed to signal handlers. This + * flag is a superset of _MC_FLAGS_RETURN_VALID. If both flags + * are set, this flag takes precedence. + */ + typedef struct __mcontext { unsigned long mc_flags; -#define IA64_MC_FLAGS_SCRATCH_VALID 1 -#define IA64_MC_FLAGS_HIGHFP_VALID 2 +#define _MC_FLAGS_ASYNC_CONTEXT 0x0001 +#define _MC_FLAGS_HIGHFP_VALID 0x0002 +#define _MC_FLAGS_KSE_SET_MBOX 0x0004 +#define _MC_FLAGS_RETURN_VALID 0x0008 +#define _MC_FLAGS_SCRATCH_VALID 0x0010 unsigned long _reserved_; struct _special mc_special; struct _callee_saved mc_preserved; |