Date: Wed, 23 May 2012 03:56:06 +0000 From: emc2@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r236184 - in soc2012/emc2/head/sys/boot/i386: . efi Message-ID: <20120523035606.9C487106566C@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: emc2 Date: Wed May 23 03:56:05 2012 New Revision: 236184 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236184 Log: Added efi directory to build, added in elf64_freebsd.c from libi386, modified the Makefile a bit to facilitate amd64 build. At the present, there are undefined symbols in the amd64 build, at least one of which seems to be defined over in libi386. Added: soc2012/emc2/head/sys/boot/i386/efi/elf64_freebsd.c - copied unchanged from r236072, soc2012/emc2/head/sys/boot/i386/libi386/elf64_freebsd.c Modified: soc2012/emc2/head/sys/boot/i386/Makefile soc2012/emc2/head/sys/boot/i386/efi/Makefile soc2012/emc2/head/sys/boot/i386/efi/exec.c Modified: soc2012/emc2/head/sys/boot/i386/Makefile ============================================================================== --- soc2012/emc2/head/sys/boot/i386/Makefile Wed May 23 02:43:28 2012 (r236183) +++ soc2012/emc2/head/sys/boot/i386/Makefile Wed May 23 03:56:05 2012 (r236184) @@ -3,7 +3,7 @@ .include <bsd.own.mk> SUBDIR= mbr pmbr boot0 boot0sio btx boot2 cdboot gptboot kgzldr \ - libi386 libfirewire loader + efi libi386 libfirewire loader # special boot programs, 'self-extracting boot2+loader' SUBDIR+= pxeldr Modified: soc2012/emc2/head/sys/boot/i386/efi/Makefile ============================================================================== --- soc2012/emc2/head/sys/boot/i386/efi/Makefile Wed May 23 02:43:28 2012 (r236183) +++ soc2012/emc2/head/sys/boot/i386/efi/Makefile Wed May 23 03:56:05 2012 (r236184) @@ -10,20 +10,27 @@ INTERNALPROG= # architecture-specific loader code -SRCS= main.c exec.c conf.c vers.c reloc.c start.S elf32_freebsd.c +SRCS= main.c exec.c conf.c vers.c reloc.c start.S SRCS+= i386_copy.c bootinfo.c autoload.c devicename.c efimd.c CFLAGS+= -I${.CURDIR}/../../efi/include CFLAGS+= -I${.CURDIR}/../../efi/include/i386 - -.if ${MK_FORTH} != "no" BOOT_FORTH= yes CFLAGS+= -DBOOT_FORTH CFLAGS+= -I${.CURDIR}/../../ficl CFLAGS+= -I${.CURDIR}/../../ficl/i386 +CFLAGS+= -I. LIBFICL= ${.OBJDIR}/../../ficl/libficl.a -.endif +.if ${MACHINE_CPUARCH} == "amd64" +SRCS+= elf64_freebsd.c +EFIFORMAT= efi-app-x86_64 +.elif ${MACHINE_CPUARCH} == "i386" +SRCS+= elf32_freebsd.c +EFIFORMAT= efi-app-ia32 +.else +.error "MACHINE_CPUARCH is ${MACHINE_CPUARCH} (not amd64 or i386)" +.endif # Include bcache code. HAVE_BCACHE= yes @@ -50,6 +57,7 @@ OBJCOPY?= objcopy OBJDUMP?= objdump + loader.efi: loader.sym if [ `${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*' | wc -l` != 0 ]; then \ ${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*'; \ @@ -57,7 +65,7 @@ fi ${OBJCOPY} -j .data -j .dynamic -j .dynstr -j .dynsym -j .hash \ -j .rel.dyn -j .reloc -j .sdata -j .text -j set_Xcommand_set \ - --target=efi-app-ia32 ${.ALLSRC} ${.TARGET} + --target=${EFIFORMAT} ${.ALLSRC} ${.TARGET} LIBEFI= ${.OBJDIR}/../../efi/libefi/libefi.a CFLAGS+= -I${.CURDIR}/../libi386 @@ -66,11 +74,4 @@ DPADD= ${LIBFICL} ${LIBEFI} ${LIBSTAND} LDADD= ${LIBFICL} ${LIBEFI} ${LIBSTAND} -.include <bsd.prog.mk> - -.if ${MACHINE_CPUARCH} == "amd64" -CFLAGS+= -I. -beforedepend ${OBJS}: machine -machine: - ln -sf ${.CURDIR}/../../../i386/include machine -.endif +.include <bsd.prog.mk> \ No newline at end of file Copied: soc2012/emc2/head/sys/boot/i386/efi/elf64_freebsd.c (from r236072, soc2012/emc2/head/sys/boot/i386/libi386/elf64_freebsd.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2012/emc2/head/sys/boot/i386/efi/elf64_freebsd.c Wed May 23 03:56:05 2012 (r236184, copy of r236072, soc2012/emc2/head/sys/boot/i386/libi386/elf64_freebsd.c) @@ -0,0 +1,126 @@ +/*- + * Copyright (c) 1998 Michael Smith <msmith@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 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 AUTHOR 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#define __ELF_WORD_SIZE 64 +#include <sys/param.h> +#include <sys/exec.h> +#include <sys/linker.h> +#include <string.h> +#include <machine/bootinfo.h> +#include <machine/elf.h> +#include <stand.h> + +#include "bootstrap.h" +#include "libi386.h" +#include "btxv86.h" + +static int elf64_exec(struct preloaded_file *amp); +static int elf64_obj_exec(struct preloaded_file *amp); + +struct file_format amd64_elf = { elf64_loadfile, elf64_exec }; +struct file_format amd64_elf_obj = { elf64_obj_loadfile, elf64_obj_exec }; + +#define PG_V 0x001 +#define PG_RW 0x002 +#define PG_U 0x004 +#define PG_PS 0x080 + +typedef u_int64_t p4_entry_t; +typedef u_int64_t p3_entry_t; +typedef u_int64_t p2_entry_t; +extern p4_entry_t PT4[]; +extern p3_entry_t PT3[]; +extern p2_entry_t PT2[]; + +u_int32_t entry_hi; +u_int32_t entry_lo; + +extern void amd64_tramp(); + +/* + * There is an ELF kernel and one or more ELF modules loaded. + * We wish to start executing the kernel image, so make such + * preparations as are required, and do so. + */ +static int +elf64_exec(struct preloaded_file *fp) +{ + struct file_metadata *md; + Elf_Ehdr *ehdr; + vm_offset_t modulep, kernend; + int err; + int i; + + if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) + return(EFTYPE); + ehdr = (Elf_Ehdr *)&(md->md_data); + + err = bi_load64(fp->f_args, &modulep, &kernend); + if (err != 0) + return(err); + + bzero(PT4, PAGE_SIZE); + bzero(PT3, PAGE_SIZE); + bzero(PT2, PAGE_SIZE); + + /* + * This is kinda brutal, but every single 1GB VM memory segment points to + * the same first 1GB of physical memory. But it is more than adequate. + */ + for (i = 0; i < 512; i++) { + /* Each slot of the level 4 pages points to the same level 3 page */ + PT4[i] = (p4_entry_t)VTOP((uintptr_t)&PT3[0]); + PT4[i] |= PG_V | PG_RW | PG_U; + + /* Each slot of the level 3 pages points to the same level 2 page */ + PT3[i] = (p3_entry_t)VTOP((uintptr_t)&PT2[0]); + PT3[i] |= PG_V | PG_RW | PG_U; + + /* The level 2 page slots are mapped with 2MB pages for 1GB. */ + PT2[i] = i * (2 * 1024 * 1024); + PT2[i] |= PG_V | PG_RW | PG_PS | PG_U; + } + + entry_lo = ehdr->e_entry & 0xffffffff; + entry_hi = (ehdr->e_entry >> 32) & 0xffffffff; +#ifdef DEBUG + printf("Start @ %#llx ...\n", ehdr->e_entry); +#endif + + dev_cleanup(); + __exec((void *)VTOP(amd64_tramp), modulep, kernend); + + panic("exec returned"); +} + +static int +elf64_obj_exec(struct preloaded_file *fp) +{ + return (EFTYPE); +} Modified: soc2012/emc2/head/sys/boot/i386/efi/exec.c ============================================================================== --- soc2012/emc2/head/sys/boot/i386/efi/exec.c Wed May 23 02:43:28 2012 (r236183) +++ soc2012/emc2/head/sys/boot/i386/efi/exec.c Wed May 23 03:56:05 2012 (r236184) @@ -46,6 +46,10 @@ void __exec(caddr_t addr, ...) { + /* XXX Find out why Rui thought this was wrong, fix it. Also, + * make a version for amd64 + */ +#if 0 /* XXX this is wrong */ __asm __volatile("movl %cr0, %eax"); __asm __volatile("andl $0x7fffffff, %eax"); @@ -56,4 +60,5 @@ __asm __volatile("andl $0xfffffffe, %eax"); __asm __volatile("movl %eax, %cr0"); __asm __volatile("jmp %0" :: "r" (addr)); +#endif }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120523035606.9C487106566C>