Author: kib
Date: Thu Feb 14 14:02:33 2019
New Revision: 344120
URL: https://svnweb.freebsd.org/changeset/base/344120

Log:
  Unify i386 and amd64 getcontextx.c, and use ifuncs while there.
  
  In particular, use ifuncs for __getcontextx_size(), also calculate the
  size of the extended save area in resolver.  Same for __fillcontextx2().
  
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Added:
  head/lib/libc/x86/gen/
  head/lib/libc/x86/gen/Makefile.inc   (contents, props changed)
  head/lib/libc/x86/gen/getcontextx.c
     - copied, changed from r344117, head/lib/libc/amd64/gen/getcontextx.c
Deleted:
  head/lib/libc/amd64/gen/getcontextx.c
  head/lib/libc/i386/gen/getcontextx.c
Modified:
  head/lib/libc/Makefile
  head/lib/libc/amd64/gen/Makefile.inc
  head/lib/libc/i386/gen/Makefile.inc

Modified: head/lib/libc/Makefile
==============================================================================
--- head/lib/libc/Makefile      Thu Feb 14 13:59:00 2019        (r344119)
+++ head/lib/libc/Makefile      Thu Feb 14 14:02:33 2019        (r344120)
@@ -122,6 +122,7 @@ NOASM=
 .endif
 .if ${LIBC_ARCH} == "i386" || ${LIBC_ARCH} == "amd64"
 .include "${LIBC_SRCTOP}/x86/sys/Makefile.inc"
+.include "${LIBC_SRCTOP}/x86/gen/Makefile.inc"
 .endif
 .if ${MK_NIS} != "no"
 CFLAGS+= -DYP

Modified: head/lib/libc/amd64/gen/Makefile.inc
==============================================================================
--- head/lib/libc/amd64/gen/Makefile.inc        Thu Feb 14 13:59:00 2019        
(r344119)
+++ head/lib/libc/amd64/gen/Makefile.inc        Thu Feb 14 14:02:33 2019        
(r344120)
@@ -2,7 +2,7 @@
 # $FreeBSD$
 
 SRCS+= _setjmp.S _set_tp.c rfork_thread.S setjmp.S sigsetjmp.S \
-       fabs.S getcontextx.c \
+       fabs.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

Modified: head/lib/libc/i386/gen/Makefile.inc
==============================================================================
--- head/lib/libc/i386/gen/Makefile.inc Thu Feb 14 13:59:00 2019        
(r344119)
+++ head/lib/libc/i386/gen/Makefile.inc Thu Feb 14 14:02:33 2019        
(r344120)
@@ -2,5 +2,5 @@
 # $FreeBSD$
 
 SRCS+= _ctx_start.S _setjmp.S _set_tp.c fabs.S \
-       flt_rounds.c getcontextx.c infinity.c ldexp.c makecontext.c \
+       flt_rounds.c infinity.c ldexp.c makecontext.c \
        rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S

Added: head/lib/libc/x86/gen/Makefile.inc
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/lib/libc/x86/gen/Makefile.inc  Thu Feb 14 14:02:33 2019        
(r344120)
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+.PATH: ${LIBC_SRCTOP}/x86/gen
+
+SRCS+= \
+       getcontextx.c

Copied and modified: head/lib/libc/x86/gen/getcontextx.c (from r344117, 
head/lib/libc/amd64/gen/getcontextx.c)
==============================================================================
--- head/lib/libc/amd64/gen/getcontextx.c       Thu Feb 14 09:50:59 2019        
(r344117, copy source)
+++ head/lib/libc/x86/gen/getcontextx.c Thu Feb 14 14:02:33 2019        
(r344120)
@@ -35,49 +35,76 @@ __FBSDID("$FreeBSD$");
 #include <stdarg.h>
 #include <stdlib.h>
 #include <machine/cpufunc.h>
-#include <machine/fpu.h>
 #include <machine/specialreg.h>
 #include <machine/sysarch.h>
+#include <x86/ifunc.h>
+#include <x86/fpu.h>
 
-static int xstate_sz = -1;
+#if defined __i386__
+#define        X86_GET_XFPUSTATE       I386_GET_XFPUSTATE
+typedef struct savexmm savex86_t ;
+typedef struct i386_get_xfpustate x86_get_xfpustate_t;
+#elif defined __amd64__
+#define        X86_GET_XFPUSTATE       AMD64_GET_XFPUSTATE
+typedef struct savefpu savex86_t;
+typedef struct amd64_get_xfpustate x86_get_xfpustate_t;
+#else
+#error "Wrong arch"
+#endif
 
-int
-__getcontextx_size(void)
+static int xstate_sz = 0;
+
+static int
+__getcontextx_size_xfpu(void)
 {
+
+       return (sizeof(ucontext_t) + xstate_sz);
+}
+
+DEFINE_UIFUNC(, int, __getcontextx_size, (void), static)
+{
        u_int p[4];
 
-       if (xstate_sz == -1) {
-               do_cpuid(1, p);
-               if ((p[2] & CPUID2_OSXSAVE) != 0) {
-                       cpuid_count(0xd, 0x0, p);
-                       xstate_sz = p[1] - sizeof(struct savefpu);
-               } else
-                       xstate_sz = 0;
+       if ((cpu_feature2 & CPUID2_OSXSAVE) != 0) {
+               cpuid_count(0xd, 0x0, p);
+               xstate_sz = p[1] - sizeof(savex86_t);
        }
+       return (__getcontextx_size_xfpu);
+}
 
-       return (sizeof(ucontext_t) + xstate_sz);
+static int
+__fillcontextx2_xfpu(char *ctx)
+{
+       x86_get_xfpustate_t xfpu;
+       ucontext_t *ucp;
+
+       ucp = (ucontext_t *)ctx;
+       xfpu.addr = (char *)(ucp + 1);
+       xfpu.len = xstate_sz;
+       if (sysarch(X86_GET_XFPUSTATE, &xfpu) == -1)
+               return (-1);
+       ucp->uc_mcontext.mc_xfpustate = (__register_t)xfpu.addr;
+       ucp->uc_mcontext.mc_xfpustate_len = xstate_sz;
+       ucp->uc_mcontext.mc_flags |= _MC_HASFPXSTATE;
+       return (0);
 }
 
-int
-__fillcontextx2(char *ctx)
+static int
+__fillcontextx2_noxfpu(char *ctx)
 {
-       struct amd64_get_xfpustate xfpu;
        ucontext_t *ucp;
 
        ucp = (ucontext_t *)ctx;
-       if (xstate_sz != 0) {
-               xfpu.addr = (char *)(ucp + 1);
-               xfpu.len = xstate_sz;
-               if (sysarch(AMD64_GET_XFPUSTATE, &xfpu) == -1)
-                       return (-1);
-               ucp->uc_mcontext.mc_xfpustate = (__register_t)xfpu.addr;
-               ucp->uc_mcontext.mc_xfpustate_len = xstate_sz;
-               ucp->uc_mcontext.mc_flags |= _MC_HASFPXSTATE;
-       } else {
-               ucp->uc_mcontext.mc_xfpustate = 0;
-               ucp->uc_mcontext.mc_xfpustate_len = 0;
-       }
+       ucp->uc_mcontext.mc_xfpustate = 0;
+       ucp->uc_mcontext.mc_xfpustate_len = 0;
        return (0);
+}
+
+DEFINE_UIFUNC(, int, __fillcontextx2, (char *), static)
+{
+
+       return ((cpu_feature2 & CPUID2_OSXSAVE) != 0 ? __fillcontextx2_xfpu : 
+           __fillcontextx2_noxfpu);
 }
 
 int
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to