From: Imre Vadász Date: Sun, 6 Mar 2016 21:39:48 +0000 (+0100) Subject: libstand: Build libstand for x86_64, and libstand32 for the bios loader. X-Git-Tag: v4.6.0rc~722 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/196ed6cbe3466309938dd8c557082abdf872b71d libstand: Build libstand for x86_64, and libstand32 for the bios loader. * lib/libstand.a is now built for the native CPU architecture. The i386 version is now built in sys/boot/libstand32 as an INTERNALLIB for usage in the BIOS bootloader. * This makes the existing BIOS bootloader (from sys/boot/loader and sys/boot/loader_tftp) use the separately built libstand32.a instead of libstand.a. * We now install an x86_64 version of libstand.a into world. --- diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile index c11c033250..fb64327d16 100644 --- a/lib/libstand/Makefile +++ b/lib/libstand/Makefile @@ -7,24 +7,24 @@ # quite large. # -LIB= stand +LIB?= stand NOPROFILE= YES NOPIC= YES -INCS= stand.h -MAN= libstand.3 +INCS?= stand.h +MAN?= libstand.3 CSTD?= c99 WARNS?= 2 LIBSTAND_SRC?= ${.CURDIR} -.if ${MACHINE_ARCH} == "x86_64" -LIBSTAND_ARCH?= i386 -.else LIBSTAND_ARCH?= ${MACHINE_ARCH} -.endif # Mostly OK, some of the libc imports are a bit noisy CFLAGS+= -ffreestanding +.if ${LIBSTAND_ARCH} == "x86_64" +CFLAGS+= -mno-red-zone -fPIC +.endif + .if ${LIBSTAND_ARCH} == "i386" .if ${CCVER:Mgcc*} CFLAGS+= -mpreferred-stack-boundary=2 diff --git a/lib/libstand/x86_64/_setjmp.S b/lib/libstand/x86_64/_setjmp.S new file mode 100644 index 0000000000..212b34ced0 --- /dev/null +++ b/lib/libstand/x86_64/_setjmp.S @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * William Jolitz. + * + * 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. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. + * + * $FreeBSD: head/lib/libstand/amd64/_setjmp.S 223695 2011-06-30 16:08:56Z dfr $ + */ + +/* + * C library -- _setjmp, _longjmp + * + * _longjmp(a,v) + * will generate a "return(v)" from the last call to + * _setjmp(a) + * by restoring registers from the environment 'a'. + * The previous signal state is NOT restored. + */ + +#include + +ENTRY(_setjmp) + movq %rdi,%rax + movq 0(%rsp),%rdx /* retval */ + movq %rdx, 0(%rax) /* 0; retval */ + movq %rbx, 8(%rax) /* 1; rbx */ + movq %rsp,16(%rax) /* 2; rsp */ + movq %rbp,24(%rax) /* 3; rbp */ + movq %r12,32(%rax) /* 4; r12 */ + movq %r13,40(%rax) /* 5; r13 */ + movq %r14,48(%rax) /* 6; r14 */ + movq %r15,56(%rax) /* 7; r15 */ + fnstcw 64(%rax) /* 8; fpu cw */ + stmxcsr 68(%rax) /* and mxcsr */ + xorq %rax,%rax + ret +END(_setjmp) + + .weak CNAME(_longjmp) +ENTRY(_longjmp) + movq %rdi,%rdx + /* Restore the mxcsr, but leave exception flags intact. */ + stmxcsr -4(%rsp) + movl 68(%rdx),%eax + andl $0xffffffc0,%eax + movl -4(%rsp),%edi + andl $0x3f,%edi + xorl %eax,%edi + movl %edi,-4(%rsp) + ldmxcsr -4(%rsp) + movq %rsi,%rax /* retval */ + movq 0(%rdx),%rcx + movq 8(%rdx),%rbx + movq 16(%rdx),%rsp + movq 24(%rdx),%rbp + movq 32(%rdx),%r12 + movq 40(%rdx),%r13 + movq 48(%rdx),%r14 + movq 56(%rdx),%r15 + fldcw 64(%rdx) + testq %rax,%rax + jnz 1f + incq %rax +1: movq %rcx,0(%rsp) + ret +END(_longjmp) diff --git a/sys/boot/Makefile b/sys/boot/Makefile index 4defe5ac42..1a0eebdeda 100644 --- a/sys/boot/Makefile +++ b/sys/boot/Makefile @@ -3,6 +3,11 @@ # Build DLoader SUBDIR+= dloader +.if ${MACHINE_ARCH} == "x86_64" +# Build i386 version of libstand +SUBDIR+= libstand32 +.endif + # Pick the machine-dependant subdir based on the target architecture. .if ${MACHINE_ARCH} == "x86_64" SUBDIR+= pc32 diff --git a/sys/boot/libstand32/Makefile b/sys/boot/libstand32/Makefile new file mode 100644 index 0000000000..c2bd993568 --- /dev/null +++ b/sys/boot/libstand32/Makefile @@ -0,0 +1,11 @@ +# $FreeBSD: head/sys/boot/libstand32/Makefile 293341 2016-01-07 19:19:23Z bdrewery $ + +LIBSTAND_SRC= ${.CURDIR}/../../../lib/libstand +LIBSTAND_ARCH= i386 +INTERNALLIB= +INCS= +LIB= stand32 +MAN= +.PATH: ${LIBSTAND_SRC} + +.include "${LIBSTAND_SRC}/Makefile" diff --git a/sys/boot/pc32/loader/Makefile b/sys/boot/pc32/loader/Makefile index 6e3d07cae5..40fd734e83 100644 --- a/sys/boot/pc32/loader/Makefile +++ b/sys/boot/pc32/loader/Makefile @@ -58,12 +58,9 @@ CFLAGS+= -I${.CURDIR}/.. # where to get libstand from #XXX need a better way to do this -LIBSTAND= ${.CURDIR}/../../../../lib/libstand/libstand.a +LIBSTAND= ${.CURDIR}/../../libstand32/libstand32.a .if !exists(${LIBSTAND}) -LIBSTAND= ${.OBJDIR}/../../../../lib/libstand/libstand.a -.if !exists(${LIBSTAND}) -LIBSTAND= -lstand -.endif +LIBSTAND= ${.OBJDIR}/../../libstand32/libstand32.a .endif CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/ diff --git a/sys/boot/pc32/loader_tftp/Makefile b/sys/boot/pc32/loader_tftp/Makefile index 1c7dcdd3d5..7fd4c61714 100644 --- a/sys/boot/pc32/loader_tftp/Makefile +++ b/sys/boot/pc32/loader_tftp/Makefile @@ -58,12 +58,9 @@ CFLAGS+= -I${.CURDIR}/.. # where to get libstand from #XXX need a better way to do this -LIBSTAND= ${.CURDIR}/../../../../lib/libstand/libstand.a +LIBSTAND= ${.CURDIR}/../../libstand32/libstand32.a .if !exists(${LIBSTAND}) -LIBSTAND= ${.OBJDIR}/../../../../lib/libstand/libstand.a -.if !exists(${LIBSTAND}) -LIBSTAND= -lstand -.endif +LIBSTAND= ${.OBJDIR}/../../libstand32/libstand32.a .endif CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/