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