Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Feb 2012 21:18:59 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r231981 - in stable/9: lib/libc/amd64/gen lib/libc/arm/gen lib/libc/gen lib/libc/i386/gen lib/libc/ia64/gen lib/libc/mips/gen lib/libc/powerpc/gen lib/libc/powerpc64/gen lib/libc/sparc6...
Message-ID:  <201202212118.q1LLIx8R020188@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Feb 21 21:18:59 2012
New Revision: 231981
URL: http://svn.freebsd.org/changeset/base/231981

Log:
  MFC r230429:
  Add API for obtaining extended machine context states that cannot be
  fit into existing mcontext_t.
  
  On i386 and amd64 do return the extended FPU states using
  getcontextx(3). For other architectures, getcontextx(3) returns the
  same information as getcontext(2).
  
  MFC r230864:
  Make the sys/ucontext.h self-contained by changing the return type
  of __getcontextx_size(3) from size_t to int.

Added:
  stable/9/lib/libc/amd64/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/amd64/gen/getcontextx.c
  stable/9/lib/libc/arm/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/arm/gen/getcontextx.c
  stable/9/lib/libc/i386/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/i386/gen/getcontextx.c
  stable/9/lib/libc/ia64/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/ia64/gen/getcontextx.c
  stable/9/lib/libc/mips/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/mips/gen/getcontextx.c
  stable/9/lib/libc/powerpc/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/powerpc/gen/getcontextx.c
  stable/9/lib/libc/powerpc64/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/powerpc64/gen/getcontextx.c
  stable/9/lib/libc/sparc64/gen/getcontextx.c
     - copied, changed from r230429, head/lib/libc/sparc64/gen/getcontextx.c
Modified:
  stable/9/lib/libc/amd64/gen/Makefile.inc
  stable/9/lib/libc/arm/gen/Makefile.inc
  stable/9/lib/libc/gen/Symbol.map
  stable/9/lib/libc/gen/getcontext.3
  stable/9/lib/libc/gen/ucontext.3
  stable/9/lib/libc/i386/gen/Makefile.inc
  stable/9/lib/libc/ia64/gen/Makefile.inc
  stable/9/lib/libc/mips/gen/Makefile.inc
  stable/9/lib/libc/powerpc/gen/Makefile.inc
  stable/9/lib/libc/powerpc64/gen/Makefile.inc
  stable/9/lib/libc/sparc64/gen/Makefile.inc
  stable/9/sys/sys/ucontext.h
Directory Properties:
  stable/9/lib/libc/   (props changed)
  stable/9/sys/   (props changed)

Modified: stable/9/lib/libc/amd64/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/amd64/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/amd64/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -2,7 +2,7 @@
 # $FreeBSD$
 
 SRCS+=	_setjmp.S _set_tp.c rfork_thread.S setjmp.S sigsetjmp.S \
-	fabs.S modf.S \
+	fabs.S getcontextx.c modf.S \
 	infinity.c ldexp.c makecontext.c signalcontext.c \
 	flt_rounds.c fpgetmask.c fpsetmask.c fpgetprec.c fpsetprec.c \
 	fpgetround.c fpsetround.c fpgetsticky.c

Copied and modified: stable/9/lib/libc/amd64/gen/getcontextx.c (from r230429, head/lib/libc/amd64/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/amd64/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/amd64/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
 
 static int xstate_sz = -1;
 
-size_t
+int
 __getcontextx_size(void)
 {
 	u_int p[4];

Modified: stable/9/lib/libc/arm/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/arm/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/arm/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -2,5 +2,5 @@
 # $FreeBSD$
 
 SRCS+=	_ctx_start.S _setjmp.S _set_tp.c alloca.S fabs.c \
-	infinity.c ldexp.c makecontext.c modf.c \
+	getcontextx.c infinity.c ldexp.c makecontext.c modf.c \
 	setjmp.S signalcontext.c sigsetjmp.S divsi3.S

Copied and modified: stable/9/lib/libc/arm/gen/getcontextx.c (from r230429, head/lib/libc/arm/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/arm/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/arm/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/lib/libc/gen/Symbol.map
==============================================================================
--- stable/9/lib/libc/gen/Symbol.map	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/gen/Symbol.map	Tue Feb 21 21:18:59 2012	(r231981)
@@ -383,6 +383,7 @@ FBSD_1.2 {
 FBSD_1.3 {
 	 fdlopen;
 	__FreeBSD_libc_enter_restricted_mode;
+	getcontextx;
 };
 
 FBSDprivate_1.0 {
@@ -506,4 +507,6 @@ FBSDprivate_1.0 {
 
 	__elf_aux_vector;
 	__pthread_map_stacks_exec;
+	__fillcontextx;
+	__getcontextx_size;
 };

Modified: stable/9/lib/libc/gen/getcontext.3
==============================================================================
--- stable/9/lib/libc/gen/getcontext.3	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/gen/getcontext.3	Tue Feb 21 21:18:59 2012	(r231981)
@@ -35,11 +35,11 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 10, 2002
+.Dd December 26, 2011
 .Dt GETCONTEXT 3
 .Os
 .Sh NAME
-.Nm getcontext , setcontext
+.Nm getcontext , getcontextx , setcontext
 .Nd get and set user thread context
 .Sh LIBRARY
 .Lb libc
@@ -59,6 +59,20 @@ This saved context may then later be res
 .Fn setcontext .
 .Pp
 The
+.Fn getcontextx
+function saves the current execution context in the newly allocated structure
+.Vt ucontext_t ,
+which is returned on success.
+If architecture defines additional CPU states that can be stored in extended
+blocks referenced from the
+.Vt ucontext_t ,
+the memory for them may be allocated and their context also stored.
+Memory returned by
+.Fn getcontextx
+function shall be freed using
+.Fn free 3 .
+.Pp
+The
 .Fn setcontext
 function
 makes a previously saved thread context the current thread context, i.e.,
@@ -109,11 +123,24 @@ If successful,
 returns zero and
 .Fn setcontext
 does not return; otherwise \-1 is returned.
+The
+.Fn getcontextx
+returns pointer to the allocated and initialized context on success, and
+.Va NULL
+on failure.
 .Sh ERRORS
 No errors are defined for
 .Fn getcontext
 or
 .Fn setcontext .
+The
+.Fn getcontextx
+may return the following errors in
+.Va errno :
+.Bl -tag -width Er
+.It Bq Er ENOMEM
+No memory was available to allocate for the context or some extended state.
+.El
 .Sh SEE ALSO
 .Xr sigaction 2 ,
 .Xr sigaltstack 2 ,

Modified: stable/9/lib/libc/gen/ucontext.3
==============================================================================
--- stable/9/lib/libc/gen/ucontext.3	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/gen/ucontext.3	Tue Feb 21 21:18:59 2012	(r231981)
@@ -92,6 +92,9 @@ structures:
 .Ft int
 .Fn getcontext "ucontext_t *" ;
 .It
+.Ft "ucontext_t *"
+.Fn getcontextx "void" ;
+.It
 .Ft int
 .Fn setcontext "const ucontext_t *" ;
 .It
@@ -104,4 +107,5 @@ structures:
 .Sh SEE ALSO
 .Xr sigaltstack 2 ,
 .Xr getcontext 3 ,
+.Xr getcontextx 3 ,
 .Xr makecontext 3

Modified: stable/9/lib/libc/i386/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/i386/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/i386/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -2,5 +2,5 @@
 # $FreeBSD$
 
 SRCS+=	_ctx_start.S _setjmp.S _set_tp.c fabs.S \
-	flt_rounds.c infinity.c ldexp.c makecontext.c modf.S \
+	flt_rounds.c getcontextx.c infinity.c ldexp.c makecontext.c modf.S \
 	rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S

Copied and modified: stable/9/lib/libc/i386/gen/getcontextx.c (from r230429, head/lib/libc/i386/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/i386/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/i386/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$");
 
 static int xstate_sz = -1;
 
-size_t
+int
 __getcontextx_size(void)
 {
 	u_int p[4];

Modified: stable/9/lib/libc/ia64/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/ia64/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/ia64/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -3,7 +3,7 @@
 SRCS+=	__divdf3.S __divdi3.S __divsf3.S __divsi3.S __moddi3.S __modsi3.S \
 	__udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S _mcount.S _set_tp.c \
 	_setjmp.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c fpsetmask.c \
-	fpsetround.c infinity.c ldexp.c makecontext.c modf.c setjmp.S \
+	fpsetround.c getcontextx.c infinity.c ldexp.c makecontext.c modf.c setjmp.S \
 	signalcontext.c sigsetjmp.S
 
 # The following may go away if function _Unwind_FindTableEntry()

Copied and modified: stable/9/lib/libc/ia64/gen/getcontextx.c (from r230429, head/lib/libc/ia64/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/ia64/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/ia64/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/lib/libc/mips/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/mips/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/mips/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -6,4 +6,5 @@ SRCS+=	infinity.c fabs.c ldexp.c modf.c
 # SRCS+=	flt_rounds.c fpgetmask.c fpgetround.c fpgetsticky.c fpsetmask.c \
 #	fpsetround.c fpsetsticky.c
 
-SRCS+=	_ctx_start.S _set_tp.c _setjmp.S makecontext.c setjmp.S signalcontext.c sigsetjmp.S
+SRCS+=	_ctx_start.S _set_tp.c _setjmp.S getcontextx.c makecontext.c \
+	setjmp.S signalcontext.c sigsetjmp.S

Copied and modified: stable/9/lib/libc/mips/gen/getcontextx.c (from r230429, head/lib/libc/mips/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/mips/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/mips/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/lib/libc/powerpc/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/powerpc/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/powerpc/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -1,7 +1,7 @@
 # $FreeBSD$
 
 SRCS += _ctx_start.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
-	fpgetsticky.c fpsetmask.c fpsetround.c \
+	fpgetsticky.c fpsetmask.c fpsetround.c getcontextx.c \
 	infinity.c ldexp.c makecontext.c modf.c _setjmp.S \
 	setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
 	_set_tp.c

Copied and modified: stable/9/lib/libc/powerpc/gen/getcontextx.c (from r230429, head/lib/libc/powerpc/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/powerpc/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/powerpc/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/lib/libc/powerpc64/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/powerpc64/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/powerpc64/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -1,7 +1,7 @@
 # $FreeBSD$
 
 SRCS += _ctx_start.S fabs.S flt_rounds.c fpgetmask.c fpgetround.c \
-	fpgetsticky.c fpsetmask.c fpsetround.c \
+	fpgetsticky.c fpsetmask.c fpsetround.c getcontextx.c \
 	infinity.c ldexp.c makecontext.c modf.c _setjmp.S \
 	setjmp.S sigsetjmp.S signalcontext.c syncicache.c \
 	_set_tp.c

Copied and modified: stable/9/lib/libc/powerpc64/gen/getcontextx.c (from r230429, head/lib/libc/powerpc64/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/powerpc64/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/powerpc64/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/lib/libc/sparc64/gen/Makefile.inc
==============================================================================
--- stable/9/lib/libc/sparc64/gen/Makefile.inc	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/lib/libc/sparc64/gen/Makefile.inc	Tue Feb 21 21:18:59 2012	(r231981)
@@ -2,5 +2,5 @@
 
 SRCS+=	_ctx_start.S _setjmp.S fabs.S fixunsdfsi.S flt_rounds.c fpgetmask.c \
 	fpgetround.c fpgetsticky.c fpsetmask.c fpsetround.c \
-	infinity.c ldexp.c makecontext.c modf.S \
+	getcontextx.c  infinity.c ldexp.c makecontext.c modf.S \
 	signalcontext.c setjmp.S sigsetjmp.S _set_tp.c

Copied and modified: stable/9/lib/libc/sparc64/gen/getcontextx.c (from r230429, head/lib/libc/sparc64/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/sparc64/gen/getcontextx.c	Sat Jan 21 18:00:28 2012	(r230429, copy source)
+++ stable/9/lib/libc/sparc64/gen/getcontextx.c	Tue Feb 21 21:18:59 2012	(r231981)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdlib.h>
 
-size_t
+int
 __getcontextx_size(void)
 {
 

Modified: stable/9/sys/sys/ucontext.h
==============================================================================
--- stable/9/sys/sys/ucontext.h	Tue Feb 21 20:59:49 2012	(r231980)
+++ stable/9/sys/sys/ucontext.h	Tue Feb 21 21:18:59 2012	(r231981)
@@ -72,11 +72,17 @@ struct ucontext4 {
 __BEGIN_DECLS
 
 int	getcontext(ucontext_t *);
+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);
+#endif
+
 __END_DECLS
 
 #else /* _KERNEL */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202212118.q1LLIx8R020188>