Skip site navigation (1)Skip section navigation (2)
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>