svn commit: r344120 - in head/lib/libc: . amd64/gen i386/gen x86/gen

Konstantin Belousov kib at FreeBSD.org
Thu Feb 14 14:02:36 UTC 2019


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


More information about the svn-src-head mailing list