diff options
author | dfr <dfr@FreeBSD.org> | 2011-06-30 16:08:56 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2011-06-30 16:08:56 +0000 |
commit | 2b9b009195e403f0f2fc9bf0d9eeefc2297d94b8 (patch) | |
tree | a32b66abbdbc4e1ab303ad37461df4652cb74043 /sys/boot/userboot/libstand | |
parent | 4d4c5b3285343962855e4ac2e891fc6711595b64 (diff) | |
download | FreeBSD-src-2b9b009195e403f0f2fc9bf0d9eeefc2297d94b8.zip FreeBSD-src-2b9b009195e403f0f2fc9bf0d9eeefc2297d94b8.tar.gz |
Add a version of the FreeBSD bootloader which can run in userland, packaged
as a shared library. This is intended to be used by BHyVe to load FreeBSD
kernels into new virtual machines.
Diffstat (limited to 'sys/boot/userboot/libstand')
-rw-r--r-- | sys/boot/userboot/libstand/Makefile | 161 | ||||
-rw-r--r-- | sys/boot/userboot/libstand/amd64/_setjmp.S | 93 |
2 files changed, 254 insertions, 0 deletions
diff --git a/sys/boot/userboot/libstand/Makefile b/sys/boot/userboot/libstand/Makefile new file mode 100644 index 0000000..9e71a24 --- /dev/null +++ b/sys/boot/userboot/libstand/Makefile @@ -0,0 +1,161 @@ +# $FreeBSD$ +# Originally from $NetBSD: Makefile,v 1.21 1997/10/26 22:08:38 lukem Exp $ +# +# Notes: +# - We don't use the libc strerror/sys_errlist because the string table is +# quite large. +# + +WITHOUT_SSP= +NO_MAN= + +.include <bsd.own.mk> + +S= ${.CURDIR}/../../../../lib/libstand + +.PATH: ${S} +LIB= stand +INTERNALLIB= +NO_PROFILE= +NO_PIC= + +WARNS?= 0 + +CFLAGS+= -ffreestanding -Wformat -fPIC +CFLAGS+= -I${.CURDIR}/../../../../lib/libstand + +.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64" +CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2 +.endif +.if ${MACHINE_CPUARCH} == "i386" +CFLAGS+= -mpreferred-stack-boundary=2 +CFLAGS+= -mno-sse3 +.endif +.if ${MACHINE} == "pc98" +CFLAGS+= -Os +.endif +.if ${MACHINE_CPUARCH} == "powerpc" +CFLAGS+= -msoft-float -D_STANDALONE -DNETIF_DEBUG +.endif +.if ${MACHINE_CPUARCH} == "arm" +CFLAGS+= -msoft-float -D_STANDALONE +.endif + +# standalone components and stuff we have modified locally +SRCS+= zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c gets.c \ + globals.c pager.c printf.c strdup.c strerror.c strtol.c random.c \ + sbrk.c twiddle.c zalloc.c zalloc_malloc.c + +# private (pruned) versions of libc string functions +SRCS+= strcasecmp.c + +LIBC= ${.CURDIR}/../../../../lib/libc + +.PATH: ${LIBC}/net + +SRCS+= ntoh.c + +# string functions from libc +.PATH: ${LIBC}/string +.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "powerpc" || \ + ${MACHINE_CPUARCH} == "sparc64" || ${MACHINE_CPUARCH} == "amd64" || \ + ${MACHINE_CPUARCH} == "arm" +SRCS+= bcmp.c bcopy.c bzero.c ffs.c index.c memccpy.c memchr.c memcmp.c \ + memcpy.c memmove.c memset.c qdivrem.c rindex.c strcat.c strchr.c \ + strcmp.c strcpy.c strcspn.c strlen.c strncat.c strncmp.c strncpy.c \ + strpbrk.c strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c +.endif +.if ${MACHINE_CPUARCH} == "arm" +.PATH: ${LIBC}/arm/gen +SRCS+= divsi3.S +.endif +.if ${MACHINE_CPUARCH} == "ia64" +.PATH: ${LIBC}/ia64/string +SRCS+= bcmp.c bcopy.S bzero.S ffs.S index.c memccpy.c memchr.c memcmp.c \ + memcpy.S memmove.S memset.c rindex.c strcat.c strchr.c \ + strcmp.c strcpy.c strcspn.c strlen.c \ + strncat.c strncmp.c strncpy.c strpbrk.c strrchr.c strsep.c \ + strspn.c strstr.c strtok.c swab.c + +.PATH: ${LIBC}/ia64/gen +SRCS+= __divdi3.S __divsi3.S __moddi3.S __modsi3.S +SRCS+= __udivdi3.S __udivsi3.S __umoddi3.S __umodsi3.S +.endif +.if ${MACHINE_CPUARCH} == "powerpc" +.PATH: ${LIBC}/libc/quad +SRCS+= ashldi3.c ashrdi3.c +.PATH: ${LIBC}/powerpc/gen +SRCS+= syncicache.c +.endif + +# uuid functions from libc +.PATH: ${LIBC}/uuid +SRCS+= uuid_equal.c uuid_is_nil.c + +# _setjmp/_longjmp +.if ${MACHINE_CPUARCH} == "amd64" +.PATH: ${.CURDIR}/amd64 +.elif ${MACHINE_ARCH} == "powerpc64" +.PATH: ${S}/powerpc +.else +.PATH: ${S}/${MACHINE_CPUARCH} +.endif +SRCS+= _setjmp.S + +# decompression functionality from libbz2 +# NOTE: to actually test this functionality after libbz2 upgrade compile +# loader(8) with LOADER_BZIP2_SUPPORT defined +.PATH: ${.CURDIR}/../../../../contrib/bzip2 +CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS +SRCS+= libstand_bzlib_private.h + +.for file in bzlib.c crctable.c decompress.c huffman.c randtable.c +SRCS+= _${file} +CLEANFILES+= _${file} + +_${file}: ${file} + sed "s|bzlib_private\.h|libstand_bzlib_private.h|" ${.ALLSRC} > ${.TARGET} +.endfor + +CLEANFILES+= libstand_bzlib_private.h +libstand_bzlib_private.h: bzlib_private.h + sed -e 's|<stdlib.h>|"stand.h"|' \ + ${.ALLSRC} > ${.TARGET} + +# decompression functionality from libz +.PATH: ${.CURDIR}/../../../../lib/libz +CFLAGS+=-DHAVE_MEMCPY -I${.CURDIR}/../../../../lib/libz +SRCS+= adler32.c crc32.c libstand_zutil.h + +.for file in infback.c inffast.c inflate.c inftrees.c zutil.c +SRCS+= _${file} +CLEANFILES+= _${file} + +_${file}: ${file} + sed "s|zutil\.h|libstand_zutil.h|" ${.ALLSRC} > ${.TARGET} +.endfor + +# depend on stand.h being able to be included multiple times +CLEANFILES+= libstand_zutil.h +libstand_zutil.h: zutil.h + sed -e 's|<stddef.h>|"stand.h"|' \ + -e 's|<string.h>|"stand.h"|' \ + -e 's|<stdlib.h>|"stand.h"|' \ + ${.ALLSRC} > ${.TARGET} + +# io routines +SRCS+= closeall.c dev.c ioctl.c nullfs.c stat.c \ + fstat.c close.c lseek.c open.c read.c write.c readdir.c + +# network routines +SRCS+= arp.c ether.c inet_ntoa.c in_cksum.c net.c udp.c netif.c rpc.c + +# network info services: +SRCS+= bootp.c rarp.c bootparam.c + +# boot filesystems +SRCS+= ufs.c nfs.c cd9660.c tftp.c gzipfs.c bzipfs.c +SRCS+= dosfs.c ext2fs.c +SRCS+= splitfs.c + +.include <bsd.lib.mk> diff --git a/sys/boot/userboot/libstand/amd64/_setjmp.S b/sys/boot/userboot/libstand/amd64/_setjmp.S new file mode 100644 index 0000000..e841f49 --- /dev/null +++ b/sys/boot/userboot/libstand/amd64/_setjmp.S @@ -0,0 +1,93 @@ +/*- + * 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. + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)_setjmp.s 5.1 (Berkeley) 4/23/90" +#endif /* LIBC_SCCS and not lint */ +#include <machine/asm.h> +__FBSDID("$FreeBSD$"); + +/* + * 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. + */ + +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) |