socsvn commit: r236184 - in soc2012/emc2/head/sys/boot/i386: . efi
emc2 at FreeBSD.org
emc2 at FreeBSD.org
Wed May 23 03:56:08 UTC 2012
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 at 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
}
More information about the svn-soc-all
mailing list