Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 Feb 2019 10:06:34 +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-12@freebsd.org
Subject:   svn commit: r344463 - in stable/12/lib/libc: . amd64/gen i386/gen x86/gen
Message-ID:  <201902221006.x1MA6YJN074607@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Fri Feb 22 10:06:34 2019
New Revision: 344463
URL: https://svnweb.freebsd.org/changeset/base/344463

Log:
  Revert r344436, which was the merge of r344120.
  
  Currently stable/12 i386 installs old ld.bfd as ld (WITHOUT_LLD_IS_LD),
  which prevents ifunc relocations from working properly.  If a static
  binary is linked, then it looses libc relocations needed.
  
  The stable i386 branch uses ld.lld for the world build (WITH_LLD_BOOTSTRAP),
  which is why static binaries from the base do not have the issue.
  
  Reported and diagnosted by:	antoine

Added:
  stable/12/lib/libc/amd64/gen/getcontextx.c
     - copied unchanged from r344435, stable/12/lib/libc/amd64/gen/getcontextx.c
  stable/12/lib/libc/i386/gen/getcontextx.c
     - copied unchanged from r344435, stable/12/lib/libc/i386/gen/getcontextx.c
Deleted:
  stable/12/lib/libc/x86/gen/
Modified:
  stable/12/lib/libc/Makefile
  stable/12/lib/libc/amd64/gen/Makefile.inc
  stable/12/lib/libc/i386/gen/Makefile.inc
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/lib/libc/Makefile
==============================================================================
--- stable/12/lib/libc/Makefile	Fri Feb 22 08:10:58 2019	(r344462)
+++ stable/12/lib/libc/Makefile	Fri Feb 22 10:06:34 2019	(r344463)
@@ -120,7 +120,6 @@ 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: stable/12/lib/libc/amd64/gen/Makefile.inc
==============================================================================
--- stable/12/lib/libc/amd64/gen/Makefile.inc	Fri Feb 22 08:10:58 2019	(r344462)
+++ stable/12/lib/libc/amd64/gen/Makefile.inc	Fri Feb 22 10:06:34 2019	(r344463)
@@ -2,7 +2,7 @@
 # $FreeBSD$
 
 SRCS+=	_setjmp.S _set_tp.c rfork_thread.S setjmp.S sigsetjmp.S \
-	fabs.S \
+	fabs.S getcontextx.c \
 	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: stable/12/lib/libc/amd64/gen/getcontextx.c (from r344435, stable/12/lib/libc/amd64/gen/getcontextx.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/lib/libc/amd64/gen/getcontextx.c	Fri Feb 22 10:06:34 2019	(r344463, copy of r344435, stable/12/lib/libc/amd64/gen/getcontextx.c)
@@ -0,0 +1,113 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/ucontext.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <machine/cpufunc.h>
+#include <machine/fpu.h>
+#include <machine/specialreg.h>
+#include <machine/sysarch.h>
+
+static int xstate_sz = -1;
+
+int
+__getcontextx_size(void)
+{
+	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;
+	}
+
+	return (sizeof(ucontext_t) + xstate_sz);
+}
+
+int
+__fillcontextx2(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;
+	}
+	return (0);
+}
+
+int
+__fillcontextx(char *ctx)
+{
+	ucontext_t *ucp;
+
+	ucp = (ucontext_t *)ctx;
+	if (getcontext(ucp) == -1)
+		return (-1);
+	__fillcontextx2(ctx);
+	return (0);
+}
+
+__weak_reference(__getcontextx, getcontextx);
+
+ucontext_t *
+__getcontextx(void)
+{
+	char *ctx;
+	int error;
+
+	ctx = malloc(__getcontextx_size());
+	if (ctx == NULL)
+		return (NULL);
+	if (__fillcontextx(ctx) == -1) {
+		error = errno;
+		free(ctx);
+		errno = error;
+		return (NULL);
+	}
+	return ((ucontext_t *)ctx);
+}

Modified: stable/12/lib/libc/i386/gen/Makefile.inc
==============================================================================
--- stable/12/lib/libc/i386/gen/Makefile.inc	Fri Feb 22 08:10:58 2019	(r344462)
+++ stable/12/lib/libc/i386/gen/Makefile.inc	Fri Feb 22 10:06:34 2019	(r344463)
@@ -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 \
+	flt_rounds.c getcontextx.c infinity.c ldexp.c makecontext.c \
 	rfork_thread.S setjmp.S signalcontext.c sigsetjmp.S

Copied: stable/12/lib/libc/i386/gen/getcontextx.c (from r344435, stable/12/lib/libc/i386/gen/getcontextx.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/lib/libc/i386/gen/getcontextx.c	Fri Feb 22 10:06:34 2019	(r344463, copy of r344435, stable/12/lib/libc/i386/gen/getcontextx.c)
@@ -0,0 +1,145 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2011 Konstantin Belousov <kib@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/ucontext.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <machine/npx.h>
+#include <machine/specialreg.h>
+#include <machine/sysarch.h>
+
+static int xstate_sz = -1;
+
+int
+__getcontextx_size(void)
+{
+	u_int p[4];
+	int cpuid_supported;
+
+	if (xstate_sz == -1) {
+		__asm __volatile(
+		    "	pushfl\n"
+		    "	popl	%%eax\n"
+		    "	movl    %%eax,%%ecx\n"
+		    "	xorl    $0x200000,%%eax\n"
+		    "	pushl	%%eax\n"
+		    "	popfl\n"
+		    "	pushfl\n"
+		    "	popl    %%eax\n"
+		    "	xorl    %%eax,%%ecx\n"
+		    "	je	1f\n"
+		    "	movl	$1,%0\n"
+		    "	jmp	2f\n"
+		    "1:	movl	$0,%0\n"
+		    "2:\n"
+		    : "=r" (cpuid_supported) : : "eax", "ecx");
+		if (cpuid_supported) {
+			__asm __volatile(
+			    "	pushl	%%ebx\n"
+			    "	cpuid\n"
+			    "	movl	%%ebx,%1\n"
+			    "	popl	%%ebx\n"
+			    : "=a" (p[0]), "=r" (p[1]), "=c" (p[2]), "=d" (p[3])
+			    :  "0" (0x1));
+			if ((p[2] & CPUID2_OSXSAVE) != 0) {
+				__asm __volatile(
+				    "	pushl	%%ebx\n"
+				    "	cpuid\n"
+				    "	movl	%%ebx,%1\n"
+				    "	popl	%%ebx\n"
+				    : "=a" (p[0]), "=r" (p[1]), "=c" (p[2]),
+					"=d" (p[3])
+				    :  "0" (0xd), "2" (0x0));
+				xstate_sz = p[1] - sizeof(struct savexmm);
+			} else
+				xstate_sz = 0;
+		} else
+			xstate_sz = 0;
+	}
+
+	return (sizeof(ucontext_t) + xstate_sz);
+}
+
+int
+__fillcontextx2(char *ctx)
+{
+	struct i386_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(I386_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;
+	}
+	return (0);
+}
+
+int
+__fillcontextx(char *ctx)
+{
+	ucontext_t *ucp;
+
+	ucp = (ucontext_t *)ctx;
+	if (getcontext(ucp) == -1)
+		return (-1);
+	__fillcontextx2(ctx);
+	return (0);
+}
+
+__weak_reference(__getcontextx, getcontextx);
+
+ucontext_t *
+__getcontextx(void)
+{
+	char *ctx;
+	int error;
+
+	ctx = malloc(__getcontextx_size());
+	if (ctx == NULL)
+		return (NULL);
+	if (__fillcontextx(ctx) == -1) {
+		error = errno;
+		free(ctx);
+		errno = error;
+		return (NULL);
+	}
+	return ((ucontext_t *)ctx);
+}



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