From owner-svn-src-stable@FreeBSD.ORG Tue Feb 21 21:18:59 2012 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id DA0B1106566C; Tue, 21 Feb 2012 21:18:59 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C48DC8FC12; Tue, 21 Feb 2012 21:18:59 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q1LLIxca020209; Tue, 21 Feb 2012 21:18:59 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q1LLIx8R020188; Tue, 21 Feb 2012 21:18:59 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201202212118.q1LLIx8R020188@svn.freebsd.org> From: Konstantin Belousov Date: Tue, 21 Feb 2012 21:18:59 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org X-SVN-Group: stable-9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: 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... X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Feb 2012 21:19:00 -0000 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 #include -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 #include -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 #include -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 #include -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 #include -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 #include -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 */