Index: head/sys/boot/arm64/libarm64/cache.c
===================================================================
--- head/sys/boot/arm64/libarm64/cache.c	(revision 293723)
+++ head/sys/boot/arm64/libarm64/cache.c	(revision 293724)
@@ -1,95 +1,95 @@
 /*-
  * Copyright (c) 2014 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by Semihalf under
  * the sponsorship of the FreeBSD Foundation.
  * 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$");
 
 #include <sys/param.h>
 
 #include <machine/armreg.h>
 
 #include <stand.h>
 #include <efi.h>
 
 #include "cache.h"
 
 static unsigned int
 get_dcache_line_size(void)
 {
 	uint64_t ctr;
 	unsigned int dcl_size;
 
 	/* Accessible from all security levels */
 	ctr = READ_SPECIALREG(ctr_el0);
 
 	/*
 	 * Relevant field [19:16] is LOG2
 	 * of the number of words in DCache line
 	 */
 	dcl_size = CTR_DLINE_SIZE(ctr);
 
 	/* Size of word shifted by cache line size */
 	return (sizeof(int) << dcl_size);
 }
 
 void
 cpu_flush_dcache(const void *ptr, size_t len)
 {
 
 	uint64_t cl_size;
 	vm_offset_t addr, end;
 
 	cl_size = get_dcache_line_size();
 
 	/* Calculate end address to clean */
-	end = (vm_offset_t)(ptr + len);
+	end = (vm_offset_t)ptr + (vm_offset_t)len;
 	/* Align start address to cache line */
 	addr = (vm_offset_t)ptr;
 	addr = rounddown2(addr, cl_size);
 
 	for (; addr < end; addr += cl_size)
 		__asm __volatile("dc	civac, %0" : : "r" (addr) : "memory");
 	/* Full system DSB */
 	__asm __volatile("dsb	sy" : : : "memory");
 }
 
 void
 cpu_inval_icache(const void *ptr, size_t len)
 {
 
 	/* NULL ptr or 0 len means all */
 	if (ptr == NULL || len == 0) {
 		__asm __volatile(
 		    "ic		ialluis	\n"
 		    "dsb	ish	\n"
 		    : : : "memory");
 		return;
 	}
 
 	/* TODO: Other cache ranges if necessary */
 }
Index: head/sys/boot/common/load_elf.c
===================================================================
--- head/sys/boot/common/load_elf.c	(revision 293723)
+++ head/sys/boot/common/load_elf.c	(revision 293724)
@@ -1,1033 +1,1033 @@
 /*-
  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
  * Copyright (c) 1998 Peter Wemm <peter@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$");
 
 #include <sys/param.h>
 #include <sys/exec.h>
 #include <sys/linker.h>
 #include <sys/module.h>
 #include <sys/stdint.h>
 #include <string.h>
 #include <machine/elf.h>
 #include <stand.h>
 #define FREEBSD_ELF
 #include <link.h>
 
 #include "bootstrap.h"
 
 #define COPYOUT(s,d,l)	archsw.arch_copyout((vm_offset_t)(s), d, l)
 
 #if defined(__i386__) && __ELF_WORD_SIZE == 64
 #undef ELF_TARG_CLASS
 #undef ELF_TARG_MACH
 #define ELF_TARG_CLASS  ELFCLASS64
 #define ELF_TARG_MACH   EM_X86_64
 #endif
 
 typedef struct elf_file {
     Elf_Phdr 	*ph;
     Elf_Ehdr	*ehdr;
     Elf_Sym	*symtab;
     Elf_Hashelt	*hashtab;
     Elf_Hashelt	nbuckets;
     Elf_Hashelt	nchains;
     Elf_Hashelt	*buckets;
     Elf_Hashelt	*chains;
     Elf_Rel	*rel;
     size_t	relsz;
     Elf_Rela	*rela;
     size_t	relasz;
     char	*strtab;
     size_t	strsz;
     int		fd;
     caddr_t	firstpage;
     size_t	firstlen;
     int		kernel;
     u_int64_t	off;
 } *elf_file_t;
 
 static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef, u_int64_t loadaddr);
 static int __elfN(lookup_symbol)(struct preloaded_file *mp, elf_file_t ef, const char* name, Elf_Sym* sym);
 static int __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
     Elf_Addr p, void *val, size_t len);
 static int __elfN(parse_modmetadata)(struct preloaded_file *mp, elf_file_t ef,
     Elf_Addr p_start, Elf_Addr p_end);
 static symaddr_fn __elfN(symaddr);
 static char	*fake_modname(const char *name);
 
 const char	*__elfN(kerneltype) = "elf kernel";
 const char	*__elfN(moduletype) = "elf module";
 
 u_int64_t	__elfN(relocation_offset) = 0;
 
 static int
 __elfN(load_elf_header)(char *filename, elf_file_t ef)
 {
 	ssize_t			 bytes_read;
 	Elf_Ehdr		*ehdr;
 	int 			 err;
 
 	/*
 	* Open the image, read and validate the ELF header 
 	*/
 	if (filename == NULL)	/* can't handle nameless */
 		return (EFTYPE);
 	if ((ef->fd = open(filename, O_RDONLY)) == -1)
 		return (errno);
 	ef->firstpage = malloc(PAGE_SIZE);
 	if (ef->firstpage == NULL) {
 		close(ef->fd);
 		return (ENOMEM);
 	}
 	bytes_read = read(ef->fd, ef->firstpage, PAGE_SIZE);
 	ef->firstlen = (size_t)bytes_read;
 	if (bytes_read < 0 || ef->firstlen <= sizeof(Elf_Ehdr)) {
 		err = EFTYPE; /* could be EIO, but may be small file */
 		goto error;
 	}
 	ehdr = ef->ehdr = (Elf_Ehdr *)ef->firstpage;
 
 	/* Is it ELF? */
 	if (!IS_ELF(*ehdr)) {
 		err = EFTYPE;
 		goto error;
 	}
 	if (ehdr->e_ident[EI_CLASS] != ELF_TARG_CLASS || /* Layout ? */
 	    ehdr->e_ident[EI_DATA] != ELF_TARG_DATA ||
 	    ehdr->e_ident[EI_VERSION] != EV_CURRENT || /* Version ? */
 	    ehdr->e_version != EV_CURRENT ||
 	    ehdr->e_machine != ELF_TARG_MACH) { /* Machine ? */
 		err = EFTYPE;
 		goto error;
 	}
 
 	return (0);
 
 error:
 	if (ef->firstpage != NULL) {
 		free(ef->firstpage);
 		ef->firstpage = NULL;
 	}
 	if (ef->fd != -1) {
 		close(ef->fd);
 		ef->fd = -1;
 	}
 	return (err);
 }
 
 /*
  * Attempt to load the file (file) as an ELF module.  It will be stored at
  * (dest), and a pointer to a module structure describing the loaded object
  * will be saved in (result).
  */
 int
 __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result)
 {
 	return (__elfN(loadfile_raw)(filename, dest, result, 0));
 }
 
 int
 __elfN(loadfile_raw)(char *filename, u_int64_t dest,
     struct preloaded_file **result, int multiboot)
 {
     struct preloaded_file	*fp, *kfp;
     struct elf_file		ef;
     Elf_Ehdr 			*ehdr;
     int				err;
 
     fp = NULL;
     bzero(&ef, sizeof(struct elf_file));
     ef.fd = -1;
 
     err = __elfN(load_elf_header)(filename, &ef);
     if (err != 0)
     	return (err);
 
     ehdr = ef.ehdr;
 
     /*
      * Check to see what sort of module we are.
      */
     kfp = file_findfile(NULL, __elfN(kerneltype));
 #ifdef __powerpc__
     /*
      * Kernels can be ET_DYN, so just assume the first loaded object is the
      * kernel. This assumption will be checked later.
      */
     if (kfp == NULL)
         ef.kernel = 1;
 #endif
     if (ef.kernel || ehdr->e_type == ET_EXEC) {
 	/* Looks like a kernel */
 	if (kfp != NULL) {
 	    printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n");
 	    err = EPERM;
 	    goto oerr;
 	}
 	/* 
 	 * Calculate destination address based on kernel entrypoint.
 	 *
 	 * For ARM, the destination address is independent of any values in the
 	 * elf header (an ARM kernel can be loaded at any 2MB boundary), so we
 	 * leave dest set to the value calculated by archsw.arch_loadaddr() and
 	 * passed in to this function.
 	 */
 #ifndef __arm__
         if (ehdr->e_type == ET_EXEC)
 	    dest = (ehdr->e_entry & ~PAGE_MASK);
 #endif
 	if ((ehdr->e_entry & ~PAGE_MASK) == 0) {
 	    printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n");
 	    err = EPERM;
 	    goto oerr;
 	}
 	ef.kernel = 1;
 
     } else if (ehdr->e_type == ET_DYN) {
 	/* Looks like a kld module */
 	if (multiboot != 0) {
 		printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module as multiboot\n");
 		err = EPERM;
 		goto oerr;
 	}
 	if (kfp == NULL) {
 	    printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module before kernel\n");
 	    err = EPERM;
 	    goto oerr;
 	}
 	if (strcmp(__elfN(kerneltype), kfp->f_type)) {
 	    printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module with kernel type '%s'\n", kfp->f_type);
 	    err = EPERM;
 	    goto oerr;
 	}
 	/* Looks OK, got ahead */
 	ef.kernel = 0;
 
     } else {
 	err = EFTYPE;
 	goto oerr;
     }
 
     if (archsw.arch_loadaddr != NULL)
 	dest = archsw.arch_loadaddr(LOAD_ELF, ehdr, dest);
     else
 	dest = roundup(dest, PAGE_SIZE);
 
     /* 
      * Ok, we think we should handle this.
      */
     fp = file_alloc();
     if (fp == NULL) {
 	    printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: cannot allocate module info\n");
 	    err = EPERM;
 	    goto out;
     }
     if (ef.kernel == 1 && multiboot == 0)
 	setenv("kernelname", filename, 1);
     fp->f_name = strdup(filename);
     if (multiboot == 0)
     	fp->f_type = strdup(ef.kernel ?
     	    __elfN(kerneltype) : __elfN(moduletype));
     else
     	fp->f_type = strdup("elf multiboot kernel");
 
 #ifdef ELF_VERBOSE
     if (ef.kernel)
 	printf("%s entry at 0x%jx\n", filename, (uintmax_t)ehdr->e_entry);
 #else
     printf("%s ", filename);
 #endif
 
     fp->f_size = __elfN(loadimage)(fp, &ef, dest);
     if (fp->f_size == 0 || fp->f_addr == 0)
 	goto ioerr;
 
     /* save exec header as metadata */
     file_addmetadata(fp, MODINFOMD_ELFHDR, sizeof(*ehdr), ehdr);
 
     /* Load OK, return module pointer */
     *result = (struct preloaded_file *)fp;
     err = 0;
     goto out;
     
  ioerr:
     err = EIO;
  oerr:
     file_discard(fp);
  out:
     if (ef.firstpage)
 	free(ef.firstpage);
     if (ef.fd != -1)
     	close(ef.fd);
     return(err);
 }
 
 /*
  * With the file (fd) open on the image, and (ehdr) containing
  * the Elf header, load the image at (off)
  */
 static int
 __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
 {
     int 	i;
     u_int	j;
     Elf_Ehdr	*ehdr;
     Elf_Phdr	*phdr, *php;
     Elf_Shdr	*shdr;
     char	*shstr;
     int		ret;
     vm_offset_t firstaddr;
     vm_offset_t lastaddr;
     size_t	chunk;
     ssize_t	result;
     Elf_Addr	ssym, esym;
     Elf_Dyn	*dp;
     Elf_Addr	adp;
     Elf_Addr	ctors;
     int		ndp;
     int		symstrindex;
     int		symtabindex;
     Elf_Size	size;
     u_int	fpcopy;
     Elf_Sym	sym;
     Elf_Addr	p_start, p_end;
 
     dp = NULL;
     shdr = NULL;
     ret = 0;
     firstaddr = lastaddr = 0;
     ehdr = ef->ehdr;
     if (ehdr->e_type == ET_EXEC) {
 #if defined(__i386__) || defined(__amd64__)
 #if __ELF_WORD_SIZE == 64
 	off = - (off & 0xffffffffff000000ull);/* x86_64 relocates after locore */
 #else
 	off = - (off & 0xff000000u);	/* i386 relocates after locore */
 #endif
 #elif defined(__powerpc__)
 	/*
 	 * On the purely virtual memory machines like e500, the kernel is
 	 * linked against its final VA range, which is most often not
 	 * available at the loader stage, but only after kernel initializes
 	 * and completes its VM settings. In such cases we cannot use p_vaddr
 	 * field directly to load ELF segments, but put them at some
 	 * 'load-time' locations.
 	 */
 	if (off & 0xf0000000u) {
 	    off = -(off & 0xf0000000u);
 	    /*
 	     * XXX the physical load address should not be hardcoded. Note
 	     * that the Book-E kernel assumes that it's loaded at a 16MB
 	     * boundary for now...
 	     */
 	    off += 0x01000000;
 	    ehdr->e_entry += off;
 #ifdef ELF_VERBOSE
 	    printf("Converted entry 0x%08x\n", ehdr->e_entry);
 #endif
 	} else
 	    off = 0;
 #elif defined(__arm__)
 	/*
 	 * The elf headers in arm kernels specify virtual addresses in all
 	 * header fields, even the ones that should be physical addresses.
 	 * We assume the entry point is in the first page, and masking the page
 	 * offset will leave us with the virtual address the kernel was linked
 	 * at.  We subtract that from the load offset, making 'off' into the
 	 * value which, when added to a virtual address in an elf header,
 	 * translates it to a physical address.  We do the va->pa conversion on
 	 * the entry point address in the header now, so that later we can
 	 * launch the kernel by just jumping to that address.
 	 */
 	off -= ehdr->e_entry & ~PAGE_MASK;
 	ehdr->e_entry += off;
 #ifdef ELF_VERBOSE
 	printf("ehdr->e_entry 0x%08x, va<->pa off %llx\n", ehdr->e_entry, off);
 #endif
 #else
 	off = 0;		/* other archs use direct mapped kernels */
 #endif
     }
     ef->off = off;
 
     if (ef->kernel)
 	__elfN(relocation_offset) = off;
 
     if ((ehdr->e_phoff + ehdr->e_phnum * sizeof(*phdr)) > ef->firstlen) {
 	printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadimage: program header not within first page\n");
 	goto out;
     }
     phdr = (Elf_Phdr *)(ef->firstpage + ehdr->e_phoff);
 
     for (i = 0; i < ehdr->e_phnum; i++) {
 	/* We want to load PT_LOAD segments only.. */
 	if (phdr[i].p_type != PT_LOAD)
 	    continue;
 
 #ifdef ELF_VERBOSE
 	printf("Segment: 0x%lx@0x%lx -> 0x%lx-0x%lx",
 	    (long)phdr[i].p_filesz, (long)phdr[i].p_offset,
 	    (long)(phdr[i].p_vaddr + off),
 	    (long)(phdr[i].p_vaddr + off + phdr[i].p_memsz - 1));
 #else
 	if ((phdr[i].p_flags & PF_W) == 0) {
 	    printf("text=0x%lx ", (long)phdr[i].p_filesz);
 	} else {
 	    printf("data=0x%lx", (long)phdr[i].p_filesz);
 	    if (phdr[i].p_filesz < phdr[i].p_memsz)
 		printf("+0x%lx", (long)(phdr[i].p_memsz -phdr[i].p_filesz));
 	    printf(" ");
 	}
 #endif
 	fpcopy = 0;
 	if (ef->firstlen > phdr[i].p_offset) {
 	    fpcopy = ef->firstlen - phdr[i].p_offset;
 	    archsw.arch_copyin(ef->firstpage + phdr[i].p_offset,
 			       phdr[i].p_vaddr + off, fpcopy);
 	}
 	if (phdr[i].p_filesz > fpcopy) {
 	    if (kern_pread(ef->fd, phdr[i].p_vaddr + off + fpcopy,
 		phdr[i].p_filesz - fpcopy, phdr[i].p_offset + fpcopy) != 0) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "_loadimage: read failed\n");
 		goto out;
 	    }
 	}
 	/* clear space from oversized segments; eg: bss */
 	if (phdr[i].p_filesz < phdr[i].p_memsz) {
 #ifdef ELF_VERBOSE
 	    printf(" (bss: 0x%lx-0x%lx)",
 		(long)(phdr[i].p_vaddr + off + phdr[i].p_filesz),
 		(long)(phdr[i].p_vaddr + off + phdr[i].p_memsz - 1));
 #endif
 
 	    kern_bzero(phdr[i].p_vaddr + off + phdr[i].p_filesz,
 		phdr[i].p_memsz - phdr[i].p_filesz);
 	}
 #ifdef ELF_VERBOSE
 	printf("\n");
 #endif
 
 	if (archsw.arch_loadseg != NULL)
 	    archsw.arch_loadseg(ehdr, phdr + i, off);
 
 	if (firstaddr == 0 || firstaddr > (phdr[i].p_vaddr + off))
 	    firstaddr = phdr[i].p_vaddr + off;
 	if (lastaddr == 0 || lastaddr < (phdr[i].p_vaddr + off + phdr[i].p_memsz))
 	    lastaddr = phdr[i].p_vaddr + off + phdr[i].p_memsz;
     }
     lastaddr = roundup(lastaddr, sizeof(long));
 
     /*
      * Get the section headers.  We need this for finding the .ctors
      * section as well as for loading any symbols.  Both may be hard
      * to do if reading from a .gz file as it involves seeking.  I
      * think the rule is going to have to be that you must strip a
      * file to remove symbols before gzipping it.
      */
     chunk = ehdr->e_shnum * ehdr->e_shentsize;
     if (chunk == 0 || ehdr->e_shoff == 0)
 	goto nosyms;
     shdr = alloc_pread(ef->fd, ehdr->e_shoff, chunk);
     if (shdr == NULL) {
 	printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 	    "_loadimage: failed to read section headers");
 	goto nosyms;
     }
     file_addmetadata(fp, MODINFOMD_SHDR, chunk, shdr);
 
     /*
      * Read the section string table and look for the .ctors section.
      * We need to tell the kernel where it is so that it can call the
      * ctors.
      */
     chunk = shdr[ehdr->e_shstrndx].sh_size;
     if (chunk) {
 	shstr = alloc_pread(ef->fd, shdr[ehdr->e_shstrndx].sh_offset, chunk);
 	if (shstr) {
 	    for (i = 0; i < ehdr->e_shnum; i++) {
 		if (strcmp(shstr + shdr[i].sh_name, ".ctors") != 0)
 		    continue;
 		ctors = shdr[i].sh_addr;
 		file_addmetadata(fp, MODINFOMD_CTORS_ADDR, sizeof(ctors),
 		    &ctors);
 		size = shdr[i].sh_size;
 		file_addmetadata(fp, MODINFOMD_CTORS_SIZE, sizeof(size),
 		    &size);
 		break;
 	    }
 	    free(shstr);
 	}
     }
 
     /*
      * Now load any symbols.
      */
     symtabindex = -1;
     symstrindex = -1;
     for (i = 0; i < ehdr->e_shnum; i++) {
 	if (shdr[i].sh_type != SHT_SYMTAB)
 	    continue;
 	for (j = 0; j < ehdr->e_phnum; j++) {
 	    if (phdr[j].p_type != PT_LOAD)
 		continue;
 	    if (shdr[i].sh_offset >= phdr[j].p_offset &&
 		(shdr[i].sh_offset + shdr[i].sh_size <=
 		 phdr[j].p_offset + phdr[j].p_filesz)) {
 		shdr[i].sh_offset = 0;
 		shdr[i].sh_size = 0;
 		break;
 	    }
 	}
 	if (shdr[i].sh_offset == 0 || shdr[i].sh_size == 0)
 	    continue;		/* alread loaded in a PT_LOAD above */
 	/* Save it for loading below */
 	symtabindex = i;
 	symstrindex = shdr[i].sh_link;
     }
     if (symtabindex < 0 || symstrindex < 0)
 	goto nosyms;
 
     /* Ok, committed to a load. */
 #ifndef ELF_VERBOSE
     printf("syms=[");
 #endif
     ssym = lastaddr;
     for (i = symtabindex; i >= 0; i = symstrindex) {
 #ifdef ELF_VERBOSE
 	char	*secname;
 
 	switch(shdr[i].sh_type) {
 	    case SHT_SYMTAB:		/* Symbol table */
 		secname = "symtab";
 		break;
 	    case SHT_STRTAB:		/* String table */
 		secname = "strtab";
 		break;
 	    default:
 		secname = "WHOA!!";
 		break;
 	}
 #endif
 
 	size = shdr[i].sh_size;
 	archsw.arch_copyin(&size, lastaddr, sizeof(size));
 	lastaddr += sizeof(size);
 
 #ifdef ELF_VERBOSE
 	printf("\n%s: 0x%jx@0x%jx -> 0x%jx-0x%jx", secname,
 	    (uintmax_t)shdr[i].sh_size, (uintmax_t)shdr[i].sh_offset,
 	    (uintmax_t)lastaddr, (uintmax_t)(lastaddr + shdr[i].sh_size));
 #else
 	if (i == symstrindex)
 	    printf("+");
 	printf("0x%lx+0x%lx", (long)sizeof(size), (long)size);
 #endif
 
 	if (lseek(ef->fd, (off_t)shdr[i].sh_offset, SEEK_SET) == -1) {
 	    printf("\nelf" __XSTRING(__ELF_WORD_SIZE) "_loadimage: could not seek for symbols - skipped!");
 	    lastaddr = ssym;
 	    ssym = 0;
 	    goto nosyms;
 	}
 	result = archsw.arch_readin(ef->fd, lastaddr, shdr[i].sh_size);
 	if (result < 0 || (size_t)result != shdr[i].sh_size) {
 	    printf("\nelf" __XSTRING(__ELF_WORD_SIZE) "_loadimage: could not read symbols - skipped! (%ju != %ju)", (uintmax_t)result,
 		(uintmax_t)shdr[i].sh_size);
 	    lastaddr = ssym;
 	    ssym = 0;
 	    goto nosyms;
 	}
 	/* Reset offsets relative to ssym */
 	lastaddr += shdr[i].sh_size;
 	lastaddr = roundup(lastaddr, sizeof(size));
 	if (i == symtabindex)
 	    symtabindex = -1;
 	else if (i == symstrindex)
 	    symstrindex = -1;
     }
     esym = lastaddr;
 #ifndef ELF_VERBOSE
     printf("]");
 #endif
 
     file_addmetadata(fp, MODINFOMD_SSYM, sizeof(ssym), &ssym);
     file_addmetadata(fp, MODINFOMD_ESYM, sizeof(esym), &esym);
 
 nosyms:
     printf("\n");
 
     ret = lastaddr - firstaddr;
     fp->f_addr = firstaddr;
 
     php = NULL;
     for (i = 0; i < ehdr->e_phnum; i++) {
 	if (phdr[i].p_type == PT_DYNAMIC) {
 	    php = phdr + i;
 	    adp = php->p_vaddr;
 	    file_addmetadata(fp, MODINFOMD_DYNAMIC, sizeof(adp), &adp);
 	    break;
 	}
     }
 
     if (php == NULL)	/* this is bad, we cannot get to symbols or _DYNAMIC */
 	goto out;
 
     ndp = php->p_filesz / sizeof(Elf_Dyn);
     if (ndp == 0)
 	goto out;
     dp = malloc(php->p_filesz);
     if (dp == NULL)
 	goto out;
     archsw.arch_copyout(php->p_vaddr + off, dp, php->p_filesz);
 
     ef->strsz = 0;
     for (i = 0; i < ndp; i++) {
 	if (dp[i].d_tag == 0)
 	    break;
 	switch (dp[i].d_tag) {
 	case DT_HASH:
 	    ef->hashtab = (Elf_Hashelt*)(uintptr_t)(dp[i].d_un.d_ptr + off);
 	    break;
 	case DT_STRTAB:
 	    ef->strtab = (char *)(uintptr_t)(dp[i].d_un.d_ptr + off);
 	    break;
 	case DT_STRSZ:
 	    ef->strsz = dp[i].d_un.d_val;
 	    break;
 	case DT_SYMTAB:
 	    ef->symtab = (Elf_Sym*)(uintptr_t)(dp[i].d_un.d_ptr + off);
 	    break;
 	case DT_REL:
 	    ef->rel = (Elf_Rel *)(uintptr_t)(dp[i].d_un.d_ptr + off);
 	    break;
 	case DT_RELSZ:
 	    ef->relsz = dp[i].d_un.d_val;
 	    break;
 	case DT_RELA:
 	    ef->rela = (Elf_Rela *)(uintptr_t)(dp[i].d_un.d_ptr + off);
 	    break;
 	case DT_RELASZ:
 	    ef->relasz = dp[i].d_un.d_val;
 	    break;
 	default:
 	    break;
 	}
     }
     if (ef->hashtab == NULL || ef->symtab == NULL ||
 	ef->strtab == NULL || ef->strsz == 0)
 	goto out;
     COPYOUT(ef->hashtab, &ef->nbuckets, sizeof(ef->nbuckets));
     COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains));
     ef->buckets = ef->hashtab + 2;
     ef->chains = ef->buckets + ef->nbuckets;
 
     if (__elfN(lookup_symbol)(fp, ef, "__start_set_modmetadata_set", &sym) != 0)
 	return 0;
     p_start = sym.st_value + ef->off;
     if (__elfN(lookup_symbol)(fp, ef, "__stop_set_modmetadata_set", &sym) != 0)
 	return ENOENT;
     p_end = sym.st_value + ef->off;
 
     if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) == 0)
 	goto out;
 
     if (ef->kernel)			/* kernel must not depend on anything */
 	goto out;
 
 out:
     if (dp)
 	free(dp);
     if (shdr)
 	free(shdr);
     return ret;
 }
 
 static char invalid_name[] = "bad";
 
 char *
 fake_modname(const char *name)
 {
     const char *sp, *ep;
     char *fp;
     size_t len;
 
     sp = strrchr(name, '/');
     if (sp)
 	sp++;
     else
 	sp = name;
     ep = strrchr(name, '.');
     if (ep) {
 	    if (ep == name) {
 		sp = invalid_name;
 		ep = invalid_name + sizeof(invalid_name) - 1;
 	    } 
     } else
 	ep = name + strlen(name);
     len = ep - sp;
     fp = malloc(len + 1);
     if (fp == NULL)
 	return NULL;
     memcpy(fp, sp, len);
     fp[len] = '\0';
     return fp;
 }
 
 #if (defined(__i386__) || defined(__powerpc__)) && __ELF_WORD_SIZE == 64
 struct mod_metadata64 {
 	int		md_version;	/* structure version MDTV_* */  
 	int		md_type;	/* type of entry MDT_* */
 	u_int64_t	md_data;	/* specific data */
 	u_int64_t	md_cval;	/* common string label */
 };
 #endif
 #if defined(__amd64__) && __ELF_WORD_SIZE == 32
 struct mod_metadata32 {
 	int		md_version;	/* structure version MDTV_* */  
 	int		md_type;	/* type of entry MDT_* */
 	u_int32_t	md_data;	/* specific data */
 	u_int32_t	md_cval;	/* common string label */
 };
 #endif
 
 int
 __elfN(load_modmetadata)(struct preloaded_file *fp, u_int64_t dest)
 {
 	struct elf_file		 ef;
 	int			 err, i, j;
 	Elf_Shdr		*sh_meta, *shdr = NULL;
 	Elf_Shdr		*sh_data[2];
 	char			*shstrtab = NULL;
 	size_t			 size;
 	Elf_Addr		 p_start, p_end;
 
 	bzero(&ef, sizeof(struct elf_file));
 	ef.fd = -1;
 
 	err = __elfN(load_elf_header)(fp->f_name, &ef);
 	if (err != 0)
 		goto out;
 
 	if (ef.kernel == 1 || ef.ehdr->e_type == ET_EXEC) {
 		ef.kernel = 1;
 	} else if (ef.ehdr->e_type != ET_DYN) {
 		err = EFTYPE;
 		goto out;
 	}
 
 	size = ef.ehdr->e_shnum * ef.ehdr->e_shentsize;
 	shdr = alloc_pread(ef.fd, ef.ehdr->e_shoff, size);
 	if (shdr == NULL) {
 		err = ENOMEM;
 		goto out;
 	}
 
 	/* Load shstrtab. */
 	shstrtab = alloc_pread(ef.fd, shdr[ef.ehdr->e_shstrndx].sh_offset,
 	    shdr[ef.ehdr->e_shstrndx].sh_size);
 	if (shstrtab == NULL) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "load_modmetadata: unable to load shstrtab\n");
 		err = EFTYPE;
 		goto out;
 	}
 
 	/* Find set_modmetadata_set and data sections. */
 	sh_data[0] = sh_data[1] = sh_meta = NULL;
 	for (i = 0, j = 0; i < ef.ehdr->e_shnum; i++) {
 		if (strcmp(&shstrtab[shdr[i].sh_name],
 		    "set_modmetadata_set") == 0) {
 			sh_meta = &shdr[i];
 		}
 		if ((strcmp(&shstrtab[shdr[i].sh_name], ".data") == 0) ||
 		    (strcmp(&shstrtab[shdr[i].sh_name], ".rodata") == 0)) {
 			sh_data[j++] = &shdr[i];
 		}
 	}
 	if (sh_meta == NULL || sh_data[0] == NULL || sh_data[1] == NULL) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
     "load_modmetadata: unable to find set_modmetadata_set or data sections\n");
 		err = EFTYPE;
 		goto out;
 	}
 
 	/* Load set_modmetadata_set into memory */
 	err = kern_pread(ef.fd, dest, sh_meta->sh_size, sh_meta->sh_offset);
 	if (err != 0) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
     "load_modmetadata: unable to load set_modmetadata_set: %d\n", err);
 		goto out;
 	}
 	p_start = dest;
 	p_end = dest + sh_meta->sh_size;
 	dest += sh_meta->sh_size;
 
 	/* Load data sections into memory. */
 	err = kern_pread(ef.fd, dest, sh_data[0]->sh_size,
 	    sh_data[0]->sh_offset);
 	if (err != 0) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "load_modmetadata: unable to load data: %d\n", err);
 		goto out;
 	}
 
 	/*
 	 * We have to increment the dest, so that the offset is the same into
 	 * both the .rodata and .data sections.
 	 */
 	ef.off = -(sh_data[0]->sh_addr - dest);
 	dest +=	(sh_data[1]->sh_addr - sh_data[0]->sh_addr);
 
 	err = kern_pread(ef.fd, dest, sh_data[1]->sh_size,
 	    sh_data[1]->sh_offset);
 	if (err != 0) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "load_modmetadata: unable to load data: %d\n", err);
 		goto out;
 	}
 
 	err = __elfN(parse_modmetadata)(fp, &ef, p_start, p_end);
 	if (err != 0) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "load_modmetadata: unable to parse metadata: %d\n", err);
 		goto out;
 	}
 
 out:
 	if (shstrtab != NULL)
 		free(shstrtab);
 	if (shdr != NULL)
 		free(shdr);
 	if (ef.firstpage != NULL)
 		free(ef.firstpage);
 	if (ef.fd != -1)
 		close(ef.fd);
 	return (err);
 }
 
 int
 __elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef,
     Elf_Addr p_start, Elf_Addr p_end)
 {
     struct mod_metadata md;
 #if (defined(__i386__) || defined(__powerpc__)) && __ELF_WORD_SIZE == 64
     struct mod_metadata64 md64;
 #elif defined(__amd64__) && __ELF_WORD_SIZE == 32
     struct mod_metadata32 md32;
 #endif
     struct mod_depend *mdepend;
     struct mod_version mver;
     char *s;
     int error, modcnt, minfolen;
     Elf_Addr v, p;
 
     modcnt = 0;
     p = p_start;
     while (p < p_end) {
 	COPYOUT(p, &v, sizeof(v));
 	error = __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v));
 	if (error == EOPNOTSUPP)
 	    v += ef->off;
 	else if (error != 0)
 	    return (error);
 #if (defined(__i386__) || defined(__powerpc__)) && __ELF_WORD_SIZE == 64
 	COPYOUT(v, &md64, sizeof(md64));
 	error = __elfN(reloc_ptr)(fp, ef, v, &md64, sizeof(md64));
 	if (error == EOPNOTSUPP) {
 	    md64.md_cval += ef->off;
 	    md64.md_data += ef->off;
 	} else if (error != 0)
 	    return (error);
 	md.md_version = md64.md_version;
 	md.md_type = md64.md_type;
 	md.md_cval = (const char *)(uintptr_t)md64.md_cval;
 	md.md_data = (void *)(uintptr_t)md64.md_data;
 #elif defined(__amd64__) && __ELF_WORD_SIZE == 32
 	COPYOUT(v, &md32, sizeof(md32));
 	error = __elfN(reloc_ptr)(fp, ef, v, &md32, sizeof(md32));
 	if (error == EOPNOTSUPP) {
 	    md32.md_cval += ef->off;
 	    md32.md_data += ef->off;
 	} else if (error != 0)
 	    return (error);
 	md.md_version = md32.md_version;
 	md.md_type = md32.md_type;
 	md.md_cval = (const char *)(uintptr_t)md32.md_cval;
 	md.md_data = (void *)(uintptr_t)md32.md_data;
 #else
 	COPYOUT(v, &md, sizeof(md));
 	error = __elfN(reloc_ptr)(fp, ef, v, &md, sizeof(md));
 	if (error == EOPNOTSUPP) {
 	    md.md_cval += ef->off;
-	    md.md_data += ef->off;
+	    md.md_data = (void *)((uintptr_t)md.md_data + ef->off);
 	} else if (error != 0)
 	    return (error);
 #endif
 	p += sizeof(Elf_Addr);
 	switch(md.md_type) {
 	  case MDT_DEPEND:
 	    if (ef->kernel)		/* kernel must not depend on anything */
 	      break;
 	    s = strdupout((vm_offset_t)md.md_cval);
 	    minfolen = sizeof(*mdepend) + strlen(s) + 1;
 	    mdepend = malloc(minfolen);
 	    if (mdepend == NULL)
 		return ENOMEM;
 	    COPYOUT((vm_offset_t)md.md_data, mdepend, sizeof(*mdepend));
 	    strcpy((char*)(mdepend + 1), s);
 	    free(s);
 	    file_addmetadata(fp, MODINFOMD_DEPLIST, minfolen, mdepend);
 	    free(mdepend);
 	    break;
 	  case MDT_VERSION:
 	    s = strdupout((vm_offset_t)md.md_cval);
 	    COPYOUT((vm_offset_t)md.md_data, &mver, sizeof(mver));
 	    file_addmodule(fp, s, mver.mv_version, NULL);
 	    free(s);
 	    modcnt++;
 	    break;
 	}
     }
     if (modcnt == 0) {
 	s = fake_modname(fp->f_name);
 	file_addmodule(fp, s, 1, NULL);
 	free(s);
     }
     return 0;
 }
 
 static unsigned long
 elf_hash(const char *name)
 {
     const unsigned char *p = (const unsigned char *) name;
     unsigned long h = 0;
     unsigned long g;
 
     while (*p != '\0') {
 	h = (h << 4) + *p++;
 	if ((g = h & 0xf0000000) != 0)
 	    h ^= g >> 24;
 	h &= ~g;
     }
     return h;
 }
 
 static const char __elfN(bad_symtable)[] = "elf" __XSTRING(__ELF_WORD_SIZE) "_lookup_symbol: corrupt symbol table\n";
 int
 __elfN(lookup_symbol)(struct preloaded_file *fp, elf_file_t ef, const char* name,
 		  Elf_Sym *symp)
 {
     Elf_Hashelt symnum;
     Elf_Sym sym;
     char *strp;
     unsigned long hash;
 
     hash = elf_hash(name);
     COPYOUT(&ef->buckets[hash % ef->nbuckets], &symnum, sizeof(symnum));
 
     while (symnum != STN_UNDEF) {
 	if (symnum >= ef->nchains) {
 	    printf(__elfN(bad_symtable));
 	    return ENOENT;
 	}
 
 	COPYOUT(ef->symtab + symnum, &sym, sizeof(sym));
 	if (sym.st_name == 0) {
 	    printf(__elfN(bad_symtable));
 	    return ENOENT;
 	}
 
 	strp = strdupout((vm_offset_t)(ef->strtab + sym.st_name));
 	if (strcmp(name, strp) == 0) {
 	    free(strp);
 	    if (sym.st_shndx != SHN_UNDEF ||
 		(sym.st_value != 0 &&
 		 ELF_ST_TYPE(sym.st_info) == STT_FUNC)) {
 		*symp = sym;
 		return 0;
 	    }
 	    return ENOENT;
 	}
 	free(strp);
 	COPYOUT(&ef->chains[symnum], &symnum, sizeof(symnum));
     }
     return ENOENT;
 }
 
 /*
  * Apply any intra-module relocations to the value. p is the load address
  * of the value and val/len is the value to be modified. This does NOT modify
  * the image in-place, because this is done by kern_linker later on.
  *
  * Returns EOPNOTSUPP if no relocation method is supplied.
  */
 static int
 __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
     Elf_Addr p, void *val, size_t len)
 {
 	size_t n;
 	Elf_Rela a;
 	Elf_Rel r;
 	int error;
 
 	/*
 	 * The kernel is already relocated, but we still want to apply
 	 * offset adjustments.
 	 */
 	if (ef->kernel)
 		return (EOPNOTSUPP);
 
 	for (n = 0; n < ef->relsz / sizeof(r); n++) {
 		COPYOUT(ef->rel + n, &r, sizeof(r));
 
 		error = __elfN(reloc)(ef, __elfN(symaddr), &r, ELF_RELOC_REL,
 		    ef->off, p, val, len);
 		if (error != 0)
 			return (error);
 	}
 	for (n = 0; n < ef->relasz / sizeof(a); n++) {
 		COPYOUT(ef->rela + n, &a, sizeof(a));
 
 		error = __elfN(reloc)(ef, __elfN(symaddr), &a, ELF_RELOC_RELA,
 		    ef->off, p, val, len);
 		if (error != 0)
 			return (error);
 	}
 
 	return (0);
 }
 
 static Elf_Addr
 __elfN(symaddr)(struct elf_file *ef, Elf_Size symidx)
 {
 
 	/* Symbol lookup by index not required here. */
 	return (0);
 }
Index: head/sys/boot/common/load_elf_obj.c
===================================================================
--- head/sys/boot/common/load_elf_obj.c	(revision 293723)
+++ head/sys/boot/common/load_elf_obj.c	(revision 293724)
@@ -1,536 +1,534 @@
 /*-
  * Copyright (c) 2004 Ian Dowse <iedowse@freebsd.org>
  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
  * Copyright (c) 1998 Peter Wemm <peter@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$");
 
 #include <sys/param.h>
 #include <sys/exec.h>
 #include <sys/linker.h>
 #include <sys/module.h>
 #include <inttypes.h>
 #include <string.h>
 #include <machine/elf.h>
 #include <stand.h>
 #define FREEBSD_ELF
 #include <link.h>
 
 #include "bootstrap.h"
 
 #define COPYOUT(s,d,l)	archsw.arch_copyout((vm_offset_t)(s), d, l)
 
 #if defined(__i386__) && __ELF_WORD_SIZE == 64
 #undef ELF_TARG_CLASS
 #undef ELF_TARG_MACH
 #define ELF_TARG_CLASS  ELFCLASS64
 #define ELF_TARG_MACH   EM_X86_64
 #endif
 
 typedef struct elf_file {
 	Elf_Ehdr	hdr;
 	Elf_Shdr	*e_shdr;
 
 	int		symtabindex;	/* Index of symbol table */
 	int		shstrindex;	/* Index of section name string table */
 
 	int		fd;
 	vm_offset_t	off;
 } *elf_file_t;
 
 static int __elfN(obj_loadimage)(struct preloaded_file *mp, elf_file_t ef,
     u_int64_t loadaddr);
 static int __elfN(obj_lookup_set)(struct preloaded_file *mp, elf_file_t ef,
     const char *name, Elf_Addr *startp, Elf_Addr *stopp, int *countp);
 static int __elfN(obj_reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
     Elf_Addr p, void *val, size_t len);
 static int __elfN(obj_parse_modmetadata)(struct preloaded_file *mp,
     elf_file_t ef);
 static Elf_Addr __elfN(obj_symaddr)(struct elf_file *ef, Elf_Size symidx);
 
 const char	*__elfN(obj_kerneltype) = "elf kernel";
 const char	*__elfN(obj_moduletype) = "elf obj module";
 
 /*
  * Attempt to load the file (file) as an ELF module.  It will be stored at
  * (dest), and a pointer to a module structure describing the loaded object
  * will be saved in (result).
  */
 int
 __elfN(obj_loadfile)(char *filename, u_int64_t dest,
     struct preloaded_file **result)
 {
 	struct preloaded_file *fp, *kfp;
 	struct elf_file	ef;
 	Elf_Ehdr *hdr;
 	int err;
 	ssize_t bytes_read;
 
 	fp = NULL;
 	bzero(&ef, sizeof(struct elf_file));
 
 	/*
 	 * Open the image, read and validate the ELF header
 	 */
 	if (filename == NULL)	/* can't handle nameless */
 		return(EFTYPE);
 	if ((ef.fd = open(filename, O_RDONLY)) == -1)
 		return(errno);
 
 	hdr = &ef.hdr;
 	bytes_read = read(ef.fd, hdr, sizeof(*hdr));
 	if (bytes_read != sizeof(*hdr)) {
 		err = EFTYPE;	/* could be EIO, but may be small file */
 		goto oerr;
 	}
 
 	/* Is it ELF? */
 	if (!IS_ELF(*hdr)) {
 		err = EFTYPE;
 		goto oerr;
 	}
 	if (hdr->e_ident[EI_CLASS] != ELF_TARG_CLASS ||	/* Layout ? */
 	    hdr->e_ident[EI_DATA] != ELF_TARG_DATA ||
 	    hdr->e_ident[EI_VERSION] != EV_CURRENT ||	/* Version ? */
 	    hdr->e_version != EV_CURRENT ||
 	    hdr->e_machine != ELF_TARG_MACH ||		/* Machine ? */
 	    hdr->e_type != ET_REL) {
 		err = EFTYPE;
 		goto oerr;
 	}
 
 	if (hdr->e_shnum * hdr->e_shentsize == 0 || hdr->e_shoff == 0 ||
 	    hdr->e_shentsize != sizeof(Elf_Shdr)) {
 		err = EFTYPE;
 		goto oerr;
 	}
 
 	kfp = file_findfile(NULL, __elfN(obj_kerneltype));
 	if (kfp == NULL) {
 		printf("elf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadfile: can't load module before kernel\n");
 		err = EPERM;
 		goto oerr;
 	}
 
 	if (archsw.arch_loadaddr != NULL)
 		dest = archsw.arch_loadaddr(LOAD_ELF, hdr, dest);
 	else
 		dest = roundup(dest, PAGE_SIZE);
 
 	/*
 	 * Ok, we think we should handle this.
 	 */
 	fp = file_alloc();
 	if (fp == NULL) {
 		printf("elf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadfile: cannot allocate module info\n");
 		err = EPERM;
 		goto out;
 	}
 	fp->f_name = strdup(filename);
 	fp->f_type = strdup(__elfN(obj_moduletype));
 
 	printf("%s ", filename);
 
 	fp->f_size = __elfN(obj_loadimage)(fp, &ef, dest);
 	if (fp->f_size == 0 || fp->f_addr == 0)
 		goto ioerr;
 
 	/* save exec header as metadata */
 	file_addmetadata(fp, MODINFOMD_ELFHDR, sizeof(*hdr), hdr);
 
 	/* Load OK, return module pointer */
 	*result = (struct preloaded_file *)fp;
 	err = 0;
 	goto out;
 
 ioerr:
 	err = EIO;
 oerr:
 	file_discard(fp);
 out:
 	close(ef.fd);
 	if (ef.e_shdr != NULL)
 		free(ef.e_shdr);
 
 	return(err);
 }
 
 /*
  * With the file (fd) open on the image, and (ehdr) containing
  * the Elf header, load the image at (off)
  */
 static int
 __elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
 {
 	Elf_Ehdr *hdr;
 	Elf_Shdr *shdr, *cshdr, *lshdr;
 	vm_offset_t firstaddr, lastaddr;
 	int i, nsym, res, ret, shdrbytes, symstrindex;
 
 	ret = 0;
 	firstaddr = lastaddr = (vm_offset_t)off;
 	hdr = &ef->hdr;
 	ef->off = (vm_offset_t)off;
 
 	/* Read in the section headers. */
 	shdrbytes = hdr->e_shnum * hdr->e_shentsize;
 	shdr = alloc_pread(ef->fd, (off_t)hdr->e_shoff, shdrbytes);
 	if (shdr == NULL) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadimage: read section headers failed\n");
 		goto out;
 	}
 	ef->e_shdr = shdr;
 
 	/*
 	 * Decide where to load everything, but don't read it yet.
 	 * We store the load address as a non-zero sh_addr value.
 	 * Start with the code/data and bss.
 	 */
 	for (i = 0; i < hdr->e_shnum; i++)
 		shdr[i].sh_addr = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
 		if (shdr[i].sh_size == 0)
 			continue;
 		switch (shdr[i].sh_type) {
 		case SHT_PROGBITS:
 		case SHT_NOBITS:
 			lastaddr = roundup(lastaddr, shdr[i].sh_addralign);
 			shdr[i].sh_addr = (Elf_Addr)lastaddr;
 			lastaddr += shdr[i].sh_size;
 			break;
 		}
 	}
 
 	/* Symbols. */
 	nsym = 0;
 	for (i = 0; i < hdr->e_shnum; i++) {
 		switch (shdr[i].sh_type) {
 		case SHT_SYMTAB:
 			nsym++;
 			ef->symtabindex = i;
 			shdr[i].sh_addr = (Elf_Addr)lastaddr;
 			lastaddr += shdr[i].sh_size;
 			break;
 		}
 	}
 	if (nsym != 1) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadimage: file has no valid symbol table\n");
 		goto out;
 	}
 	lastaddr = roundup(lastaddr, shdr[ef->symtabindex].sh_addralign);
 	shdr[ef->symtabindex].sh_addr = (Elf_Addr)lastaddr;
 	lastaddr += shdr[ef->symtabindex].sh_size;
 
 	symstrindex = shdr[ef->symtabindex].sh_link;
 	if (symstrindex < 0 || symstrindex >= hdr->e_shnum ||
 	    shdr[symstrindex].sh_type != SHT_STRTAB) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadimage: file has invalid symbol strings\n");
 		goto out;
 	}
 	lastaddr = roundup(lastaddr, shdr[symstrindex].sh_addralign);
 	shdr[symstrindex].sh_addr = (Elf_Addr)lastaddr;
 	lastaddr += shdr[symstrindex].sh_size;
 
 	/* Section names. */
 	if (hdr->e_shstrndx == 0 || hdr->e_shstrndx >= hdr->e_shnum ||
 	    shdr[hdr->e_shstrndx].sh_type != SHT_STRTAB) {
 		printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 		    "_obj_loadimage: file has no section names\n");
 		goto out;
 	}
 	ef->shstrindex = hdr->e_shstrndx;
 	lastaddr = roundup(lastaddr, shdr[ef->shstrindex].sh_addralign);
 	shdr[ef->shstrindex].sh_addr = (Elf_Addr)lastaddr;
 	lastaddr += shdr[ef->shstrindex].sh_size;
 
 	/* Relocation tables. */
 	for (i = 0; i < hdr->e_shnum; i++) {
 		switch (shdr[i].sh_type) {
 		case SHT_REL:
 		case SHT_RELA:
 			lastaddr = roundup(lastaddr, shdr[i].sh_addralign);
 			shdr[i].sh_addr = (Elf_Addr)lastaddr;
 			lastaddr += shdr[i].sh_size;
 			break;
 		}
 	}
 
 	/* Clear the whole area, including bss regions. */
 	kern_bzero(firstaddr, lastaddr - firstaddr);
 
 	/* Figure section with the lowest file offset we haven't loaded yet. */
 	for (cshdr = NULL; /* none */; /* none */)
 	{
 		/*
 		 * Find next section to load. The complexity of this loop is
 		 * O(n^2), but with  the number of sections being typically
 		 * small, we do not care.
 		 */
 		lshdr = cshdr;
 
 		for (i = 0; i < hdr->e_shnum; i++) {
 			if (shdr[i].sh_addr == 0 ||
 			    shdr[i].sh_type == SHT_NOBITS)
 				continue;
 			/* Skip sections that were loaded already. */
 			if (lshdr != NULL &&
 			    lshdr->sh_offset >= shdr[i].sh_offset)
 				continue;
 			/* Find section with smallest offset. */
 			if (cshdr == lshdr ||
 			    cshdr->sh_offset > shdr[i].sh_offset)
 				cshdr = &shdr[i];
 		}
 
 		if (cshdr == lshdr)
 			break;
 
 		if (kern_pread(ef->fd, (vm_offset_t)cshdr->sh_addr,
 		    cshdr->sh_size, (off_t)cshdr->sh_offset) != 0) {
 			printf("\nelf" __XSTRING(__ELF_WORD_SIZE)
 			    "_obj_loadimage: read failed\n");
 			goto out;
 		}
 	}
 
 	file_addmetadata(fp, MODINFOMD_SHDR, shdrbytes, shdr);
 
 	res = __elfN(obj_parse_modmetadata)(fp, ef);
 	if (res != 0)
 		goto out;
 
 	ret = lastaddr - firstaddr;
 	fp->f_addr = firstaddr;
 
 	printf("size 0x%lx at 0x%lx", (u_long)ret, (u_long)firstaddr);
 
 out:
 	printf("\n");
 	return ret;
 }
 
 #if defined(__i386__) && __ELF_WORD_SIZE == 64
 struct mod_metadata64 {
 	int		md_version;	/* structure version MDTV_* */
 	int		md_type;	/* type of entry MDT_* */
 	u_int64_t	md_data;	/* specific data */
 	u_int64_t	md_cval;	/* common string label */
 };
 #endif
 
 int
 __elfN(obj_parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef)
 {
 	struct mod_metadata md;
 #if defined(__i386__) && __ELF_WORD_SIZE == 64
 	struct mod_metadata64 md64;
 #endif
 	struct mod_depend *mdepend;
 	struct mod_version mver;
 	char *s;
 	int error, modcnt, minfolen;
 	Elf_Addr v, p, p_stop;
 
 	if (__elfN(obj_lookup_set)(fp, ef, "modmetadata_set", &p, &p_stop,
 	    &modcnt) != 0)
 		return 0;
 
 	modcnt = 0;
 	while (p < p_stop) {
 		COPYOUT(p, &v, sizeof(v));
 		error = __elfN(obj_reloc_ptr)(fp, ef, p, &v, sizeof(v));
 		if (error != 0)
 			return (error);
 #if defined(__i386__) && __ELF_WORD_SIZE == 64
 		COPYOUT(v, &md64, sizeof(md64));
 		error = __elfN(obj_reloc_ptr)(fp, ef, v, &md64, sizeof(md64));
 		if (error != 0)
 			return (error);
 		md.md_version = md64.md_version;
 		md.md_type = md64.md_type;
 		md.md_cval = (const char *)(uintptr_t)md64.md_cval;
 		md.md_data = (void *)(uintptr_t)md64.md_data;
 #else
 		COPYOUT(v, &md, sizeof(md));
 		error = __elfN(obj_reloc_ptr)(fp, ef, v, &md, sizeof(md));
 		if (error != 0)
 			return (error);
 #endif
 		p += sizeof(Elf_Addr);
 		switch(md.md_type) {
 		case MDT_DEPEND:
 			s = strdupout((vm_offset_t)md.md_cval);
 			minfolen = sizeof(*mdepend) + strlen(s) + 1;
 			mdepend = malloc(minfolen);
 			if (mdepend == NULL)
 				return ENOMEM;
 			COPYOUT((vm_offset_t)md.md_data, mdepend,
 			    sizeof(*mdepend));
 			strcpy((char*)(mdepend + 1), s);
 			free(s);
 			file_addmetadata(fp, MODINFOMD_DEPLIST, minfolen,
 			    mdepend);
 			free(mdepend);
 			break;
 		case MDT_VERSION:
 			s = strdupout((vm_offset_t)md.md_cval);
 			COPYOUT((vm_offset_t)md.md_data, &mver, sizeof(mver));
 			file_addmodule(fp, s, mver.mv_version, NULL);
 			free(s);
 			modcnt++;
 			break;
 		case MDT_MODULE:
 		case MDT_PNP_INFO:
 			break;
 		default:
 			printf("unknown type %d\n", md.md_type);
 			break;
 		}
 	}
 	return 0;
 }
 
 static int
 __elfN(obj_lookup_set)(struct preloaded_file *fp, elf_file_t ef,
     const char* name, Elf_Addr *startp, Elf_Addr *stopp, int *countp)
 {
 	Elf_Ehdr *hdr;
 	Elf_Shdr *shdr;
 	char *p;
 	vm_offset_t shstrtab;
 	int i;
 
 	hdr = &ef->hdr;
 	shdr = ef->e_shdr;
 	shstrtab = shdr[ef->shstrindex].sh_addr;
 
 	for (i = 0; i < hdr->e_shnum; i++) {
 		if (shdr[i].sh_type != SHT_PROGBITS)
 			continue;
 		if (shdr[i].sh_name == 0)
 			continue;
 		p = strdupout(shstrtab + shdr[i].sh_name);
 		if (strncmp(p, "set_", 4) == 0 && strcmp(p + 4, name) == 0) {
 			*startp = shdr[i].sh_addr;
 			*stopp = shdr[i].sh_addr +  shdr[i].sh_size;
 			*countp = (*stopp - *startp) / sizeof(Elf_Addr);
 			free(p);
 			return (0);
 		}
 		free(p);
 	}
 
 	return (ESRCH);
 }
 
 /*
  * Apply any intra-module relocations to the value. p is the load address
  * of the value and val/len is the value to be modified. This does NOT modify
  * the image in-place, because this is done by kern_linker later on.
  */
 static int
 __elfN(obj_reloc_ptr)(struct preloaded_file *mp, elf_file_t ef, Elf_Addr p,
     void *val, size_t len)
 {
 	Elf_Ehdr *hdr;
 	Elf_Shdr *shdr;
 	Elf_Addr off = p;
 	Elf_Addr base;
 	Elf_Rela a, *abase;
 	Elf_Rel r, *rbase;
 	int error, i, j, nrel, nrela;
 
 	hdr = &ef->hdr;
 	shdr = ef->e_shdr;
 
 	for (i = 0; i < hdr->e_shnum; i++) {
 		if (shdr[i].sh_type != SHT_RELA && shdr[i].sh_type != SHT_REL)
 			continue;
 		base = shdr[shdr[i].sh_info].sh_addr;
 		if (base == 0 || shdr[i].sh_addr == 0)
 			continue;
 		if (off < base || off + len > base +
 		    shdr[shdr[i].sh_info].sh_size)
 			continue;
 
 		switch (shdr[i].sh_type) {
 		case SHT_RELA:
 			abase = (Elf_Rela *)(intptr_t)shdr[i].sh_addr;
 
 			nrela = shdr[i].sh_size / sizeof(Elf_Rela);
 			for (j = 0; j < nrela; j++) {
 				COPYOUT(abase + j, &a, sizeof(a));
 
 				error = __elfN(reloc)(ef, __elfN(obj_symaddr),
 				    &a, ELF_RELOC_RELA, base, off, val, len);
 				if (error != 0)
 					return (error);
 			}
 			break;
 		case SHT_REL:
 			rbase = (Elf_Rel *)(intptr_t)shdr[i].sh_addr;
 
 			nrel = shdr[i].sh_size / sizeof(Elf_Rel);
 			for (j = 0; j < nrel; j++) {
 				COPYOUT(rbase + j, &r, sizeof(r));
 
 				error = __elfN(reloc)(ef, __elfN(obj_symaddr),
 				    &r, ELF_RELOC_REL, base, off, val, len);
 				if (error != 0)
 					return (error);
 			}
 			break;
 		}
 	}
 	return (0);
 }
 
 /* Look up the address of a specified symbol. */
 static Elf_Addr
 __elfN(obj_symaddr)(struct elf_file *ef, Elf_Size symidx)
 {
 	Elf_Sym sym;
 	Elf_Addr base;
-	int symcnt;
 
-	symcnt = ef->e_shdr[ef->symtabindex].sh_size / sizeof(Elf_Sym);
-	if (symidx >= symcnt)
+	if (symidx >= ef->e_shdr[ef->symtabindex].sh_size / sizeof(Elf_Sym))
 		return (0);
 	COPYOUT(ef->e_shdr[ef->symtabindex].sh_addr + symidx * sizeof(Elf_Sym),
 	    &sym, sizeof(sym));
 	if (sym.st_shndx == SHN_UNDEF || sym.st_shndx >= ef->hdr.e_shnum)
 		return (0);
 	base = ef->e_shdr[sym.st_shndx].sh_addr;
 	if (base == 0)
 		return (0);
 	return (base + sym.st_value);
 }
Index: head/sys/boot/common/misc.c
===================================================================
--- head/sys/boot/common/misc.c	(revision 293723)
+++ head/sys/boot/common/misc.c	(revision 293724)
@@ -1,223 +1,219 @@
 /*-
  * 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$");
 
 #include <string.h>
 #include <stand.h>
 #include <bootstrap.h>
 
 /*
  * Concatenate the (argc) elements of (argv) into a single string, and return
  * a copy of same.
  */
 char *
 unargv(int argc, char *argv[])
 {
     size_t	hlong;
     int		i;
     char	*cp;
 
     for (i = 0, hlong = 0; i < argc; i++)
 	hlong += strlen(argv[i]) + 2;
 
     if(hlong == 0)
 	return(NULL);
 
     cp = malloc(hlong);
     cp[0] = 0;
     for (i = 0; i < argc; i++) {
 	strcat(cp, argv[i]);
 	if (i < (argc - 1))
 	  strcat(cp, " ");
     }
 	  
     return(cp);
 }
 
 /*
  * Get the length of a string in kernel space
  */
 size_t
 strlenout(vm_offset_t src)
 {
     char	c;
     size_t	len;
     
     for (len = 0; ; len++) {
 	archsw.arch_copyout(src++, &c, 1);
 	if (c == 0)
 	    break;
     }
     return(len);
 }
 
 /*
  * Make a duplicate copy of a string in kernel space
  */
 char *
 strdupout(vm_offset_t str)
 {
     char	*result, *cp;
     
     result = malloc(strlenout(str) + 1);
     for (cp = result; ;cp++) {
 	archsw.arch_copyout(str++, cp, 1);
 	if (*cp == 0)
 	    break;
     }
     return(result);
 }
 
 /* Zero a region in kernel space. */
 void
 kern_bzero(vm_offset_t dest, size_t len)
 {
 	char buf[256];
 	size_t chunk, resid;
 
 	bzero(buf, sizeof(buf));
 	resid = len;
 	while (resid > 0) {
 		chunk = min(sizeof(buf), resid);
 		archsw.arch_copyin(buf, dest, chunk);
 		resid -= chunk;
 		dest += chunk;
 	}
 }
 
 /*
  * Read the specified part of a file to kernel space.  Unlike regular
  * pread, the file pointer is advanced to the end of the read data,
  * and it just returns 0 if successful.
  */
 int
 kern_pread(int fd, vm_offset_t dest, size_t len, off_t off)
 {
-	ssize_t nread;
 
 	if (lseek(fd, off, SEEK_SET) == -1) {
 #ifdef DEBUG
 		printf("\nlseek failed\n");
 #endif
 		return (-1);
 	}
-	nread = archsw.arch_readin(fd, dest, len);
-	if (nread != len) {
+	if ((size_t)archsw.arch_readin(fd, dest, len) != len) {
 #ifdef DEBUG
 		printf("\nreadin failed\n");
 #endif
 		return (-1);
 	}
 	return (0);
 }
 
 /*
  * Read the specified part of a file to a malloced buffer.  The file
  * pointer is advanced to the end of the read data.
  */
 void *
 alloc_pread(int fd, off_t off, size_t len)
 {
 	void *buf;
-	ssize_t nread;
 
 	buf = malloc(len);
 	if (buf == NULL) {
 #ifdef DEBUG
 		printf("\nmalloc(%d) failed\n", (int)len);
 #endif
 		return (NULL);
 	}
 	if (lseek(fd, off, SEEK_SET) == -1) {
 #ifdef DEBUG
 		printf("\nlseek failed\n");
 #endif
 		free(buf);
 		return (NULL);
 	}
-	nread = read(fd, buf, len);
-	if (nread != len) {
+	if ((size_t)read(fd, buf, len) != len) {
 #ifdef DEBUG
 		printf("\nread failed\n");
 #endif
 		free(buf);
 		return (NULL);
 	}
 	return (buf);
 }
 
 /*
  * Display a region in traditional hexdump format.
  */
 void
 hexdump(caddr_t region, size_t len)
 {
     caddr_t	line;
     int		x, c;
     char	lbuf[80];
 #define emit(fmt, args...)	{sprintf(lbuf, fmt , ## args); pager_output(lbuf);}
 
     pager_open();
     for (line = region; line < (region + len); line += 16) {
 	emit("%08lx  ", (long) line);
 	
 	for (x = 0; x < 16; x++) {
 	    if ((line + x) < (region + len)) {
 		emit("%02x ", *(u_int8_t *)(line + x));
 	    } else {
 		emit("-- ");
 	    }
 	    if (x == 7)
 		emit(" ");
 	}
 	emit(" |");
 	for (x = 0; x < 16; x++) {
 	    if ((line + x) < (region + len)) {
 		c = *(u_int8_t *)(line + x);
 		if ((c < ' ') || (c > '~'))	/* !isprint(c) */
 		    c = '.';
 		emit("%c", c);
 	    } else {
 		emit(" ");
 	    }
 	}
 	emit("|\n");
     }
     pager_close();
 }
 
 void
 dev_cleanup(void)
 {
     int		i;
 
     /* Call cleanup routines */
     for (i = 0; devsw[i] != NULL; ++i)
 	if (devsw[i]->dv_cleanup != NULL)
 	    (devsw[i]->dv_cleanup)();
 }
Index: head/sys/boot/common/module.c
===================================================================
--- head/sys/boot/common/module.c	(revision 293723)
+++ head/sys/boot/common/module.c	(revision 293724)
@@ -1,1043 +1,1043 @@
 /*-
  * 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$");
 
 /*
  * file/module function dispatcher, support, etc.
  */
 
 #include <stand.h>
 #include <string.h>
 #include <sys/param.h>
 #include <sys/linker.h>
 #include <sys/module.h>
 #include <sys/queue.h>
 #include <sys/stdint.h>
 
 #include "bootstrap.h"
 
 #define	MDIR_REMOVED	0x0001
 #define	MDIR_NOHINTS	0x0002
 
 struct moduledir {
 	char	*d_path;	/* path of modules directory */
 	u_char	*d_hints;	/* content of linker.hints file */
 	int	d_hintsz;	/* size of hints data */
 	int	d_flags;
 	STAILQ_ENTRY(moduledir) d_link;
 };
 
 static int			file_load(char *filename, vm_offset_t dest, struct preloaded_file **result);
 static int			file_load_dependencies(struct preloaded_file *base_mod);
 static char *			file_search(const char *name, char **extlist);
 static struct kernel_module *	file_findmodule(struct preloaded_file *fp, char *modname, struct mod_depend *verinfo);
 static int			file_havepath(const char *name);
 static char			*mod_searchmodule(char *name, struct mod_depend *verinfo);
 static void			file_insert_tail(struct preloaded_file *mp);
 struct file_metadata*		metadata_next(struct file_metadata *base_mp, int type);
 static void			moduledir_readhints(struct moduledir *mdp);
 static void			moduledir_rebuild(void);
 
 /* load address should be tweaked by first module loaded (kernel) */
 static vm_offset_t	loadaddr = 0;
 
 #if defined(LOADER_FDT_SUPPORT)
 static const char	*default_searchpath =
     "/boot/kernel;/boot/modules;/boot/dtb";
 #else
 static const char	*default_searchpath ="/boot/kernel;/boot/modules";
 #endif
 
 static STAILQ_HEAD(, moduledir) moduledir_list = STAILQ_HEAD_INITIALIZER(moduledir_list);
 
 struct preloaded_file *preloaded_files = NULL;
 
 static char *kld_ext_list[] = {
     ".ko",
     "",
     ".debug",
     NULL
 };
 
 
 /*
  * load an object, either a disk file or code module.
  *
  * To load a file, the syntax is:
  *
  * load -t <type> <path>
  *
  * code modules are loaded as:
  *
  * load <path> <options>
  */
 
 COMMAND_SET(load, "load", "load a kernel or module", command_load);
 
 static int
 command_load(int argc, char *argv[])
 {
     struct preloaded_file *fp;
     char	*typestr;
     int		dofile, dokld, ch, error;
     
     dokld = dofile = 0;
     optind = 1;
     optreset = 1;
     typestr = NULL;
     if (argc == 1) {
 	command_errmsg = "no filename specified";
 	return(CMD_ERROR);
     }
     while ((ch = getopt(argc, argv, "kt:")) != -1) {
 	switch(ch) {
 	case 'k':
 	    dokld = 1;
 	    break;
 	case 't':
 	    typestr = optarg;
 	    dofile = 1;
 	    break;
 	case '?':
 	default:
 	    /* getopt has already reported an error */
 	    return(CMD_OK);
 	}
     }
     argv += (optind - 1);
     argc -= (optind - 1);
 
     /*
      * Request to load a raw file?
      */
     if (dofile) {
 	if ((argc != 2) || (typestr == NULL) || (*typestr == 0)) {
 	    command_errmsg = "invalid load type";
 	    return(CMD_ERROR);
 	}
 
 	fp = file_findfile(argv[1], typestr);
 	if (fp) {
 		sprintf(command_errbuf, "warning: file '%s' already loaded", argv[1]);
 		return (CMD_ERROR);
 	}
 
 	return (file_loadraw(argv[1], typestr, 1) ? CMD_OK : CMD_ERROR);
     }
     /*
      * Do we have explicit KLD load ?
      */
     if (dokld || file_havepath(argv[1])) {
 	error = mod_loadkld(argv[1], argc - 2, argv + 2);
 	if (error == EEXIST)
 	    sprintf(command_errbuf, "warning: KLD '%s' already loaded", argv[1]);
 	return (error == 0 ? CMD_OK : CMD_ERROR);
     }
     /*
      * Looks like a request for a module.
      */
     error = mod_load(argv[1], NULL, argc - 2, argv + 2);
     if (error == EEXIST)
 	sprintf(command_errbuf, "warning: module '%s' already loaded", argv[1]);
     return (error == 0 ? CMD_OK : CMD_ERROR);
 }
 
 COMMAND_SET(load_geli, "load_geli", "load a geli key", command_load_geli);
 
 static int
 command_load_geli(int argc, char *argv[])
 {
     char	typestr[80];
     char	*cp;
     int		ch, num;
 
     if (argc < 3) {
 	    command_errmsg = "usage is [-n key#] <prov> <file>";
 	    return(CMD_ERROR);
     }
 
     num = 0;
     optind = 1;
     optreset = 1;
     while ((ch = getopt(argc, argv, "n:")) != -1) {
 	switch(ch) {
 	case 'n':
 	    num = strtol(optarg, &cp, 0);
 	    if (cp == optarg) {
 		    sprintf(command_errbuf, "bad key index '%s'", optarg);
 		    return(CMD_ERROR);
 	    }
 	    break;
 	case '?':
 	default:
 	    /* getopt has already reported an error */
 	    return(CMD_OK);
 	}
     }
     argv += (optind - 1);
     argc -= (optind - 1);
     sprintf(typestr, "%s:geli_keyfile%d", argv[1], num);
     return (file_loadraw(argv[2], typestr, 1) ? CMD_OK : CMD_ERROR);
 }
 
 void
 unload(void)
 {
     struct preloaded_file *fp;
 
     while (preloaded_files != NULL) {
 	fp = preloaded_files;
 	preloaded_files = preloaded_files->f_next;
 	file_discard(fp);
     }
     loadaddr = 0;
     unsetenv("kernelname");
 }
 
 COMMAND_SET(unload, "unload", "unload all modules", command_unload);
 
 static int
 command_unload(int argc, char *argv[])
 {
     unload();
     return(CMD_OK);
 }
 
 COMMAND_SET(lsmod, "lsmod", "list loaded modules", command_lsmod);
 
 static int
 command_lsmod(int argc, char *argv[])
 {
     struct preloaded_file	*fp;
     struct kernel_module	*mp;
     struct file_metadata	*md;
     char			lbuf[80];
     int				ch, verbose;
 
     verbose = 0;
     optind = 1;
     optreset = 1;
     while ((ch = getopt(argc, argv, "v")) != -1) {
 	switch(ch) {
 	case 'v':
 	    verbose = 1;
 	    break;
 	case '?':
 	default:
 	    /* getopt has already reported an error */
 	    return(CMD_OK);
 	}
     }
 
     pager_open();
     for (fp = preloaded_files; fp; fp = fp->f_next) {
 	sprintf(lbuf, " %p: ", (void *) fp->f_addr);
 	pager_output(lbuf);
 	pager_output(fp->f_name);
 	sprintf(lbuf, " (%s, 0x%lx)\n", fp->f_type, (long)fp->f_size);
 	pager_output(lbuf);
 	if (fp->f_args != NULL) {
 	    pager_output("    args: ");
 	    pager_output(fp->f_args);
 	    pager_output("\n");
 	}
 	if (fp->f_modules) {
 	    pager_output("  modules: ");
 	    for (mp = fp->f_modules; mp; mp = mp->m_next) {
 		sprintf(lbuf, "%s.%d ", mp->m_name, mp->m_version);
 		pager_output(lbuf);
 	    }
 	    pager_output("\n");
 	}
 	if (verbose) {
 	    /* XXX could add some formatting smarts here to display some better */
 	    for (md = fp->f_metadata; md != NULL; md = md->md_next) {
 		sprintf(lbuf, "      0x%04x, 0x%lx\n", md->md_type, (long) md->md_size);
 		pager_output(lbuf);
 	    }
 	}
     }
     pager_close();
     return(CMD_OK);
 }
 
 /*
  * File level interface, functions file_*
  */
 int
 file_load(char *filename, vm_offset_t dest, struct preloaded_file **result)
 {
     static int last_file_format = 0;
     struct preloaded_file *fp;
     int error;
     int i;
 
     if (archsw.arch_loadaddr != NULL)
 	dest = archsw.arch_loadaddr(LOAD_RAW, filename, dest);
 
     error = EFTYPE;
     for (i = last_file_format, fp = NULL;
 	file_formats[i] && fp == NULL; i++) {
 	error = (file_formats[i]->l_load)(filename, dest, &fp);
 	if (error == 0) {
 	    fp->f_loader = last_file_format = i; /* remember the loader */
 	    *result = fp;
 	    break;
 	} else if (last_file_format == i && i != 0) {
 	    /* Restart from the beginning */
 	    i = -1;
 	    last_file_format = 0;
 	    fp = NULL;
 	    continue;
 	}
 	if (error == EFTYPE)
 	    continue;		/* Unknown to this handler? */
 	if (error) {
 	    sprintf(command_errbuf, "can't load file '%s': %s",
 		filename, strerror(error));
 	    break;
 	}
     }
     return (error);
 }
 
 static int
 file_load_dependencies(struct preloaded_file *base_file)
 {
     struct file_metadata *md;
     struct preloaded_file *fp;
     struct mod_depend *verinfo;
     struct kernel_module *mp;
     char *dmodname;
     int error;
 
     md = file_findmetadata(base_file, MODINFOMD_DEPLIST);
     if (md == NULL)
 	return (0);
     error = 0;
     do {
 	verinfo = (struct mod_depend*)md->md_data;
 	dmodname = (char *)(verinfo + 1);
 	if (file_findmodule(NULL, dmodname, verinfo) == NULL) {
 	    printf("loading required module '%s'\n", dmodname);
 	    error = mod_load(dmodname, verinfo, 0, NULL);
 	    if (error)
 		break;
 	    /*
 	     * If module loaded via kld name which isn't listed
 	     * in the linker.hints file, we should check if it have
 	     * required version.
 	     */
 	    mp = file_findmodule(NULL, dmodname, verinfo);
 	    if (mp == NULL) {
 		sprintf(command_errbuf, "module '%s' exists but with wrong version",
 		    dmodname);
 		error = ENOENT;
 		break;
 	    }
 	}
 	md = metadata_next(md, MODINFOMD_DEPLIST);
     } while (md);
     if (!error)
 	return (0);
     /* Load failed; discard everything */
     while (base_file != NULL) {
         fp = base_file;
         base_file = base_file->f_next;
         file_discard(fp);
     }
     return (error);
 }
 
 /*
  * We've been asked to load (name) as (type), so just suck it in,
  * no arguments or anything.
  */
 struct preloaded_file *
 file_loadraw(char *name, char *type, int insert)
 {
     struct preloaded_file	*fp;
     char			*cp;
     int				fd, got;
     vm_offset_t			laddr;
 
     /* We can't load first */
     if ((file_findfile(NULL, NULL)) == NULL) {
 	command_errmsg = "can't load file before kernel";
 	return(NULL);
     }
 
     /* locate the file on the load path */
     cp = file_search(name, NULL);
     if (cp == NULL) {
 	sprintf(command_errbuf, "can't find '%s'", name);
 	return(NULL);
     }
     name = cp;
 
     if ((fd = open(name, O_RDONLY)) < 0) {
 	sprintf(command_errbuf, "can't open '%s': %s", name, strerror(errno));
 	free(name);
 	return(NULL);
     }
 
     if (archsw.arch_loadaddr != NULL)
 	loadaddr = archsw.arch_loadaddr(LOAD_RAW, name, loadaddr);
 
     printf("%s ", name);
 
     laddr = loadaddr;
     for (;;) {
 	/* read in 4k chunks; size is not really important */
 	got = archsw.arch_readin(fd, laddr, 4096);
 	if (got == 0)				/* end of file */
 	    break;
 	if (got < 0) {				/* error */
 	    sprintf(command_errbuf, "error reading '%s': %s", name, strerror(errno));
 	    free(name);
 	    close(fd);
 	    return(NULL);
 	}
 	laddr += got;
     }
 
     printf("size=%#jx\n", (uintmax_t)(laddr - loadaddr));
 
     /* Looks OK so far; create & populate control structure */
     fp = file_alloc();
     fp->f_name = strdup(name);
     fp->f_type = strdup(type);
     fp->f_args = NULL;
     fp->f_metadata = NULL;
     fp->f_loader = -1;
     fp->f_addr = loadaddr;
     fp->f_size = laddr - loadaddr;
 
     /* recognise space consumption */
     loadaddr = laddr;
 
     /* Add to the list of loaded files */
     if (insert != 0)
     	file_insert_tail(fp);
     close(fd);
     return(fp);
 }
 
 /*
  * Load the module (name), pass it (argc),(argv), add container file
  * to the list of loaded files.
  * If module is already loaded just assign new argc/argv.
  */
 int
 mod_load(char *modname, struct mod_depend *verinfo, int argc, char *argv[])
 {
     struct kernel_module	*mp;
     int				err;
     char			*filename;
 
     if (file_havepath(modname)) {
 	printf("Warning: mod_load() called instead of mod_loadkld() for module '%s'\n", modname);
 	return (mod_loadkld(modname, argc, argv));
     }
     /* see if module is already loaded */
     mp = file_findmodule(NULL, modname, verinfo);
     if (mp) {
 #ifdef moduleargs
 	if (mp->m_args)
 	    free(mp->m_args);
 	mp->m_args = unargv(argc, argv);
 #endif
 	sprintf(command_errbuf, "warning: module '%s' already loaded", mp->m_name);
 	return (0);
     }
     /* locate file with the module on the search path */
     filename = mod_searchmodule(modname, verinfo);
     if (filename == NULL) {
 	sprintf(command_errbuf, "can't find '%s'", modname);
 	return (ENOENT);
     }
     err = mod_loadkld(filename, argc, argv);
     return (err);
 }
 
 /*
  * Load specified KLD. If path is omitted, then try to locate it via
  * search path.
  */
 int
 mod_loadkld(const char *kldname, int argc, char *argv[])
 {
     struct preloaded_file	*fp, *last_file;
     int				err;
     char			*filename;
 
     /*
      * Get fully qualified KLD name
      */
     filename = file_search(kldname, kld_ext_list);
     if (filename == NULL) {
 	sprintf(command_errbuf, "can't find '%s'", kldname);
 	return (ENOENT);
     }
     /* 
      * Check if KLD already loaded
      */
     fp = file_findfile(filename, NULL);
     if (fp) {
 	sprintf(command_errbuf, "warning: KLD '%s' already loaded", filename);
 	free(filename);
 	return (0);
     }
     for (last_file = preloaded_files; 
 	 last_file != NULL && last_file->f_next != NULL;
 	 last_file = last_file->f_next)
 	;
 
     do {
 	err = file_load(filename, loadaddr, &fp);
 	if (err)
 	    break;
 	fp->f_args = unargv(argc, argv);
 	loadaddr = fp->f_addr + fp->f_size;
 	file_insert_tail(fp);		/* Add to the list of loaded files */
 	if (file_load_dependencies(fp) != 0) {
 	    err = ENOENT;
 	    last_file->f_next = NULL;
 	    loadaddr = last_file->f_addr + last_file->f_size;
 	    fp = NULL;
 	    break;
 	}
     } while(0);
     if (err == EFTYPE)
 	sprintf(command_errbuf, "don't know how to load module '%s'", filename);
     if (err && fp)
 	file_discard(fp);
     free(filename);
     return (err);
 }
 
 /*
  * Find a file matching (name) and (type).
  * NULL may be passed as a wildcard to either.
  */
 struct preloaded_file *
 file_findfile(const char *name, const char *type)
 {
     struct preloaded_file *fp;
 
     for (fp = preloaded_files; fp != NULL; fp = fp->f_next) {
 	if (((name == NULL) || !strcmp(name, fp->f_name)) &&
 	    ((type == NULL) || !strcmp(type, fp->f_type)))
 	    break;
     }
     return (fp);
 }
 
 /*
  * Find a module matching (name) inside of given file.
  * NULL may be passed as a wildcard.
  */
 struct kernel_module *
 file_findmodule(struct preloaded_file *fp, char *modname,
 	struct mod_depend *verinfo)
 {
     struct kernel_module *mp, *best;
     int bestver, mver;
 
     if (fp == NULL) {
 	for (fp = preloaded_files; fp; fp = fp->f_next) {
 	    mp = file_findmodule(fp, modname, verinfo);
     	    if (mp)
 		return (mp);
 	}
 	return (NULL);
     }
     best = NULL;
     bestver = 0;
     for (mp = fp->f_modules; mp; mp = mp->m_next) {
         if (strcmp(modname, mp->m_name) == 0) {
 	    if (verinfo == NULL)
 		return (mp);
 	    mver = mp->m_version;
 	    if (mver == verinfo->md_ver_preferred)
 		return (mp);
 	    if (mver >= verinfo->md_ver_minimum && 
 		mver <= verinfo->md_ver_maximum &&
 		mver > bestver) {
 		best = mp;
 		bestver = mver;
 	    }
 	}
     }
     return (best);
 }
 /*
  * Make a copy of (size) bytes of data from (p), and associate them as
  * metadata of (type) to the module (mp).
  */
 void
 file_addmetadata(struct preloaded_file *fp, int type, size_t size, void *p)
 {
     struct file_metadata	*md;
 
     md = malloc(sizeof(struct file_metadata) - sizeof(md->md_data) + size);
     md->md_size = size;
     md->md_type = type;
     bcopy(p, md->md_data, size);
     md->md_next = fp->f_metadata;
     fp->f_metadata = md;
 }
 
 /*
  * Find a metadata object of (type) associated with the file (fp)
  */
 struct file_metadata *
 file_findmetadata(struct preloaded_file *fp, int type)
 {
     struct file_metadata *md;
 
     for (md = fp->f_metadata; md != NULL; md = md->md_next)
 	if (md->md_type == type)
 	    break;
     return(md);
 }
 
 struct file_metadata *
 metadata_next(struct file_metadata *md, int type)
 {
     if (md == NULL)
 	return (NULL);
     while((md = md->md_next) != NULL)
 	if (md->md_type == type)
 	    break;
     return (md);
 }
 
 static char *emptyextlist[] = { "", NULL };
 
 /*
  * Check if the given file is in place and return full path to it.
  */
 static char *
 file_lookup(const char *path, const char *name, int namelen, char **extlist)
 {
     struct stat	st;
     char	*result, *cp, **cpp;
     int		pathlen, extlen, len;
 
     pathlen = strlen(path);
     extlen = 0;
     if (extlist == NULL)
 	extlist = emptyextlist;
     for (cpp = extlist; *cpp; cpp++) {
 	len = strlen(*cpp);
 	if (len > extlen)
 	    extlen = len;
     }
     result = malloc(pathlen + namelen + extlen + 2);
     if (result == NULL)
 	return (NULL);
     bcopy(path, result, pathlen);
     if (pathlen > 0 && result[pathlen - 1] != '/')
 	result[pathlen++] = '/';
     cp = result + pathlen;
     bcopy(name, cp, namelen);
     cp += namelen;
     for (cpp = extlist; *cpp; cpp++) {
 	strcpy(cp, *cpp);
 	if (stat(result, &st) == 0 && S_ISREG(st.st_mode))
 	    return result;
     }
     free(result);
     return NULL;
 }
 
 /*
  * Check if file name have any qualifiers
  */
 static int
 file_havepath(const char *name)
 {
     const char		*cp;
 
     archsw.arch_getdev(NULL, name, &cp);
     return (cp != name || strchr(name, '/') != NULL);
 }
 
 /*
  * Attempt to find the file (name) on the module searchpath.
  * If (name) is qualified in any way, we simply check it and
  * return it or NULL.  If it is not qualified, then we attempt
  * to construct a path using entries in the environment variable
  * module_path.
  *
  * The path we return a pointer to need never be freed, as we manage
  * it internally.
  */
 static char *
 file_search(const char *name, char **extlist)
 {
     struct moduledir	*mdp;
     struct stat		sb;
     char		*result;
     int			namelen;
 
     /* Don't look for nothing */
     if (name == NULL)
 	return(NULL);
 
     if (*name == 0)
 	return(strdup(name));
 
     if (file_havepath(name)) {
 	/* Qualified, so just see if it exists */
 	if (stat(name, &sb) == 0)
 	    return(strdup(name));
 	return(NULL);
     }
     moduledir_rebuild();
     result = NULL;
     namelen = strlen(name);
     STAILQ_FOREACH(mdp, &moduledir_list, d_link) {
 	result = file_lookup(mdp->d_path, name, namelen, extlist);
 	if (result)
 	    break;
     }
     return(result);
 }
 
 #define	INT_ALIGN(base, ptr)	ptr = \
 	(base) + (((ptr) - (base) + sizeof(int) - 1) & ~(sizeof(int) - 1))
 
 static char *
 mod_search_hints(struct moduledir *mdp, const char *modname,
 	struct mod_depend *verinfo)
 {
     u_char	*cp, *recptr, *bufend, *best;
     char	*result;
     int		*intp, bestver, blen, clen, found, ival, modnamelen, reclen;
 
     moduledir_readhints(mdp);
     modnamelen = strlen(modname);
     found = 0;
     result = NULL;
     bestver = 0;
     if (mdp->d_hints == NULL)
 	goto bad;
     recptr = mdp->d_hints;
     bufend = recptr + mdp->d_hintsz;
     clen = blen = 0;
     best = cp = NULL;
     while (recptr < bufend && !found) {
 	intp = (int*)recptr;
 	reclen = *intp++;
 	ival = *intp++;
 	cp = (char*)intp;
 	switch (ival) {
 	case MDT_VERSION:
 	    clen = *cp++;
 	    if (clen != modnamelen || bcmp(cp, modname, clen) != 0)
 		break;
 	    cp += clen;
 	    INT_ALIGN(mdp->d_hints, cp);
 	    ival = *(int*)cp;
 	    cp += sizeof(int);
 	    clen = *cp++;
 	    if (verinfo == NULL || ival == verinfo->md_ver_preferred) {
 		found = 1;
 		break;
 	    }
 	    if (ival >= verinfo->md_ver_minimum && 
 		ival <= verinfo->md_ver_maximum &&
 		ival > bestver) {
 		bestver = ival;
 		best = cp;
 		blen = clen;
 	    }
 	    break;
 	default:
 	    break;
 	}
 	recptr += reclen + sizeof(int);
     }
     /*
      * Finally check if KLD is in the place
      */
     if (found)
 	result = file_lookup(mdp->d_path, cp, clen, NULL);
     else if (best)
 	result = file_lookup(mdp->d_path, best, blen, NULL);
 bad:
     /*
      * If nothing found or hints is absent - fallback to the old way
      * by using "kldname[.ko]" as module name.
      */
     if (!found && !bestver && result == NULL)
 	result = file_lookup(mdp->d_path, modname, modnamelen, kld_ext_list);
     return result;
 }
 
 /*
  * Attempt to locate the file containing the module (name)
  */
 static char *
 mod_searchmodule(char *name, struct mod_depend *verinfo)
 {
     struct	moduledir *mdp;
     char	*result;
 
     moduledir_rebuild();
     /*
      * Now we ready to lookup module in the given directories
      */
     result = NULL;
     STAILQ_FOREACH(mdp, &moduledir_list, d_link) {
 	result = mod_search_hints(mdp, name, verinfo);
 	if (result)
 	    break;
     }
 
     return(result);
 }
 
 int
 file_addmodule(struct preloaded_file *fp, char *modname, int version,
 	struct kernel_module **newmp)
 {
     struct kernel_module *mp;
     struct mod_depend mdepend;
 
     bzero(&mdepend, sizeof(mdepend));
     mdepend.md_ver_preferred = version;
     mp = file_findmodule(fp, modname, &mdepend);
     if (mp)
 	return (EEXIST);
     mp = malloc(sizeof(struct kernel_module));
     if (mp == NULL)
 	return (ENOMEM);
     bzero(mp, sizeof(struct kernel_module));
     mp->m_name = strdup(modname);
     mp->m_version = version;
     mp->m_fp = fp;
     mp->m_next = fp->f_modules;
     fp->f_modules = mp;
     if (newmp)
 	*newmp = mp;
     return (0);
 }
 
 /*
  * Throw a file away
  */
 void
 file_discard(struct preloaded_file *fp)
 {
     struct file_metadata	*md, *md1;
     struct kernel_module	*mp, *mp1;
     if (fp == NULL)
 	return;
     md = fp->f_metadata;
     while (md) {
 	md1 = md;
 	md = md->md_next;
 	free(md1);
     }
     mp = fp->f_modules;
     while (mp) {
 	if (mp->m_name)
 	    free(mp->m_name);
 	mp1 = mp;
 	mp = mp->m_next;
 	free(mp1);
     }	
     if (fp->f_name != NULL)
 	free(fp->f_name);
     if (fp->f_type != NULL)
         free(fp->f_type);
     if (fp->f_args != NULL)
         free(fp->f_args);
     free(fp);
 }
 
 /*
  * Allocate a new file; must be used instead of malloc()
  * to ensure safe initialisation.
  */
 struct preloaded_file *
 file_alloc(void)
 {
     struct preloaded_file	*fp;
     
     if ((fp = malloc(sizeof(struct preloaded_file))) != NULL) {
 	bzero(fp, sizeof(struct preloaded_file));
     }
     return (fp);
 }
 
 /*
  * Add a module to the chain
  */
 static void
 file_insert_tail(struct preloaded_file *fp)
 {
     struct preloaded_file	*cm;
     
     /* Append to list of loaded file */
     fp->f_next = NULL;
     if (preloaded_files == NULL) {
 	preloaded_files = fp;
     } else {
 	for (cm = preloaded_files; cm->f_next != NULL; cm = cm->f_next)
 	    ;
 	cm->f_next = fp;
     }
 }
 
 static char *
 moduledir_fullpath(struct moduledir *mdp, const char *fname)
 {
     char *cp;
 
     cp = malloc(strlen(mdp->d_path) + strlen(fname) + 2);
     if (cp == NULL)
 	return NULL;
     strcpy(cp, mdp->d_path);
     strcat(cp, "/");
     strcat(cp, fname);
     return (cp);
 }
 
 /*
  * Read linker.hints file into memory performing some sanity checks.
  */
 static void
 moduledir_readhints(struct moduledir *mdp)
 {
     struct stat	st;
     char	*path;
     int		fd, size, version;
 
     if (mdp->d_hints != NULL || (mdp->d_flags & MDIR_NOHINTS))
 	return;
     path = moduledir_fullpath(mdp, "linker.hints");
     if (stat(path, &st) != 0 ||
 	st.st_size < (ssize_t)(sizeof(version) + sizeof(int)) ||
 	st.st_size > LINKER_HINTS_MAX || (fd = open(path, O_RDONLY)) < 0) {
 	free(path);
 	mdp->d_flags |= MDIR_NOHINTS;
 	return;
     }
     free(path);
     size = read(fd, &version, sizeof(version));
     if (size != sizeof(version) || version != LINKER_HINTS_VERSION)
 	goto bad;
     size = st.st_size - size;
     mdp->d_hints = malloc(size);
     if (mdp->d_hints == NULL)
 	goto bad;
     if (read(fd, mdp->d_hints, size) != size)
 	goto bad;
     mdp->d_hintsz = size;
     close(fd);
     return;
 bad:
     close(fd);
     if (mdp->d_hints) {
 	free(mdp->d_hints);
 	mdp->d_hints = NULL;
     }
     mdp->d_flags |= MDIR_NOHINTS;
     return;
 }
 
 /*
  * Extract directories from the ';' separated list, remove duplicates.
  */
 static void
 moduledir_rebuild(void)
 {
     struct	moduledir *mdp, *mtmp;
     const char	*path, *cp, *ep;
-    int		cplen;
+    size_t	cplen;
 
     path = getenv("module_path");
     if (path == NULL)
 	path = default_searchpath;
     /*
      * Rebuild list of module directories if it changed
      */
     STAILQ_FOREACH(mdp, &moduledir_list, d_link)
 	mdp->d_flags |= MDIR_REMOVED;
 
     for (ep = path; *ep != 0;  ep++) {
 	cp = ep;
 	for (; *ep != 0 && *ep != ';'; ep++)
 	    ;
 	/*
 	 * Ignore trailing slashes
 	 */
 	for (cplen = ep - cp; cplen > 1 && cp[cplen - 1] == '/'; cplen--)
 	    ;
 	STAILQ_FOREACH(mdp, &moduledir_list, d_link) {
 	    if (strlen(mdp->d_path) != cplen ||	bcmp(cp, mdp->d_path, cplen) != 0)
 		continue;
 	    mdp->d_flags &= ~MDIR_REMOVED;
 	    break;
 	}
 	if (mdp == NULL) {
 	    mdp = malloc(sizeof(*mdp) + cplen + 1);
 	    if (mdp == NULL)
 		return;
 	    mdp->d_path = (char*)(mdp + 1);
 	    bcopy(cp, mdp->d_path, cplen);
 	    mdp->d_path[cplen] = 0;
 	    mdp->d_hints = NULL;
 	    mdp->d_flags = 0;
 	    STAILQ_INSERT_TAIL(&moduledir_list, mdp, d_link);
 	}
 	if (*ep == 0)
 	    break;
     }
     /*
      * Delete unused directories if any
      */
     mdp = STAILQ_FIRST(&moduledir_list);
     while (mdp) {
 	if ((mdp->d_flags & MDIR_REMOVED) == 0) {
 	    mdp = STAILQ_NEXT(mdp, d_link);
 	} else {
 	    if (mdp->d_hints)
 		free(mdp->d_hints);
 	    mtmp = mdp;
 	    mdp = STAILQ_NEXT(mdp, d_link);
 	    STAILQ_REMOVE(&moduledir_list, mtmp, moduledir, d_link);
 	    free(mtmp);
 	}
     }
     return;
 }
Index: head/sys/boot/common/part.c
===================================================================
--- head/sys/boot/common/part.c	(revision 293723)
+++ head/sys/boot/common/part.c	(revision 293724)
@@ -1,861 +1,861 @@
 /*-
  * Copyright (c) 2012 Andrey V. Elsukov <ae@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 AUTHORS 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 AUTHORS 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$");
 
 #include <stand.h>
 #include <sys/param.h>
 #include <sys/diskmbr.h>
 #include <sys/disklabel.h>
 #include <sys/endian.h>
 #include <sys/gpt.h>
 #include <sys/stddef.h>
 #include <sys/queue.h>
 #include <sys/vtoc.h>
 
 #include <crc32.h>
 #include <part.h>
 #include <uuid.h>
 
 #ifdef PART_DEBUG
 #define	DEBUG(fmt, args...) printf("%s: " fmt "\n" , __func__ , ## args)
 #else
 #define	DEBUG(fmt, args...)
 #endif
 
 #ifdef LOADER_GPT_SUPPORT
 #define	MAXTBLSZ	64
 static const uuid_t gpt_uuid_unused = GPT_ENT_TYPE_UNUSED;
 static const uuid_t gpt_uuid_ms_basic_data = GPT_ENT_TYPE_MS_BASIC_DATA;
 static const uuid_t gpt_uuid_freebsd_ufs = GPT_ENT_TYPE_FREEBSD_UFS;
 static const uuid_t gpt_uuid_efi = GPT_ENT_TYPE_EFI;
 static const uuid_t gpt_uuid_freebsd = GPT_ENT_TYPE_FREEBSD;
 static const uuid_t gpt_uuid_freebsd_boot = GPT_ENT_TYPE_FREEBSD_BOOT;
 static const uuid_t gpt_uuid_freebsd_nandfs = GPT_ENT_TYPE_FREEBSD_NANDFS;
 static const uuid_t gpt_uuid_freebsd_swap = GPT_ENT_TYPE_FREEBSD_SWAP;
 static const uuid_t gpt_uuid_freebsd_zfs = GPT_ENT_TYPE_FREEBSD_ZFS;
 static const uuid_t gpt_uuid_freebsd_vinum = GPT_ENT_TYPE_FREEBSD_VINUM;
 #endif
 
 struct pentry {
 	struct ptable_entry	part;
 	uint64_t		flags;
 	union {
 		uint8_t bsd;
 		uint8_t	mbr;
 		uuid_t	gpt;
 		uint16_t vtoc8;
 	} type;
 	STAILQ_ENTRY(pentry)	entry;
 };
 
 struct ptable {
 	enum ptable_type	type;
 	uint16_t		sectorsize;
 	uint64_t		sectors;
 
 	STAILQ_HEAD(, pentry)	entries;
 };
 
 static struct parttypes {
 	enum partition_type	type;
 	const char		*desc;
 } ptypes[] = {
 	{ PART_UNKNOWN,		"Unknown" },
 	{ PART_EFI,		"EFI" },
 	{ PART_FREEBSD,		"FreeBSD" },
 	{ PART_FREEBSD_BOOT,	"FreeBSD boot" },
 	{ PART_FREEBSD_NANDFS,	"FreeBSD nandfs" },
 	{ PART_FREEBSD_UFS,	"FreeBSD UFS" },
 	{ PART_FREEBSD_ZFS,	"FreeBSD ZFS" },
 	{ PART_FREEBSD_SWAP,	"FreeBSD swap" },
 	{ PART_FREEBSD_VINUM,	"FreeBSD vinum" },
 	{ PART_LINUX,		"Linux" },
 	{ PART_LINUX_SWAP,	"Linux swap" },
 	{ PART_DOS,		"DOS/Windows" },
 };
 
 const char *
 parttype2str(enum partition_type type)
 {
-	int i;
+	size_t i;
 
 	for (i = 0; i < sizeof(ptypes) / sizeof(ptypes[0]); i++)
 		if (ptypes[i].type == type)
 			return (ptypes[i].desc);
 	return (ptypes[0].desc);
 }
 
 #ifdef LOADER_GPT_SUPPORT
 static void
 uuid_letoh(uuid_t *uuid)
 {
 
 	uuid->time_low = le32toh(uuid->time_low);
 	uuid->time_mid = le16toh(uuid->time_mid);
 	uuid->time_hi_and_version = le16toh(uuid->time_hi_and_version);
 }
 
 static enum partition_type
 gpt_parttype(uuid_t type)
 {
 
 	if (uuid_equal(&type, &gpt_uuid_efi, NULL))
 		return (PART_EFI);
 	else if (uuid_equal(&type, &gpt_uuid_ms_basic_data, NULL))
 		return (PART_DOS);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_boot, NULL))
 		return (PART_FREEBSD_BOOT);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_ufs, NULL))
 		return (PART_FREEBSD_UFS);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_zfs, NULL))
 		return (PART_FREEBSD_ZFS);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_swap, NULL))
 		return (PART_FREEBSD_SWAP);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_vinum, NULL))
 		return (PART_FREEBSD_VINUM);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd_nandfs, NULL))
 		return (PART_FREEBSD_NANDFS);
 	else if (uuid_equal(&type, &gpt_uuid_freebsd, NULL))
 		return (PART_FREEBSD);
 	return (PART_UNKNOWN);
 }
 
 static struct gpt_hdr*
 gpt_checkhdr(struct gpt_hdr *hdr, uint64_t lba_self, uint64_t lba_last,
     uint16_t sectorsize)
 {
 	uint32_t sz, crc;
 
 	if (memcmp(hdr->hdr_sig, GPT_HDR_SIG, sizeof(hdr->hdr_sig)) != 0) {
 		DEBUG("no GPT signature");
 		return (NULL);
 	}
 	sz = le32toh(hdr->hdr_size);
 	if (sz < 92 || sz > sectorsize) {
 		DEBUG("invalid GPT header size: %d", sz);
 		return (NULL);
 	}
 	crc = le32toh(hdr->hdr_crc_self);
 	hdr->hdr_crc_self = 0;
 	if (crc32(hdr, sz) != crc) {
 		DEBUG("GPT header's CRC doesn't match");
 		return (NULL);
 	}
 	hdr->hdr_crc_self = crc;
 	hdr->hdr_revision = le32toh(hdr->hdr_revision);
 	if (hdr->hdr_revision < GPT_HDR_REVISION) {
 		DEBUG("unsupported GPT revision %d", hdr->hdr_revision);
 		return (NULL);
 	}
 	hdr->hdr_lba_self = le64toh(hdr->hdr_lba_self);
 	if (hdr->hdr_lba_self != lba_self) {
 		DEBUG("self LBA doesn't match");
 		return (NULL);
 	}
 	hdr->hdr_lba_alt = le64toh(hdr->hdr_lba_alt);
 	if (hdr->hdr_lba_alt == hdr->hdr_lba_self) {
 		DEBUG("invalid alternate LBA");
 		return (NULL);
 	}
 	hdr->hdr_entries = le32toh(hdr->hdr_entries);
 	hdr->hdr_entsz = le32toh(hdr->hdr_entsz);
 	if (hdr->hdr_entries == 0 ||
 	    hdr->hdr_entsz < sizeof(struct gpt_ent) ||
 	    sectorsize % hdr->hdr_entsz != 0) {
 		DEBUG("invalid entry size or number of entries");
 		return (NULL);
 	}
 	hdr->hdr_lba_start = le64toh(hdr->hdr_lba_start);
 	hdr->hdr_lba_end = le64toh(hdr->hdr_lba_end);
 	hdr->hdr_lba_table = le64toh(hdr->hdr_lba_table);
 	hdr->hdr_crc_table = le32toh(hdr->hdr_crc_table);
 	uuid_letoh(&hdr->hdr_uuid);
 	return (hdr);
 }
 
 static int
 gpt_checktbl(const struct gpt_hdr *hdr, u_char *tbl, size_t size,
     uint64_t lba_last)
 {
 	struct gpt_ent *ent;
-	int i, cnt;
+	uint32_t i, cnt;
 
 	cnt = size / hdr->hdr_entsz;
 	if (hdr->hdr_entries <= cnt) {
 		cnt = hdr->hdr_entries;
 		/* Check CRC only when buffer size is enough for table. */
 		if (hdr->hdr_crc_table !=
 		    crc32(tbl, hdr->hdr_entries * hdr->hdr_entsz)) {
 			DEBUG("GPT table's CRC doesn't match");
 			return (-1);
 		}
 	}
 	for (i = 0; i < cnt; i++) {
 		ent = (struct gpt_ent *)(tbl + i * hdr->hdr_entsz);
 		uuid_letoh(&ent->ent_type);
 		if (uuid_equal(&ent->ent_type, &gpt_uuid_unused, NULL))
 			continue;
 		ent->ent_lba_start = le64toh(ent->ent_lba_start);
 		ent->ent_lba_end = le64toh(ent->ent_lba_end);
 	}
 	return (0);
 }
 
 static struct ptable*
 ptable_gptread(struct ptable *table, void *dev, diskread_t dread)
 {
 	struct pentry *entry;
 	struct gpt_hdr *phdr, hdr;
 	struct gpt_ent *ent;
 	u_char *buf, *tbl;
 	uint64_t offset;
-	int pri, sec, i;
-	size_t size;
+	int pri, sec;
+	size_t size, i;
 
 	buf = malloc(table->sectorsize);
 	if (buf == NULL)
 		return (NULL);
 	tbl = malloc(table->sectorsize * MAXTBLSZ);
 	if (tbl == NULL) {
 		free(buf);
 		return (NULL);
 	}
 	/* Read the primary GPT header. */
 	if (dread(dev, buf, 1, 1) != 0) {
 		ptable_close(table);
 		table = NULL;
 		goto out;
 	}
 	pri = sec = 0;
 	/* Check the primary GPT header. */
 	phdr = gpt_checkhdr((struct gpt_hdr *)buf, 1, table->sectors - 1,
 	    table->sectorsize);
 	if (phdr != NULL) {
 		/* Read the primary GPT table. */
 		size = MIN(MAXTBLSZ, (phdr->hdr_entries * phdr->hdr_entsz +
 		    table->sectorsize - 1) / table->sectorsize);
 		if (dread(dev, tbl, size, phdr->hdr_lba_table) == 0 &&
 		    gpt_checktbl(phdr, tbl, size * table->sectorsize,
 		    table->sectors - 1) == 0) {
 			memcpy(&hdr, phdr, sizeof(hdr));
 			pri = 1;
 		}
 	}
 	offset = pri ? hdr.hdr_lba_alt: table->sectors - 1;
 	/* Read the backup GPT header. */
 	if (dread(dev, buf, 1, offset) != 0)
 		phdr = NULL;
 	else
 		phdr = gpt_checkhdr((struct gpt_hdr *)buf, offset,
 		    table->sectors - 1, table->sectorsize);
 	if (phdr != NULL) {
 		/*
 		 * Compare primary and backup headers.
 		 * If they are equal, then we do not need to read backup
 		 * table. If they are different, then prefer backup header
 		 * and try to read backup table.
 		 */
 		if (pri == 0 ||
 		    uuid_equal(&hdr.hdr_uuid, &phdr->hdr_uuid, NULL) == 0 ||
 		    hdr.hdr_revision != phdr->hdr_revision ||
 		    hdr.hdr_size != phdr->hdr_size ||
 		    hdr.hdr_lba_start != phdr->hdr_lba_start ||
 		    hdr.hdr_lba_end != phdr->hdr_lba_end ||
 		    hdr.hdr_entries != phdr->hdr_entries ||
 		    hdr.hdr_entsz != phdr->hdr_entsz ||
 		    hdr.hdr_crc_table != phdr->hdr_crc_table) {
 			/* Read the backup GPT table. */
 			size = MIN(MAXTBLSZ, (phdr->hdr_entries *
 			    phdr->hdr_entsz + table->sectorsize - 1) /
 			    table->sectorsize);
 			if (dread(dev, tbl, size, phdr->hdr_lba_table) == 0 &&
 			    gpt_checktbl(phdr, tbl, size * table->sectorsize,
 			    table->sectors - 1) == 0) {
 				memcpy(&hdr, phdr, sizeof(hdr));
 				sec = 1;
 			}
 		}
 	}
 	if (pri == 0 && sec == 0) {
 		/* Both primary and backup tables are invalid. */
 		table->type = PTABLE_NONE;
 		goto out;
 	}
 	DEBUG("GPT detected");
 	size = MIN(hdr.hdr_entries * hdr.hdr_entsz,
 	    MAXTBLSZ * table->sectorsize);
 	for (i = 0; i < size / hdr.hdr_entsz; i++) {
 		ent = (struct gpt_ent *)(tbl + i * hdr.hdr_entsz);
 		if (uuid_equal(&ent->ent_type, &gpt_uuid_unused, NULL))
 			continue;
 		entry = malloc(sizeof(*entry));
 		if (entry == NULL)
 			break;
 		entry->part.start = ent->ent_lba_start;
 		entry->part.end = ent->ent_lba_end;
 		entry->part.index = i + 1;
 		entry->part.type = gpt_parttype(ent->ent_type);
 		entry->flags = le64toh(ent->ent_attr);
 		memcpy(&entry->type.gpt, &ent->ent_type, sizeof(uuid_t));
 		STAILQ_INSERT_TAIL(&table->entries, entry, entry);
 		DEBUG("new GPT partition added");
 	}
 out:
 	free(buf);
 	free(tbl);
 	return (table);
 }
 #endif /* LOADER_GPT_SUPPORT */
 
 #ifdef LOADER_MBR_SUPPORT
 /* We do not need to support too many EBR partitions in the loader */
 #define	MAXEBRENTRIES		8
 static enum partition_type
 mbr_parttype(uint8_t type)
 {
 
 	switch (type) {
 	case DOSPTYP_386BSD:
 		return (PART_FREEBSD);
 	case DOSPTYP_LINSWP:
 		return (PART_LINUX_SWAP);
 	case DOSPTYP_LINUX:
 		return (PART_LINUX);
 	case 0x01:
 	case 0x04:
 	case 0x06:
 	case 0x07:
 	case 0x0b:
 	case 0x0c:
 	case 0x0e:
 		return (PART_DOS);
 	}
 	return (PART_UNKNOWN);
 }
 
-struct ptable*
+static struct ptable*
 ptable_ebrread(struct ptable *table, void *dev, diskread_t dread)
 {
 	struct dos_partition *dp;
 	struct pentry *e1, *entry;
 	uint32_t start, end, offset;
 	u_char *buf;
 	int i, index;
 
 	STAILQ_FOREACH(e1, &table->entries, entry) {
 		if (e1->type.mbr == DOSPTYP_EXT ||
 		    e1->type.mbr == DOSPTYP_EXTLBA)
 			break;
 	}
 	if (e1 == NULL)
 		return (table);
 	index = 5;
 	offset = e1->part.start;
 	buf = malloc(table->sectorsize);
 	if (buf == NULL)
 		return (table);
 	DEBUG("EBR detected");
 	for (i = 0; i < MAXEBRENTRIES; i++) {
 #if 0	/* Some BIOSes return an incorrect number of sectors */
 		if (offset >= table->sectors)
 			break;
 #endif
 		if (dread(dev, buf, 1, offset) != 0)
 			break;
 		dp = (struct dos_partition *)(buf + DOSPARTOFF);
 		if (dp[0].dp_typ == 0)
 			break;
 		start = le32toh(dp[0].dp_start);
 		if (dp[0].dp_typ == DOSPTYP_EXT &&
 		    dp[1].dp_typ == 0) {
 			offset = e1->part.start + start;
 			continue;
 		}
 		end = le32toh(dp[0].dp_size);
 		entry = malloc(sizeof(*entry));
 		if (entry == NULL)
 			break;
 		entry->part.start = offset + start;
 		entry->part.end = entry->part.start + end - 1;
 		entry->part.index = index++;
 		entry->part.type = mbr_parttype(dp[0].dp_typ);
 		entry->flags = dp[0].dp_flag;
 		entry->type.mbr = dp[0].dp_typ;
 		STAILQ_INSERT_TAIL(&table->entries, entry, entry);
 		DEBUG("new EBR partition added");
 		if (dp[1].dp_typ == 0)
 			break;
 		offset = e1->part.start + le32toh(dp[1].dp_start);
 	}
 	free(buf);
 	return (table);
 }
 #endif /* LOADER_MBR_SUPPORT */
 
 static enum partition_type
 bsd_parttype(uint8_t type)
 {
 
 	switch (type) {
 	case FS_NANDFS:
 		return (PART_FREEBSD_NANDFS);
 	case FS_SWAP:
 		return (PART_FREEBSD_SWAP);
 	case FS_BSDFFS:
 		return (PART_FREEBSD_UFS);
 	case FS_VINUM:
 		return (PART_FREEBSD_VINUM);
 	case FS_ZFS:
 		return (PART_FREEBSD_ZFS);
 	}
 	return (PART_UNKNOWN);
 }
 
-struct ptable*
+static struct ptable*
 ptable_bsdread(struct ptable *table, void *dev, diskread_t dread)
 {
 	struct disklabel *dl;
 	struct partition *part;
 	struct pentry *entry;
 	u_char *buf;
 	uint32_t raw_offset;
 	int i;
 
 	if (table->sectorsize < sizeof(struct disklabel)) {
 		DEBUG("Too small sectorsize");
 		return (table);
 	}
 	buf = malloc(table->sectorsize);
 	if (buf == NULL)
 		return (table);
 	if (dread(dev, buf, 1, 1) != 0) {
 		DEBUG("read failed");
 		ptable_close(table);
 		table = NULL;
 		goto out;
 	}
 	dl = (struct disklabel *)buf;
 	if (le32toh(dl->d_magic) != DISKMAGIC &&
 	    le32toh(dl->d_magic2) != DISKMAGIC)
 		goto out;
 	if (le32toh(dl->d_secsize) != table->sectorsize) {
 		DEBUG("unsupported sector size");
 		goto out;
 	}
 	dl->d_npartitions = le16toh(dl->d_npartitions);
 	if (dl->d_npartitions > 20 || dl->d_npartitions < 8) {
 		DEBUG("invalid number of partitions");
 		goto out;
 	}
 	DEBUG("BSD detected");
 	part = &dl->d_partitions[0];
 	raw_offset = le32toh(part[RAW_PART].p_offset);
 	for (i = 0; i < dl->d_npartitions; i++, part++) {
 		if (i == RAW_PART)
 			continue;
 		if (part->p_size == 0)
 			continue;
 		entry = malloc(sizeof(*entry));
 		if (entry == NULL)
 			break;
 		entry->part.start = le32toh(part->p_offset) - raw_offset;
 		entry->part.end = entry->part.start +
 		    le32toh(part->p_size) + 1;
 		entry->part.type = bsd_parttype(part->p_fstype);
 		entry->part.index = i; /* starts from zero */
 		entry->type.bsd = part->p_fstype;
 		STAILQ_INSERT_TAIL(&table->entries, entry, entry);
 		DEBUG("new BSD partition added");
 	}
 	table->type = PTABLE_BSD;
 out:
 	free(buf);
 	return (table);
 }
 
 #ifdef LOADER_VTOC8_SUPPORT
 static enum partition_type
 vtoc8_parttype(uint16_t type)
 {
 
 	switch (type) {
 	case VTOC_TAG_FREEBSD_NANDFS:
 		return (PART_FREEBSD_NANDFS);
 	case VTOC_TAG_FREEBSD_SWAP:
 		return (PART_FREEBSD_SWAP);
 	case VTOC_TAG_FREEBSD_UFS:
 		return (PART_FREEBSD_UFS);
 	case VTOC_TAG_FREEBSD_VINUM:
 		return (PART_FREEBSD_VINUM);
 	case VTOC_TAG_FREEBSD_ZFS:
 		return (PART_FREEBSD_ZFS);
 	};
 	return (PART_UNKNOWN);
 }
 
 static struct ptable*
 ptable_vtoc8read(struct ptable *table, void *dev, diskread_t dread)
 {
 	struct pentry *entry;
 	struct vtoc8 *dl;
 	u_char *buf;
 	uint16_t sum, heads, sectors;
 	int i;
 
 	if (table->sectorsize != sizeof(struct vtoc8))
 		return (table);
 	buf = malloc(table->sectorsize);
 	if (buf == NULL)
 		return (table);
 	if (dread(dev, buf, 1, 0) != 0) {
 		DEBUG("read failed");
 		ptable_close(table);
 		table = NULL;
 		goto out;
 	}
 	dl = (struct vtoc8 *)buf;
 	/* Check the sum */
 	for (i = sum = 0; i < sizeof(struct vtoc8); i += sizeof(sum))
 		sum ^= be16dec(buf + i);
 	if (sum != 0) {
 		DEBUG("incorrect checksum");
 		goto out;
 	}
 	if (be16toh(dl->nparts) != VTOC8_NPARTS) {
 		DEBUG("invalid number of entries");
 		goto out;
 	}
 	sectors = be16toh(dl->nsecs);
 	heads = be16toh(dl->nheads);
 	if (sectors * heads == 0) {
 		DEBUG("invalid geometry");
 		goto out;
 	}
 	DEBUG("VTOC8 detected");
 	for (i = 0; i < VTOC8_NPARTS; i++) {
 		dl->part[i].tag = be16toh(dl->part[i].tag);
 		if (i == VTOC_RAW_PART ||
 		    dl->part[i].tag == VTOC_TAG_UNASSIGNED)
 			continue;
 		entry = malloc(sizeof(*entry));
 		if (entry == NULL)
 			break;
 		entry->part.start = be32toh(dl->map[i].cyl) * heads * sectors;
 		entry->part.end = be32toh(dl->map[i].nblks) +
 		    entry->part.start - 1;
 		entry->part.type = vtoc8_parttype(dl->part[i].tag);
 		entry->part.index = i; /* starts from zero */
 		entry->type.vtoc8 = dl->part[i].tag;
 		STAILQ_INSERT_TAIL(&table->entries, entry, entry);
 		DEBUG("new VTOC8 partition added");
 	}
 	table->type = PTABLE_VTOC8;
 out:
 	free(buf);
 	return (table);
 
 }
 #endif /* LOADER_VTOC8_SUPPORT */
 
 struct ptable*
 ptable_open(void *dev, off_t sectors, uint16_t sectorsize,
     diskread_t *dread)
 {
 	struct dos_partition *dp;
 	struct ptable *table;
 	u_char *buf;
 	int i, count;
 #ifdef LOADER_MBR_SUPPORT
 	struct pentry *entry;
 	uint32_t start, end;
 	int has_ext;
 #endif
 	table = NULL;
 	buf = malloc(sectorsize);
 	if (buf == NULL)
 		return (NULL);
 	/* First, read the MBR. */
 	if (dread(dev, buf, 1, DOSBBSECTOR) != 0) {
 		DEBUG("read failed");
 		goto out;
 	}
 
 	table = malloc(sizeof(*table));
 	if (table == NULL)
 		goto out;
 	table->sectors = sectors;
 	table->sectorsize = sectorsize;
 	table->type = PTABLE_NONE;
 	STAILQ_INIT(&table->entries);
 
 #ifdef LOADER_VTOC8_SUPPORT
 	if (be16dec(buf + offsetof(struct vtoc8, magic)) == VTOC_MAGIC) {
 		if (ptable_vtoc8read(table, dev, dread) == NULL) {
 			/* Read error. */
 			table = NULL;
 			goto out;
 		} else if (table->type == PTABLE_VTOC8)
 			goto out;
 	}
 #endif
 	/* Check the BSD label. */
 	if (ptable_bsdread(table, dev, dread) == NULL) { /* Read error. */
 		table = NULL;
 		goto out;
 	} else if (table->type == PTABLE_BSD)
 		goto out;
 
 #if defined(LOADER_GPT_SUPPORT) || defined(LOADER_MBR_SUPPORT)
 	/* Check the MBR magic. */
 	if (buf[DOSMAGICOFFSET] != 0x55 ||
 	    buf[DOSMAGICOFFSET + 1] != 0xaa) {
 		DEBUG("magic sequence not found");
 #if defined(LOADER_GPT_SUPPORT)
 		/* There is no PMBR, check that we have backup GPT */
 		table->type = PTABLE_GPT;
 		table = ptable_gptread(table, dev, dread);
 #endif
 		goto out;
 	}
 	/* Check that we have PMBR. Also do some validation. */
 	dp = (struct dos_partition *)(buf + DOSPARTOFF);
 	for (i = 0, count = 0; i < NDOSPART; i++) {
 		if (dp[i].dp_flag != 0 && dp[i].dp_flag != 0x80) {
 			DEBUG("invalid partition flag %x", dp[i].dp_flag);
 			goto out;
 		}
 #ifdef LOADER_GPT_SUPPORT
 		if (dp[i].dp_typ == DOSPTYP_PMBR) {
 			table->type = PTABLE_GPT;
 			DEBUG("PMBR detected");
 		}
 #endif
 		if (dp[i].dp_typ != 0)
 			count++;
 	}
 	/* Do we have some invalid values? */
 	if (table->type == PTABLE_GPT && count > 1) {
 		if (dp[1].dp_typ != DOSPTYP_HFS) {
 			table->type = PTABLE_NONE;
 			DEBUG("Incorrect PMBR, ignore it");
 		} else
 			DEBUG("Bootcamp detected");
 	}
 #ifdef LOADER_GPT_SUPPORT
 	if (table->type == PTABLE_GPT) {
 		table = ptable_gptread(table, dev, dread);
 		goto out;
 	}
 #endif
 #ifdef LOADER_MBR_SUPPORT
 	/* Read MBR. */
 	DEBUG("MBR detected");
 	table->type = PTABLE_MBR;
 	for (i = has_ext = 0; i < NDOSPART; i++) {
 		if (dp[i].dp_typ == 0)
 			continue;
 		start = le32dec(&(dp[i].dp_start));
 		end = le32dec(&(dp[i].dp_size));
 		if (start == 0 || end == 0)
 			continue;
 #if 0	/* Some BIOSes return an incorrect number of sectors */
 		if (start + end - 1 >= sectors)
 			continue;	/* XXX: ignore */
 #endif
 		if (dp[i].dp_typ == DOSPTYP_EXT ||
 		    dp[i].dp_typ == DOSPTYP_EXTLBA)
 			has_ext = 1;
 		entry = malloc(sizeof(*entry));
 		if (entry == NULL)
 			break;
 		entry->part.start = start;
 		entry->part.end = start + end - 1;
 		entry->part.index = i + 1;
 		entry->part.type = mbr_parttype(dp[i].dp_typ);
 		entry->flags = dp[i].dp_flag;
 		entry->type.mbr = dp[i].dp_typ;
 		STAILQ_INSERT_TAIL(&table->entries, entry, entry);
 		DEBUG("new MBR partition added");
 	}
 	if (has_ext) {
 		table = ptable_ebrread(table, dev, dread);
 		/* FALLTHROUGH */
 	}
 #endif /* LOADER_MBR_SUPPORT */
 #endif /* LOADER_MBR_SUPPORT || LOADER_GPT_SUPPORT */
 out:
 	free(buf);
 	return (table);
 }
 
 void
 ptable_close(struct ptable *table)
 {
 	struct pentry *entry;
 
 	while (!STAILQ_EMPTY(&table->entries)) {
 		entry = STAILQ_FIRST(&table->entries);
 		STAILQ_REMOVE_HEAD(&table->entries, entry);
 		free(entry);
 	}
 	free(table);
 }
 
 enum ptable_type
 ptable_gettype(const struct ptable *table)
 {
 
 	return (table->type);
 }
 
 int
 ptable_getpart(const struct ptable *table, struct ptable_entry *part, int index)
 {
 	struct pentry *entry;
 
 	if (part == NULL || table == NULL)
 		return (EINVAL);
 
 	STAILQ_FOREACH(entry, &table->entries, entry) {
 		if (entry->part.index != index)
 			continue;
 		memcpy(part, &entry->part, sizeof(*part));
 		return (0);
 	}
 	return (ENOENT);
 }
 
 /*
  * Search for a slice with the following preferences:
  *
  * 1: Active FreeBSD slice
  * 2: Non-active FreeBSD slice
  * 3: Active Linux slice
  * 4: non-active Linux slice
  * 5: Active FAT/FAT32 slice
  * 6: non-active FAT/FAT32 slice
  */
 #define PREF_RAWDISK	0
 #define PREF_FBSD_ACT	1
 #define PREF_FBSD	2
 #define PREF_LINUX_ACT	3
 #define PREF_LINUX	4
 #define PREF_DOS_ACT	5
 #define PREF_DOS	6
 #define PREF_NONE	7
 int
 ptable_getbestpart(const struct ptable *table, struct ptable_entry *part)
 {
 	struct pentry *entry, *best;
 	int pref, preflevel;
 
 	if (part == NULL || table == NULL)
 		return (EINVAL);
 
 	best = NULL;
 	preflevel = pref = PREF_NONE;
 	STAILQ_FOREACH(entry, &table->entries, entry) {
 #ifdef LOADER_MBR_SUPPORT
 		if (table->type == PTABLE_MBR) {
 			switch (entry->type.mbr) {
 			case DOSPTYP_386BSD:
 				pref = entry->flags & 0x80 ? PREF_FBSD_ACT:
 				    PREF_FBSD;
 				break;
 			case DOSPTYP_LINUX:
 				pref = entry->flags & 0x80 ? PREF_LINUX_ACT:
 				    PREF_LINUX;
 				break;
 			case 0x01:		/* DOS/Windows */
 			case 0x04:
 			case 0x06:
 			case 0x0c:
 			case 0x0e:
 			case DOSPTYP_FAT32:
 				pref = entry->flags & 0x80 ? PREF_DOS_ACT:
 				    PREF_DOS;
 				break;
 			default:
 				pref = PREF_NONE;
 			}
 		}
 #endif /* LOADER_MBR_SUPPORT */
 #ifdef LOADER_GPT_SUPPORT
 		if (table->type == PTABLE_GPT) {
 			if (entry->part.type == PART_DOS)
 				pref = PREF_DOS;
 			else if (entry->part.type == PART_FREEBSD_UFS ||
 			    entry->part.type == PART_FREEBSD_ZFS)
 				pref = PREF_FBSD;
 			else
 				pref = PREF_NONE;
 		}
 #endif /* LOADER_GPT_SUPPORT */
 		if (pref < preflevel) {
 			preflevel = pref;
 			best = entry;
 		}
 	}
 	if (best != NULL) {
 		memcpy(part, &best->part, sizeof(*part));
 		return (0);
 	}
 	return (ENOENT);
 }
 
 void
 ptable_iterate(const struct ptable *table, void *arg, ptable_iterate_t *iter)
 {
 	struct pentry *entry;
 	char name[32];
 
 	name[0] = '\0';
 	STAILQ_FOREACH(entry, &table->entries, entry) {
 #ifdef LOADER_MBR_SUPPORT
 		if (table->type == PTABLE_MBR)
 			sprintf(name, "s%d", entry->part.index);
 		else
 #endif
 #ifdef LOADER_GPT_SUPPORT
 		if (table->type == PTABLE_GPT)
 			sprintf(name, "p%d", entry->part.index);
 		else
 #endif
 #ifdef LOADER_VTOC8_SUPPORT
 		if (table->type == PTABLE_VTOC8)
 			sprintf(name, "%c", (u_char) 'a' +
 			    entry->part.index);
 		else
 #endif
 		if (table->type == PTABLE_BSD)
 			sprintf(name, "%c", (u_char) 'a' +
 			    entry->part.index);
 		iter(arg, name, &entry->part);
 	}
 }
 
Index: head/sys/boot/common/self_reloc.c
===================================================================
--- head/sys/boot/common/self_reloc.c	(revision 293723)
+++ head/sys/boot/common/self_reloc.c	(revision 293724)
@@ -1,123 +1,125 @@
 /*-
  * Copyright (c) 2008-2010 Rui Paulo <rpaulo@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$");
 
 #include <sys/types.h>
 #include <elf.h>
 #include <bootstrap.h>
 
 #if defined(__aarch64__)
 #define	ElfW_Rel	Elf64_Rela
 #define	ElfW_Dyn	Elf64_Dyn
 #define	ELFW_R_TYPE	ELF64_R_TYPE
 #define	ELF_RELA
 #elif defined(__arm__) || defined(__i386__)
 #define	ElfW_Rel	Elf32_Rel
 #define	ElfW_Dyn	Elf32_Dyn
 #define	ELFW_R_TYPE	ELF32_R_TYPE
 #elif defined(__amd64__)
 #define	ElfW_Rel	Elf64_Rel
 #define	ElfW_Dyn	Elf64_Dyn
 #define	ELFW_R_TYPE	ELF64_R_TYPE
 #else
 #error architecture not supported
 #endif
 #if defined(__aarch64__)
 #define	RELOC_TYPE_NONE		R_AARCH64_NONE
 #define	RELOC_TYPE_RELATIVE	R_AARCH64_RELATIVE
 #elif defined(__amd64__)
 #define	RELOC_TYPE_NONE		R_X86_64_NONE
 #define	RELOC_TYPE_RELATIVE	R_X86_64_RELATIVE
 #elif defined(__arm__)
 #define	RELOC_TYPE_NONE		R_ARM_NONE
 #define	RELOC_TYPE_RELATIVE	R_ARM_RELATIVE
 #elif defined(__i386__)
 #define	RELOC_TYPE_NONE		R_386_NONE
 #define	RELOC_TYPE_RELATIVE	R_386_RELATIVE
 #endif
 
+void self_reloc(Elf_Addr baseaddr, ElfW_Dyn *dynamic);
+
 /*
  * A simple elf relocator.
  */
 void
 self_reloc(Elf_Addr baseaddr, ElfW_Dyn *dynamic)
 {
 	Elf_Word relsz, relent;
 	Elf_Addr *newaddr;
 	ElfW_Rel *rel;
 	ElfW_Dyn *dynp;
 
 	/*
 	 * Find the relocation address, its size and the relocation entry.
 	 */
 	relsz = 0;
 	relent = 0;
 	for (dynp = dynamic; dynp->d_tag != DT_NULL; dynp++) {
 		switch (dynp->d_tag) {
 		case DT_REL:
 		case DT_RELA:
 			rel = (ElfW_Rel *)(dynp->d_un.d_ptr + baseaddr);
 			break;
 		case DT_RELSZ:
 		case DT_RELASZ:
 			relsz = dynp->d_un.d_val;
 			break;
 		case DT_RELENT:
 		case DT_RELAENT:
 			relent = dynp->d_un.d_val;
 			break;
 		default:
 			break;
 		}
 	}
 
 	/*
 	 * Perform the actual relocation.
 	 */
 	for (; relsz > 0; relsz -= relent) {
 		switch (ELFW_R_TYPE(rel->r_info)) {
 		case RELOC_TYPE_NONE:
 			/* No relocation needs be performed. */
 			break;
 
 		case RELOC_TYPE_RELATIVE:
 			/* Address relative to the base address. */
 			newaddr = (Elf_Addr *)(rel->r_offset + baseaddr);
 			*newaddr += baseaddr;
 			/* Add the addend when the ABI uses them */ 
 #ifdef ELF_RELA
 			*newaddr += rel->r_addend;
 #endif
 			break;
 		default:
 			/* XXX: do we need other relocations ? */
 			break;
 		}
-		rel = (ElfW_Rel *) ((caddr_t) rel + relent);
+		rel = (ElfW_Rel *)(void *)((caddr_t) rel + relent);
 	}
 }
Index: head/sys/boot/common/ufsread.c
===================================================================
--- head/sys/boot/common/ufsread.c	(revision 293723)
+++ head/sys/boot/common/ufsread.c	(revision 293724)
@@ -1,303 +1,303 @@
 /*-
  * Copyright (c) 2002 McAfee, Inc.
  * All rights reserved.
  *
  * This software was developed for the FreeBSD Project by Marshall
  * Kirk McKusick and McAfee Research,, the Security Research Division of
  * McAfee, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as
  * part of the DARPA CHATS research program
  *
  * 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.
  */
 /*-
  * Copyright (c) 1998 Robert Nordier
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are freely
  * permitted provided that the above copyright notice and this
  * paragraph and the following disclaimer are duplicated in all
  * such forms.
  *
  * This software is provided "AS IS" and without any express or
  * implied warranties, including, without limitation, the implied
  * warranties of merchantability and fitness for a particular
  * purpose.
  */
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
 #include <ufs/ufs/dinode.h>
 #include <ufs/ufs/dir.h>
 #include <ufs/ffs/fs.h>
 
 #ifdef UFS_SMALL_CGBASE
 /* XXX: Revert to old (broken for over 1.5Tb filesystems) version of cgbase
    (see sys/ufs/ffs/fs.h rev 1.39) so that small boot loaders (e.g. boot2) can
    support both UFS1 and UFS2. */
 #undef cgbase
 #define cgbase(fs, c)   ((ufs2_daddr_t)((fs)->fs_fpg * (c)))
 #endif
 
 typedef	uint32_t	ufs_ino_t;
 
 /*
  * We use 4k `virtual' blocks for filesystem data, whatever the actual
  * filesystem block size. FFS blocks are always a multiple of 4k.
  */
 #define VBLKSHIFT	12
 #define VBLKSIZE	(1 << VBLKSHIFT)
 #define VBLKMASK	(VBLKSIZE - 1)
 #define DBPERVBLK	(VBLKSIZE / DEV_BSIZE)
 #define INDIRPERVBLK(fs) (NINDIR(fs) / ((fs)->fs_bsize >> VBLKSHIFT))
 #define IPERVBLK(fs)	(INOPB(fs) / ((fs)->fs_bsize >> VBLKSHIFT))
 #define INO_TO_VBA(fs, ipervblk, x) \
     (fsbtodb(fs, cgimin(fs, ino_to_cg(fs, x))) + \
     (((x) % (fs)->fs_ipg) / (ipervblk) * DBPERVBLK))
 #define INO_TO_VBO(ipervblk, x) ((x) % ipervblk)
 #define FS_TO_VBA(fs, fsb, off) (fsbtodb(fs, fsb) + \
     ((off) / VBLKSIZE) * DBPERVBLK)
 #define FS_TO_VBO(fs, fsb, off) ((off) & VBLKMASK)
 
 /* Buffers that must not span a 64k boundary. */
 struct dmadat {
 	char blkbuf[VBLKSIZE];	/* filesystem blocks */
 	char indbuf[VBLKSIZE];	/* indir blocks */
 	char sbbuf[SBLOCKSIZE];	/* superblock */
 	char secbuf[DEV_BSIZE];	/* for MBR/disklabel */
 };
 static struct dmadat *dmadat;
 
 static ufs_ino_t lookup(const char *);
 static ssize_t fsread(ufs_ino_t, void *, size_t);
 
 static uint8_t ls, dsk_meta;
 static uint32_t fs_off;
 
 static __inline uint8_t
 fsfind(const char *name, ufs_ino_t * ino)
 {
 	static char buf[DEV_BSIZE];
 	struct direct *d;
 	char *s;
 	ssize_t n;
 
 	fs_off = 0;
 	while ((n = fsread(*ino, buf, DEV_BSIZE)) > 0)
 		for (s = buf; s < buf + DEV_BSIZE;) {
 			d = (void *)s;
 			if (ls)
 				printf("%s ", d->d_name);
 			else if (!strcmp(name, d->d_name)) {
 				*ino = d->d_ino;
 				return d->d_type;
 			}
 			s += d->d_reclen;
 		}
 	if (n != -1 && ls)
 		printf("\n");
 	return 0;
 }
 
 static ufs_ino_t
 lookup(const char *path)
 {
 	static char name[MAXNAMLEN + 1];
 	const char *s;
 	ufs_ino_t ino;
 	ssize_t n;
 	uint8_t dt;
 
 	ino = ROOTINO;
 	dt = DT_DIR;
 	for (;;) {
 		if (*path == '/')
 			path++;
 		if (!*path)
 			break;
 		for (s = path; *s && *s != '/'; s++);
 		if ((n = s - path) > MAXNAMLEN)
 			return 0;
 		ls = *path == '?' && n == 1 && !*s;
 		memcpy(name, path, n);
 		name[n] = 0;
 		if (dt != DT_DIR) {
 			printf("%s: not a directory.\n", name);
 			return (0);
 		}
 		if ((dt = fsfind(name, &ino)) <= 0)
 			break;
 		path = s;
 	}
 	return dt == DT_REG ? ino : 0;
 }
 
 /*
  * Possible superblock locations ordered from most to least likely.
  */
 static int sblock_try[] = SBLOCKSEARCH;
 
 #if defined(UFS2_ONLY)
 #define DIP(field) dp2.field
 #elif defined(UFS1_ONLY)
 #define DIP(field) dp1.field
 #else
 #define DIP(field) fs.fs_magic == FS_UFS1_MAGIC ? dp1.field : dp2.field
 #endif
 
 static ssize_t
 fsread(ufs_ino_t inode, void *buf, size_t nbyte)
 {
 #ifndef UFS2_ONLY
 	static struct ufs1_dinode dp1;
 	ufs1_daddr_t addr1;
 #endif
 #ifndef UFS1_ONLY
 	static struct ufs2_dinode dp2;
 #endif
 	static struct fs fs;
 	static ufs_ino_t inomap;
 	char *blkbuf;
 	void *indbuf;
 	char *s;
 	size_t n, nb, size, off, vboff;
 	ufs_lbn_t lbn;
 	ufs2_daddr_t addr2, vbaddr;
 	static ufs2_daddr_t blkmap, indmap;
 	u_int u;
 
 	blkbuf = dmadat->blkbuf;
 	indbuf = dmadat->indbuf;
 	if (!dsk_meta) {
 		inomap = 0;
 		for (n = 0; sblock_try[n] != -1; n++) {
 			if (dskread(dmadat->sbbuf, sblock_try[n] / DEV_BSIZE,
 			    SBLOCKSIZE / DEV_BSIZE))
 				return -1;
 			memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
 			if ((
 #if defined(UFS1_ONLY)
 			    fs.fs_magic == FS_UFS1_MAGIC
 #elif defined(UFS2_ONLY)
 			    (fs.fs_magic == FS_UFS2_MAGIC &&
 			    fs.fs_sblockloc == sblock_try[n])
 #else
 			    fs.fs_magic == FS_UFS1_MAGIC ||
 			    (fs.fs_magic == FS_UFS2_MAGIC &&
 			    fs.fs_sblockloc == sblock_try[n])
 #endif
 			    ) &&
 			    fs.fs_bsize <= MAXBSIZE &&
-			    fs.fs_bsize >= sizeof(struct fs))
+			    fs.fs_bsize >= (int32_t)sizeof(struct fs))
 				break;
 		}
 		if (sblock_try[n] == -1) {
 			return -1;
 		}
 		dsk_meta++;
 	} else
 		memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
 	if (!inode)
 		return 0;
 	if (inomap != inode) {
 		n = IPERVBLK(&fs);
 		if (dskread(blkbuf, INO_TO_VBA(&fs, n, inode), DBPERVBLK))
 			return -1;
 		n = INO_TO_VBO(n, inode);
 #if defined(UFS1_ONLY)
 		memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
 		    sizeof(struct ufs1_dinode));
 #elif defined(UFS2_ONLY)
 		memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
 		    sizeof(struct ufs2_dinode));
 #else
 		if (fs.fs_magic == FS_UFS1_MAGIC)
-			memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
+			memcpy(&dp1, (struct ufs1_dinode *)(void *)blkbuf + n,
 			    sizeof(struct ufs1_dinode));
 		else
-			memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
+			memcpy(&dp2, (struct ufs2_dinode *)(void *)blkbuf + n,
 			    sizeof(struct ufs2_dinode));
 #endif
 		inomap = inode;
 		fs_off = 0;
 		blkmap = indmap = 0;
 	}
 	s = buf;
 	size = DIP(di_size);
 	n = size - fs_off;
 	if (nbyte > n)
 		nbyte = n;
 	nb = nbyte;
 	while (nb) {
 		lbn = lblkno(&fs, fs_off);
 		off = blkoff(&fs, fs_off);
 		if (lbn < NDADDR) {
 			addr2 = DIP(di_db[lbn]);
 		} else if (lbn < NDADDR + NINDIR(&fs)) {
 			n = INDIRPERVBLK(&fs);
 			addr2 = DIP(di_ib[0]);
 			u = (u_int)(lbn - NDADDR) / n * DBPERVBLK;
 			vbaddr = fsbtodb(&fs, addr2) + u;
 			if (indmap != vbaddr) {
 				if (dskread(indbuf, vbaddr, DBPERVBLK))
 					return -1;
 				indmap = vbaddr;
 			}
 			n = (lbn - NDADDR) & (n - 1);
 #if defined(UFS1_ONLY)
 			memcpy(&addr1, (ufs1_daddr_t *)indbuf + n,
 			    sizeof(ufs1_daddr_t));
 			addr2 = addr1;
 #elif defined(UFS2_ONLY)
 			memcpy(&addr2, (ufs2_daddr_t *)indbuf + n,
 			    sizeof(ufs2_daddr_t));
 #else
 			if (fs.fs_magic == FS_UFS1_MAGIC) {
 				memcpy(&addr1, (ufs1_daddr_t *)indbuf + n,
 				    sizeof(ufs1_daddr_t));
 				addr2 = addr1;
 			} else
 				memcpy(&addr2, (ufs2_daddr_t *)indbuf + n,
 				    sizeof(ufs2_daddr_t));
 #endif
 		} else
 			return -1;
 		vbaddr = fsbtodb(&fs, addr2) + (off >> VBLKSHIFT) * DBPERVBLK;
 		vboff = off & VBLKMASK;
-		n = sblksize(&fs, size, lbn) - (off & ~VBLKMASK);
+		n = sblksize(&fs, (off_t)size, lbn) - (off & ~VBLKMASK);
 		if (n > VBLKSIZE)
 			n = VBLKSIZE;
 		if (blkmap != vbaddr) {
 			if (dskread(blkbuf, vbaddr, n >> DEV_BSHIFT))
 				return -1;
 			blkmap = vbaddr;
 		}
 		n -= vboff;
 		if (n > nb)
 			n = nb;
 		memcpy(s, blkbuf + vboff, n);
 		s += n;
 		fs_off += n;
 		nb -= n;
 	}
 	return nbyte;
 }
Index: head/sys/boot/efi/boot1/Makefile
===================================================================
--- head/sys/boot/efi/boot1/Makefile	(revision 293723)
+++ head/sys/boot/efi/boot1/Makefile	(revision 293724)
@@ -1,115 +1,116 @@
 # $FreeBSD$
 
 MAN=
 
 .include <bsd.own.mk>
 
 # In-tree GCC does not support __attribute__((ms_abi)).
 .if ${COMPILER_TYPE} != "gcc"
 
 MK_SSP=		no
 
 PROG=		boot1.sym
 INTERNALPROG=
+WARNS?=		6
 
 # architecture-specific loader code
 SRCS=	boot1.c self_reloc.c start.S
 
 CFLAGS+=	-I.
 CFLAGS+=	-I${.CURDIR}/../include
 CFLAGS+=	-I${.CURDIR}/../include/${MACHINE}
 CFLAGS+=	-I${.CURDIR}/../../../contrib/dev/acpica/include
 CFLAGS+=	-I${.CURDIR}/../../..
 
 # Always add MI sources and REGULAR efi loader bits
 .PATH:		${.CURDIR}/../loader/arch/${MACHINE}
 .PATH:		${.CURDIR}/../loader
 .PATH:		${.CURDIR}/../../common
 CFLAGS+=	-I${.CURDIR}/../../common
 
 FILES=	boot1.efi boot1.efifat
 FILESMODE_boot1.efi=	${BINMODE}
 
 LDSCRIPT=	${.CURDIR}/../loader/arch/${MACHINE}/ldscript.${MACHINE}
 LDFLAGS=	-Wl,-T${LDSCRIPT} -Wl,-Bsymbolic -shared
 
 .if ${MACHINE_CPUARCH} == "aarch64"
 CFLAGS+=	-msoft-float -mgeneral-regs-only
 .endif
 .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
 CFLAGS+=	-fPIC
 LDFLAGS+=	-Wl,-znocombreloc
 .endif
 
 #
 # Add libstand for the runtime functions used by the compiler - for example
 # __aeabi_* (arm) or __divdi3 (i386).
 # as well as required string and memory functions for all platforms.
 #
 DPADD+=		${LIBSTAND}
 LDADD+=		-lstand
 
 DPADD+=		${LDSCRIPT}
 
 OBJCOPY?=	objcopy
 OBJDUMP?=	objdump
 
 .if ${MACHINE_CPUARCH} == "amd64"
 EFI_TARGET=	efi-app-x86_64
 .elif ${MACHINE_CPUARCH} == "i386"
 EFI_TARGET=	efi-app-ia32
 .else
 EFI_TARGET=	binary
 .endif
 
 boot1.efi: ${PROG}
 	if [ `${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*' | wc -l` != 0 ]; then \
 		${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*'; \
 		exit 1; \
 	fi
 	${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
 		-j .dynamic -j .dynsym -j .rel.dyn \
 		-j .rela.dyn -j .reloc -j .eh_frame \
 		--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
 
 boot1.o: ${.CURDIR}/../../common/ufsread.c
 
 # The following inserts our objects into a template FAT file system
 # created by generate-fat.sh
 
 .include "${.CURDIR}/Makefile.fat"
 BOOT1_MAXSIZE?=	131072
 
 boot1.efifat: boot1.efi
 	@set -- `ls -l boot1.efi`; \
 	x=$$(($$5-${BOOT1_MAXSIZE})); \
 	if [ $$x -ge 0 ]; then \
 	    echo "boot1 $$x bytes too large; regenerate FAT templates?" >&2 ;\
 	    exit 1; \
 	fi
 	echo ${.OBJDIR}
 	uudecode ${.CURDIR}/fat-${MACHINE}.tmpl.bz2.uu
 	mv fat-${MACHINE}.tmpl.bz2 ${.TARGET}.bz2
 	bzip2 -f -d ${.TARGET}.bz2
 	dd if=boot1.efi of=${.TARGET} seek=${BOOT1_OFFSET} conv=notrunc
 
 CLEANFILES= boot1.efi boot1.efifat
 
 .endif # ${COMPILER_TYPE} != "gcc"
 
 .include <bsd.prog.mk>
 
 beforedepend ${OBJS}: machine
 
 CLEANFILES+=   machine
 
 machine:
 	ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
 
 .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
 beforedepend ${OBJS}: x86
 CLEANFILES+=   x86
 
 x86:
 	ln -sf ${.CURDIR}/../../../x86/include x86
 .endif
Index: head/sys/boot/efi/boot1/boot1.c
===================================================================
--- head/sys/boot/efi/boot1/boot1.c	(revision 293723)
+++ head/sys/boot/efi/boot1/boot1.c	(revision 293724)
@@ -1,323 +1,320 @@
 /*-
  * Copyright (c) 1998 Robert Nordier
  * All rights reserved.
  * Copyright (c) 2001 Robert Drehmel
  * All rights reserved.
  * Copyright (c) 2014 Nathan Whitehorn
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms are freely
  * permitted provided that the above copyright notice and this
  * paragraph and the following disclaimer are duplicated in all
  * such forms.
  *
  * This software is provided "AS IS" and without any express or
  * implied warranties, including, without limitation, the implied
  * warranties of merchantability and fitness for a particular
  * purpose.
  */
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/dirent.h>
 #include <machine/elf.h>
 #include <machine/stdarg.h>
 #include <stand.h>
 
 #include <efi.h>
 #include <eficonsctl.h>
 
 #define _PATH_LOADER	"/boot/loader.efi"
 #define _PATH_KERNEL	"/boot/kernel/kernel"
 
 #define BSIZEMAX	16384
 
 void panic(const char *fmt, ...) __dead2;
 void putchar(int c);
+EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab);
 
 static int domount(EFI_DEVICE_PATH *device, EFI_BLOCK_IO *blkio, int quiet);
 static void load(const char *fname);
 
 static EFI_SYSTEM_TABLE *systab;
 static EFI_HANDLE *image;
 
 static EFI_GUID BlockIoProtocolGUID = BLOCK_IO_PROTOCOL;
 static EFI_GUID DevicePathGUID = DEVICE_PATH_PROTOCOL;
 static EFI_GUID LoadedImageGUID = LOADED_IMAGE_PROTOCOL;
 static EFI_GUID ConsoleControlGUID = EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
 
 static EFI_BLOCK_IO *bootdev;
 static EFI_DEVICE_PATH *bootdevpath;
 static EFI_HANDLE *bootdevhandle;
 
 EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
 {
 	EFI_HANDLE handles[128];
 	EFI_BLOCK_IO *blkio;
 	UINTN i, nparts = sizeof(handles), cols, rows, max_dim, best_mode;
 	EFI_STATUS status;
 	EFI_DEVICE_PATH *devpath;
 	EFI_BOOT_SERVICES *BS;
 	EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL;
 	SIMPLE_TEXT_OUTPUT_INTERFACE *conout = NULL;
-	char *path = _PATH_LOADER;
+	const char *path = _PATH_LOADER;
 
 	systab = Xsystab;
 	image = Ximage;
 
 	BS = systab->BootServices;
 	status = BS->LocateProtocol(&ConsoleControlGUID, NULL,
 	    (VOID **)&ConsoleControl);
 	if (status == EFI_SUCCESS)
 		(void)ConsoleControl->SetMode(ConsoleControl,
 		    EfiConsoleControlScreenText);
 	/*
 	 * Reset the console and find the best text mode.
 	 */
 	conout = systab->ConOut;
 	conout->Reset(conout, TRUE);
 	max_dim = best_mode = 0;
 	for (i = 0; ; i++) {
 		status = conout->QueryMode(conout, i, &cols, &rows);
 		if (EFI_ERROR(status))
 			break;
 		if (cols * rows > max_dim) {
 			max_dim = cols * rows;
 			best_mode = i;
 		}
 	}
 	if (max_dim > 0)
 		conout->SetMode(conout, best_mode);
 	conout->EnableCursor(conout, TRUE);
 	conout->ClearScreen(conout);
 
 	printf("\n"
 	       ">> FreeBSD EFI boot block\n");
 	printf("   Loader path: %s\n", path);
 
 	status = systab->BootServices->LocateHandle(ByProtocol,
 	    &BlockIoProtocolGUID, NULL, &nparts, handles);
 	nparts /= sizeof(handles[0]);
 
 	for (i = 0; i < nparts; i++) {
 		status = systab->BootServices->HandleProtocol(handles[i],
 		    &DevicePathGUID, (void **)&devpath);
 		if (EFI_ERROR(status))
 			continue;
 
 		while (!IsDevicePathEnd(NextDevicePathNode(devpath)))
 			devpath = NextDevicePathNode(devpath);
 
 		status = systab->BootServices->HandleProtocol(handles[i],
 		    &BlockIoProtocolGUID, (void **)&blkio);
 		if (EFI_ERROR(status))
 			continue;
 
 		if (!blkio->Media->LogicalPartition)
 			continue;
 
 		if (domount(devpath, blkio, 1) >= 0)
 			break;
 	}
 
 	if (i == nparts)
 		panic("No bootable partition found");
 
 	bootdevhandle = handles[i];
 	load(path);
 
 	panic("Load failed");
 
 	return EFI_SUCCESS;
 }
 
 static int
 dskread(void *buf, u_int64_t lba, int nblk)
 {
 	EFI_STATUS status;
 	int size;
 
 	lba = lba / (bootdev->Media->BlockSize / DEV_BSIZE);
 	size = nblk * DEV_BSIZE;
 	status = bootdev->ReadBlocks(bootdev, bootdev->Media->MediaId, lba,
 	    size, buf);
 
 	if (EFI_ERROR(status))
 		return (-1);
 
 	return (0);
 }
 
 #include "ufsread.c"
 
 static ssize_t
 fsstat(ufs_ino_t inode)
 {
 #ifndef UFS2_ONLY
 	static struct ufs1_dinode dp1;
-	ufs1_daddr_t addr1;
 #endif
 #ifndef UFS1_ONLY
 	static struct ufs2_dinode dp2;
 #endif
 	static struct fs fs;
 	static ufs_ino_t inomap;
 	char *blkbuf;
 	void *indbuf;
-	size_t n, nb, size, off, vboff;
-	ufs_lbn_t lbn;
-	ufs2_daddr_t addr2, vbaddr;
+	size_t n, size;
 	static ufs2_daddr_t blkmap, indmap;
-	u_int u;
 
 	blkbuf = dmadat->blkbuf;
 	indbuf = dmadat->indbuf;
 	if (!dsk_meta) {
 		inomap = 0;
 		for (n = 0; sblock_try[n] != -1; n++) {
 			if (dskread(dmadat->sbbuf, sblock_try[n] / DEV_BSIZE,
 			    SBLOCKSIZE / DEV_BSIZE))
 				return -1;
 			memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
 			if ((
 #if defined(UFS1_ONLY)
 			    fs.fs_magic == FS_UFS1_MAGIC
 #elif defined(UFS2_ONLY)
 			    (fs.fs_magic == FS_UFS2_MAGIC &&
 			    fs.fs_sblockloc == sblock_try[n])
 #else
 			    fs.fs_magic == FS_UFS1_MAGIC ||
 			    (fs.fs_magic == FS_UFS2_MAGIC &&
 			    fs.fs_sblockloc == sblock_try[n])
 #endif
 			    ) &&
 			    fs.fs_bsize <= MAXBSIZE &&
-			    fs.fs_bsize >= sizeof(struct fs))
+			    fs.fs_bsize >= (int32_t)sizeof(struct fs))
 				break;
 		}
 		if (sblock_try[n] == -1) {
 			return -1;
 		}
 		dsk_meta++;
 	} else
 		memcpy(&fs, dmadat->sbbuf, sizeof(struct fs));
 	if (!inode)
 		return 0;
 	if (inomap != inode) {
 		n = IPERVBLK(&fs);
 		if (dskread(blkbuf, INO_TO_VBA(&fs, n, inode), DBPERVBLK))
 			return -1;
 		n = INO_TO_VBO(n, inode);
 #if defined(UFS1_ONLY)
 		memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
 		    sizeof(struct ufs1_dinode));
 #elif defined(UFS2_ONLY)
 		memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
 		    sizeof(struct ufs2_dinode));
 #else
 		if (fs.fs_magic == FS_UFS1_MAGIC)
-			memcpy(&dp1, (struct ufs1_dinode *)blkbuf + n,
+			memcpy(&dp1, (struct ufs1_dinode *)(void *)blkbuf + n,
 			    sizeof(struct ufs1_dinode));
 		else
-			memcpy(&dp2, (struct ufs2_dinode *)blkbuf + n,
+			memcpy(&dp2, (struct ufs2_dinode *)(void *)blkbuf + n,
 			    sizeof(struct ufs2_dinode));
 #endif
 		inomap = inode;
 		fs_off = 0;
 		blkmap = indmap = 0;
 	}
 	size = DIP(di_size);
 	n = size - fs_off;
 	return (n);
 }
 
 static struct dmadat __dmadat;
 
 static int
 domount(EFI_DEVICE_PATH *device, EFI_BLOCK_IO *blkio, int quiet)
 {
 
 	dmadat = &__dmadat;
 	bootdev = blkio;
 	bootdevpath = device;
 	if (fsread(0, NULL, 0)) {
 		if (!quiet)
 			printf("domount: can't read superblock\n");
 		return (-1);
 	}
 	if (!quiet)
 		printf("Succesfully mounted UFS filesystem\n");
 	return (0);
 }
 
 static void
 load(const char *fname)
 {
 	ufs_ino_t ino;
 	EFI_STATUS status;
 	EFI_HANDLE loaderhandle;
 	EFI_LOADED_IMAGE *loaded_image;
 	void *buffer;
 	size_t bufsize;
 
 	if ((ino = lookup(fname)) == 0) {
 		printf("File %s not found\n", fname);
 		return;
 	}
 
 	bufsize = fsstat(ino);
 	status = systab->BootServices->AllocatePool(EfiLoaderData,
 	    bufsize, &buffer);
 	fsread(ino, buffer, bufsize);
 
 	/* XXX: For secure boot, we need our own loader here */
 	status = systab->BootServices->LoadImage(TRUE, image, bootdevpath,
 	    buffer, bufsize, &loaderhandle);
 	if (EFI_ERROR(status))
 		printf("LoadImage failed with error %lu\n",
 		    EFI_ERROR_CODE(status));
 
 	status = systab->BootServices->HandleProtocol(loaderhandle,
 	    &LoadedImageGUID, (VOID**)&loaded_image);
 	if (EFI_ERROR(status))
 		printf("HandleProtocol failed with error %lu\n",
 		    EFI_ERROR_CODE(status));
 
 	loaded_image->DeviceHandle = bootdevhandle;
 
 	status = systab->BootServices->StartImage(loaderhandle, NULL, NULL);
 	if (EFI_ERROR(status))
 		printf("StartImage failed with error %lu\n",
 		    EFI_ERROR_CODE(status));
 }
 
 void
 panic(const char *fmt, ...)
 {
 	va_list ap;
 
 	printf("panic: ");
 	va_start(ap, fmt);
 	vprintf(fmt, ap);
 	va_end(ap);
 	printf("\n");
 
 	while (1) {}
 }
 
 void
 putchar(int c)
 {
 	CHAR16 buf[2];
 
 	if (c == '\n') {
 		buf[0] = '\r';
 		buf[1] = 0;
 		systab->ConOut->OutputString(systab->ConOut, buf);
 	}
 	buf[0] = c;
 	buf[1] = 0;
 	systab->ConOut->OutputString(systab->ConOut, buf);
 }
Index: head/sys/boot/efi/fdt/Makefile
===================================================================
--- head/sys/boot/efi/fdt/Makefile	(revision 293723)
+++ head/sys/boot/efi/fdt/Makefile	(revision 293724)
@@ -1,36 +1,37 @@
 # $FreeBSD$
 
 .include <src.opts.mk>
 
 .PATH: ${.CURDIR}/../../common
 
 LIB=		efi_fdt
 INTERNALLIB=
+WARNS?=		6
 
 SRCS=		efi_fdt.c
 
 CFLAGS+=	-ffreestanding -msoft-float
 .if ${MACHINE_CPUARCH} == "aarch64"
 CFLAGS+=	-mgeneral-regs-only
 .endif
 
 CFLAGS+=	-I${.CURDIR}/../../../../lib/libstand/
 
 # EFI library headers
 CFLAGS+=	-I${.CURDIR}/../include
 CFLAGS+=	-I${.CURDIR}/../include/${MACHINE}
 
 # libfdt headers
 CFLAGS+=	-I${.CURDIR}/../../fdt
 
 # Pick up the bootstrap header for some interface items
 CFLAGS+=	-I${.CURDIR}/../../common -I${.CURDIR}/../../.. -I.
 
 machine:
 	ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
 
 CLEANFILES+=	machine
 
 .include <bsd.lib.mk>
 
 beforedepend ${OBJS}: machine
Index: head/sys/boot/efi/fdt/efi_fdt.c
===================================================================
--- head/sys/boot/efi/fdt/efi_fdt.c	(revision 293723)
+++ head/sys/boot/efi/fdt/efi_fdt.c	(revision 293724)
@@ -1,63 +1,62 @@
 /*-
  * Copyright (c) 2014 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by Andrew Turner under
  * sponsorship from the FreeBSD Foundation.
  *
  * 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$");
 
 #include <sys/param.h>
 #include <stand.h>
 #include <efi.h>
 #include <efilib.h>
 #include <fdt_platform.h>
 
 #include "bootstrap.h"
 
 static EFI_GUID fdtdtb = FDT_TABLE_GUID;
 
 int
 fdt_platform_load_dtb(void)
 {
 	struct fdt_header *hdr;
-	int err;
 
 	hdr = efi_get_table(&fdtdtb);
 	if (hdr != NULL) {
 		if (fdt_load_dtb_addr(hdr) == 0) {
 			printf("Using DTB provided by EFI at %p.\n", hdr);
 			return (0);
 		}
 	}
 
-	return (err);
+	return (1);
 }
 
 void
 fdt_platform_fixups(void)
 {
 }
Index: head/sys/boot/efi/include/arm64/efibind.h
===================================================================
--- head/sys/boot/efi/include/arm64/efibind.h	(revision 293723)
+++ head/sys/boot/efi/include/arm64/efibind.h	(revision 293724)
@@ -1,219 +1,217 @@
 /* $FreeBSD$ */
 /*++
 
 Copyright (c)  1999 - 2003 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efefind.h
 
 Abstract:
 
     EFI to compile bindings
 
 
 
 
 Revision History
 
 --*/
 
 #pragma pack()
 
 
 #ifdef __FreeBSD__
 #include <sys/stdint.h>
 #else
 //
 // Basic int types of various widths
 //
 
 #if (__STDC_VERSION__ < 199901L )
 
     // No ANSI C 1999/2000 stdint.h integer width declarations 
 
     #ifdef _MSC_EXTENSIONS
 
         // Use Microsoft C compiler integer width declarations 
 
         typedef unsigned __int64    uint64_t;
         typedef __int64             int64_t;
         typedef unsigned __int32    uint32_t;
         typedef __int32             int32_t;
         typedef unsigned __int16    uint16_t;
         typedef __int16             int16_t;
         typedef unsigned __int8     uint8_t;
         typedef __int8              int8_t;
     #else             
         #ifdef UNIX_LP64
 
             // Use LP64 programming model from C_FLAGS for integer width declarations 
 
             typedef unsigned long       uint64_t;
             typedef long                int64_t;
             typedef unsigned int        uint32_t;
             typedef int                 int32_t;
             typedef unsigned short      uint16_t;
             typedef short               int16_t;
             typedef unsigned char       uint8_t;
             typedef char                int8_t;
         #else
 
             // Assume P64 programming model from C_FLAGS for integer width declarations 
 
             typedef unsigned long long  uint64_t;
             typedef long long           int64_t;
             typedef unsigned int        uint32_t;
             typedef int                 int32_t;
             typedef unsigned short      uint16_t;
             typedef short               int16_t;
             typedef unsigned char       uint8_t;
             typedef char                int8_t;
         #endif
     #endif
 #endif
 #endif	/* __FreeBSD__ */
 
 //
 // Basic EFI types of various widths
 //
 
 
 typedef uint64_t   UINT64;
 typedef int64_t    INT64;
 typedef uint32_t   UINT32;
 typedef int32_t    INT32;
 typedef uint16_t   UINT16;
 typedef int16_t    INT16;
 typedef uint8_t    UINT8;
 typedef int8_t     INT8;
 
 
 #undef VOID
 #define VOID    void
 
 
 typedef int64_t    INTN;
 typedef uint64_t   UINTN;
 
 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 // BugBug: Code to debug
 //
 #define BIT63   0x8000000000000000
 
 #define PLATFORM_IOBASE_ADDRESS   (0xffffc000000 | BIT63)                                               
 #define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) )
                                                                            
 //                                                                  
 // Macro's with casts make this much easier to use and read.
 //
 #define PORT_TO_MEM8D(_Port)  (*(UINT8  *)(PORT_TO_MEMD(_Port)))
 #define POST_CODE(_Data)  (PORT_TO_MEM8D(0x80) = (_Data))
 //
 // BugBug: End Debug Code!!!
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 #define EFIERR(a)           (0x8000000000000000 | a)
 #define EFI_ERROR_MASK      0x8000000000000000
 #define EFIERR_OEM(a)       (0xc000000000000000 | a)      
 
 #define BAD_POINTER         0xFBFBFBFBFBFBFBFB
 #define MAX_ADDRESS         0xFFFFFFFFFFFFFFFF
 
-#pragma intrinsic (__break)  
 #define BREAKPOINT()  __break(0)
 
 //
 // Pointers must be aligned to these address to function
 //  you will get an alignment fault if this value is less than 8
 //
 #define MIN_ALIGNMENT_SIZE  8
 
 #define ALIGN_VARIABLE(Value , Adjustment) \
             (UINTN) Adjustment = 0; \
             if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
                 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
             Value = (UINTN)Value + (UINTN)Adjustment
 
 //
 // Define macros to create data structure signatures.
 //
 
 #define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
 #define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
 #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
 
 //
 // EFIAPI - prototype calling convention for EFI function pointers
 // BOOTSERVICE - prototype for implementation of a boot service interface
 // RUNTIMESERVICE - prototype for implementation of a runtime service interface
 // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
 // RUNTIME_CODE - pragma macro for declaring runtime code    
 //
 
 #ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options 
     #ifdef _MSC_EXTENSIONS
         #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler 
     #else
         #define EFIAPI          // Substitute expresion to force C calling convention 
     #endif
 #endif
 
 #define BOOTSERVICE
 #define RUNTIMESERVICE
 #define RUNTIMEFUNCTION
 
 #define RUNTIME_CODE(a)         alloc_text("rtcode", a)
 #define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
 #define END_RUNTIME_DATA()      data_seg()
 
 #define VOLATILE    volatile
 
 //
 // BugBug: Need to find out if this is portable accross compliers.
 //
 void __mfa (void);                       
-#pragma intrinsic (__mfa)  
 #define MEMORY_FENCE()    __mfa()
 
 #ifdef EFI_NO_INTERFACE_DECL
   #define EFI_FORWARD_DECLARATION(x)
   #define EFI_INTERFACE_DECL(x)
 #else
   #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
   #define EFI_INTERFACE_DECL(x) typedef struct x
 #endif
 
 //
 // When build similiar to FW, then link everything together as
 // one big module.
 //
 
 #define EFI_DRIVER_ENTRY_POINT(InitFunction)
 
 #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
             (_if)->LoadInternal(type, name, entry)
 //        entry(NULL, ST)
 
 #ifdef __FreeBSD__
 #define INTERFACE_DECL(x) struct x
 #else
 //
 // Some compilers don't support the forward reference construct:
 //  typedef struct XXXXX
 //
 // The following macro provide a workaround for such cases.
 //
 #ifdef NO_INTERFACE_DECL
 #define INTERFACE_DECL(x)
 #else
 #define INTERFACE_DECL(x) typedef struct x
 #endif
 #endif
Index: head/sys/boot/efi/include/efi_nii.h
===================================================================
--- head/sys/boot/efi/include/efi_nii.h	(revision 293723)
+++ head/sys/boot/efi/include/efi_nii.h	(revision 293724)
@@ -1,86 +1,86 @@
 /* $FreeBSD$ */
 #ifndef _EFI_NII_H
 #define _EFI_NII_H
 
 /*++
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module name:
     efi_nii.h
 
 Abstract:
 
 Revision history:
     2000-Feb-18 M(f)J   GUID updated.
                 Structure order changed for machine word alignment.
                 Added StringId[4] to structure.
                 
     2000-Feb-14 M(f)J   Genesis.
 --*/
 
 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL \
-    { 0xE18541CD, 0xF755, 0x4f73, 0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29 }
+    { 0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29} }
 #define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_31 \
-    { 0x1ACED566, 0x76ED, 0x4218, 0xBC, 0x81, 0x76, 0x7F, 0x1F, 0x97, 0x7A, 0x89 }
+    { 0x1ACED566, 0x76ED, 0x4218, {0xBC, 0x81, 0x76, 0x7F, 0x1F, 0x97, 0x7A, 0x89} }
 
 #define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION 0x00010000
 #define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION_31 0x00010001
 
 typedef enum {
     EfiNetworkInterfaceUndi = 1
 } EFI_NETWORK_INTERFACE_TYPE;
 
 typedef struct {
 
     UINT64 Revision;
     // Revision of the network interface identifier protocol interface.
 
     UINT64 ID;
     // Address of the first byte of the identifying structure for this
     // network interface.  This is set to zero if there is no structure.
     //
     // For PXE/UNDI this is the first byte of the !PXE structure.
 
     UINT64 ImageAddr;
     // Address of the UNrelocated driver/ROM image.  This is set
     // to zero if there is no driver/ROM image.
     //
     // For 16-bit UNDI, this is the first byte of the option ROM in
     // upper memory.
     //
     // For 32/64-bit S/W UNDI, this is the first byte of the EFI ROM
     // image.
     //
     // For H/W UNDI, this is set to zero.
 
     UINT32 ImageSize;
     // Size of the UNrelocated driver/ROM image of this network interface.
     // This is set to zero if there is no driver/ROM image.
 
     CHAR8 StringId[4];
     // 4 char ASCII string to go in class identifier (option 60) in DHCP
     // and Boot Server discover packets.
     // For EfiNetworkInterfaceUndi this field is "UNDI".
     // For EfiNetworkInterfaceSnp this field is "SNPN".
 
     UINT8 Type;
     UINT8 MajorVer;
     UINT8 MinorVer;
     // Information to be placed into the PXE DHCP and Discover packets.
     // This is the network interface type and version number that will
     // be placed into DHCP option 94 (client network interface identifier).
     BOOLEAN Ipv6Supported;
 	UINT8   IfNum;	// interface number to be used with pxeid structure
 } EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE;
 
 extern EFI_GUID NetworkInterfaceIdentifierProtocol;
 extern EFI_GUID NetworkInterfaceIdentifierProtocol_31;
 
 #endif // _EFI_NII_H
Index: head/sys/boot/efi/include/efiapi.h
===================================================================
--- head/sys/boot/efi/include/efiapi.h	(revision 293723)
+++ head/sys/boot/efi/include/efiapi.h	(revision 293724)
@@ -1,901 +1,901 @@
 /* $FreeBSD$ */
 #ifndef _EFI_API_H
 #define _EFI_API_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efiapi.h
 
 Abstract:
 
     Global EFI runtime & boot service interfaces
 
 
 
 
 Revision History
 
 --*/
 
 //
 // EFI Specification Revision
 //
 
 #define EFI_SPECIFICATION_MAJOR_REVISION 1
 #define EFI_SPECIFICATION_MINOR_REVISION 10
 
 //
 // Declare forward referenced data structures
 //
 
 INTERFACE_DECL(_EFI_SYSTEM_TABLE);
 
 //
 // EFI Memory
 //
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_ALLOCATE_PAGES) (
     IN EFI_ALLOCATE_TYPE            Type,
     IN EFI_MEMORY_TYPE              MemoryType,
     IN UINTN                        NoPages,
     OUT EFI_PHYSICAL_ADDRESS        *Memory
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FREE_PAGES) (
     IN EFI_PHYSICAL_ADDRESS         Memory,
     IN UINTN                        NoPages
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_MEMORY_MAP) (
     IN OUT UINTN                    *MemoryMapSize,
     IN OUT EFI_MEMORY_DESCRIPTOR    *MemoryMap,
     OUT UINTN                       *MapKey,
     OUT UINTN                       *DescriptorSize,
     OUT UINT32                      *DescriptorVersion
     );
 
 #define NextMemoryDescriptor(Ptr,Size)  ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_ALLOCATE_POOL) (
     IN EFI_MEMORY_TYPE              PoolType,
     IN UINTN                        Size,
     OUT VOID                        **Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FREE_POOL) (
     IN VOID                         *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
     IN UINTN                        MemoryMapSize,
     IN UINTN                        DescriptorSize,
     IN UINT32                       DescriptorVersion,
     IN EFI_MEMORY_DESCRIPTOR        *VirtualMap
     );
 
 
 #define EFI_OPTIONAL_PTR            0x00000001
 #define EFI_INTERNAL_FNC            0x00000002      // Pointer to internal runtime fnc
 #define EFI_INTERNAL_PTR            0x00000004      // Pointer to internal runtime data
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CONVERT_POINTER) (
     IN UINTN                        DebugDisposition,
     IN OUT VOID                     **Address
     );
 
 
 //
 // EFI Events
 //
 
 
 
 #define EVT_TIMER                           0x80000000
 #define EVT_RUNTIME                         0x40000000
 #define EVT_RUNTIME_CONTEXT                 0x20000000
 
 #define EVT_NOTIFY_WAIT                     0x00000100
 #define EVT_NOTIFY_SIGNAL                   0x00000200
 
 #define EVT_SIGNAL_EXIT_BOOT_SERVICES       0x00000201
 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE   0x60000202
 
 #define EVT_EFI_SIGNAL_MASK                 0x000000FF
 #define EVT_EFI_SIGNAL_MAX                  2
 
 typedef
 VOID
 (EFIAPI *EFI_EVENT_NOTIFY) (
     IN EFI_EVENT                Event,
     IN VOID                     *Context
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CREATE_EVENT) (
     IN UINT32                       Type,
     IN EFI_TPL                      NotifyTpl,
     IN EFI_EVENT_NOTIFY             NotifyFunction,
     IN VOID                         *NotifyContext,
     OUT EFI_EVENT                   *Event
     );
 
 typedef enum {
     TimerCancel,
     TimerPeriodic,
     TimerRelative,
     TimerTypeMax
 } EFI_TIMER_DELAY;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_TIMER) (
     IN EFI_EVENT                Event,
     IN EFI_TIMER_DELAY          Type,
     IN UINT64                   TriggerTime
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SIGNAL_EVENT) (
     IN EFI_EVENT                Event
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_WAIT_FOR_EVENT) (
     IN UINTN                    NumberOfEvents,
     IN EFI_EVENT                *Event,
     OUT UINTN                   *Index
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CLOSE_EVENT) (
     IN EFI_EVENT                Event
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CHECK_EVENT) (
     IN EFI_EVENT                Event
     );
 
 //
 // Task priority level
 //
 
 #define TPL_APPLICATION    4
 #define TPL_CALLBACK       8
 #define TPL_NOTIFY        16
 #define TPL_HIGH_LEVEL    31
 
 typedef
 EFI_TPL
 (EFIAPI *EFI_RAISE_TPL) (
     IN EFI_TPL      NewTpl
     );
 
 typedef
 VOID
 (EFIAPI *EFI_RESTORE_TPL) (
     IN EFI_TPL      OldTpl
     );
 
 
 //
 // EFI platform varibles
 //
 
-#define EFI_GLOBAL_VARIABLE     \
-    { 0x8BE4DF61, 0x93CA, 0x11d2, 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }
+#define EFI_GLOBAL_VARIABLE \
+    { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
 
 // Variable attributes
 #define EFI_VARIABLE_NON_VOLATILE           0x00000001
 #define EFI_VARIABLE_BOOTSERVICE_ACCESS     0x00000002
 #define EFI_VARIABLE_RUNTIME_ACCESS         0x00000004
 
 // Variable size limitation
 #define EFI_MAXIMUM_VARIABLE_SIZE           1024
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_VARIABLE) (
     IN CHAR16                       *VariableName,
     IN EFI_GUID                     *VendorGuid,
     OUT UINT32                      *Attributes OPTIONAL,
     IN OUT UINTN                    *DataSize,
     OUT VOID                        *Data
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
     IN OUT UINTN                    *VariableNameSize,
     IN OUT CHAR16                   *VariableName,
     IN OUT EFI_GUID                 *VendorGuid
     );
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_VARIABLE) (
     IN CHAR16                       *VariableName,
     IN EFI_GUID                     *VendorGuid,
     IN UINT32                       Attributes,
     IN UINTN                        DataSize,
     IN VOID                         *Data
     );
 
 
 //
 // EFI Time
 //
 
 typedef struct {
         UINT32                      Resolution;     // 1e-6 parts per million
         UINT32                      Accuracy;       // hertz
         BOOLEAN                     SetsToZero;     // Set clears sub-second time
 } EFI_TIME_CAPABILITIES;
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_TIME) (
     OUT EFI_TIME                    *Time,
     OUT EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_TIME) (
     IN EFI_TIME                     *Time
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_WAKEUP_TIME) (
     OUT BOOLEAN                     *Enabled,
     OUT BOOLEAN                     *Pending,
     OUT EFI_TIME                    *Time
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_WAKEUP_TIME) (
     IN BOOLEAN                      Enable,
     IN EFI_TIME                     *Time OPTIONAL
     );
 
 
 //
 // Image functions
 //
 
 
 // PE32+ Subsystem type for EFI images
 
 #if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
 #define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
 #endif
 
 // PE32+ Machine type for EFI images
 
 #if !defined(EFI_IMAGE_MACHINE_IA32)
 #define EFI_IMAGE_MACHINE_IA32      0x014c
 #endif
 
 #if !defined(EFI_IMAGE_MACHINE_EBC)
 #define EFI_IMAGE_MACHINE_EBC       0x0EBC
 #endif
 
 // Image Entry prototype
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
     IN EFI_HANDLE                   ImageHandle,
     IN struct _EFI_SYSTEM_TABLE     *SystemTable
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_LOAD) (
     IN BOOLEAN                      BootPolicy,
     IN EFI_HANDLE                   ParentImageHandle,
     IN EFI_DEVICE_PATH              *FilePath,
     IN VOID                         *SourceBuffer   OPTIONAL,
     IN UINTN                        SourceSize,
     OUT EFI_HANDLE                  *ImageHandle
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_START) (
     IN EFI_HANDLE                   ImageHandle,
     OUT UINTN                       *ExitDataSize,
     OUT CHAR16                      **ExitData  OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_EXIT) (
     IN EFI_HANDLE                   ImageHandle,
     IN EFI_STATUS                   ExitStatus,
     IN UINTN                        ExitDataSize,
     IN CHAR16                       *ExitData OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IMAGE_UNLOAD) (
     IN EFI_HANDLE                   ImageHandle
     );
 
 
 // Image handle
-#define LOADED_IMAGE_PROTOCOL      \
-    { 0x5B1B31A1, 0x9562, 0x11d2, 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }
+#define LOADED_IMAGE_PROTOCOL \
+    { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
 
 #define EFI_LOADED_IMAGE_INFORMATION_REVISION      0x1000
 typedef struct {
     UINT32                          Revision;
     EFI_HANDLE                      ParentHandle;
     struct _EFI_SYSTEM_TABLE        *SystemTable;
 
     // Source location of image
     EFI_HANDLE                      DeviceHandle;
     EFI_DEVICE_PATH                 *FilePath;
     VOID                            *Reserved;
 
     // Images load options
     UINT32                          LoadOptionsSize;
     VOID                            *LoadOptions;
 
     // Location of where image was loaded
     VOID                            *ImageBase;
     UINT64                          ImageSize;
     EFI_MEMORY_TYPE                 ImageCodeType;
     EFI_MEMORY_TYPE                 ImageDataType;
 
     // If the driver image supports a dynamic unload request
     EFI_IMAGE_UNLOAD                Unload;
 
 } EFI_LOADED_IMAGE;
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_EXIT_BOOT_SERVICES) (
     IN EFI_HANDLE                   ImageHandle,
     IN UINTN                        MapKey
     );
 
 //
 // Misc
 //
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_STALL) (
     IN UINTN                    Microseconds
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SET_WATCHDOG_TIMER) (
     IN UINTN                    Timeout,
     IN UINT64                   WatchdogCode,
     IN UINTN                    DataSize,
     IN CHAR16                   *WatchdogData OPTIONAL
     );
 
 
 typedef enum {
     EfiResetCold,
     EfiResetWarm,
     EfiResetShutdown
 } EFI_RESET_TYPE;
 
 typedef
 VOID
 (EFIAPI *EFI_RESET_SYSTEM) (
     IN EFI_RESET_TYPE           ResetType,
     IN EFI_STATUS               ResetStatus,
     IN UINTN                    DataSize,
     IN CHAR16                   *ResetData OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
     OUT UINT64                  *Count
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
     OUT UINT32                  *HighCount
     );
 
 //
 // Protocol handler functions
 //
 
 typedef enum {
     EFI_NATIVE_INTERFACE
 } EFI_INTERFACE_TYPE;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
     IN OUT EFI_HANDLE           *Handle,
     IN EFI_GUID                 *Protocol,
     IN EFI_INTERFACE_TYPE       InterfaceType,
     IN VOID                     *Interface
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
     IN EFI_HANDLE               Handle,
     IN EFI_GUID                 *Protocol,
     IN VOID                     *OldInterface,
     IN VOID                     *NewInterface
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
     IN EFI_HANDLE               Handle,
     IN EFI_GUID                 *Protocol,
     IN VOID                     *Interface
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_HANDLE_PROTOCOL) (
     IN EFI_HANDLE               Handle,
     IN EFI_GUID                 *Protocol,
     OUT VOID                    **Interface
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
     IN EFI_GUID                 *Protocol,
     IN EFI_EVENT                Event,
     OUT VOID                    **Registration
     );
 
 typedef enum {
     AllHandles,
     ByRegisterNotify,
     ByProtocol
 } EFI_LOCATE_SEARCH_TYPE;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_LOCATE_HANDLE) (
     IN EFI_LOCATE_SEARCH_TYPE   SearchType,
     IN EFI_GUID                 *Protocol OPTIONAL,
     IN VOID                     *SearchKey OPTIONAL,
     IN OUT UINTN                *BufferSize,
     OUT EFI_HANDLE              *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
     IN EFI_GUID                 *Protocol,
     IN OUT EFI_DEVICE_PATH      **DevicePath,
     OUT EFI_HANDLE              *Device
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
     IN EFI_GUID                 *Guid,
     IN VOID                     *Table
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_RESERVED_SERVICE) (
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CONNECT_CONTROLLER) (
   IN  EFI_HANDLE                    ControllerHandle,
   IN  EFI_HANDLE                    *DriverImageHandle    OPTIONAL,
   IN  EFI_DEVICE_PATH               *RemainingDevicePath  OPTIONAL,
   IN  BOOLEAN                       Recursive
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_DISCONNECT_CONTROLLER)(
   IN EFI_HANDLE           ControllerHandle,
   IN EFI_HANDLE           DriverImageHandle, OPTIONAL
   IN EFI_HANDLE           ChildHandle        OPTIONAL
   );
 
 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL	 0x00000001
 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL	       0x00000002
 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL        0x00000004
 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER  0x00000008
 #define EFI_OPEN_PROTOCOL_BY_DRIVER            0x00000010
 #define EFI_OPEN_PROTOCOL_EXCLUSIVE            0x00000020
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_OPEN_PROTOCOL) (
   IN EFI_HANDLE                 Handle,
   IN EFI_GUID                   *Protocol,
   OUT VOID                      **Interface,
   IN  EFI_HANDLE                ImageHandle,
   IN  EFI_HANDLE                ControllerHandle, OPTIONAL
   IN  UINT32                    Attributes
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CLOSE_PROTOCOL) (
   IN EFI_HANDLE               Handle,
   IN EFI_GUID                 *Protocol,
   IN EFI_HANDLE               ImageHandle,
   IN EFI_HANDLE               DeviceHandle
   );
 
 typedef struct {
   EFI_HANDLE                  AgentHandle;
   EFI_HANDLE                  ControllerHandle;
   UINT32                      Attributes;
   UINT32                      OpenCount;
 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
   IN  EFI_HANDLE                          UserHandle,
   IN  EFI_GUID                            *Protocol,
   IN  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
   OUT UINTN                               *EntryCount
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
   IN EFI_HANDLE       UserHandle,
   OUT EFI_GUID        ***ProtocolBuffer,
   OUT UINTN           *ProtocolBufferCount
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
   IN EFI_LOCATE_SEARCH_TYPE       SearchType,
   IN EFI_GUID                     *Protocol OPTIONAL,
   IN VOID                         *SearchKey OPTIONAL,
   IN OUT UINTN                    *NumberHandles,
   OUT EFI_HANDLE                  **Buffer
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_LOCATE_PROTOCOL) (
   EFI_GUID  *Protocol,
   VOID      *Registration, OPTIONAL
   VOID      **Interface
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
   IN OUT EFI_HANDLE           *Handle,
   ...
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
   IN EFI_HANDLE           Handle,
   ...
   );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CALCULATE_CRC32) (
   IN  VOID                              *Data,
   IN  UINTN                             DataSize,
   OUT UINT32                            *Crc32
   );
 
 typedef
 VOID
 (EFIAPI *EFI_COPY_MEM) (
   IN VOID     *Destination,
   IN VOID     *Source,
   IN UINTN    Length
   );
 
 typedef
 VOID
 (EFIAPI *EFI_SET_MEM) (
   IN VOID     *Buffer,
   IN UINTN    Size,
   IN UINT8    Value
   );
 
 //
 // Standard EFI table header
 //
 
 typedef struct _EFI_TABLE_HEARDER {
   UINT64                      Signature;
   UINT32                      Revision;
   UINT32                      HeaderSize;
   UINT32                      CRC32;
   UINT32                      Reserved;
 } EFI_TABLE_HEADER;
 
 
 //
 // EFI Runtime Serivces Table
 //
 
 #define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552
 #define EFI_RUNTIME_SERVICES_REVISION   ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
 
 typedef struct  {
   EFI_TABLE_HEADER                Hdr;
 
   //
   // Time services
   //
 
   EFI_GET_TIME                    GetTime;
   EFI_SET_TIME                    SetTime;
   EFI_GET_WAKEUP_TIME             GetWakeupTime;
   EFI_SET_WAKEUP_TIME             SetWakeupTime;
 
   //
   // Virtual memory services
   //
 
   EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
   EFI_CONVERT_POINTER             ConvertPointer;
 
   //
   // Variable serviers
   //
 
   EFI_GET_VARIABLE                GetVariable;
   EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
   EFI_SET_VARIABLE                SetVariable;
 
   //
   // Misc
   //
 
   EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
   EFI_RESET_SYSTEM                ResetSystem;
 
 } EFI_RUNTIME_SERVICES;
 
 
 //
 // EFI Boot Services Table
 //
 
 #define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
 #define EFI_BOOT_SERVICES_REVISION      ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
 
 typedef struct {
 
   EFI_TABLE_HEADER                Hdr;
 
   //
   // Task priority functions
   //
 
   EFI_RAISE_TPL                   RaiseTPL;
   EFI_RESTORE_TPL                 RestoreTPL;
 
   //
   // Memory functions
   //
 
   EFI_ALLOCATE_PAGES              AllocatePages;
   EFI_FREE_PAGES                  FreePages;
   EFI_GET_MEMORY_MAP              GetMemoryMap;
   EFI_ALLOCATE_POOL               AllocatePool;
   EFI_FREE_POOL                   FreePool;
 
   //
   // Event & timer functions
   //
 
   EFI_CREATE_EVENT                CreateEvent;
   EFI_SET_TIMER                   SetTimer;
   EFI_WAIT_FOR_EVENT              WaitForEvent;
   EFI_SIGNAL_EVENT                SignalEvent;
   EFI_CLOSE_EVENT                 CloseEvent;
   EFI_CHECK_EVENT                 CheckEvent;
 
   //
   // Protocol handler functions
   //
 
   EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
   EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
   EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
   EFI_HANDLE_PROTOCOL             HandleProtocol;
   VOID                            *Reserved;
   EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
   EFI_LOCATE_HANDLE               LocateHandle;
   EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
   EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
 
   //
   // Image functions
   //
 
   EFI_IMAGE_LOAD                  LoadImage;
   EFI_IMAGE_START                 StartImage;
   EFI_EXIT                        Exit;
   EFI_IMAGE_UNLOAD                UnloadImage;
   EFI_EXIT_BOOT_SERVICES          ExitBootServices;
 
   //
   // Misc functions
   //
 
   EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
   EFI_STALL                       Stall;
   EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
 
   //
   // DriverSupport Services
   //
   EFI_CONNECT_CONTROLLER	        ConnectController;
   EFI_DISCONNECT_CONTROLLER       DisconnectController;
 
   //
   // Open and Close Protocol Services
   //
   EFI_OPEN_PROTOCOL               OpenProtocol;
   EFI_CLOSE_PROTOCOL              CloseProtocol;
   EFI_OPEN_PROTOCOL_INFORMATION   OpenProtocolInformation;
 
   //
   // Library Services to reduce size of drivers
   //
   EFI_PROTOCOLS_PER_HANDLE        ProtocolsPerHandle;
   EFI_LOCATE_HANDLE_BUFFER        LocateHandleBuffer;
   EFI_LOCATE_PROTOCOL             LocateProtocol;
 
   EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES    InstallMultipleProtocolInterfaces;
   EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES  UninstallMultipleProtocolInterfaces;
 
   //
   // CRC32 services
   //
   EFI_CALCULATE_CRC32             CalculateCrc32;
 
   //
   // Memory Utility Services
   //
   EFI_COPY_MEM                    CopyMem;
   EFI_SET_MEM                     SetMem;
 
 } EFI_BOOT_SERVICES;
 
 
 //
 // EFI Configuration Table and GUID definitions
 //
 
-#define MPS_TABLE_GUID    \
-  { 0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+#define MPS_TABLE_GUID \
+    { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
-#define ACPI_TABLE_GUID    \
-  { 0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+#define ACPI_TABLE_GUID \
+    { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
-#define ACPI_20_TABLE_GUID  \
-  { 0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 }
+#define ACPI_20_TABLE_GUID \
+    { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
 
-#define SMBIOS_TABLE_GUID    \
-  { 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+#define SMBIOS_TABLE_GUID \
+    { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
-#define SAL_SYSTEM_TABLE_GUID    \
-  { 0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+#define SAL_SYSTEM_TABLE_GUID  \
+    { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
-#define FDT_TABLE_GUID    \
-  { 0xb1b621d5, 0xf19c, 0x41a5, 0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0 }
+#define FDT_TABLE_GUID \
+    { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0} }
 
-#define DXE_SERVICES_TABLE_GUID	\
-  { 0x5ad34ba, 0x6f02, 0x4214, 0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9 }
+#define DXE_SERVICES_TABLE_GUID \
+    { 0x5ad34ba, 0x6f02, 0x4214, {0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9} }
 
-#define	HOB_LIST_TABLE_GUID	\
-  { 0x7739f24c, 0x93d7, 0x11d4, 0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+#define HOB_LIST_TABLE_GUID \
+    { 0x7739f24c, 0x93d7, 0x11d4, {0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 #define MEMORY_TYPE_INFORMATION_TABLE_GUID \
-  { 0x4c19049f, 0x4137, 0x4dd3, 0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa }
+    { 0x4c19049f, 0x4137, 0x4dd3, {0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa} }
 
 #define DEBUG_IMAGE_INFO_TABLE_GUID \
-  { 0x49152e77, 0x1ada, 0x4764, 0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b }
+    { 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} }
 
 typedef struct _EFI_CONFIGURATION_TABLE {
   EFI_GUID                VendorGuid;
   VOID                    *VendorTable;
 } EFI_CONFIGURATION_TABLE;
 
 
 //
 // EFI System Table
 //
 
 
 
 
 #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
 #define EFI_SYSTEM_TABLE_REVISION      ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
 #define EFI_1_10_SYSTEM_TABLE_REVISION ((1<<16) | 10)
 #define EFI_1_02_SYSTEM_TABLE_REVISION ((1<<16) | 02)
 
 typedef struct _EFI_SYSTEM_TABLE {
   EFI_TABLE_HEADER                Hdr;
 
   CHAR16                          *FirmwareVendor;
   UINT32                          FirmwareRevision;
 
   EFI_HANDLE                      ConsoleInHandle;
   SIMPLE_INPUT_INTERFACE          *ConIn;
 
   EFI_HANDLE                      ConsoleOutHandle;
   SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
 
   EFI_HANDLE                      StandardErrorHandle;
   SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
 
   EFI_RUNTIME_SERVICES            *RuntimeServices;
   EFI_BOOT_SERVICES               *BootServices;
 
   UINTN                           NumberOfTableEntries;
   EFI_CONFIGURATION_TABLE         *ConfigurationTable;
 
 } EFI_SYSTEM_TABLE;
 
 #endif
Index: head/sys/boot/efi/include/eficon.h
===================================================================
--- head/sys/boot/efi/include/eficon.h	(revision 293723)
+++ head/sys/boot/efi/include/eficon.h	(revision 293724)
@@ -1,309 +1,309 @@
 /* $FreeBSD$ */
 #ifndef _EFI_CON_H
 #define _EFI_CON_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     eficon.h
 
 Abstract:
 
     EFI console protocols
 
 
 
 Revision History
 
 --*/
 
 //
 // Text output protocol
 //
 
 #define SIMPLE_TEXT_OUTPUT_PROTOCOL \
-    { 0x387477c2, 0x69c7, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE);
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_RESET) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN BOOLEAN                      ExtendedVerification
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_OUTPUT_STRING) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN CHAR16                       *String
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_TEST_STRING) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN CHAR16                       *String
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_QUERY_MODE) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN UINTN                        ModeNumber,
     OUT UINTN                       *Columns,
     OUT UINTN                       *Rows
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_SET_MODE) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN UINTN                        ModeNumber
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_SET_ATTRIBUTE) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN UINTN                        Attribute
     );
 
 #define EFI_BLACK   0x00
 #define EFI_BLUE    0x01
 #define EFI_GREEN   0x02
 #define EFI_CYAN            (EFI_BLUE | EFI_GREEN)
 #define EFI_RED     0x04
 #define EFI_MAGENTA         (EFI_BLUE | EFI_RED)
 #define EFI_BROWN           (EFI_GREEN | EFI_RED)
 #define EFI_LIGHTGRAY       (EFI_BLUE | EFI_GREEN | EFI_RED)
 #define EFI_BRIGHT  0x08
 #define EFI_DARKGRAY        (EFI_BRIGHT)
 #define EFI_LIGHTBLUE       (EFI_BLUE | EFI_BRIGHT)
 #define EFI_LIGHTGREEN      (EFI_GREEN | EFI_BRIGHT)
 #define EFI_LIGHTCYAN       (EFI_CYAN | EFI_BRIGHT)
 #define EFI_LIGHTRED        (EFI_RED | EFI_BRIGHT)
 #define EFI_LIGHTMAGENTA    (EFI_MAGENTA | EFI_BRIGHT)
 #define EFI_YELLOW          (EFI_BROWN | EFI_BRIGHT)
 #define EFI_WHITE           (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT)
 
 #define EFI_TEXT_ATTR(f,b)  ((f) | ((b) << 4))
 
 #define EFI_BACKGROUND_BLACK        0x00
 #define EFI_BACKGROUND_BLUE         0x10
 #define EFI_BACKGROUND_GREEN        0x20
 #define EFI_BACKGROUND_CYAN         (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN)
 #define EFI_BACKGROUND_RED          0x40
 #define EFI_BACKGROUND_MAGENTA      (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED)
 #define EFI_BACKGROUND_BROWN        (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
 #define EFI_BACKGROUND_LIGHTGRAY    (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED)
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_CLEAR_SCREEN) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN UINTN                        Column,
     IN UINTN                        Row
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_TEXT_ENABLE_CURSOR) (
     IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE     *This,
     IN BOOLEAN                      Enable
     );
 
 typedef struct {
     INT32                           MaxMode;
     // current settings
     INT32                           Mode;
     INT32                           Attribute;
     INT32                           CursorColumn;
     INT32                           CursorRow;
     BOOLEAN                         CursorVisible;
 } SIMPLE_TEXT_OUTPUT_MODE;
 
 typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE {
     EFI_TEXT_RESET                  Reset;
 
     EFI_TEXT_OUTPUT_STRING          OutputString;
     EFI_TEXT_TEST_STRING            TestString;
 
     EFI_TEXT_QUERY_MODE             QueryMode;
     EFI_TEXT_SET_MODE               SetMode;
     EFI_TEXT_SET_ATTRIBUTE          SetAttribute;
 
     EFI_TEXT_CLEAR_SCREEN           ClearScreen;
     EFI_TEXT_SET_CURSOR_POSITION    SetCursorPosition;
     EFI_TEXT_ENABLE_CURSOR          EnableCursor;
 
     // Current mode
     SIMPLE_TEXT_OUTPUT_MODE         *Mode;
 } SIMPLE_TEXT_OUTPUT_INTERFACE;
 
 //
 // Define's for required EFI Unicode Box Draw character
 //
 
 #define BOXDRAW_HORIZONTAL                  0x2500
 #define BOXDRAW_VERTICAL                    0x2502
 #define BOXDRAW_DOWN_RIGHT                  0x250c
 #define BOXDRAW_DOWN_LEFT                   0x2510
 #define BOXDRAW_UP_RIGHT                    0x2514
 #define BOXDRAW_UP_LEFT                     0x2518
 #define BOXDRAW_VERTICAL_RIGHT              0x251c
 #define BOXDRAW_VERTICAL_LEFT               0x2524
 #define BOXDRAW_DOWN_HORIZONTAL             0x252c
 #define BOXDRAW_UP_HORIZONTAL               0x2534
 #define BOXDRAW_VERTICAL_HORIZONTAL         0x253c
 
 #define BOXDRAW_DOUBLE_HORIZONTAL           0x2550
 #define BOXDRAW_DOUBLE_VERTICAL             0x2551
 #define BOXDRAW_DOWN_RIGHT_DOUBLE           0x2552
 #define BOXDRAW_DOWN_DOUBLE_RIGHT           0x2553
 #define BOXDRAW_DOUBLE_DOWN_RIGHT           0x2554
 
 #define BOXDRAW_DOWN_LEFT_DOUBLE            0x2555
 #define BOXDRAW_DOWN_DOUBLE_LEFT            0x2556
 #define BOXDRAW_DOUBLE_DOWN_LEFT            0x2557
 
 #define BOXDRAW_UP_RIGHT_DOUBLE             0x2558
 #define BOXDRAW_UP_DOUBLE_RIGHT             0x2559
 #define BOXDRAW_DOUBLE_UP_RIGHT             0x255a
 
 #define BOXDRAW_UP_LEFT_DOUBLE              0x255b
 #define BOXDRAW_UP_DOUBLE_LEFT              0x255c
 #define BOXDRAW_DOUBLE_UP_LEFT              0x255d
 
 #define BOXDRAW_VERTICAL_RIGHT_DOUBLE       0x255e
 #define BOXDRAW_VERTICAL_DOUBLE_RIGHT       0x255f
 #define BOXDRAW_DOUBLE_VERTICAL_RIGHT       0x2560
 
 #define BOXDRAW_VERTICAL_LEFT_DOUBLE        0x2561
 #define BOXDRAW_VERTICAL_DOUBLE_LEFT        0x2562
 #define BOXDRAW_DOUBLE_VERTICAL_LEFT        0x2563
 
 #define BOXDRAW_DOWN_HORIZONTAL_DOUBLE      0x2564
 #define BOXDRAW_DOWN_DOUBLE_HORIZONTAL      0x2565
 #define BOXDRAW_DOUBLE_DOWN_HORIZONTAL      0x2566
 
 #define BOXDRAW_UP_HORIZONTAL_DOUBLE        0x2567
 #define BOXDRAW_UP_DOUBLE_HORIZONTAL        0x2568
 #define BOXDRAW_DOUBLE_UP_HORIZONTAL        0x2569
 
 #define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE  0x256a
 #define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL  0x256b
 #define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL  0x256c
 
 //
 // EFI Required Block Elements Code Chart
 //
 
 #define BLOCKELEMENT_FULL_BLOCK             0x2588
 #define BLOCKELEMENT_LIGHT_SHADE            0x2591
 //
 // EFI Required Geometric Shapes Code Chart
 //
 
 #define GEOMETRICSHAPE_UP_TRIANGLE           0x25b2
 #define GEOMETRICSHAPE_RIGHT_TRIANGLE        0x25ba
 #define GEOMETRICSHAPE_DOWN_TRIANGLE         0x25bc
 #define GEOMETRICSHAPE_LEFT_TRIANGLE         0x25c4
 
 //
 // EFI Required Arrow shapes
 //
 
 #define ARROW_UP                            0x2191
 #define ARROW_DOWN                          0x2193
 
 //
 // Text input protocol
 //
 
-#define SIMPLE_TEXT_INPUT_PROTOCOL  \
-    { 0x387477c1, 0x69c7, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+#define SIMPLE_TEXT_INPUT_PROTOCOL \
+    { 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE);
 
 typedef struct {
     UINT16                              ScanCode;
     CHAR16                              UnicodeChar;
 } EFI_INPUT_KEY;
 
 //
 // Baseline unicode control chars
 //
 
 #define CHAR_NULL                       0x0000
 #define CHAR_BACKSPACE                  0x0008
 #define CHAR_TAB                        0x0009
 #define CHAR_LINEFEED                   0x000A
 #define CHAR_CARRIAGE_RETURN            0x000D
 
 //
 // Scan codes for base line keys
 //
 
 #define SCAN_NULL                       0x0000
 #define SCAN_UP                         0x0001
 #define SCAN_DOWN                       0x0002
 #define SCAN_RIGHT                      0x0003
 #define SCAN_LEFT                       0x0004
 #define SCAN_HOME                       0x0005
 #define SCAN_END                        0x0006
 #define SCAN_INSERT                     0x0007
 #define SCAN_DELETE                     0x0008
 #define SCAN_PAGE_UP                    0x0009
 #define SCAN_PAGE_DOWN                  0x000A
 #define SCAN_F1                         0x000B
 #define SCAN_F2                         0x000C
 #define SCAN_F3                         0x000D
 #define SCAN_F4                         0x000E
 #define SCAN_F5                         0x000F
 #define SCAN_F6                         0x0010
 #define SCAN_F7                         0x0011
 #define SCAN_F8                         0x0012
 #define SCAN_F9                         0x0013
 #define SCAN_F10                        0x0014
 #define SCAN_ESC                        0x0017
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_INPUT_RESET) (
     IN struct _SIMPLE_INPUT_INTERFACE   *This,
     IN BOOLEAN                          ExtendedVerification
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_INPUT_READ_KEY) (
     IN struct _SIMPLE_INPUT_INTERFACE   *This,
     OUT EFI_INPUT_KEY                   *Key
     );
 
 typedef struct _SIMPLE_INPUT_INTERFACE {
     EFI_INPUT_RESET                     Reset;
     EFI_INPUT_READ_KEY                  ReadKeyStroke;
     EFI_EVENT                           WaitForKey;
 } SIMPLE_INPUT_INTERFACE;
 
 #endif
Index: head/sys/boot/efi/include/eficonsctl.h
===================================================================
--- head/sys/boot/efi/include/eficonsctl.h	(revision 293723)
+++ head/sys/boot/efi/include/eficonsctl.h	(revision 293724)
@@ -1,134 +1,134 @@
 /*-
  * Copyright (c) 2004 - 2010, Intel Corporation. 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 COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
  */
 
 /*
  * Original Module Name: ConsoleControl.h
  * Abstract: Abstraction of a Text mode or GOP/UGA screen
  */
 
 /* $FreeBSD$ */
 
 #ifndef _EFI_CONS_CTL_H
 #define _EFI_CONS_CTL_H
 
 #define EFI_CONSOLE_CONTROL_PROTOCOL_GUID \
-  { 0xf42f7782, 0x12e, 0x4c12, {0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21} }
+    { 0xf42f7782, 0x12e, 0x4c12, {0x99, 0x56, 0x49, 0xf9, 0x43, 0x4, 0xf7, 0x21} }
 
 typedef struct _EFI_CONSOLE_CONTROL_PROTOCOL   EFI_CONSOLE_CONTROL_PROTOCOL;
 
 
 typedef enum {
   EfiConsoleControlScreenText,
   EfiConsoleControlScreenGraphics,
   EfiConsoleControlScreenMaxValue
 } EFI_CONSOLE_CONTROL_SCREEN_MODE;
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE) (
   IN  EFI_CONSOLE_CONTROL_PROTOCOL      *This,
   OUT EFI_CONSOLE_CONTROL_SCREEN_MODE   *Mode,
   OUT BOOLEAN                           *GopUgaExists,  OPTIONAL
   OUT BOOLEAN                           *StdInLocked    OPTIONAL
   )
 /*++
 
   Routine Description:
     Return the current video mode information. Also returns info about existence
     of Graphics Output devices or UGA Draw devices in system, and if the Std In
     device is locked. All the arguments are optional and only returned if a non
     NULL pointer is passed in.
 
   Arguments:
     This         - Protocol instance pointer.
     Mode         - Are we in text of grahics mode.
     GopUgaExists - TRUE if Console Spliter has found a GOP or UGA device
     StdInLocked  - TRUE if StdIn device is keyboard locked
 
   Returns:
     EFI_SUCCESS     - Mode information returned.
 
 --*/
 ;
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE) (
   IN  EFI_CONSOLE_CONTROL_PROTOCOL      *This,
   IN  EFI_CONSOLE_CONTROL_SCREEN_MODE   Mode
   )
 /*++
 
   Routine Description:
     Set the current mode to either text or graphics. Graphics is
     for Quiet Boot.
 
   Arguments:
     This  - Protocol instance pointer.
     Mode  - Mode to set the
 
   Returns:
     EFI_SUCCESS     - Mode information returned.
 
 --*/
 ;
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN) (
   IN  EFI_CONSOLE_CONTROL_PROTOCOL      *This,
   IN CHAR16                             *Password
   )
 /*++
 
   Routine Description:
     Lock Std In devices until Password is typed.
 
   Arguments:
     This     - Protocol instance pointer.
     Password - Password needed to unlock screen. NULL means unlock keyboard
 
   Returns:
     EFI_SUCCESS      - Mode information returned.
     EFI_DEVICE_ERROR - Std In not locked
 
 --*/
 ;
 
 
 
 struct _EFI_CONSOLE_CONTROL_PROTOCOL {
   EFI_CONSOLE_CONTROL_PROTOCOL_GET_MODE           GetMode;
   EFI_CONSOLE_CONTROL_PROTOCOL_SET_MODE           SetMode;
   EFI_CONSOLE_CONTROL_PROTOCOL_LOCK_STD_IN        LockStdIn;
 };
 
 extern EFI_GUID gEfiConsoleControlProtocolGuid;
 
 #endif
Index: head/sys/boot/efi/include/efidevp.h
===================================================================
--- head/sys/boot/efi/include/efidevp.h	(revision 293723)
+++ head/sys/boot/efi/include/efidevp.h	(revision 293724)
@@ -1,423 +1,423 @@
 /* $FreeBSD$ */
 #ifndef _DEVPATH_H
 #define _DEVPATH_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     devpath.h
 
 Abstract:
 
     Defines for parsing the EFI Device Path structures
 
 
 
 Revision History
 
 --*/
 
 //
 // Device Path structures - Section C
 //
 
 typedef struct _EFI_DEVICE_PATH {
         UINT8                           Type;
         UINT8                           SubType;
         UINT8                           Length[2];
 } EFI_DEVICE_PATH;
 
 #define EFI_DP_TYPE_MASK                    0x7F
 #define EFI_DP_TYPE_UNPACKED                0x80
 
 //#define END_DEVICE_PATH_TYPE                0xff
 #define END_DEVICE_PATH_TYPE                0x7f
 //#define END_DEVICE_PATH_TYPE_UNPACKED       0x7f
 
 #define END_ENTIRE_DEVICE_PATH_SUBTYPE      0xff
 #define END_INSTANCE_DEVICE_PATH_SUBTYPE    0x01
 #define END_DEVICE_PATH_LENGTH              (sizeof(EFI_DEVICE_PATH))
 
 
 #define DP_IS_END_TYPE(a)
 #define DP_IS_END_SUBTYPE(a)        ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
 
 #define DevicePathType(a)           ( ((a)->Type) & EFI_DP_TYPE_MASK )
 #define DevicePathSubType(a)        ( (a)->SubType )
 #define DevicePathNodeLength(a)     ( ((a)->Length[0]) | ((a)->Length[1] << 8) )
 #define NextDevicePathNode(a)       ( (EFI_DEVICE_PATH *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a)))
 //#define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED )
 #define IsDevicePathEndType(a)      ( DevicePathType(a) == END_DEVICE_PATH_TYPE )
 #define IsDevicePathEndSubType(a)   ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE )
 #define IsDevicePathEnd(a)          ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) )
 #define IsDevicePathUnpacked(a)     ( (a)->Type & EFI_DP_TYPE_UNPACKED )
 
 
 #define SetDevicePathNodeLength(a,l) {                  \
             (a)->Length[0] = (UINT8) (l);               \
             (a)->Length[1] = (UINT8) ((l) >> 8);        \
             }
 
 #define SetDevicePathEndNode(a)  {                      \
             (a)->Type = END_DEVICE_PATH_TYPE;           \
             (a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;     \
             (a)->Length[0] = sizeof(EFI_DEVICE_PATH);   \
             (a)->Length[1] = 0;                         \
             }
 
 
 
 /*
  *
  */
 #define HARDWARE_DEVICE_PATH            0x01
 
 #define HW_PCI_DP                       0x01
 typedef struct _PCI_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT8                           Function;
         UINT8                           Device;
 } PCI_DEVICE_PATH;
 
 #define HW_PCCARD_DP                    0x02
 typedef struct _PCCARD_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT8                           FunctionNumber;
 } PCCARD_DEVICE_PATH;
 
 #define HW_MEMMAP_DP                    0x03
 typedef struct _MEMMAP_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          MemoryType;
         EFI_PHYSICAL_ADDRESS            StartingAddress;
         EFI_PHYSICAL_ADDRESS            EndingAddress;
 } MEMMAP_DEVICE_PATH;
 
 #define HW_VENDOR_DP                    0x04
 typedef struct _VENDOR_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         EFI_GUID                        Guid;
 } VENDOR_DEVICE_PATH;
 
 #define UNKNOWN_DEVICE_GUID \
-    { 0xcf31fac5, 0xc24e, 0x11d2,  0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b  }
+    { 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} }
 
 typedef struct _UKNOWN_DEVICE_VENDOR_DP {
     VENDOR_DEVICE_PATH      DevicePath;
     UINT8                   LegacyDriveLetter;
 } UNKNOWN_DEVICE_VENDOR_DEVICE_PATH;
 
 #define HW_CONTROLLER_DP            0x05
 typedef struct _CONTROLLER_DEVICE_PATH {
         EFI_DEVICE_PATH     Header;
         UINT32              Controller;
 } CONTROLLER_DEVICE_PATH;
 
 /*
  *
  */
 #define ACPI_DEVICE_PATH                 0x02
 
 #define ACPI_DP                         0x01
 typedef struct _ACPI_HID_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          HID;
         UINT32                          UID;
 } ACPI_HID_DEVICE_PATH;
 
 #define ACPI_EXTENDED_DP          0x02
 typedef struct _ACPI_EXTENDED_HID_DEVICE_PATH {
   EFI_DEVICE_PATH                 Header;
   UINT32                          HID;
   UINT32                          UID;
   UINT32                          CID;
 } ACPI_EXTENDED_HID_DEVICE_PATH;
 
 //
 // EISA ID Macro
 // EISA ID Definition 32-bits
 //  bits[15:0] - three character compressed ASCII EISA ID.
 //  bits[31:16] - binary number
 //   Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z'
 //
 #define PNP_EISA_ID_CONST       0x41d0    
 #define EISA_ID(_Name, _Num)    ((UINT32) ((_Name) | (_Num) << 16))   
 #define EISA_PNP_ID(_PNPId)     (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
 #define EFI_PNP_ID(_PNPId)      (EISA_ID(PNP_EISA_ID_CONST, (_PNPId)))
 
 #define PNP_EISA_ID_MASK        0xffff
 #define EISA_ID_TO_NUM(_Id)     ((_Id) >> 16)
 /*
  *
  */
 #define MESSAGING_DEVICE_PATH           0x03 
 
 #define MSG_ATAPI_DP                    0x01
 typedef struct _ATAPI_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT8                           PrimarySecondary;
         UINT8                           SlaveMaster;
         UINT16                          Lun;
 } ATAPI_DEVICE_PATH;
 
 #define MSG_SCSI_DP                     0x02
 typedef struct _SCSI_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT16                          Pun;
         UINT16                          Lun; 
 } SCSI_DEVICE_PATH;
 
 #define MSG_FIBRECHANNEL_DP             0x03
 typedef struct _FIBRECHANNEL_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          Reserved;
         UINT64                          WWN;
         UINT64                          Lun;
 } FIBRECHANNEL_DEVICE_PATH;
 
 #define MSG_1394_DP                     0x04
 typedef struct _F1394_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          Reserved;
         UINT64                          Guid;
 } F1394_DEVICE_PATH;
 
 #define MSG_USB_DP                      0x05
 typedef struct _USB_DEVICE_PATH {
     EFI_DEVICE_PATH                     Header;
     UINT8					                      ParentPortNumber;
     UINT8					                      InterfaceNumber;
 } USB_DEVICE_PATH;
 
 #define MSG_USB_CLASS_DP                0x0F
 typedef struct _USB_CLASS_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT16                          VendorId;
         UINT16                          ProductId;
         UINT8                           DeviceClass;
         UINT8                           DeviceSubClass;
         UINT8                           DeviceProtocol;
 } USB_CLASS_DEVICE_PATH;
 
 #define MSG_I2O_DP                      0x06
 typedef struct _I2O_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          Tid;
 } I2O_DEVICE_PATH;
 
 #define MSG_MAC_ADDR_DP                 0x0b
 typedef struct _MAC_ADDR_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         EFI_MAC_ADDRESS                 MacAddress;
         UINT8                           IfType;
 } MAC_ADDR_DEVICE_PATH;
 
 #define MSG_IPv4_DP                     0x0c
 typedef struct _IPv4_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         EFI_IPv4_ADDRESS                LocalIpAddress;
         EFI_IPv4_ADDRESS                RemoteIpAddress;
         UINT16                          LocalPort;
         UINT16                          RemotePort;
         UINT16                          Protocol;
         BOOLEAN                         StaticIpAddress;
 } IPv4_DEVICE_PATH;
 
 #define MSG_IPv6_DP                     0x0d
 typedef struct _IPv6_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         EFI_IPv6_ADDRESS                LocalIpAddress;
         EFI_IPv6_ADDRESS                RemoteIpAddress;
         UINT16                          LocalPort;
         UINT16                          RemotePort;
         UINT16                          Protocol;
         BOOLEAN                         StaticIpAddress;
 } IPv6_DEVICE_PATH;
 
 #define MSG_INFINIBAND_DP               0x09
 typedef struct _INFINIBAND_DEVICE_PATH {
   EFI_DEVICE_PATH                       Header;
   UINT32                                ResourceFlags;
   UINT8                                 PortGid[16];
   UINT64                                ServiceId;
   UINT64                                TargetPortId;
   UINT64                                DeviceId;
 } INFINIBAND_DEVICE_PATH;
 
 #define INFINIBAND_RESOURCE_FLAG_IOC_SERVICE                0x01
 #define INFINIBAND_RESOURCE_FLAG_EXTENDED_BOOT_ENVIRONMENT  0x02
 #define INFINIBAND_RESOURCE_FLAG_CONSOLE_PROTOCOL           0x04
 #define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL           0x08
 #define INFINIBAND_RESOURCE_FLAG_NETWORK_PROTOCOL           0x10
 
 #define MSG_UART_DP                     0x0e
 typedef struct _UART_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          Reserved;
         UINT64                          BaudRate;
         UINT8                           DataBits;
         UINT8                           Parity;
         UINT8                           StopBits;
 } UART_DEVICE_PATH;
 
 #define MSG_VENDOR_DP                   0x0A
 /* Use VENDOR_DEVICE_PATH struct */
 
 #define DEVICE_PATH_MESSAGING_PC_ANSI \
-    { 0xe0c14753, 0xf9be, 0x11d2,  0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d  }
+    { 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 #define DEVICE_PATH_MESSAGING_VT_100 \
-    { 0xdfa66065, 0xb419, 0x11d3,  0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d  }
+    { 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 #define DEVICE_PATH_MESSAGING_VT_100_PLUS \
-    { 0x7baec70b, 0x57e0, 0x4c76, 0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43  }
+    { 0x7baec70b, 0x57e0, 0x4c76, {0x8e, 0x87, 0x2f, 0x9e, 0x28, 0x08, 0x83, 0x43} }
     
 #define DEVICE_PATH_MESSAGING_VT_UTF8 \
-    { 0xad15a0d6, 0x8bec, 0x4acf, 0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88 }   
+    { 0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} }
 
 
 #define MEDIA_DEVICE_PATH               0x04
 
 #define MEDIA_HARDDRIVE_DP              0x01
 typedef struct _HARDDRIVE_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          PartitionNumber;
         UINT64                          PartitionStart;
         UINT64                          PartitionSize;
         UINT8                           Signature[16];
         UINT8                           MBRType;
         UINT8                           SignatureType;
 } HARDDRIVE_DEVICE_PATH;
 
 #define MBR_TYPE_PCAT                       0x01
 #define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02
 
 #define SIGNATURE_TYPE_MBR                  0x01
 #define SIGNATURE_TYPE_GUID                 0x02
 
 #define MEDIA_CDROM_DP                  0x02
 typedef struct _CDROM_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT32                          BootEntry;
         UINT64                          PartitionStart;
         UINT64                          PartitionSize;
 } CDROM_DEVICE_PATH;
 
 #define MEDIA_VENDOR_DP                 0x03
 /* Use VENDOR_DEVICE_PATH struct */
 
 #define MEDIA_FILEPATH_DP               0x04
 typedef struct _FILEPATH_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         CHAR16                          PathName[1];
 } FILEPATH_DEVICE_PATH;
 
 #define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName)
 
 #define MEDIA_PROTOCOL_DP               0x05
 typedef struct _MEDIA_PROTOCOL_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         EFI_GUID                        Protocol;
 } MEDIA_PROTOCOL_DEVICE_PATH;
 
 
 #define BBS_DEVICE_PATH                 0x05
 #define BBS_BBS_DP                      0x01
 typedef struct _BBS_BBS_DEVICE_PATH {
         EFI_DEVICE_PATH                 Header;
         UINT16                          DeviceType;
         UINT16                          StatusFlag;
         CHAR8                           String[1];
 } BBS_BBS_DEVICE_PATH;
 
 /* DeviceType definitions - from BBS specification */
 #define BBS_TYPE_FLOPPY                 0x01
 #define BBS_TYPE_HARDDRIVE              0x02
 #define BBS_TYPE_CDROM                  0x03
 #define BBS_TYPE_PCMCIA                 0x04
 #define BBS_TYPE_USB                    0x05
 #define BBS_TYPE_EMBEDDED_NETWORK       0x06
 #define BBS_TYPE_DEV                    0x80
 #define BBS_TYPE_UNKNOWN                0xFF
 
 typedef union {
     EFI_DEVICE_PATH                      DevPath;
     PCI_DEVICE_PATH                      Pci;
     PCCARD_DEVICE_PATH                   PcCard;
     MEMMAP_DEVICE_PATH                   MemMap;
     VENDOR_DEVICE_PATH                   Vendor;
     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    UnknownVendor;   
     CONTROLLER_DEVICE_PATH               Controller;
     ACPI_HID_DEVICE_PATH                 Acpi;
 
     ATAPI_DEVICE_PATH                    Atapi;
     SCSI_DEVICE_PATH                     Scsi;
     FIBRECHANNEL_DEVICE_PATH             FibreChannel;
 
     F1394_DEVICE_PATH                    F1394;
     USB_DEVICE_PATH                      Usb;
     USB_CLASS_DEVICE_PATH                UsbClass;
     I2O_DEVICE_PATH                      I2O;
     MAC_ADDR_DEVICE_PATH                 MacAddr;
     IPv4_DEVICE_PATH                     Ipv4;
     IPv6_DEVICE_PATH                     Ipv6;
     INFINIBAND_DEVICE_PATH               InfiniBand;
     UART_DEVICE_PATH                     Uart;
 
     HARDDRIVE_DEVICE_PATH                HardDrive;
     CDROM_DEVICE_PATH                    CD;
 
     FILEPATH_DEVICE_PATH                 FilePath;
     MEDIA_PROTOCOL_DEVICE_PATH           MediaProtocol;
 
     BBS_BBS_DEVICE_PATH                  Bbs;
 
 } EFI_DEV_PATH;
 
 typedef union {
     EFI_DEVICE_PATH                      *DevPath;
     PCI_DEVICE_PATH                      *Pci;
     PCCARD_DEVICE_PATH                   *PcCard;
     MEMMAP_DEVICE_PATH                   *MemMap;
     VENDOR_DEVICE_PATH                   *Vendor;
     UNKNOWN_DEVICE_VENDOR_DEVICE_PATH    *UnknownVendor;   
     CONTROLLER_DEVICE_PATH               *Controller;
     ACPI_HID_DEVICE_PATH                 *Acpi;
     ACPI_EXTENDED_HID_DEVICE_PATH        *ExtendedAcpi;
 
     ATAPI_DEVICE_PATH                    *Atapi;
     SCSI_DEVICE_PATH                     *Scsi;
     FIBRECHANNEL_DEVICE_PATH             *FibreChannel;
 
     F1394_DEVICE_PATH                    *F1394;
     USB_DEVICE_PATH                      *Usb;
     USB_CLASS_DEVICE_PATH                *UsbClass;
     I2O_DEVICE_PATH                      *I2O;
     MAC_ADDR_DEVICE_PATH                 *MacAddr;
     IPv4_DEVICE_PATH                     *Ipv4;
     IPv6_DEVICE_PATH                     *Ipv6;
     INFINIBAND_DEVICE_PATH               *InfiniBand;
     UART_DEVICE_PATH                     *Uart;
 
     HARDDRIVE_DEVICE_PATH                *HardDrive;
 
     FILEPATH_DEVICE_PATH                 *FilePath;
     MEDIA_PROTOCOL_DEVICE_PATH           *MediaProtocol;
 
     CDROM_DEVICE_PATH                    *CD;
     BBS_BBS_DEVICE_PATH                  *Bbs;
 
 } EFI_DEV_PATH_PTR;
 
 
 #endif
Index: head/sys/boot/efi/include/efierr.h
===================================================================
--- head/sys/boot/efi/include/efierr.h	(revision 293723)
+++ head/sys/boot/efi/include/efierr.h	(revision 293724)
@@ -1,68 +1,68 @@
 /* $FreeBSD$ */
 #ifndef _EFI_ERR_H
 #define _EFI_ERR_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efierr.h
 
 Abstract:
 
     EFI error codes
 
 
 
 
 Revision History
 
 --*/
 
 
 #define EFIWARN(a)                            (a)
 #define EFI_ERROR(a)             (((INTN) a) < 0)
-#define EFI_ERROR_CODE(a)   (a & ~EFI_ERROR_MASK)
+#define EFI_ERROR_CODE(a)   (unsigned long)(a & ~EFI_ERROR_MASK)
 
 
 #define EFI_SUCCESS                             0
 #define EFI_LOAD_ERROR                  EFIERR(1)
 #define EFI_INVALID_PARAMETER           EFIERR(2)
 #define EFI_UNSUPPORTED                 EFIERR(3)
 #define EFI_BAD_BUFFER_SIZE             EFIERR(4)
 #define EFI_BUFFER_TOO_SMALL            EFIERR(5)
 #define EFI_NOT_READY                   EFIERR(6)
 #define EFI_DEVICE_ERROR                EFIERR(7)
 #define EFI_WRITE_PROTECTED             EFIERR(8)
 #define EFI_OUT_OF_RESOURCES            EFIERR(9)
 #define EFI_VOLUME_CORRUPTED            EFIERR(10)
 #define EFI_VOLUME_FULL                 EFIERR(11)
 #define EFI_NO_MEDIA                    EFIERR(12)
 #define EFI_MEDIA_CHANGED               EFIERR(13)
 #define EFI_NOT_FOUND                   EFIERR(14)
 #define EFI_ACCESS_DENIED               EFIERR(15)
 #define EFI_NO_RESPONSE                 EFIERR(16)
 #define EFI_NO_MAPPING                  EFIERR(17)
 #define EFI_TIMEOUT                     EFIERR(18)
 #define EFI_NOT_STARTED                 EFIERR(19)
 #define EFI_ALREADY_STARTED             EFIERR(20)
 #define EFI_ABORTED                     EFIERR(21)
 #define EFI_ICMP_ERROR                  EFIERR(22)
 #define EFI_TFTP_ERROR                  EFIERR(23)
 #define EFI_PROTOCOL_ERROR              EFIERR(24)
 
 #define EFI_WARN_UNKNOWN_GLYPH          EFIWARN(1)
 #define EFI_WARN_DELETE_FAILURE         EFIWARN(2)
 #define EFI_WARN_WRITE_FAILURE          EFIWARN(3)
 #define EFI_WARN_BUFFER_TOO_SMALL       EFIWARN(4)
 
 #endif
Index: head/sys/boot/efi/include/efifpswa.h
===================================================================
--- head/sys/boot/efi/include/efifpswa.h	(revision 293723)
+++ head/sys/boot/efi/include/efifpswa.h	(revision 293724)
@@ -1,40 +1,40 @@
 /* $FreeBSD$ */
 #ifndef _EFI_FPSWA_H
 #define _EFI_FPSWA_H
 
 /*
  * EFI FP SWA Driver (Floating Point Software Assist)
  */
 
 #define EFI_INTEL_FPSWA \
-    { 0xc41b6531, 0x97b9, 0x11d3, 0x9a, 0x29, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+    { 0xc41b6531, 0x97b9, 0x11d3, {0x9a, 0x29, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 INTERFACE_DECL(_FPSWA_INTERFACE);
 
 typedef struct _FPSWA_RET {
     UINT64                          status;
     UINT64                          err1;
     UINT64                          err2;
     UINT64                          err3;
 } FPSWA_RET;
 
 typedef
 FPSWA_RET
 (EFIAPI *EFI_FPSWA) (
     IN UINTN                        TrapType,
     IN OUT VOID                     *Bundle,
     IN OUT UINT64                   *pipsr,
     IN OUT UINT64                   *pfsr,
     IN OUT UINT64                   *pisr,
     IN OUT UINT64                   *ppreds,
     IN OUT UINT64                   *pifs,
     IN OUT VOID                     *fp_state
     );
 
 typedef struct _FPSWA_INTERFACE {
     UINT32                          Revision;
     UINT32                          Reserved;
     EFI_FPSWA                       Fpswa;
 } FPSWA_INTERFACE;
 
 #endif
Index: head/sys/boot/efi/include/efigop.h
===================================================================
--- head/sys/boot/efi/include/efigop.h	(revision 293723)
+++ head/sys/boot/efi/include/efigop.h	(revision 293724)
@@ -1,122 +1,121 @@
 /* $FreeBSD$ */
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efigop.h
 
 Abstract:
     Info about framebuffers
 
 
 
 
 Revision History
 
 --*/
 
 #ifndef _EFIGOP_H
 #define _EFIGOP_H
 
-#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID				\
-    { 0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80,	\
-      0x51, 0x6a }
+#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
+    { 0x9042a9de, 0x23dc, 0x4a38, {0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a} }
 
 INTERFACE_DECL(_EFI_GRAPHICS_OUTPUT);
 
 typedef struct {
 	UINT32	RedMask;
 	UINT32	GreenMask;
 	UINT32	BlueMask;
 	UINT32	ReservedMask;
 } EFI_PIXEL_BITMASK;
 
 typedef enum {
 	PixelRedGreenBlueReserved8BitPerColor,
 	PixelBlueGreenRedReserved8BitPerColor,
 	PixelBitMask,
 	PixelBltOnly,
 	PixelFormatMax,
 } EFI_GRAPHICS_PIXEL_FORMAT;
 
 typedef struct {
 	UINT32				Version;
 	UINT32				HorizontalResolution;
 	UINT32				VerticalResolution;
 	EFI_GRAPHICS_PIXEL_FORMAT	PixelFormat;
 	EFI_PIXEL_BITMASK		PixelInformation;
 	UINT32				PixelsPerScanLine;
 } EFI_GRAPHICS_OUTPUT_MODE_INFORMATION;
 
 typedef struct {
 	UINT32					MaxMode;
 	UINT32					Mode;
 	EFI_GRAPHICS_OUTPUT_MODE_INFORMATION	*Info;
 	UINTN					SizeOfInfo;
 	EFI_PHYSICAL_ADDRESS			FrameBufferBase;
 	UINTN					FrameBufferSize;
 } EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE) (
     IN  struct _EFI_GRAPHICS_OUTPUT		*This,
     IN  UINT32					ModeNumber,
     OUT UINTN					*SizeOfInfo,
     OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION	**Info
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE) (
     IN  struct _EFI_GRAPHICS_OUTPUT	*This,
     IN  UINT32				ModeNumber
     );
 
 typedef struct {
 	UINT8	Blue;
 	UINT8	Green;
 	UINT8	Red;
 	UINT8	Reserved;
 } EFI_GRAPHICS_OUTPUT_BLT_PIXEL;
 
 typedef enum {
 	EfiBltVideoFill,
 	EfiBltVideoToBltBuffer,
 	EfiBltBufferToVideo,
 	EfiBltVideoToVideo,
 	EfiGraphcisOutputBltOperationMax,
 } EFI_GRAPHICS_OUTPUT_BLT_OPERATION;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT) (
     IN struct _EFI_GRAPHICS_OUTPUT		*This,
     IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL	*BltBuffer,
     IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION	BltOperation,
     IN UINTN					SourceX,
     IN UINTN					SourceY,
     IN UINTN					DestinationX,
     IN UINTN					DestinationY,
     IN UINTN					Width,
     IN UINTN					Height,
     IN UINTN					Delta
     );
 
 typedef struct _EFI_GRAPHICS_OUTPUT {
 	EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE	QueryMode;
 	EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE	SetMode;
 	EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT	Blt;
 	EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE	*Mode;
 } EFI_GRAPHICS_OUTPUT;
 
 #endif /* _EFIGOP_H */
Index: head/sys/boot/efi/include/efilib.h
===================================================================
--- head/sys/boot/efi/include/efilib.h	(revision 293723)
+++ head/sys/boot/efi/include/efilib.h	(revision 293724)
@@ -1,52 +1,53 @@
 /*-
  * Copyright (c) 2000 Doug Rabson
  * Copyright (c) 2006 Marcel Moolenaar
  * 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.
  *
  * $FreeBSD$
  */
 
 #include <stand.h>
 
 extern EFI_HANDLE		IH;
 extern EFI_SYSTEM_TABLE		*ST;
 extern EFI_BOOT_SERVICES	*BS;
 extern EFI_RUNTIME_SERVICES	*RS;
 
 extern struct devsw efipart_dev;
 extern struct devsw efinet_dev;
 extern struct netif_driver efinetif;
 
 void *efi_get_table(EFI_GUID *tbl);
 void efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table);
 
 int efi_register_handles(struct devsw *, EFI_HANDLE *, EFI_HANDLE *, int);
 EFI_HANDLE efi_find_handle(struct devsw *, int);
 int efi_handle_lookup(EFI_HANDLE, struct devsw **, int *);
 
 int efi_status_to_errno(EFI_STATUS);
 time_t efi_time(EFI_TIME *);
 
 EFI_STATUS main(int argc, CHAR16 *argv[]);
 void exit(EFI_STATUS status);
+void delay(int usecs);
Index: head/sys/boot/efi/include/efinet.h
===================================================================
--- head/sys/boot/efi/include/efinet.h	(revision 293723)
+++ head/sys/boot/efi/include/efinet.h	(revision 293724)
@@ -1,348 +1,348 @@
 /* $FreeBSD$ */
 #ifndef _EFINET_H
 #define _EFINET_H
 
 
 /*++
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
     efinet.h
 
 Abstract:
     EFI Simple Network protocol
 
 Revision History
 --*/
 
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 //      Simple Network Protocol
 //
 
 #define EFI_SIMPLE_NETWORK_PROTOCOL \
-    { 0xA19832B9, 0xAC25, 0x11D3, 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }
+    { 0xA19832B9, 0xAC25, 0x11D3, {0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
 
 
 INTERFACE_DECL(_EFI_SIMPLE_NETWORK);
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef struct {
     //
     // Total number of frames received.  Includes frames with errors and
     // dropped frames.
     //
     UINT64  RxTotalFrames;
 
     //
     // Number of valid frames received and copied into receive buffers.
     //
     UINT64  RxGoodFrames;
 
     //
     // Number of frames below the minimum length for the media.
     // This would be <64 for ethernet.
     //
     UINT64  RxUndersizeFrames;
 
     //
     // Number of frames longer than the maxminum length for the
     // media.  This would be >1500 for ethernet.
     //
     UINT64  RxOversizeFrames;
 
     //
     // Valid frames that were dropped because receive buffers were full.
     //
     UINT64  RxDroppedFrames;
 
     //
     // Number of valid unicast frames received and not dropped.
     //
     UINT64  RxUnicastFrames;
 
     //
     // Number of valid broadcast frames received and not dropped.
     //
     UINT64  RxBroadcastFrames;
 
     //
     // Number of valid mutlicast frames received and not dropped.
     //
     UINT64  RxMulticastFrames;
 
     //
     // Number of frames w/ CRC or alignment errors.
     //
     UINT64  RxCrcErrorFrames;
 
     //
     // Total number of bytes received.  Includes frames with errors
     // and dropped frames.
     //
     UINT64  RxTotalBytes;
 
     //
     // Transmit statistics.
     //
     UINT64  TxTotalFrames;
     UINT64  TxGoodFrames;
     UINT64  TxUndersizeFrames;
     UINT64  TxOversizeFrames;
     UINT64  TxDroppedFrames;
     UINT64  TxUnicastFrames;
     UINT64  TxBroadcastFrames;
     UINT64  TxMulticastFrames;
     UINT64  TxCrcErrorFrames;
     UINT64  TxTotalBytes;
 
     //
     // Number of collisions detection on this subnet.
     //
     UINT64  Collisions;
 
     //
     // Number of frames destined for unsupported protocol.
     //
     UINT64  UnsupportedProtocol;
 
 } EFI_NETWORK_STATISTICS;
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef enum {
     EfiSimpleNetworkStopped,
     EfiSimpleNetworkStarted,
     EfiSimpleNetworkInitialized,
     EfiSimpleNetworkMaxState
 } EFI_SIMPLE_NETWORK_STATE;
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 #define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST               0x01
 #define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST             0x02
 #define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST             0x04
 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS           0x08
 #define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 #define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT        0x01
 #define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT       0x02
 #define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT        0x04
 #define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT       0x08
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 #define MAX_MCAST_FILTER_CNT    16
 typedef struct {
     UINT32                      State;
     UINT32                      HwAddressSize;
     UINT32                      MediaHeaderSize;
     UINT32                      MaxPacketSize;
     UINT32                      NvRamSize;
     UINT32                      NvRamAccessSize;
     UINT32                      ReceiveFilterMask;
     UINT32                      ReceiveFilterSetting;
     UINT32                      MaxMCastFilterCount;
     UINT32                      MCastFilterCount;
     EFI_MAC_ADDRESS             MCastFilter[MAX_MCAST_FILTER_CNT];
     EFI_MAC_ADDRESS             CurrentAddress;
     EFI_MAC_ADDRESS             BroadcastAddress;
     EFI_MAC_ADDRESS             PermanentAddress;
     UINT8                       IfType;
     BOOLEAN                     MacAddressChangeable;
     BOOLEAN                     MultipleTxSupported;
     BOOLEAN                     MediaPresentSupported;
     BOOLEAN                     MediaPresent;
 } EFI_SIMPLE_NETWORK_MODE;
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_START) (
     IN struct _EFI_SIMPLE_NETWORK  *This
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_STOP) (
     IN struct _EFI_SIMPLE_NETWORK  *This
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_INITIALIZE) (
     IN struct _EFI_SIMPLE_NETWORK  *This,
     IN UINTN                       ExtraRxBufferSize  OPTIONAL,
     IN UINTN                       ExtraTxBufferSize  OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_RESET) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN BOOLEAN                      ExtendedVerification
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_SHUTDOWN) (
     IN struct _EFI_SIMPLE_NETWORK  *This
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE_FILTERS) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN UINT32                       Enable,
     IN UINT32                       Disable,
     IN BOOLEAN                      ResetMCastFilter,
     IN UINTN                        MCastFilterCnt     OPTIONAL,
     IN EFI_MAC_ADDRESS              *MCastFilter       OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_STATION_ADDRESS) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN BOOLEAN                      Reset,
     IN EFI_MAC_ADDRESS              *New      OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_STATISTICS) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN BOOLEAN                      Reset,
     IN OUT UINTN                    *StatisticsSize   OPTIONAL,
     OUT EFI_NETWORK_STATISTICS      *StatisticsTable  OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN BOOLEAN                      IPv6,
     IN EFI_IP_ADDRESS               *IP,
     OUT EFI_MAC_ADDRESS             *MAC
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_NVDATA) (
     IN struct _EFI_SIMPLE_NETWORK  *This,
     IN BOOLEAN                     ReadWrite,
     IN UINTN                       Offset,
     IN UINTN                       BufferSize,
     IN OUT VOID                    *Buffer
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_GET_STATUS) (
     IN struct _EFI_SIMPLE_NETWORK  *This,
     OUT UINT32                     *InterruptStatus  OPTIONAL,
     OUT VOID                       **TxBuf           OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_TRANSMIT) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     IN UINTN                        HeaderSize,
     IN UINTN                        BufferSize,
     IN VOID                         *Buffer,
     IN EFI_MAC_ADDRESS              *SrcAddr     OPTIONAL,
     IN EFI_MAC_ADDRESS              *DestAddr    OPTIONAL,
     IN UINT16                       *Protocol    OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 typedef 
 EFI_STATUS 
 (EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE) (
     IN struct _EFI_SIMPLE_NETWORK   *This,
     OUT UINTN                       *HeaderSize  OPTIONAL,
     IN OUT UINTN                    *BufferSize,
     OUT VOID                        *Buffer,
     OUT EFI_MAC_ADDRESS             *SrcAddr     OPTIONAL,
     OUT EFI_MAC_ADDRESS             *DestAddr    OPTIONAL,
     OUT UINT16                      *Protocol    OPTIONAL
 );
 
 ///////////////////////////////////////////////////////////////////////////////
 //
 
 #define EFI_SIMPLE_NETWORK_INTERFACE_REVISION   0x00010000
 
 typedef struct _EFI_SIMPLE_NETWORK {
     UINT64                              Revision;
     EFI_SIMPLE_NETWORK_START            Start;
     EFI_SIMPLE_NETWORK_STOP             Stop;
     EFI_SIMPLE_NETWORK_INITIALIZE       Initialize;
     EFI_SIMPLE_NETWORK_RESET            Reset;
     EFI_SIMPLE_NETWORK_SHUTDOWN         Shutdown;
     EFI_SIMPLE_NETWORK_RECEIVE_FILTERS  ReceiveFilters;
     EFI_SIMPLE_NETWORK_STATION_ADDRESS  StationAddress;
     EFI_SIMPLE_NETWORK_STATISTICS       Statistics;
     EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC  MCastIpToMac;
     EFI_SIMPLE_NETWORK_NVDATA           NvData;
     EFI_SIMPLE_NETWORK_GET_STATUS       GetStatus;
     EFI_SIMPLE_NETWORK_TRANSMIT         Transmit;
     EFI_SIMPLE_NETWORK_RECEIVE          Receive;
     EFI_EVENT                           WaitForPacket;
     EFI_SIMPLE_NETWORK_MODE             *Mode;
 } EFI_SIMPLE_NETWORK;
 
 #endif /* _EFINET_H */
Index: head/sys/boot/efi/include/efipciio.h
===================================================================
--- head/sys/boot/efi/include/efipciio.h	(revision 293723)
+++ head/sys/boot/efi/include/efipciio.h	(revision 293724)
@@ -1,559 +1,557 @@
 /* $FreeBSD$ */
 /** @file
   EFI PCI I/O Protocol provides the basic Memory, I/O, PCI configuration, 
   and DMA interfaces that a driver uses to access its PCI controller.
 
   Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials                          
   are licensed and made available under the terms and conditions of the BSD License         
   which accompanies this distribution.  The full text of the license may be found at        
   http://opensource.org/licenses/bsd-license.php                                            
 
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 
 **/
 
 #ifndef __PCI_IO_H__
 #define __PCI_IO_H__
 
 ///
 /// Global ID for the PCI I/O Protocol
 ///
 #define EFI_PCI_IO_PROTOCOL_GUID \
-  { \
-    0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a } \
-  }
+    { 0x4cf5b200, 0x68b8, 0x4ca5, {0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a} }
 
 typedef struct _EFI_PCI_IO_PROTOCOL  EFI_PCI_IO_PROTOCOL;
 
 ///
 /// *******************************************************
 /// EFI_PCI_IO_PROTOCOL_WIDTH
 /// *******************************************************
 ///
 typedef enum {
   EfiPciIoWidthUint8      = 0,
   EfiPciIoWidthUint16,
   EfiPciIoWidthUint32,
   EfiPciIoWidthUint64,
   EfiPciIoWidthFifoUint8,
   EfiPciIoWidthFifoUint16,
   EfiPciIoWidthFifoUint32,
   EfiPciIoWidthFifoUint64,
   EfiPciIoWidthFillUint8,
   EfiPciIoWidthFillUint16,
   EfiPciIoWidthFillUint32,
   EfiPciIoWidthFillUint64,
   EfiPciIoWidthMaximum
 } EFI_PCI_IO_PROTOCOL_WIDTH;
 
 //
 // Complete PCI address generater
 //
 #define EFI_PCI_IO_PASS_THROUGH_BAR               0xff    ///< Special BAR that passes a memory or I/O cycle through unchanged
 #define EFI_PCI_IO_ATTRIBUTE_MASK                 0x077f  ///< All the following I/O and Memory cycles
 #define EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO   0x0001  ///< I/O cycles 0x0000-0x00FF (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_ISA_IO               0x0002  ///< I/O cycles 0x0100-0x03FF or greater (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO       0x0004  ///< I/O cycles 0x3C6, 0x3C8, 0x3C9 (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY           0x0008  ///< MEM cycles 0xA0000-0xBFFFF (24 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_VGA_IO               0x0010  ///< I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO       0x0020  ///< I/O cycles 0x1F0-0x1F7, 0x3F6, 0x3F7 (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO     0x0040  ///< I/O cycles 0x170-0x177, 0x376, 0x377 (10 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_WRITE_COMBINE 0x0080  ///< Map a memory range so writes are combined
 #define EFI_PCI_IO_ATTRIBUTE_IO                   0x0100  ///< Enable the I/O decode bit in the PCI Config Header
 #define EFI_PCI_IO_ATTRIBUTE_MEMORY               0x0200  ///< Enable the Memory decode bit in the PCI Config Header
 #define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER           0x0400  ///< Enable the DMA bit in the PCI Config Header
 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_CACHED        0x0800  ///< Map a memory range so all r/w accesses are cached
 #define EFI_PCI_IO_ATTRIBUTE_MEMORY_DISABLE       0x1000  ///< Disable a memory range
 #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_DEVICE      0x2000  ///< Clear for an add-in PCI Device
 #define EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM         0x4000  ///< Clear for a physical PCI Option ROM accessed through ROM BAR
 #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE   0x8000  ///< Clear for PCI controllers that can not genrate a DAC
 #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16            0x10000 ///< I/O cycles 0x0100-0x03FF or greater (16 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16    0x20000 ///< I/O cycles 0x3C6, 0x3C8, 0x3C9 (16 bit decode)
 #define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16            0x40000 ///< I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (16 bit decode)
 
 #define EFI_PCI_DEVICE_ENABLE                     (EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER)
 #define EFI_VGA_DEVICE_ENABLE                     (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_IO)
 
 ///
 /// *******************************************************
 /// EFI_PCI_IO_PROTOCOL_OPERATION
 /// *******************************************************
 ///
 typedef enum {
   ///
   /// A read operation from system memory by a bus master.
   ///
   EfiPciIoOperationBusMasterRead,
   ///
   /// A write operation from system memory by a bus master.
   ///
   EfiPciIoOperationBusMasterWrite,
   ///
   /// Provides both read and write access to system memory by both the processor and a
   /// bus master. The buffer is coherent from both the processor's and the bus master's point of view.
   ///
   EfiPciIoOperationBusMasterCommonBuffer,
   EfiPciIoOperationMaximum
 } EFI_PCI_IO_PROTOCOL_OPERATION;
 
 ///
 /// *******************************************************
 /// EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION
 /// *******************************************************
 ///
 typedef enum {
   ///
   /// Retrieve the PCI controller's current attributes, and return them in Result.
   ///
   EfiPciIoAttributeOperationGet,
   ///
   /// Set the PCI controller's current attributes to Attributes.
   ///
   EfiPciIoAttributeOperationSet,
   ///
   /// Enable the attributes specified by the bits that are set in Attributes for this PCI controller.
   ///
   EfiPciIoAttributeOperationEnable,
   ///
   /// Disable the attributes specified by the bits that are set in Attributes for this PCI controller.
   ///
   EfiPciIoAttributeOperationDisable,
   ///
   /// Retrieve the PCI controller's supported attributes, and return them in Result.
   ///
   EfiPciIoAttributeOperationSupported,
   EfiPciIoAttributeOperationMaximum
 } EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION;
 
 /**                                                                 
   Reads from the memory space of a PCI controller. Returns either when the polling exit criteria is
   satisfied or after a defined duration.                                                           
           
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.
   @param  Width                 Signifies the width of the memory or I/O operations.
   @param  BarIndex              The BAR index of the standard PCI Configuration header to use as the
                                 base address for the memory operation to perform.                   
   @param  Offset                The offset within the selected BAR to start the memory operation.
   @param  Mask                  Mask used for the polling criteria.
   @param  Value                 The comparison value used for the polling exit criteria.
   @param  Delay                 The number of 100 ns units to poll.
   @param  Result                Pointer to the last value read from the memory location.
                                 
   @retval EFI_SUCCESS           The last data returned from the access matched the poll exit criteria.
   @retval EFI_UNSUPPORTED       BarIndex not valid for this PCI controller.
   @retval EFI_UNSUPPORTED       Offset is not valid for the BarIndex of this PCI controller.
   @retval EFI_TIMEOUT           Delay expired before a match occurred.
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_POLL_IO_MEM)(
   IN EFI_PCI_IO_PROTOCOL           *This,
   IN  EFI_PCI_IO_PROTOCOL_WIDTH    Width,
   IN  UINT8                        BarIndex,
   IN  UINT64                       Offset,
   IN  UINT64                       Mask,
   IN  UINT64                       Value,
   IN  UINT64                       Delay,
   OUT UINT64                       *Result
   );
 
 /**                                                                 
   Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.
           
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.
   @param  Width                 Signifies the width of the memory or I/O operations.
   @param  BarIndex              The BAR index of the standard PCI Configuration header to use as the
                                 base address for the memory or I/O operation to perform.                    
   @param  Offset                The offset within the selected BAR to start the memory or I/O operation.                                
   @param  Count                 The number of memory or I/O operations to perform.
   @param  Buffer                For read operations, the destination buffer to store the results. For write
                                 operations, the source buffer to write data from.                          
   
   @retval EFI_SUCCESS           The data was read from or written to the PCI controller.
   @retval EFI_UNSUPPORTED       BarIndex not valid for this PCI controller.
   @retval EFI_UNSUPPORTED       The address range specified by Offset, Width, and Count is not
                                 valid for the PCI BAR specified by BarIndex.                  
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_IO_MEM)(
   IN EFI_PCI_IO_PROTOCOL              *This,
   IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
   IN     UINT8                        BarIndex,
   IN     UINT64                       Offset,
   IN     UINTN                        Count,
   IN OUT VOID                         *Buffer
   );
 
 typedef struct {
   ///
   /// Read PCI controller registers in the PCI memory or I/O space.
   ///
   EFI_PCI_IO_PROTOCOL_IO_MEM  Read;
   ///
   /// Write PCI controller registers in the PCI memory or I/O space.
   ///
   EFI_PCI_IO_PROTOCOL_IO_MEM  Write;
 } EFI_PCI_IO_PROTOCOL_ACCESS;
 
 /**                                                                 
   Enable a PCI driver to access PCI controller registers in PCI configuration space.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  Width                 Signifies the width of the memory operations.
   @param  Offset                The offset within the PCI configuration space for the PCI controller.
   @param  Count                 The number of PCI configuration operations to perform.
   @param  Buffer                For read operations, the destination buffer to store the results. For write
                                 operations, the source buffer to write data from.
   
                                   
   @retval EFI_SUCCESS           The data was read from or written to the PCI controller.
   @retval EFI_UNSUPPORTED       The address range specified by Offset, Width, and Count is not
                                 valid for the PCI configuration header of the PCI controller.
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.                                 
   @retval EFI_INVALID_PARAMETER Buffer is NULL or Width is invalid.                                
                                      
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_CONFIG)(
   IN EFI_PCI_IO_PROTOCOL              *This,
   IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
   IN     UINT32                       Offset,
   IN     UINTN                        Count,
   IN OUT VOID                         *Buffer
   );
 
 typedef struct {
   ///
   /// Read PCI controller registers in PCI configuration space.
   ///
   EFI_PCI_IO_PROTOCOL_CONFIG  Read;
   ///
   /// Write PCI controller registers in PCI configuration space.
   ///
   EFI_PCI_IO_PROTOCOL_CONFIG  Write;
 } EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS;
 
 /**                                                                 
   Enables a PCI driver to copy one region of PCI memory space to another region of PCI
   memory space.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.
   @param  Width                 Signifies the width of the memory operations.
   @param  DestBarIndex          The BAR index in the standard PCI Configuration header to use as the
                                 base address for the memory operation to perform.                   
   @param  DestOffset            The destination offset within the BAR specified by DestBarIndex to
                                 start the memory writes for the copy operation.                   
   @param  SrcBarIndex           The BAR index in the standard PCI Configuration header to use as the
                                 base address for the memory operation to perform.                   
   @param  SrcOffset             The source offset within the BAR specified by SrcBarIndex to start
                                 the memory reads for the copy operation.                          
   @param  Count                 The number of memory operations to perform. Bytes moved is Width
                                 size * Count, starting at DestOffset and SrcOffset.             
                                 
   @retval EFI_SUCCESS           The data was copied from one memory region to another memory region.
   @retval EFI_UNSUPPORTED       DestBarIndex not valid for this PCI controller.
   @retval EFI_UNSUPPORTED       SrcBarIndex not valid for this PCI controller.
   @retval EFI_UNSUPPORTED       The address range specified by DestOffset, Width, and Count
                                 is not valid for the PCI BAR specified by DestBarIndex.    
   @retval EFI_UNSUPPORTED       The address range specified by SrcOffset, Width, and Count is
                                 not valid for the PCI BAR specified by SrcBarIndex.          
   @retval EFI_INVALID_PARAMETER Width is invalid.
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_COPY_MEM)(
   IN EFI_PCI_IO_PROTOCOL              *This,
   IN     EFI_PCI_IO_PROTOCOL_WIDTH    Width,
   IN     UINT8                        DestBarIndex,
   IN     UINT64                       DestOffset,
   IN     UINT8                        SrcBarIndex,
   IN     UINT64                       SrcOffset,
   IN     UINTN                        Count
   );
 
 /**                                                                 
   Provides the PCI controller-specific addresses needed to access system memory.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.
   @param  Operation             Indicates if the bus master is going to read or write to system memory.
   @param  HostAddress           The system memory address to map to the PCI controller.
   @param  NumberOfBytes         On input the number of bytes to map. On output the number of bytes
                                 that were mapped.                                                 
   @param  DeviceAddress         The resulting map address for the bus master PCI controller to use to
                                 access the hosts HostAddress.                                        
   @param  Mapping               A resulting value to pass to Unmap().
                                   
   @retval EFI_SUCCESS           The range was mapped for the returned NumberOfBytes.
   @retval EFI_UNSUPPORTED       The HostAddress cannot be mapped as a common buffer.                                
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
   @retval EFI_DEVICE_ERROR      The system hardware could not map the requested address.
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_MAP)(
   IN EFI_PCI_IO_PROTOCOL                *This,
   IN     EFI_PCI_IO_PROTOCOL_OPERATION  Operation,
   IN     VOID                           *HostAddress,
   IN OUT UINTN                          *NumberOfBytes,
   OUT    EFI_PHYSICAL_ADDRESS           *DeviceAddress,
   OUT    VOID                           **Mapping
   );
 
 /**                                                                 
   Completes the Map() operation and releases any corresponding resources.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.                                      
   @param  Mapping               The mapping value returned from Map().
                                   
   @retval EFI_SUCCESS           The range was unmapped.
   @retval EFI_DEVICE_ERROR      The data was not committed to the target system memory.
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_UNMAP)(
   IN EFI_PCI_IO_PROTOCOL           *This,
   IN  VOID                         *Mapping
   );
 
 /**                                                                 
   Allocates pages that are suitable for an EfiPciIoOperationBusMasterCommonBuffer
   mapping.                                                                       
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.
   @param  Type                  This parameter is not used and must be ignored.
   @param  MemoryType            The type of memory to allocate, EfiBootServicesData or
                                 EfiRuntimeServicesData.                               
   @param  Pages                 The number of pages to allocate.                                
   @param  HostAddress           A pointer to store the base system memory address of the
                                 allocated range.                                        
   @param  Attributes            The requested bit mask of attributes for the allocated range.
                                   
   @retval EFI_SUCCESS           The requested memory pages were allocated.
   @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal attribute bits are
                                 MEMORY_WRITE_COMBINE and MEMORY_CACHED.                     
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
   @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.  
                                    
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER)(
   IN EFI_PCI_IO_PROTOCOL           *This,
   IN  EFI_ALLOCATE_TYPE            Type,
   IN  EFI_MEMORY_TYPE              MemoryType,
   IN  UINTN                        Pages,
   OUT VOID                         **HostAddress,
   IN  UINT64                       Attributes
   );
 
 /**                                                                 
   Frees memory that was allocated with AllocateBuffer().
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  Pages                 The number of pages to free.                                
   @param  HostAddress           The base system memory address of the allocated range.                                    
                                   
   @retval EFI_SUCCESS           The requested memory pages were freed.
   @retval EFI_INVALID_PARAMETER The memory range specified by HostAddress and Pages
                                 was not allocated with AllocateBuffer().
                                      
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_FREE_BUFFER)(
   IN EFI_PCI_IO_PROTOCOL           *This,
   IN  UINTN                        Pages,
   IN  VOID                         *HostAddress
   );
 
 /**                                                                 
   Flushes all PCI posted write transactions from a PCI host bridge to system memory.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
                                   
   @retval EFI_SUCCESS           The PCI posted write transactions were flushed from the PCI host
                                 bridge to system memory.                                        
   @retval EFI_DEVICE_ERROR      The PCI posted write transactions were not flushed from the PCI
                                 host bridge due to a hardware error.                           
                                      
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_FLUSH)(
   IN EFI_PCI_IO_PROTOCOL  *This
   );
 
 /**                                                                 
   Retrieves this PCI controller's current PCI bus number, device number, and function number.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  SegmentNumber         The PCI controller's current PCI segment number.
   @param  BusNumber             The PCI controller's current PCI bus number.
   @param  DeviceNumber          The PCI controller's current PCI device number.
   @param  FunctionNumber        The PCI controller's current PCI function number.
                                   
   @retval EFI_SUCCESS           The PCI controller location was returned.                                                       
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.                              
                                      
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_LOCATION)(
   IN EFI_PCI_IO_PROTOCOL          *This,
   OUT UINTN                       *SegmentNumber,
   OUT UINTN                       *BusNumber,
   OUT UINTN                       *DeviceNumber,
   OUT UINTN                       *FunctionNumber
   );
 
 /**                                                                 
   Performs an operation on the attributes that this PCI controller supports. The operations include
   getting the set of supported attributes, retrieving the current attributes, setting the current  
   attributes, enabling attributes, and disabling attributes.                                       
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  Operation             The operation to perform on the attributes for this PCI controller.
   @param  Attributes            The mask of attributes that are used for Set, Enable, and Disable
                                 operations.                                                      
   @param  Result                A pointer to the result mask of attributes that are returned for the Get
                                 and Supported operations.                                               
                                   
   @retval EFI_SUCCESS           The operation on the PCI controller's attributes was completed.
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.                              
   @retval EFI_UNSUPPORTED       one or more of the bits set in                               
                                 Attributes are not supported by this PCI controller or one of
                                 its parent bridges when Operation is Set, Enable or Disable.
                                        
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_ATTRIBUTES)(
   IN EFI_PCI_IO_PROTOCOL                       *This,
   IN  EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION  Operation,
   IN  UINT64                                   Attributes,
   OUT UINT64                                   *Result OPTIONAL
   );
 
 /**                                                                 
   Gets the attributes that this PCI controller supports setting on a BAR using
   SetBarAttributes(), and retrieves the list of resource descriptors for a BAR.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  BarIndex              The BAR index of the standard PCI Configuration header to use as the
                                 base address for resource range. The legal range for this field is 0..5.
   @param  Supports              A pointer to the mask of attributes that this PCI controller supports
                                 setting for this BAR with SetBarAttributes().                        
   @param  Resources             A pointer to the ACPI 2.0 resource descriptors that describe the current
                                 configuration of this BAR of the PCI controller.                        
                                   
   @retval EFI_SUCCESS           If Supports is not NULL, then the attributes that the PCI       
                                 controller supports are returned in Supports. If Resources      
                                 is not NULL, then the ACPI 2.0 resource descriptors that the PCI
                                 controller is currently using are returned in Resources.          
   @retval EFI_INVALID_PARAMETER Both Supports and Attributes are NULL.
   @retval EFI_UNSUPPORTED       BarIndex not valid for this PCI controller.
   @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to allocate
                                 Resources.                                                 
                                 
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES)(
   IN EFI_PCI_IO_PROTOCOL             *This,
   IN  UINT8                          BarIndex,
   OUT UINT64                         *Supports, OPTIONAL
   OUT VOID                           **Resources OPTIONAL
   );
 
 /**                                                                 
   Sets the attributes for a range of a BAR on a PCI controller.
             
   @param  This                  A pointer to the EFI_PCI_IO_PROTOCOL instance.  
   @param  Attributes            The mask of attributes to set for the resource range specified by
                                 BarIndex, Offset, and Length.                                    
   @param  BarIndex              The BAR index of the standard PCI Configuration header to use as the
                                 base address for resource range. The legal range for this field is 0..5.
   @param  Offset                A pointer to the BAR relative base address of the resource range to be
                                 modified by the attributes specified by Attributes.                   
   @param  Length                A pointer to the length of the resource range to be modified by the
                                 attributes specified by Attributes.                                
                                   
   @retval EFI_SUCCESS           The set of attributes specified by Attributes for the resource      
                                 range specified by BarIndex, Offset, and Length were                
                                 set on the PCI controller, and the actual resource range is returned
                                 in Offset and Length.                                               
   @retval EFI_INVALID_PARAMETER Offset or Length is NULL.
   @retval EFI_UNSUPPORTED       BarIndex not valid for this PCI controller.
   @retval EFI_OUT_OF_RESOURCES  There are not enough resources to set the attributes on the
                                 resource range specified by BarIndex, Offset, and          
                                 Length.                                                    
                                 
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES)(
   IN EFI_PCI_IO_PROTOCOL              *This,
   IN     UINT64                       Attributes,
   IN     UINT8                        BarIndex,
   IN OUT UINT64                       *Offset,
   IN OUT UINT64                       *Length
   );
 
 ///
 /// The EFI_PCI_IO_PROTOCOL provides the basic Memory, I/O, PCI configuration, 
 /// and DMA interfaces used to abstract accesses to PCI controllers. 
 /// There is one EFI_PCI_IO_PROTOCOL instance for each PCI controller on a PCI bus. 
 /// A device driver that wishes to manage a PCI controller in a system will have to 
 /// retrieve the EFI_PCI_IO_PROTOCOL instance that is associated with the PCI controller. 
 ///
 struct _EFI_PCI_IO_PROTOCOL {
   EFI_PCI_IO_PROTOCOL_POLL_IO_MEM         PollMem;
   EFI_PCI_IO_PROTOCOL_POLL_IO_MEM         PollIo;
   EFI_PCI_IO_PROTOCOL_ACCESS              Mem;
   EFI_PCI_IO_PROTOCOL_ACCESS              Io;
   EFI_PCI_IO_PROTOCOL_CONFIG_ACCESS       Pci;
   EFI_PCI_IO_PROTOCOL_COPY_MEM            CopyMem;
   EFI_PCI_IO_PROTOCOL_MAP                 Map;
   EFI_PCI_IO_PROTOCOL_UNMAP               Unmap;
   EFI_PCI_IO_PROTOCOL_ALLOCATE_BUFFER     AllocateBuffer;
   EFI_PCI_IO_PROTOCOL_FREE_BUFFER         FreeBuffer;
   EFI_PCI_IO_PROTOCOL_FLUSH               Flush;
   EFI_PCI_IO_PROTOCOL_GET_LOCATION        GetLocation;
   EFI_PCI_IO_PROTOCOL_ATTRIBUTES          Attributes;
   EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES  GetBarAttributes;
   EFI_PCI_IO_PROTOCOL_SET_BAR_ATTRIBUTES  SetBarAttributes;
   
   ///
   /// The size, in bytes, of the ROM image.
   ///
   UINT64                                  RomSize;
 
   ///
   /// A pointer to the in memory copy of the ROM image. The PCI Bus Driver is responsible 
   /// for allocating memory for the ROM image, and copying the contents of the ROM to memory. 
   /// The contents of this buffer are either from the PCI option ROM that can be accessed 
   /// through the ROM BAR of the PCI controller, or it is from a platform-specific location. 
   /// The Attributes() function can be used to determine from which of these two sources 
   /// the RomImage buffer was initialized.
   /// 
   VOID                                    *RomImage;
 };
 
 extern EFI_GUID gEfiPciIoProtocolGuid;
 
 #endif
Index: head/sys/boot/efi/include/efiprot.h
===================================================================
--- head/sys/boot/efi/include/efiprot.h	(revision 293723)
+++ head/sys/boot/efi/include/efiprot.h	(revision 293724)
@@ -1,558 +1,558 @@
 /* $FreeBSD$ */
 #ifndef _EFI_PROT_H
 #define _EFI_PROT_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efiprot.h
 
 Abstract:
 
     EFI Protocols
 
 
 
 Revision History
 
 --*/
 
 //
 // Device Path protocol
 //
 
-#define DEVICE_PATH_PROTOCOL    \
-    { 0x9576e91, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+#define DEVICE_PATH_PROTOCOL \
+    { 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 
 //
 // Block IO protocol
 //
 
 #define BLOCK_IO_PROTOCOL \
-    { 0x964e5b21, 0x6459, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 #define EFI_BLOCK_IO_INTERFACE_REVISION   0x00010000
 
 INTERFACE_DECL(_EFI_BLOCK_IO);
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_BLOCK_RESET) (
     IN struct _EFI_BLOCK_IO     *This,
     IN BOOLEAN                  ExtendedVerification
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_BLOCK_READ) (
     IN struct _EFI_BLOCK_IO     *This,
     IN UINT32                   MediaId,
     IN EFI_LBA                  LBA,
     IN UINTN                    BufferSize,
     OUT VOID                    *Buffer
     );
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_BLOCK_WRITE) (
     IN struct _EFI_BLOCK_IO     *This,
     IN UINT32                   MediaId,
     IN EFI_LBA                  LBA,
     IN UINTN                    BufferSize,
     IN VOID                     *Buffer
     );
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_BLOCK_FLUSH) (
     IN struct _EFI_BLOCK_IO     *This
     );
 
 
 
 typedef struct {
     UINT32              MediaId;
     BOOLEAN             RemovableMedia;
     BOOLEAN             MediaPresent;
 
     BOOLEAN             LogicalPartition;
     BOOLEAN             ReadOnly;
     BOOLEAN             WriteCaching;
 
     UINT32              BlockSize;
     UINT32              IoAlign;
 
     EFI_LBA             LastBlock;
 } EFI_BLOCK_IO_MEDIA;
 
 typedef struct _EFI_BLOCK_IO {
     UINT64                  Revision;
 
     EFI_BLOCK_IO_MEDIA      *Media;
 
     EFI_BLOCK_RESET         Reset;
     EFI_BLOCK_READ          ReadBlocks;
     EFI_BLOCK_WRITE         WriteBlocks;
     EFI_BLOCK_FLUSH         FlushBlocks;
 
 } EFI_BLOCK_IO;
 
 
 
 //
 // Disk Block IO protocol
 //
 
 #define DISK_IO_PROTOCOL \
-    { 0xce345171, 0xba0b, 0x11d2,  0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0xce345171, 0xba0b, 0x11d2, {0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 #define EFI_DISK_IO_INTERFACE_REVISION   0x00010000
 
 INTERFACE_DECL(_EFI_DISK_IO);
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_DISK_READ) (
     IN struct _EFI_DISK_IO      *This,
     IN UINT32                   MediaId,
     IN UINT64                   Offset,
     IN UINTN                    BufferSize,
     OUT VOID                    *Buffer
     );
 
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_DISK_WRITE) (
     IN struct _EFI_DISK_IO      *This,
     IN UINT32                   MediaId,
     IN UINT64                   Offset,
     IN UINTN                    BufferSize,
     IN VOID                     *Buffer
     );
 
 
 typedef struct _EFI_DISK_IO {
     UINT64              Revision;
     EFI_DISK_READ       ReadDisk;
     EFI_DISK_WRITE      WriteDisk;
 } EFI_DISK_IO;
 
 
 //
 // Simple file system protocol
 //
 
 #define SIMPLE_FILE_SYSTEM_PROTOCOL \
-    { 0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 INTERFACE_DECL(_EFI_FILE_IO_INTERFACE);
 INTERFACE_DECL(_EFI_FILE_HANDLE);
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_VOLUME_OPEN) (
     IN struct _EFI_FILE_IO_INTERFACE    *This,
     OUT struct _EFI_FILE_HANDLE         **Root
     );
 
 #define EFI_FILE_IO_INTERFACE_REVISION   0x00010000
 
 typedef struct _EFI_FILE_IO_INTERFACE {
     UINT64                  Revision;
     EFI_VOLUME_OPEN         OpenVolume;
 } EFI_FILE_IO_INTERFACE;
 
 //
 //
 //
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_OPEN) (
     IN struct _EFI_FILE_HANDLE  *File,
     OUT struct _EFI_FILE_HANDLE **NewHandle,
     IN CHAR16                   *FileName,
     IN UINT64                   OpenMode,
     IN UINT64                   Attributes
     );
 
 // Open modes
 #define EFI_FILE_MODE_READ      0x0000000000000001
 #define EFI_FILE_MODE_WRITE     0x0000000000000002
 #define EFI_FILE_MODE_CREATE    0x8000000000000000
 
 // File attributes
 #define EFI_FILE_READ_ONLY      0x0000000000000001
 #define EFI_FILE_HIDDEN         0x0000000000000002
 #define EFI_FILE_SYSTEM         0x0000000000000004
 #define EFI_FILE_RESERVIED      0x0000000000000008
 #define EFI_FILE_DIRECTORY      0x0000000000000010
 #define EFI_FILE_ARCHIVE        0x0000000000000020
 #define EFI_FILE_VALID_ATTR     0x0000000000000037
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_CLOSE) (
     IN struct _EFI_FILE_HANDLE  *File
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_DELETE) (
     IN struct _EFI_FILE_HANDLE  *File
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_READ) (
     IN struct _EFI_FILE_HANDLE  *File,
     IN OUT UINTN                *BufferSize,
     OUT VOID                    *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_WRITE) (
     IN struct _EFI_FILE_HANDLE  *File,
     IN OUT UINTN                *BufferSize,
     IN VOID                     *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_SET_POSITION) (
     IN struct _EFI_FILE_HANDLE  *File,
     IN UINT64                   Position
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_GET_POSITION) (
     IN struct _EFI_FILE_HANDLE  *File,
     OUT UINT64                  *Position
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_GET_INFO) (
     IN struct _EFI_FILE_HANDLE  *File,
     IN EFI_GUID                 *InformationType,
     IN OUT UINTN                *BufferSize,
     OUT VOID                    *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_SET_INFO) (
     IN struct _EFI_FILE_HANDLE  *File,
     IN EFI_GUID                 *InformationType,
     IN UINTN                    BufferSize,
     IN VOID                     *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_FILE_FLUSH) (
     IN struct _EFI_FILE_HANDLE  *File
     );
 
 
 
 #define EFI_FILE_HANDLE_REVISION         0x00010000
 typedef struct _EFI_FILE_HANDLE {
     UINT64                  Revision;
     EFI_FILE_OPEN           Open;
     EFI_FILE_CLOSE          Close;
     EFI_FILE_DELETE         Delete;
     EFI_FILE_READ           Read;
     EFI_FILE_WRITE          Write;
     EFI_FILE_GET_POSITION   GetPosition;
     EFI_FILE_SET_POSITION   SetPosition;
     EFI_FILE_GET_INFO       GetInfo;
     EFI_FILE_SET_INFO       SetInfo;
     EFI_FILE_FLUSH          Flush;
 } EFI_FILE, *EFI_FILE_HANDLE;
 
 
 //
 // File information types
 //
 
-#define EFI_FILE_INFO_ID   \
-    { 0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+#define EFI_FILE_INFO_ID \
+    { 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 typedef struct {
     UINT64                  Size;
     UINT64                  FileSize;
     UINT64                  PhysicalSize;
     EFI_TIME                CreateTime;
     EFI_TIME                LastAccessTime;
     EFI_TIME                ModificationTime;
     UINT64                  Attribute;
     CHAR16                  FileName[1];
 } EFI_FILE_INFO;
 
 //
 // The FileName field of the EFI_FILE_INFO data structure is variable length.
 // Whenever code needs to know the size of the EFI_FILE_INFO data structure, it needs to
 // be the size of the data structure without the FileName field.  The following macro 
 // computes this size correctly no matter how big the FileName array is declared.
 // This is required to make the EFI_FILE_INFO data structure ANSI compilant. 
 //
 
 #define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName)
 
-#define EFI_FILE_SYSTEM_INFO_ID    \
-    { 0x9576e93, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+#define EFI_FILE_SYSTEM_INFO_ID \
+    { 0x9576e93, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 typedef struct {
     UINT64                  Size;
     BOOLEAN                 ReadOnly;
     UINT64                  VolumeSize;
     UINT64                  FreeSpace;
     UINT32                  BlockSize;
     CHAR16                  VolumeLabel[1];
 } EFI_FILE_SYSTEM_INFO;
 
 //
 // The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length.
 // Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data structure, it needs
 // to be the size of the data structure without the VolumeLable field.  The following macro 
 // computes this size correctly no matter how big the VolumeLable array is declared.
 // This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI compilant. 
 //
 
 #define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_INFO,VolumeLabel)
 
-#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID    \
-    { 0xDB47D7D3,0xFE81, 0x11d3, 0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }
+#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID \
+    { 0xDB47D7D3,0xFE81, 0x11d3, {0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} }
 
 typedef struct {
     CHAR16                  VolumeLabel[1];
 } EFI_FILE_SYSTEM_VOLUME_LABEL_INFO;
 
 #define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_VOLUME_LABEL_INFO,VolumeLabel)
 
 //
 // Load file protocol
 //
 
 
 #define LOAD_FILE_PROTOCOL \
-    { 0x56EC3091, 0x954C, 0x11d2, 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }
+    { 0x56EC3091, 0x954C, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
 
 INTERFACE_DECL(_EFI_LOAD_FILE_INTERFACE);
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_LOAD_FILE) (
     IN struct _EFI_LOAD_FILE_INTERFACE  *This,
     IN EFI_DEVICE_PATH                  *FilePath,
     IN BOOLEAN                          BootPolicy,
     IN OUT UINTN                        *BufferSize,
     IN VOID                             *Buffer OPTIONAL
     );
 
 typedef struct _EFI_LOAD_FILE_INTERFACE {
     EFI_LOAD_FILE                       LoadFile;
 } EFI_LOAD_FILE_INTERFACE;
 
 
 //
 // Device IO protocol
 //
 
 #define DEVICE_IO_PROTOCOL \
-    { 0xaf6ac311, 0x84c3, 0x11d2, 0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 INTERFACE_DECL(_EFI_DEVICE_IO_INTERFACE);
 
 typedef enum {
     IO_UINT8,
     IO_UINT16,
     IO_UINT32,
     IO_UINT64,
 //
 // Specification Change: Copy from MMIO to MMIO vs. MMIO to buffer, buffer to MMIO
 //
     MMIO_COPY_UINT8,
     MMIO_COPY_UINT16,
     MMIO_COPY_UINT32,
     MMIO_COPY_UINT64
 } EFI_IO_WIDTH;
 
 #define EFI_PCI_ADDRESS(bus,dev,func,reg) \
   ( (UINT64) ( (((UINTN)bus) << 24) + (((UINTN)dev) << 16) + (((UINTN)func) << 8) + ((UINTN)reg) ))
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_DEVICE_IO) (
     IN struct _EFI_DEVICE_IO_INTERFACE *This,
     IN EFI_IO_WIDTH                 Width,
     IN UINT64                       Address,
     IN UINTN                        Count,
     IN OUT VOID                     *Buffer
     );
 
 typedef struct {
     EFI_DEVICE_IO                   Read;
     EFI_DEVICE_IO                   Write;
 } EFI_IO_ACCESS;
 
 typedef 
 EFI_STATUS
 (EFIAPI *EFI_PCI_DEVICE_PATH) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This,
     IN UINT64                           Address,
     IN OUT EFI_DEVICE_PATH              **PciDevicePath
     );
 
 typedef enum {
     EfiBusMasterRead,
     EfiBusMasterWrite,
     EfiBusMasterCommonBuffer
 } EFI_IO_OPERATION_TYPE;
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IO_MAP) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This,
     IN EFI_IO_OPERATION_TYPE            Operation,
     IN EFI_PHYSICAL_ADDRESS             *HostAddress,
     IN OUT UINTN                        *NumberOfBytes,
     OUT EFI_PHYSICAL_ADDRESS            *DeviceAddress,
     OUT VOID                            **Mapping
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IO_UNMAP) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This,
     IN VOID                             *Mapping
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IO_ALLOCATE_BUFFER) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This,
     IN EFI_ALLOCATE_TYPE                Type,
     IN EFI_MEMORY_TYPE                  MemoryType,
     IN UINTN                            Pages,
     IN OUT EFI_PHYSICAL_ADDRESS         *HostAddress
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IO_FLUSH) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_IO_FREE_BUFFER) (
     IN struct _EFI_DEVICE_IO_INTERFACE  *This,
     IN UINTN                            Pages,
     IN EFI_PHYSICAL_ADDRESS             HostAddress
     );
 
 typedef struct _EFI_DEVICE_IO_INTERFACE {
     EFI_IO_ACCESS                       Mem;
     EFI_IO_ACCESS                       Io;
     EFI_IO_ACCESS                       Pci;
     EFI_IO_MAP                          Map;
     EFI_PCI_DEVICE_PATH                 PciDevicePath;
     EFI_IO_UNMAP                        Unmap;
     EFI_IO_ALLOCATE_BUFFER              AllocateBuffer;
     EFI_IO_FLUSH                        Flush;
     EFI_IO_FREE_BUFFER                  FreeBuffer;
 } EFI_DEVICE_IO_INTERFACE;
 
 
 //
 // Unicode Collation protocol
 //
 
 #define UNICODE_COLLATION_PROTOCOL \
-    { 0x1d85cd7f, 0xf43d, 0x11d2, 0x9a, 0xc,  0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+    { 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 #define UNICODE_BYTE_ORDER_MARK       (CHAR16)(0xfeff)
 
 INTERFACE_DECL(_EFI_UNICODE_COLLATION_INTERFACE);
 
 typedef
 INTN
 (EFIAPI *EFI_UNICODE_COLLATION_STRICOLL) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN CHAR16                         *s1,
     IN CHAR16                         *s2
     );
 
 typedef
 BOOLEAN
 (EFIAPI *EFI_UNICODE_COLLATION_METAIMATCH) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN CHAR16                         *String,
     IN CHAR16                         *Pattern
     );
 
 typedef
 VOID
 (EFIAPI *EFI_UNICODE_COLLATION_STRLWR) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN OUT CHAR16                       *Str
     );
 
 typedef
 VOID
 (EFIAPI *EFI_UNICODE_COLLATION_STRUPR) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN OUT CHAR16                       *Str
     );
 
 typedef
 VOID
 (EFIAPI *EFI_UNICODE_COLLATION_FATTOSTR) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN UINTN                            FatSize,
     IN CHAR8                            *Fat,
     OUT CHAR16                          *String
     );
 
 typedef
 BOOLEAN
 (EFIAPI *EFI_UNICODE_COLLATION_STRTOFAT) (
     IN struct _EFI_UNICODE_COLLATION_INTERFACE  *This,
     IN CHAR16                           *String,
     IN UINTN                            FatSize,
     OUT CHAR8                           *Fat
     );
 
 
 typedef struct _EFI_UNICODE_COLLATION_INTERFACE {
 
     // general
     EFI_UNICODE_COLLATION_STRICOLL                StriColl;
     EFI_UNICODE_COLLATION_METAIMATCH              MetaiMatch;
     EFI_UNICODE_COLLATION_STRLWR                  StrLwr;
     EFI_UNICODE_COLLATION_STRUPR                  StrUpr;
 
     // for supporting fat volumes
     EFI_UNICODE_COLLATION_FATTOSTR                FatToStr;
     EFI_UNICODE_COLLATION_STRTOFAT                StrToFat;
 
     CHAR8                               *SupportedLanguages;
 } EFI_UNICODE_COLLATION_INTERFACE;
 
 #endif
Index: head/sys/boot/efi/include/efipxebc.h
===================================================================
--- head/sys/boot/efi/include/efipxebc.h	(revision 293723)
+++ head/sys/boot/efi/include/efipxebc.h	(revision 293724)
@@ -1,472 +1,472 @@
 /* $FreeBSD$ */
 #ifndef _EFIPXEBC_H
 #define _EFIPXEBC_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efipxebc.h
 
 Abstract:
 
     EFI PXE Base Code Protocol
 
 
 
 Revision History
 
 --*/
 
 //
 // PXE Base Code protocol
 //
 
 #define EFI_PXE_BASE_CODE_PROTOCOL \
-    { 0x03c4e603, 0xac28, 0x11d3, 0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
+    { 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
 
 INTERFACE_DECL(_EFI_PXE_BASE_CODE);
 
 #define DEFAULT_TTL 8
 #define DEFAULT_ToS 0
 //
 // Address definitions
 //
 
 typedef union {
     UINT32      Addr[4];
     EFI_IPv4_ADDRESS    v4;
     EFI_IPv6_ADDRESS    v6;
 } EFI_IP_ADDRESS;
 
 typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT;
 
 //
 // Packet definitions
 //
 
 typedef struct {
     UINT8                           BootpOpcode;
     UINT8                           BootpHwType;
     UINT8                           BootpHwAddrLen;
     UINT8                           BootpGateHops;
     UINT32                          BootpIdent;
     UINT16                          BootpSeconds;
     UINT16                          BootpFlags;
     UINT8                           BootpCiAddr[4];
     UINT8                           BootpYiAddr[4];
     UINT8                           BootpSiAddr[4];
     UINT8                           BootpGiAddr[4];
     UINT8                           BootpHwAddr[16];
     UINT8                           BootpSrvName[64];
     UINT8                           BootpBootFile[128];
     UINT32                          DhcpMagik;
     UINT8                           DhcpOptions[56];
 } EFI_PXE_BASE_CODE_DHCPV4_PACKET;
 
 // TBD in EFI v1.1
 //typedef struct {
 //    UINT8                           reserved;
 //} EFI_PXE_BASE_CODE_DHCPV6_PACKET;
 
 typedef union {
     UINT8                               Raw[1472];
     EFI_PXE_BASE_CODE_DHCPV4_PACKET     Dhcpv4;
 //    EFI_PXE_BASE_CODE_DHCPV6_PACKET     Dhcpv6;
 } EFI_PXE_BASE_CODE_PACKET;
 
 typedef struct {
     UINT8                   Type;
     UINT8                   Code;
     UINT16                  Checksum;
     union {
         UINT32              reserved;
         UINT32              Mtu;
         UINT32              Pointer;
         struct {
             UINT16          Identifier;
             UINT16          Sequence;
         } Echo;
     } u;
     UINT8                   Data[494];
 } EFI_PXE_BASE_CODE_ICMP_ERROR;
 
 typedef struct {
     UINT8                   ErrorCode;
     CHAR8                   ErrorString[127];
 } EFI_PXE_BASE_CODE_TFTP_ERROR;
 
 //
 // IP Receive Filter definitions
 //
 #define EFI_PXE_BASE_CODE_MAX_IPCNT             8
 typedef struct {
     UINT8                       Filters;
     UINT8                       IpCnt;
     UINT16                      reserved;
     EFI_IP_ADDRESS              IpList[EFI_PXE_BASE_CODE_MAX_IPCNT];
 } EFI_PXE_BASE_CODE_IP_FILTER;
 
 #define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP             0x0001
 #define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST              0x0002
 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS            0x0004
 #define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST  0x0008
 
 //
 // ARP Cache definitions
 //
 
 typedef struct {
     EFI_IP_ADDRESS       IpAddr;
     EFI_MAC_ADDRESS      MacAddr;
 } EFI_PXE_BASE_CODE_ARP_ENTRY;
 
 typedef struct {
     EFI_IP_ADDRESS       IpAddr;
     EFI_IP_ADDRESS       SubnetMask;
     EFI_IP_ADDRESS       GwAddr;
 } EFI_PXE_BASE_CODE_ROUTE_ENTRY;
 
 //
 // UDP definitions
 //
 
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP    0x0001
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT  0x0002
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP   0x0004
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER    0x0010
 #define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT  0x0020
 
 //
 // Discover() definitions
 //
 
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP           0   
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS        1
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM           2
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI             3
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO          4
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD            5
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM            6
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG    7
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW         8
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9           9
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10          10
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11          11
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12         12
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL      13
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT         14
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO               15
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT             16
 //
 // 17 through 32767 are reserved
 // 32768 through 65279 are for vendor use
 // 65280 through 65534 are reserved
 //
 #define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST             65535
 
 #define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK               0x7FFF
 #define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL            0x0000
 #define EFI_PXE_BASE_CODE_BOOT_LAYER_CREDENTIALS        0x8000
 
 
 typedef struct {
     UINT16                      Type;
     BOOLEAN                     AcceptAnyResponse;
     UINT8                       Reserved;
     EFI_IP_ADDRESS              IpAddr;
 } EFI_PXE_BASE_CODE_SRVLIST;
 
 typedef struct {
     BOOLEAN                     UseMCast;
     BOOLEAN                     UseBCast;
     BOOLEAN                     UseUCast;
     BOOLEAN                     MustUseList;
     EFI_IP_ADDRESS              ServerMCastIp;
     UINT16                      IpCnt;
     EFI_PXE_BASE_CODE_SRVLIST   SrvList[1];
 } EFI_PXE_BASE_CODE_DISCOVER_INFO;
 
 //
 // Mtftp() definitions
 //
 
 typedef enum {
     EFI_PXE_BASE_CODE_TFTP_FIRST,
     EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
     EFI_PXE_BASE_CODE_TFTP_READ_FILE,
     EFI_PXE_BASE_CODE_TFTP_WRITE_FILE,
     EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY,
     EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE,
     EFI_PXE_BASE_CODE_MTFTP_READ_FILE,
     EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY,
     EFI_PXE_BASE_CODE_MTFTP_LAST
 } EFI_PXE_BASE_CODE_TFTP_OPCODE;
 
 typedef struct {
     EFI_IP_ADDRESS   MCastIp;
     EFI_PXE_BASE_CODE_UDP_PORT  CPort;
     EFI_PXE_BASE_CODE_UDP_PORT  SPort;
     UINT16                      ListenTimeout;
     UINT16                      TransmitTimeout;
 } EFI_PXE_BASE_CODE_MTFTP_INFO;
 
 //
 // PXE Base Code Mode structure
 //
 
 #define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES       8
 #define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES     8
 
 typedef struct {
     BOOLEAN                         Started;
     BOOLEAN                         Ipv6Available;
     BOOLEAN                         Ipv6Supported;
     BOOLEAN                         UsingIpv6;
     BOOLEAN                         BisSupported;
     BOOLEAN                         BisDetected;
     BOOLEAN                         AutoArp;
     BOOLEAN                         SendGUID;
     BOOLEAN                         DhcpDiscoverValid;
     BOOLEAN                         DhcpAckReceived;
     BOOLEAN                         ProxyOfferReceived;
     BOOLEAN                         PxeDiscoverValid;
     BOOLEAN                         PxeReplyReceived;
     BOOLEAN                         PxeBisReplyReceived;
     BOOLEAN                         IcmpErrorReceived;
     BOOLEAN                         TftpErrorReceived;
     BOOLEAN                         MakeCallbacks;
     UINT8                           TTL;
     UINT8                           ToS;
     EFI_IP_ADDRESS                  StationIp;
     EFI_IP_ADDRESS                  SubnetMask;
     EFI_PXE_BASE_CODE_PACKET        DhcpDiscover;
     EFI_PXE_BASE_CODE_PACKET        DhcpAck;
     EFI_PXE_BASE_CODE_PACKET        ProxyOffer;
     EFI_PXE_BASE_CODE_PACKET        PxeDiscover;
     EFI_PXE_BASE_CODE_PACKET        PxeReply;
     EFI_PXE_BASE_CODE_PACKET        PxeBisReply;
     EFI_PXE_BASE_CODE_IP_FILTER     IpFilter;
     UINT32                          ArpCacheEntries;
     EFI_PXE_BASE_CODE_ARP_ENTRY     ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES];
     UINT32                          RouteTableEntries;
     EFI_PXE_BASE_CODE_ROUTE_ENTRY   RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES];
     EFI_PXE_BASE_CODE_ICMP_ERROR    IcmpError;
     EFI_PXE_BASE_CODE_TFTP_ERROR    TftpError;
 } EFI_PXE_BASE_CODE_MODE;
 
 //
 // PXE Base Code Interface Function definitions
 //
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_START) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN BOOLEAN                      UseIpv6
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_STOP) (
     IN struct _EFI_PXE_BASE_CODE    *This
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_DHCP) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN BOOLEAN                      SortOffers
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) (
     IN struct _EFI_PXE_BASE_CODE            *This,
     IN UINT16                               Type,
     IN UINT16                               *Layer,
     IN BOOLEAN                              UseBis,
     IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO  *Info   OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_MTFTP) (
     IN struct _EFI_PXE_BASE_CODE        *This,
     IN EFI_PXE_BASE_CODE_TFTP_OPCODE    Operation,
     IN OUT VOID                         *BufferPtr  OPTIONAL,
     IN BOOLEAN                          Overwrite,
     IN OUT UINT64                       *BufferSize,
     IN UINTN                            *BlockSize  OPTIONAL,
     IN EFI_IP_ADDRESS                   *ServerIp,
     IN UINT8                            *Filename,
     IN EFI_PXE_BASE_CODE_MTFTP_INFO     *Info       OPTIONAL,
     IN BOOLEAN                          DontUseBuffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) (
     IN struct _EFI_PXE_BASE_CODE        *This,
     IN UINT16                           OpFlags,
     IN EFI_IP_ADDRESS                   *DestIp,
     IN EFI_PXE_BASE_CODE_UDP_PORT       *DestPort,
     IN EFI_IP_ADDRESS                   *GatewayIp,  OPTIONAL
     IN EFI_IP_ADDRESS                   *SrcIp,      OPTIONAL
     IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,    OPTIONAL
     IN UINTN                            *HeaderSize, OPTIONAL
     IN VOID                             *HeaderPtr,  OPTIONAL
     IN UINTN                            *BufferSize,
     IN VOID                             *BufferPtr
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) (
     IN struct _EFI_PXE_BASE_CODE        *This,
     IN UINT16                           OpFlags,
     IN OUT EFI_IP_ADDRESS               *DestIp,      OPTIONAL
     IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *DestPort,    OPTIONAL
     IN OUT EFI_IP_ADDRESS               *SrcIp,       OPTIONAL
     IN OUT EFI_PXE_BASE_CODE_UDP_PORT   *SrcPort,     OPTIONAL
     IN UINTN                            *HeaderSize,  OPTIONAL
     IN VOID                             *HeaderPtr,   OPTIONAL
     IN OUT UINTN                        *BufferSize,
     IN VOID                             *BufferPtr
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN EFI_PXE_BASE_CODE_IP_FILTER  *NewFilter
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_ARP) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN EFI_IP_ADDRESS               *IpAddr,      
     IN EFI_MAC_ADDRESS              *MacAddr      OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN BOOLEAN                      *NewAutoArp,    OPTIONAL
     IN BOOLEAN                      *NewSendGUID,   OPTIONAL
     IN UINT8                        *NewTTL,        OPTIONAL
     IN UINT8                        *NewToS,        OPTIONAL
     IN BOOLEAN                      *NewMakeCallback    OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     IN EFI_IP_ADDRESS               *NewStationIp,  OPTIONAL
     IN EFI_IP_ADDRESS               *NewSubnetMask  OPTIONAL
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) (
     IN struct _EFI_PXE_BASE_CODE    *This,
     BOOLEAN                         *NewDhcpDiscoverValid,  OPTIONAL
     BOOLEAN                         *NewDhcpAckReceived,    OPTIONAL
     BOOLEAN                         *NewProxyOfferReceived, OPTIONAL
     BOOLEAN                         *NewPxeDiscoverValid,   OPTIONAL
     BOOLEAN                         *NewPxeReplyReceived,   OPTIONAL
     BOOLEAN                         *NewPxeBisReplyReceived,OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpDiscover, OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewDhcpAck,      OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewProxyOffer,   OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewPxeDiscover,  OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewPxeReply,     OPTIONAL
     IN EFI_PXE_BASE_CODE_PACKET     *NewPxeBisReply   OPTIONAL
     );
 
 //
 // PXE Base Code Protocol structure
 //
 
 #define EFI_PXE_BASE_CODE_INTERFACE_REVISION    0x00010000
 
 typedef struct _EFI_PXE_BASE_CODE {
     UINT64                              Revision;
     EFI_PXE_BASE_CODE_START             Start;
     EFI_PXE_BASE_CODE_STOP              Stop;
     EFI_PXE_BASE_CODE_DHCP              Dhcp;
     EFI_PXE_BASE_CODE_DISCOVER          Discover;
     EFI_PXE_BASE_CODE_MTFTP             Mtftp;
     EFI_PXE_BASE_CODE_UDP_WRITE         UdpWrite;
     EFI_PXE_BASE_CODE_UDP_READ          UdpRead;
     EFI_PXE_BASE_CODE_SET_IP_FILTER     SetIpFilter;
     EFI_PXE_BASE_CODE_ARP               Arp;
     EFI_PXE_BASE_CODE_SET_PARAMETERS    SetParameters;
     EFI_PXE_BASE_CODE_SET_STATION_IP    SetStationIp;
     EFI_PXE_BASE_CODE_SET_PACKETS       SetPackets;
     EFI_PXE_BASE_CODE_MODE              *Mode;
 } EFI_PXE_BASE_CODE;
 
 //
 // Call Back Definitions
 //
 
 #define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL \
-    { 0x245dca21, 0xfb7b, 0x11d3, 0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b }
+    { 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} }
 
 //
 // Revision Number
 //
 
 #define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION   0x00010000
 
 INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK);
 
 typedef enum {
     EFI_PXE_BASE_CODE_FUNCTION_FIRST,
     EFI_PXE_BASE_CODE_FUNCTION_DHCP,
     EFI_PXE_BASE_CODE_FUNCTION_DISCOVER,
     EFI_PXE_BASE_CODE_FUNCTION_MTFTP,
     EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE,
     EFI_PXE_BASE_CODE_FUNCTION_UDP_READ,
     EFI_PXE_BASE_CODE_FUNCTION_ARP,
     EFI_PXE_BASE_CODE_FUNCTION_IGMP,
     EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST
 } EFI_PXE_BASE_CODE_FUNCTION;
 
 typedef enum {
     EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST,
     EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
     EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT,
     EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST
 } EFI_PXE_BASE_CODE_CALLBACK_STATUS;
 
 typedef
 EFI_PXE_BASE_CODE_CALLBACK_STATUS 
 (EFIAPI *EFI_PXE_CALLBACK) (
     IN struct _EFI_PXE_BASE_CODE_CALLBACK   *This,
     IN EFI_PXE_BASE_CODE_FUNCTION           Function,
     IN BOOLEAN                              Received,
     IN UINT32                               PacketLen,
     IN EFI_PXE_BASE_CODE_PACKET             *Packet     OPTIONAL
     );
 
 typedef struct _EFI_PXE_BASE_CODE_CALLBACK {
     UINT64                      Revision;
     EFI_PXE_CALLBACK            Callback;
 } EFI_PXE_BASE_CODE_CALLBACK;
 
 #endif /* _EFIPXEBC_H */
Index: head/sys/boot/efi/include/efiser.h
===================================================================
--- head/sys/boot/efi/include/efiser.h	(revision 293723)
+++ head/sys/boot/efi/include/efiser.h	(revision 293724)
@@ -1,139 +1,139 @@
 /* $FreeBSD$ */
 #ifndef _EFI_SER_H
 #define _EFI_SER_H
 
 /*++
 
 Copyright (c)  1999 - 2002 Intel Corporation. All rights reserved
 This software and associated documentation (if any) is furnished
 under a license and may only be used or copied in accordance
 with the terms of the license. Except as permitted by such
 license, no part of this software or documentation may be
 reproduced, stored in a retrieval system, or transmitted in any
 form or by any means without the express written consent of
 Intel Corporation.
 
 Module Name:
 
     efiser.h
 
 Abstract:
 
     EFI serial protocol
 
 Revision History
 
 --*/
 
 //
 // Serial protocol
 //
 
 #define SERIAL_IO_PROTOCOL \
-    { 0xBB25CF6F, 0xF1D4, 0x11D2, 0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }
+    { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} }
 
 INTERFACE_DECL(_SERIAL_IO_INTERFACE);
 
 typedef enum {
     DefaultParity,      
     NoParity,           
     EvenParity,
     OddParity,
     MarkParity,
     SpaceParity
 } EFI_PARITY_TYPE;
 
 typedef enum {
     DefaultStopBits,        
     OneStopBit,         // 1 stop bit
     OneFiveStopBits,    // 1.5 stop bits
     TwoStopBits         // 2 stop bits
 } EFI_STOP_BITS_TYPE;
 
 #define EFI_SERIAL_CLEAR_TO_SEND                   0x0010  // RO
 #define EFI_SERIAL_DATA_SET_READY                  0x0020  // RO
 #define EFI_SERIAL_RING_INDICATE                   0x0040  // RO
 #define EFI_SERIAL_CARRIER_DETECT                  0x0080  // RO
 #define EFI_SERIAL_REQUEST_TO_SEND                 0x0002  // WO
 #define EFI_SERIAL_DATA_TERMINAL_READY             0x0001  // WO
 #define EFI_SERIAL_INPUT_BUFFER_EMPTY              0x0100  // RO
 #define EFI_SERIAL_OUTPUT_BUFFER_EMPTY             0x0200  // RO
 #define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE        0x1000  // RW
 #define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE        0x2000  // RW
 #define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE    0x4000  // RW
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_RESET) (
     IN struct _SERIAL_IO_INTERFACE  *This
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_SET_ATTRIBUTES) (
     IN struct _SERIAL_IO_INTERFACE  *This,
     IN UINT64                       BaudRate,
     IN UINT32                       ReceiveFifoDepth,
     IN UINT32                       Timeout,
     IN EFI_PARITY_TYPE              Parity,
     IN UINT8                        DataBits,
     IN EFI_STOP_BITS_TYPE           StopBits
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_SET_CONTROL_BITS) (
     IN struct _SERIAL_IO_INTERFACE  *This,
     IN UINT32                       Control
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_GET_CONTROL_BITS) (
     IN struct _SERIAL_IO_INTERFACE  *This,
     OUT UINT32                      *Control
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_WRITE) (
     IN struct _SERIAL_IO_INTERFACE  *This,
     IN OUT UINTN                    *BufferSize,
     IN VOID                         *Buffer
     );
 
 typedef
 EFI_STATUS
 (EFIAPI *EFI_SERIAL_READ) (
     IN struct _SERIAL_IO_INTERFACE  *This,
     IN OUT UINTN                    *BufferSize,
     OUT VOID                        *Buffer
     );
 
 typedef struct {
     UINT32                  ControlMask;
 
     // current Attributes
     UINT32                  Timeout;
     UINT64                  BaudRate;
     UINT32                  ReceiveFifoDepth;
     UINT32                  DataBits;
     UINT32                  Parity;
     UINT32                  StopBits;
 } SERIAL_IO_MODE;
 
 #define SERIAL_IO_INTERFACE_REVISION    0x00010000
 
 typedef struct _SERIAL_IO_INTERFACE {
     UINT32                       Revision;
     EFI_SERIAL_RESET             Reset;
     EFI_SERIAL_SET_ATTRIBUTES    SetAttributes;
     EFI_SERIAL_SET_CONTROL_BITS  SetControl;
     EFI_SERIAL_GET_CONTROL_BITS  GetControl;
     EFI_SERIAL_WRITE             Write;
     EFI_SERIAL_READ              Read;
 
     SERIAL_IO_MODE               *Mode;
 } SERIAL_IO_INTERFACE;
 
 #endif
Index: head/sys/boot/efi/include/efiuga.h
===================================================================
--- head/sys/boot/efi/include/efiuga.h	(revision 293723)
+++ head/sys/boot/efi/include/efiuga.h	(revision 293724)
@@ -1,170 +1,168 @@
 /* $FreeBSD$ */
 /** @file
   UGA Draw protocol from the EFI 1.1 specification.
 
   Abstraction of a very simple graphics device.
 
   Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
 
   This program and the accompanying materials are licensed and made available
   under the terms and conditions of the BSD License which accompanies this
   distribution.  The full text of the license may be found at:
   http://opensource.org/licenses/bsd-license.php
 
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
   File name: UgaDraw.h
 
 **/
 
 #ifndef __UGA_DRAW_H__
 #define __UGA_DRAW_H__
 
 #define EFI_UGA_DRAW_PROTOCOL_GUID \
-  { \
-    0x982c298b, 0xf4fa, 0x41cb, {0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 } \
-  }
+    { 0x982c298b, 0xf4fa, 0x41cb, {0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39} }
 
 typedef struct _EFI_UGA_DRAW_PROTOCOL EFI_UGA_DRAW_PROTOCOL;
 
 /**
   Return the current video mode information.
 
   @param  This                  Protocol instance pointer.
   @param  HorizontalResolution  Current video horizontal resolution in pixels
   @param  VerticalResolution    Current video vertical resolution in pixels
   @param  ColorDepth            Current video color depth in bits per pixel
   @param  RefreshRate           Current video refresh rate in Hz.
 
   @retval EFI_SUCCESS           Mode information returned.
   @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
   @retval EFI_INVALID_PARAMETER One of the input args was NULL.
 
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_UGA_DRAW_PROTOCOL_GET_MODE) (
   IN  EFI_UGA_DRAW_PROTOCOL *This,
   OUT UINT32                *HorizontalResolution,
   OUT UINT32                *VerticalResolution,
   OUT UINT32                *ColorDepth,
   OUT UINT32                *RefreshRate
   )
 ;
 
 /**
   Return the current video mode information.
 
   @param  This                 Protocol instance pointer.
   @param  HorizontalResolution Current video horizontal resolution in pixels
   @param  VerticalResolution   Current video vertical resolution in pixels
   @param  ColorDepth           Current video color depth in bits per pixel
   @param  RefreshRate          Current video refresh rate in Hz.
 
   @retval EFI_SUCCESS          Mode information returned.
   @retval EFI_NOT_STARTED      Video display is not initialized. Call SetMode ()
 
 **/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_UGA_DRAW_PROTOCOL_SET_MODE) (
   IN  EFI_UGA_DRAW_PROTOCOL *This,
   IN  UINT32                HorizontalResolution,
   IN  UINT32                VerticalResolution,
   IN  UINT32                ColorDepth,
   IN  UINT32                RefreshRate
   )
 ;
 
 typedef struct {
   UINT8 Blue;
   UINT8 Green;
   UINT8 Red;
   UINT8 Reserved;
 } EFI_UGA_PIXEL;
 
 typedef union {
   EFI_UGA_PIXEL Pixel;
   UINT32        Raw;
 } EFI_UGA_PIXEL_UNION;
 
 typedef enum {
   EfiUgaVideoFill,
   EfiUgaVideoToBltBuffer,
   EfiUgaBltBufferToVideo,
   EfiUgaVideoToVideo,
   EfiUgaBltMax
 } EFI_UGA_BLT_OPERATION;
 
 /**
   Type specifying a pointer to a function to perform an UGA Blt operation.
 
     The following table defines actions for BltOperations:
 
     <B>EfiUgaVideoFill</B> - Write data from the  BltBuffer pixel (SourceX, SourceY) 
       directly to every pixel of the video display rectangle 
       (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). 
       Only one pixel will be used from the BltBuffer. Delta is NOT used.
 
     <B>EfiUgaVideoToBltBuffer</B> - Read data from the video display rectangle 
       (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in 
       the BltBuffer rectangle (DestinationX, DestinationY ) 
       (DestinationX + Width, DestinationY + Height). If DestinationX or 
       DestinationY is not zero then Delta must be set to the length in bytes 
       of a row in the BltBuffer.
 
     <B>EfiUgaBltBufferToVideo</B> - Write data from the  BltBuffer rectangle 
       (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the 
       video display rectangle (DestinationX, DestinationY) 
       (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is 
       not zero then Delta must be set to the length in bytes of a row in the 
       BltBuffer.
 
     <B>EfiUgaVideoToVideo</B> - Copy from the video display rectangle (SourceX, SourceY)
      (SourceX + Width, SourceY + Height) .to the video display rectangle 
      (DestinationX, DestinationY) (DestinationX + Width, DestinationY + Height). 
      The BltBuffer and Delta  are not used in this mode.
 
 
     @param[in] This          - Protocol instance pointer.
     @param[in] BltBuffer     - Buffer containing data to blit into video buffer. This 
                                buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL)
     @param[in] BltOperation  - Operation to perform on BlitBuffer and video memory
     @param[in] SourceX       - X coordinate of source for the BltBuffer.
     @param[in] SourceY       - Y coordinate of source for the BltBuffer.
     @param[in] DestinationX  - X coordinate of destination for the BltBuffer.
     @param[in] DestinationY  - Y coordinate of destination for the BltBuffer.
     @param[in] Width         - Width of rectangle in BltBuffer in pixels.
     @param[in] Height        - Hight of rectangle in BltBuffer in pixels.
     @param[in] Delta         - OPTIONAL
   
     @retval EFI_SUCCESS           - The Blt operation completed.
     @retval EFI_INVALID_PARAMETER - BltOperation is not valid.
     @retval EFI_DEVICE_ERROR      - A hardware error occured writting to the video buffer.
 
 --*/
 typedef
 EFI_STATUS
 (EFIAPI *EFI_UGA_DRAW_PROTOCOL_BLT) (
   IN  EFI_UGA_DRAW_PROTOCOL                   * This,
   IN  EFI_UGA_PIXEL                           * BltBuffer, OPTIONAL
   IN  EFI_UGA_BLT_OPERATION                   BltOperation,
   IN  UINTN                                   SourceX,
   IN  UINTN                                   SourceY,
   IN  UINTN                                   DestinationX,
   IN  UINTN                                   DestinationY,
   IN  UINTN                                   Width,
   IN  UINTN                                   Height,
   IN  UINTN                                   Delta         OPTIONAL
   );
 
 struct _EFI_UGA_DRAW_PROTOCOL {
   EFI_UGA_DRAW_PROTOCOL_GET_MODE  GetMode;
   EFI_UGA_DRAW_PROTOCOL_SET_MODE  SetMode;
   EFI_UGA_DRAW_PROTOCOL_BLT       Blt;
 };
 
 extern EFI_GUID gEfiUgaDrawProtocolGuid;
 
 #endif
Index: head/sys/boot/efi/libefi/Makefile
===================================================================
--- head/sys/boot/efi/libefi/Makefile	(revision 293723)
+++ head/sys/boot/efi/libefi/Makefile	(revision 293724)
@@ -1,26 +1,27 @@
 # $FreeBSD$
 
 LIB=	efi
 INTERNALLIB=
+WARNS?=	2
 
 SRCS=	delay.c efi_console.c efinet.c efipart.c errno.c handles.c \
 	libefi.c time.c
 
 .if ${MACHINE_CPUARCH} == "aarch64"
 CFLAGS+=	-msoft-float -mgeneral-regs-only
 .endif
 .if ${MACHINE_ARCH} == "amd64"
 CFLAGS+= -fPIC -mno-red-zone
 .endif
 CFLAGS+= -I${.CURDIR}/../include
 CFLAGS+= -I${.CURDIR}/../include/${MACHINE}
 CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
 
 # Pick up the bootstrap header for some interface items
 CFLAGS+= -I${.CURDIR}/../../common
 
 # Handle FreeBSD specific %b and %D printf format specifiers
 CFLAGS+= ${FORMAT_EXTENSIONS}
 CFLAGS+= -DTERM_EMU
 
 .include <bsd.lib.mk>
Index: head/sys/boot/efi/libefi/efi_console.c
===================================================================
--- head/sys/boot/efi/libefi/efi_console.c	(revision 293723)
+++ head/sys/boot/efi/libefi/efi_console.c	(revision 293724)
@@ -1,483 +1,485 @@
 /*-
  * Copyright (c) 2000 Doug Rabson
  * 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$");
 
 #include <efi.h>
 #include <efilib.h>
 
 #include "bootstrap.h"
 
 static SIMPLE_TEXT_OUTPUT_INTERFACE	*conout;
 static SIMPLE_INPUT_INTERFACE		*conin;
 
 #ifdef TERM_EMU
 #define	DEFAULT_FGCOLOR	EFI_LIGHTGRAY
 #define	DEFAULT_BGCOLOR	EFI_BLACK
 
 #define	MAXARGS	8
 static int args[MAXARGS], argc;
 static int fg_c, bg_c, curx, cury;
 static int esc;
 
 void get_pos(int *x, int *y);
 void curs_move(int *_x, int *_y, int x, int y);
 static void CL(int);
+void HO(void);
+void end_term(void);
 #endif
 
 static void efi_cons_probe(struct console *);
 static int efi_cons_init(int);
 void efi_cons_putchar(int);
 int efi_cons_getchar(void);
 void efi_cons_efiputchar(int);
 int efi_cons_poll(void);
 
 struct console efi_console = {
 	"efi",
 	"EFI console",
 	0,
 	efi_cons_probe,
 	efi_cons_init,
 	efi_cons_putchar,
 	efi_cons_getchar,
 	efi_cons_poll
 };
 
 #ifdef TERM_EMU
 
 /* Get cursor position. */
 void
 get_pos(int *x, int *y)
 {
 	*x = conout->Mode->CursorColumn;
 	*y = conout->Mode->CursorRow;
 }
 
 /* Move cursor to x rows and y cols (0-based). */
 void
 curs_move(int *_x, int *_y, int x, int y)
 {
 	conout->SetCursorPosition(conout, x, y);
 	if (_x != NULL)
 		*_x = conout->Mode->CursorColumn;
 	if (_y != NULL)
 		*_y = conout->Mode->CursorRow;
 }
 
 /* Clear internal state of the terminal emulation code. */
 void
 end_term(void)
 {
 	esc = 0;
 	argc = -1;
 }
 
 #endif
 
 static void
 efi_cons_probe(struct console *cp)
 {
 	conout = ST->ConOut;
 	conin = ST->ConIn;
 	cp->c_flags |= C_PRESENTIN | C_PRESENTOUT;
 }
 
 static int
 efi_cons_init(int arg)
 {
 	conout->SetAttribute(conout, EFI_TEXT_ATTR(DEFAULT_FGCOLOR,
 	    DEFAULT_BGCOLOR));
 #ifdef TERM_EMU
 	end_term();
 	get_pos(&curx, &cury);
 	curs_move(&curx, &cury, curx, cury);
 	fg_c = DEFAULT_FGCOLOR;
 	bg_c = DEFAULT_BGCOLOR;
 #endif
 	conout->EnableCursor(conout, TRUE);
 	return 0;
 }
 
 static void
 efi_cons_rawputchar(int c)
 {
 	int i;
 	UINTN x, y;
 	conout->QueryMode(conout, conout->Mode->Mode, &x, &y);
 
 	if (c == '\t')
 		/* XXX lame tab expansion */
 		for (i = 0; i < 8; i++)
 			efi_cons_rawputchar(' ');
 	else {
 #ifndef	TERM_EMU
 		if (c == '\n')
 			efi_cons_efiputchar('\r');
 		else
 			efi_cons_efiputchar(c);
 #else
 		switch (c) {
 		case '\r':
 			curx = 0;
 			curs_move(&curx, &cury, curx, cury);
 			return;
 		case '\n':
 			cury++;
 			if (cury >= y) {
 				efi_cons_efiputchar('\n');
 				cury--;
 			} else
 				curs_move(&curx, &cury, curx, cury);
 			return;
 		case '\b':
 			if (curx > 0) {
 				curx--;
 				curs_move(&curx, &cury, curx, cury);
 			}
 			return;
 		default:
 			efi_cons_efiputchar(c);
 			curx++;
 			if (curx > x-1) {
 				curx = 0;
 				cury++;
 			}
 			if (cury > y-1) {
 				curx = 0;
 				cury--;
 			}
 		}
 		curs_move(&curx, &cury, curx, cury);
 #endif
 	}
 }
 
 /* Gracefully exit ESC-sequence processing in case of misunderstanding. */
 static void
 bail_out(int c)
 {
 	char buf[16], *ch;
 	int i;
 
 	if (esc) {
 		efi_cons_rawputchar('\033');
 		if (esc != '\033')
 			efi_cons_rawputchar(esc);
 		for (i = 0; i <= argc; ++i) {
 			sprintf(buf, "%d", args[i]);
 			ch = buf;
 			while (*ch)
 				efi_cons_rawputchar(*ch++);
 		}
 	}
 	efi_cons_rawputchar(c);
 	end_term();
 }
 
 /* Clear display from current position to end of screen. */
 static void
 CD(void) {
 	int i;
 	UINTN x, y;
 
 	get_pos(&curx, &cury);
 	if (curx == 0 && cury == 0) {
 		conout->ClearScreen(conout);
 		end_term();
 		return;
 	}
 
 	conout->QueryMode(conout, conout->Mode->Mode, &x, &y);
 	CL(0);  /* clear current line from cursor to end */
 	for (i = cury + 1; i < y-1; i++) {
 		curs_move(NULL, NULL, 0, i);
 		CL(0);
 	}
 	curs_move(NULL, NULL, curx, cury);
 	end_term();
 }
 
 /*
  * Absolute cursor move to args[0] rows and args[1] columns
  * (the coordinates are 1-based).
  */
 static void
 CM(void)
 {
 	if (args[0] > 0)
 		args[0]--;
 	if (args[1] > 0)
 		args[1]--;
 	curs_move(&curx, &cury, args[1], args[0]);
 	end_term();
 }
 
 /* Home cursor (left top corner), also called from mode command. */
 void
 HO(void)
 {
 	argc = 1;
 	args[0] = args[1] = 1;
 	CM();
 }
 
 /* Clear line from current position to end of line */
 static void
 CL(int direction)
 {
 	int i, len;
 	UINTN x, y;
 	CHAR16 *line;
 
 	conout->QueryMode(conout, conout->Mode->Mode, &x, &y);
 	switch (direction) {
 	case 0:         /* from cursor to end */
 		len = x - curx + 1;
 		break;
 	case 1:         /* from beginning to cursor */
 		len = curx;
 		break;
 	case 2:         /* entire line */
 		len = x;
 		break;
 	}
 
 	if (cury == y - 1)
 		len--;
 
 	line = malloc(len * sizeof (CHAR16));
 	if (line == NULL) {
 		printf("out of memory\n");
 		return;
 	}
 	for (i = 0; i < len; i++)
 		line[i] = ' ';
 	line[len-1] = 0;
 
 	if (direction != 0)
 		curs_move(NULL, NULL, 0, cury);
 
 	conout->OutputString(conout, line);
 	/* restore cursor position */
 	curs_move(NULL, NULL, curx, cury);
 	free(line);
 	end_term();
 }
 
 static void
 get_arg(int c)
 {
 	if (argc < 0)
 		argc = 0;
 	args[argc] *= 10;
 	args[argc] += c - '0';
 }
 
 /* Emulate basic capabilities of cons25 terminal */
 static void
 efi_term_emu(int c)
 {
 	static int ansi_col[] = {
 		0, 4, 2, 6, 1, 5, 3, 7
 	};
 	int t, i;
 
 	switch (esc) {
 	case 0:
 		switch (c) {
 		case '\033':
 			esc = c;
 			break;
 		default:
 			efi_cons_rawputchar(c);
 			break;
 		}
 		break;
 	case '\033':
 		switch (c) {
 		case '[':
 			esc = c;
 			args[0] = 0;
 			argc = -1;
 			break;
 		default:
 			bail_out(c);
 			break;
 		}
 		break;
 	case '[':
 		switch (c) {
 		case ';':
 			if (argc < 0)
 				argc = 0;
 			else if (argc + 1 >= MAXARGS)
 				bail_out(c);
 			else
 				args[++argc] = 0;
 			break;
 		case 'H':               /* ho = \E[H */
 			if (argc < 0)
 				HO();
 			else if (argc == 1)
 				CM();
 			else
 				bail_out(c);
 			break;
 		case 'J':               /* cd = \E[J */
 			if (argc < 0)
 				CD();
 			else
 				bail_out(c);
 			break;
 		case 'm':
 			if (argc < 0) {
 				fg_c = DEFAULT_FGCOLOR;
 				bg_c = DEFAULT_BGCOLOR;
 			}
 			for (i = 0; i <= argc; ++i) {
 				switch (args[i]) {
 				case 0:         /* back to normal */
 					fg_c = DEFAULT_FGCOLOR;
 					bg_c = DEFAULT_BGCOLOR;
 					break;
 				case 1:         /* bold */
 					fg_c |= 0x8;
 					break;
 				case 4:         /* underline */
 				case 5:         /* blink */
 					bg_c |= 0x8;
 					break;
 				case 7:         /* reverse */
 					t = fg_c;
 					fg_c = bg_c;
 					bg_c = t;
 					break;
 				case 30: case 31: case 32: case 33:
 				case 34: case 35: case 36: case 37:
 					fg_c = ansi_col[args[i] - 30];
 					break;
 				case 39:        /* normal */
 					fg_c = DEFAULT_FGCOLOR;
 					break;
 				case 40: case 41: case 42: case 43:
 				case 44: case 45: case 46: case 47:
 					bg_c = ansi_col[args[i] - 40];
 					break;
 				case 49:        /* normal */
 					bg_c = DEFAULT_BGCOLOR;
 					break;
 				}
 			}
 			conout->SetAttribute(conout, EFI_TEXT_ATTR(fg_c, bg_c));
 			end_term();
 			break;
 		default:
 			if (isdigit(c))
 				get_arg(c);
 			else
 				bail_out(c);
 			break;
 		}
 		break;
 	default:
 		bail_out(c);
 		break;
 	}
 }
 
 void
 efi_cons_putchar(int c)
 {
 #ifdef TERM_EMU
 	efi_term_emu(c);
 #else
 	efi_cons_rawputchar(c);
 #endif
 }
 
 int
 efi_cons_getchar()
 {
 	EFI_INPUT_KEY key;
 	EFI_STATUS status;
 	UINTN junk;
 
 	/* Try to read a key stroke. We wait for one if none is pending. */
 	status = conin->ReadKeyStroke(conin, &key);
 	if (status == EFI_NOT_READY) {
 		BS->WaitForEvent(1, &conin->WaitForKey, &junk);
 		status = conin->ReadKeyStroke(conin, &key);
 	}
 	switch (key.ScanCode) {
 	case 0x17: /* ESC */
 		return (0x1b);  /* esc */
 	}
 
 	/* this can return  */
 	return (key.UnicodeChar);
 }
 
 int
 efi_cons_poll()
 {
 	/* This can clear the signaled state. */
 	return (BS->CheckEvent(conin->WaitForKey) == EFI_SUCCESS);
 }
 
 /* Plain direct access to EFI OutputString(). */
 void
 efi_cons_efiputchar(int c)
 {
 	CHAR16 buf[2];
 
 	/*
 	 * translate box chars to unicode
 	 */
 	switch (c) {
 	/* single frame */
 	case 0xb3: buf[0] = BOXDRAW_VERTICAL; break;
 	case 0xbf: buf[0] = BOXDRAW_DOWN_LEFT; break;
 	case 0xc0: buf[0] = BOXDRAW_UP_RIGHT; break;
 	case 0xc4: buf[0] = BOXDRAW_HORIZONTAL; break;
 	case 0xda: buf[0] = BOXDRAW_DOWN_RIGHT; break;
 	case 0xd9: buf[0] = BOXDRAW_UP_LEFT; break;
 
 	/* double frame */
 	case 0xba: buf[0] = BOXDRAW_DOUBLE_VERTICAL; break;
 	case 0xbb: buf[0] = BOXDRAW_DOUBLE_DOWN_LEFT; break;
 	case 0xbc: buf[0] = BOXDRAW_DOUBLE_UP_LEFT; break;
 	case 0xc8: buf[0] = BOXDRAW_DOUBLE_UP_RIGHT; break;
 	case 0xc9: buf[0] = BOXDRAW_DOUBLE_DOWN_RIGHT; break;
 	case 0xcd: buf[0] = BOXDRAW_DOUBLE_HORIZONTAL; break;
 
 	default:
 		buf[0] = c;
 	}
         buf[1] = 0;     /* terminate string */
 
 	conout->OutputString(conout, buf);
 }
Index: head/sys/boot/efi/libefi/efipart.c
===================================================================
--- head/sys/boot/efi/libefi/efipart.c	(revision 293723)
+++ head/sys/boot/efi/libefi/efipart.c	(revision 293724)
@@ -1,313 +1,312 @@
 /*-
  * Copyright (c) 2010 Marcel Moolenaar
  * 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$");
 
 #include <sys/param.h>
 #include <sys/time.h>
 #include <stddef.h>
 #include <stdarg.h>
 
 #include <bootstrap.h>
 
 #include <efi.h>
 #include <efilib.h>
 #include <efiprot.h>
 
 static EFI_GUID blkio_guid = BLOCK_IO_PROTOCOL;
 static EFI_GUID devpath_guid = DEVICE_PATH_PROTOCOL;
 
 static int efipart_init(void);
 static int efipart_strategy(void *, int, daddr_t, size_t, char *, size_t *);
 static int efipart_open(struct open_file *, ...);
 static int efipart_close(struct open_file *);
 static void efipart_print(int);
 
 struct devsw efipart_dev = {
 	.dv_name = "part",
 	.dv_type = DEVT_DISK,
 	.dv_init = efipart_init,
 	.dv_strategy = efipart_strategy,
 	.dv_open = efipart_open,
 	.dv_close = efipart_close,
 	.dv_ioctl = noioctl,
 	.dv_print = efipart_print,
 	.dv_cleanup = NULL
 };
 
 static int
 efipart_init(void) 
 {
 	EFI_BLOCK_IO *blkio;
 	EFI_DEVICE_PATH *devpath, *devpathcpy, *tmpdevpath, *node;
 	EFI_HANDLE *hin, *hout, *aliases, handle;
 	EFI_STATUS status;
 	UINTN sz;
-	CHAR16 *path;
 	u_int n, nin, nout;
 	int err;
 	size_t devpathlen;
 
 	sz = 0;
 	hin = NULL;
 	status = BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz, 0);
 	if (status == EFI_BUFFER_TOO_SMALL) {
 		hin = (EFI_HANDLE *)malloc(sz * 3);
 		status = BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz,
 		    hin);
 		if (EFI_ERROR(status))
 			free(hin);
 	}
 	if (EFI_ERROR(status))
 		return (efi_status_to_errno(status));
 
 	/* Filter handles to only include FreeBSD partitions. */
 	nin = sz / sizeof(EFI_HANDLE);
 	hout = hin + nin;
 	aliases = hout + nin;
 	nout = 0;
 
 	bzero(aliases, nin * sizeof(EFI_HANDLE));
 
 	for (n = 0; n < nin; n++) {
 		status = BS->HandleProtocol(hin[n], &devpath_guid,
 		    (void **)&devpath);
 		if (EFI_ERROR(status)) {
 			continue;
 		}
 
 		node = devpath;
 		devpathlen = DevicePathNodeLength(node);
 		while (!IsDevicePathEnd(NextDevicePathNode(node))) {
 			node = NextDevicePathNode(node);
 			devpathlen += DevicePathNodeLength(node);
 		}
 		devpathlen += DevicePathNodeLength(NextDevicePathNode(node));
 
 		status = BS->HandleProtocol(hin[n], &blkio_guid,
 		    (void**)&blkio);
 		if (EFI_ERROR(status))
 			continue;
 		if (!blkio->Media->LogicalPartition)
 			continue;
 
 		/*
 		 * If we come across a logical partition of subtype CDROM
 		 * it doesn't refer to the CD filesystem itself, but rather
 		 * to any usable El Torito boot image on it. In this case
 		 * we try to find the parent device and add that instead as
 		 * that will be the CD filesystem.
 		 */
 		if (DevicePathType(node) == MEDIA_DEVICE_PATH &&
 		    DevicePathSubType(node) == MEDIA_CDROM_DP) {
 			devpathcpy = malloc(devpathlen);
 			memcpy(devpathcpy, devpath, devpathlen);
 			node = devpathcpy;
 			while (!IsDevicePathEnd(NextDevicePathNode(node)))
 				node = NextDevicePathNode(node);
 			SetDevicePathEndNode(node);
 			tmpdevpath = devpathcpy;
 			status = BS->LocateDevicePath(&blkio_guid, &tmpdevpath,
 			    &handle);
 			free(devpathcpy);
 			if (EFI_ERROR(status))
 				continue;
 			hout[nout] = handle;
 			aliases[nout] = hin[n];
 		} else
 			hout[nout] = hin[n];
 		nout++;
 	}
 
 	err = efi_register_handles(&efipart_dev, hout, aliases, nout);
 	free(hin);
 	return (err);
 }
 
 static void
 efipart_print(int verbose)
 {
 	char line[80];
 	EFI_BLOCK_IO *blkio;
 	EFI_HANDLE h;
 	EFI_STATUS status;
 	u_int unit;
 
 	for (unit = 0, h = efi_find_handle(&efipart_dev, 0);
 	    h != NULL; h = efi_find_handle(&efipart_dev, ++unit)) {
 		sprintf(line, "    %s%d:", efipart_dev.dv_name, unit);
 		pager_output(line);
 
 		status = BS->HandleProtocol(h, &blkio_guid, (void **)&blkio);
 		if (!EFI_ERROR(status)) {
 			sprintf(line, "    %llu blocks",
 			    (unsigned long long)(blkio->Media->LastBlock + 1));
 			pager_output(line);
 			if (blkio->Media->RemovableMedia)
 				pager_output(" (removable)");
 		}
 		pager_output("\n");
 	}
 }
 
 static int 
 efipart_open(struct open_file *f, ...)
 {
 	va_list args;
 	struct devdesc *dev;
 	EFI_BLOCK_IO *blkio;
 	EFI_HANDLE h;
 	EFI_STATUS status;
 
 	va_start(args, f);
 	dev = va_arg(args, struct devdesc*);
 	va_end(args);
 
 	h = efi_find_handle(&efipart_dev, dev->d_unit);
 	if (h == NULL)
 		return (EINVAL);
 
 	status = BS->HandleProtocol(h, &blkio_guid, (void **)&blkio);
 	if (EFI_ERROR(status))
 		return (efi_status_to_errno(status));
 
 	if (!blkio->Media->MediaPresent)
 		return (EAGAIN);
 
 	dev->d_opendata = blkio;
 	return (0);
 }
 
 static int 
 efipart_close(struct open_file *f)
 {
 	struct devdesc *dev;
 
 	dev = (struct devdesc *)(f->f_devdata);
 	if (dev->d_opendata == NULL)
 		return (EINVAL);
 
 	dev->d_opendata = NULL;
 	return (0);
 }
 
 /*
  * efipart_readwrite()
  * Internal equivalent of efipart_strategy(), which operates on the
  * media-native block size. This function expects all I/O requests
  * to be within the media size and returns an error if such is not
  * the case.
  */
 static int
 efipart_readwrite(EFI_BLOCK_IO *blkio, int rw, daddr_t blk, daddr_t nblks,
     char *buf)
 {
 	EFI_STATUS status;
 
 	if (blkio == NULL)
 		return (ENXIO);
 	if (blk < 0 || blk > blkio->Media->LastBlock)
 		return (EIO);
 	if ((blk + nblks - 1) > blkio->Media->LastBlock)
 		return (EIO);
 
 	switch (rw) {
 	case F_READ:
 		status = blkio->ReadBlocks(blkio, blkio->Media->MediaId, blk,
 		    nblks * blkio->Media->BlockSize, buf);
 		break;
 	case F_WRITE:
 		if (blkio->Media->ReadOnly)
 			return (EROFS);
 		status = blkio->WriteBlocks(blkio, blkio->Media->MediaId, blk,
 		    nblks * blkio->Media->BlockSize, buf);
 		break;
 	default:
 		return (ENOSYS);
 	}
 
 	if (EFI_ERROR(status))
 		printf("%s: rw=%d, status=%lu\n", __func__, rw, (u_long)status);
 	return (efi_status_to_errno(status));
 }
 
 static int 
 efipart_strategy(void *devdata, int rw, daddr_t blk, size_t size, char *buf,
     size_t *rsize)
 {
 	struct devdesc *dev = (struct devdesc *)devdata;
 	EFI_BLOCK_IO *blkio;
 	off_t off;
 	char *blkbuf;
 	size_t blkoff, blksz;
 	int error;
 
 	if (dev == NULL || blk < 0)
 		return (EINVAL);
 
 	blkio = dev->d_opendata;
 	if (blkio == NULL)
 		return (ENXIO);
 
 	if (size == 0 || (size % 512) != 0)
 		return (EIO);
 
 	if (rsize != NULL)
 		*rsize = size;
 
 	if (blkio->Media->BlockSize == 512)
 		return (efipart_readwrite(blkio, rw, blk, size / 512, buf));
 
 	/*
 	 * The block size of the media is not 512B per sector.
 	 */
 	blkbuf = malloc(blkio->Media->BlockSize);
 	if (blkbuf == NULL)
 		return (ENOMEM);
 
 	error = 0;
 	off = blk * 512;
 	blk = off / blkio->Media->BlockSize;
 	blkoff = off % blkio->Media->BlockSize;
 	blksz = blkio->Media->BlockSize - blkoff;
 	while (size > 0) {
 		error = efipart_readwrite(blkio, rw, blk, 1, blkbuf);
 		if (error)
 			break;
 		if (size < blksz)
 			blksz = size;
 		bcopy(blkbuf + blkoff, buf, blksz);
 		buf += blksz;
 		size -= blksz;
 		blk++;
 		blkoff = 0;
 		blksz = blkio->Media->BlockSize;
 	}
 
 	free(blkbuf);
 	return (error);
 }
Index: head/sys/boot/efi/libefi/libefi.c
===================================================================
--- head/sys/boot/efi/libefi/libefi.c	(revision 293723)
+++ head/sys/boot/efi/libefi/libefi.c	(revision 293724)
@@ -1,198 +1,198 @@
 /*-
  * Copyright (c) 2000 Doug Rabson
  * 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$");
 
 #include <efi.h>
 #include <eficonsctl.h>
 #include <efilib.h>
 #include <stand.h>
 
 EFI_HANDLE		IH;
 EFI_SYSTEM_TABLE	*ST;
 EFI_BOOT_SERVICES	*BS;
 EFI_RUNTIME_SERVICES	*RS;
 
 static EFI_PHYSICAL_ADDRESS heap;
 static UINTN heapsize;
 
 static CHAR16 *
 arg_skipsep(CHAR16 *argp)
 {
 
 	while (*argp == ' ' || *argp == '\t')
 		argp++;
 	return (argp);
 }
 
 static CHAR16 *
 arg_skipword(CHAR16 *argp)
 {
 
 	while (*argp && *argp != ' ' && *argp != '\t')
 		argp++;
 	return (argp);
 }
 
 void *
 efi_get_table(EFI_GUID *tbl)
 {
 	EFI_GUID *id;
 	int i;
 
 	for (i = 0; i < ST->NumberOfTableEntries; i++) {
 		id = &ST->ConfigurationTable[i].VendorGuid;
 		if (!memcmp(id, tbl, sizeof(EFI_GUID)))
 			return (ST->ConfigurationTable[i].VendorTable);
 	}
 	return (NULL);
 }
 
 void exit(EFI_STATUS exit_code)
 {
 
 	BS->FreePages(heap, EFI_SIZE_TO_PAGES(heapsize));
 	BS->Exit(IH, exit_code, 0, NULL);
 }
 
 void
 efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *system_table)
 {
 	static EFI_GUID image_protocol = LOADED_IMAGE_PROTOCOL;
 	static EFI_GUID console_control_protocol =
 	    EFI_CONSOLE_CONTROL_PROTOCOL_GUID;
 	EFI_CONSOLE_CONTROL_PROTOCOL *console_control = NULL;
 	EFI_LOADED_IMAGE *img;
 	CHAR16 *argp, *args, **argv;
 	EFI_STATUS status;
 	int argc, addprog;
 
 	IH = image_handle;
 	ST = system_table;
 	BS = ST->BootServices;
 	RS = ST->RuntimeServices;
 
 	status = BS->LocateProtocol(&console_control_protocol, NULL,
 	    (VOID **)&console_control);
 	if (status == EFI_SUCCESS)
 		(void)console_control->SetMode(console_control,
 		    EfiConsoleControlScreenText);
 
 	heapsize = 3 * 1024 * 1024;
 	status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
 	    EFI_SIZE_TO_PAGES(heapsize), &heap);
 	if (status != EFI_SUCCESS)
 		BS->Exit(IH, status, 0, NULL);
 
 	setheap((void *)(uintptr_t)heap, (void *)(uintptr_t)(heap + heapsize));
 
 	/* Use exit() from here on... */
 
 	status = BS->HandleProtocol(IH, &image_protocol, (VOID**)&img);
 	if (status != EFI_SUCCESS)
 		exit(status);
 
 	/*
 	 * Pre-process the (optional) load options. If the option string
 	 * is given as an ASCII string, we use a poor man's ASCII to
 	 * Unicode-16 translation. The size of the option string as given
 	 * to us includes the terminating null character. We assume the
 	 * string is an ASCII string if strlen() plus the terminating
 	 * '\0' is less than LoadOptionsSize. Even if all Unicode-16
 	 * characters have the upper 8 bits non-zero, the terminating
 	 * null character will cause a one-off.
 	 * If the string is already in Unicode-16, we make a copy so that
 	 * we know we can always modify the string.
 	 */
 	if (img->LoadOptionsSize > 0 && img->LoadOptions != NULL) {
 		if (img->LoadOptionsSize == strlen(img->LoadOptions) + 1) {
 			args = malloc(img->LoadOptionsSize << 1);
 			for (argc = 0; argc < img->LoadOptionsSize; argc++)
 				args[argc] = ((char*)img->LoadOptions)[argc];
 		} else {
 			args = malloc(img->LoadOptionsSize);
 			memcpy(args, img->LoadOptions, img->LoadOptionsSize);
 		}
 	} else
 		args = NULL;
 
 	/*
 	 * Use a quick and dirty algorithm to build the argv vector. We
 	 * first count the number of words. Then, after allocating the
 	 * vector, we split the string up. We don't deal with quotes or
 	 * other more advanced shell features.
 	 * The EFI shell will pass the name of the image as the first
 	 * word in the argument list. This does not happen if we're
 	 * loaded by the boot manager. This is not so easy to figure
 	 * out though. The ParentHandle is not always NULL, because
 	 * there can be a function (=image) that will perform the task
 	 * for the boot manager.
 	 */
 	/* Part 1: Figure out if we need to add our program name. */
 	addprog = (args == NULL || img->ParentHandle == NULL ||
 	    img->FilePath == NULL) ? 1 : 0;
 	if (!addprog) {
 		addprog =
 		    (DevicePathType(img->FilePath) != MEDIA_DEVICE_PATH ||
 		     DevicePathSubType(img->FilePath) != MEDIA_FILEPATH_DP ||
 		     DevicePathNodeLength(img->FilePath) <=
 			sizeof(FILEPATH_DEVICE_PATH)) ? 1 : 0;
 		if (!addprog) {
 			/* XXX todo. */
 		}
 	}
 	/* Part 2: count words. */
 	argc = (addprog) ? 1 : 0;
 	argp = args;
 	while (argp != NULL && *argp != 0) {
 		argp = arg_skipsep(argp);
 		if (*argp == 0)
 			break;
 		argc++;
 		argp = arg_skipword(argp);
 	}
 	/* Part 3: build vector. */
 	argv = malloc((argc + 1) * sizeof(CHAR16*));
 	argc = 0;
 	if (addprog)
-		argv[argc++] = L"loader.efi";
+		argv[argc++] = (CHAR16 *)"loader.efi";
 	argp = args;
 	while (argp != NULL && *argp != 0) {
 		argp = arg_skipsep(argp);
 		if (*argp == 0)
 			break;
 		argv[argc++] = argp;
 		argp = arg_skipword(argp);
 		/* Terminate the words. */
 		if (*argp != 0)
 			*argp++ = 0;
 	}
 	argv[argc] = NULL;
 
 	status = main(argc, argv);
 	exit(status);
 }
Index: head/sys/boot/efi/loader/Makefile
===================================================================
--- head/sys/boot/efi/loader/Makefile	(revision 293723)
+++ head/sys/boot/efi/loader/Makefile	(revision 293724)
@@ -1,132 +1,133 @@
 # $FreeBSD$
 
 MAN=
 
 .include <src.opts.mk>
 
 # In-tree GCC does not support __attribute__((ms_abi)).
 .if ${COMPILER_TYPE} != "gcc"
 
 MK_SSP=		no
 
 PROG=		loader.sym
 INTERNALPROG=
+WARNS?=		3
 
 # architecture-specific loader code
 SRCS=	autoload.c \
 	bootinfo.c \
 	conf.c \
 	copy.c \
 	devicename.c \
 	main.c \
 	self_reloc.c \
 	smbios.c \
 	vers.c
 
 .PATH: ${.CURDIR}/arch/${MACHINE}
 # For smbios.c
 .PATH: ${.CURDIR}/../../i386/libi386
 .include "${.CURDIR}/arch/${MACHINE}/Makefile.inc"
 
 CFLAGS+=	-I${.CURDIR}
 CFLAGS+=	-I${.CURDIR}/arch/${MACHINE}
 CFLAGS+=	-I${.CURDIR}/../include
 CFLAGS+=	-I${.CURDIR}/../include/${MACHINE}
 CFLAGS+=	-I${.CURDIR}/../../../contrib/dev/acpica/include
 CFLAGS+=	-I${.CURDIR}/../../..
 CFLAGS+=	-I${.CURDIR}/../../i386/libi386
 CFLAGS+=	-DNO_PCI -DEFI
 
 # make buildenv doesn't set DESTDIR, this means LIBSTAND
 # will be wrong when crossbuilding.
 .if exists(${.OBJDIR}/../../../../lib/libstand/libstand.a)
 LIBSTAND=	${.OBJDIR}/../../../../lib/libstand/libstand.a
 .endif
 
 .if ${MK_FORTH} != "no"
 BOOT_FORTH=	yes
 CFLAGS+=	-DBOOT_FORTH
 CFLAGS+=	-I${.CURDIR}/../../ficl
 CFLAGS+=	-I${.CURDIR}/../../ficl/${MACHINE_CPUARCH}
 LIBFICL=	${.OBJDIR}/../../ficl/libficl.a
 .endif
 
 LOADER_FDT_SUPPORT?=	no
 .if ${MK_FDT} != "no" && ${LOADER_FDT_SUPPORT} != "no"
 CFLAGS+=	-I${.CURDIR}/../../fdt
 CFLAGS+=	-I${.OBJDIR}/../../fdt
 CFLAGS+=	-DLOADER_FDT_SUPPORT
 LIBEFI_FDT=	${.OBJDIR}/../../efi/fdt/libefi_fdt.a
 LIBFDT=		${.OBJDIR}/../../fdt/libfdt.a
 .endif
 
 # Include bcache code.
 HAVE_BCACHE=    yes
 
 .if defined(EFI_STAGING_SIZE)
 CFLAGS+=	-DEFI_STAGING_SIZE=${EFI_STAGING_SIZE}
 .endif
 
 # Always add MI sources
 .PATH:		${.CURDIR}/../../common
 .include	"${.CURDIR}/../../common/Makefile.inc"
 CFLAGS+=	-I${.CURDIR}/../../common
 
 FILES+=	loader.efi
 FILESMODE_loader.efi=	${BINMODE}
 
 LDSCRIPT=	${.CURDIR}/arch/${MACHINE}/ldscript.${MACHINE}
 LDFLAGS+=	-Wl,-T${LDSCRIPT} -Wl,-Bsymbolic -shared
 
 CLEANFILES+=	vers.c loader.efi
 
 NEWVERSWHAT=	"EFI loader" ${MACHINE}
 
 vers.c:	${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../../efi/loader/version
 	sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
 
 OBJCOPY?=	objcopy
 OBJDUMP?=	objdump
 
 .if ${MACHINE_CPUARCH} == "amd64"
 EFI_TARGET=	efi-app-x86_64
 .elif ${MACHINE_CPUARCH} == "i386"
 EFI_TARGET=	efi-app-ia32
 .else
 EFI_TARGET=	binary
 .endif
 
 loader.efi: ${PROG}
 	if [ `${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*' | wc -l` != 0 ]; then \
 		${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*'; \
 		exit 1; \
 	fi
 	${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
 		-j .dynamic -j .dynsym -j .rel.dyn \
 		-j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \
 		--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
 
 LIBEFI=		${.OBJDIR}/../libefi/libefi.a
 
 DPADD=		${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND} \
 		${LDSCRIPT}
 LDADD=		${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND}
 
 .endif # ${COMPILER_TYPE} != "gcc"
 
 .include <bsd.prog.mk>
 
 beforedepend ${OBJS}: machine
 
 CLEANFILES+=   machine
 
 machine:
 	ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
 
 .if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
 beforedepend ${OBJS}: x86
 CLEANFILES+=   x86
 
 x86:
 	ln -sf ${.CURDIR}/../../../x86/include x86
 .endif
Index: head/sys/boot/efi/loader/arch/amd64/elf64_freebsd.c
===================================================================
--- head/sys/boot/efi/loader/arch/amd64/elf64_freebsd.c	(revision 293723)
+++ head/sys/boot/efi/loader/arch/amd64/elf64_freebsd.c	(revision 293724)
@@ -1,189 +1,188 @@
 /*-
  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
  * Copyright (c) 2014 The FreeBSD Foundation
  * 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/elf.h>
 #include <stand.h>
 
 #include <efi.h>
 #include <efilib.h>
 
 #include "bootstrap.h"
 
 #include "platform/acfreebsd.h"
 #include "acconfig.h"
 #define ACPI_SYSTEM_XFACE
 #include "actypes.h"
 #include "actbl.h"
 
 #include "loader_efi.h"
 
 static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
 static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
 
 extern int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
 
 static int	elf64_exec(struct preloaded_file *amp);
 static int	elf64_obj_exec(struct preloaded_file *amp);
 
 static struct file_format amd64_elf = { elf64_loadfile, elf64_exec };
 static struct file_format amd64_elf_obj = { elf64_obj_loadfile, elf64_obj_exec };
 
 struct file_format *file_formats[] = {
 	&amd64_elf,
 	&amd64_elf_obj,
 	NULL
 };
 
 #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;
 static p4_entry_t *PT4;
 static p3_entry_t *PT3;
 static p2_entry_t *PT2;
 
 static void (*trampoline)(uint64_t stack, void *copy_finish, uint64_t kernend,
 			  uint64_t modulep, p4_entry_t *pagetable,
 			  uint64_t entry);
 
 extern uintptr_t amd64_tramp;
 extern uint32_t amd64_tramp_size;
 
 /*
  * 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, trampcode, trampstack;
 	int			err, i;
 	ACPI_TABLE_RSDP		*rsdp;
 	char			buf[24];
 	int			revision;
-	EFI_STATUS		status;
 
 	rsdp = efi_get_table(&acpi20_guid);
 	if (rsdp == NULL) {
 		rsdp = efi_get_table(&acpi_guid);
 	}
 	if (rsdp != NULL) {
 		sprintf(buf, "0x%016llx", (unsigned long long)rsdp);
 		setenv("hint.acpi.0.rsdp", buf, 1);
 		revision = rsdp->Revision;
 		if (revision == 0)
 			revision = 1;
 		sprintf(buf, "%d", revision);
 		setenv("hint.acpi.0.revision", buf, 1);
 		strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
 		buf[sizeof(rsdp->OemId)] = '\0';
 		setenv("hint.acpi.0.oem", buf, 1);
 		sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
 		setenv("hint.acpi.0.rsdt", buf, 1);
 		if (revision >= 2) {
 			/* XXX extended checksum? */
 			sprintf(buf, "0x%016llx",
 			    (unsigned long long)rsdp->XsdtPhysicalAddress);
 			setenv("hint.acpi.0.xsdt", buf, 1);
 			sprintf(buf, "%d", rsdp->Length);
 			setenv("hint.acpi.0.xsdt_length", buf, 1);
 		}
 	}
 
 	if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
 		return(EFTYPE);
 	ehdr = (Elf_Ehdr *)&(md->md_data);
 
 	trampcode = (vm_offset_t)0x0000000040000000;
 	err = BS->AllocatePages(AllocateMaxAddress, EfiLoaderData, 1,
 	    (EFI_PHYSICAL_ADDRESS *)&trampcode);
 	bzero((void *)trampcode, EFI_PAGE_SIZE);
 	trampstack = trampcode + EFI_PAGE_SIZE - 8;
 	bcopy((void *)&amd64_tramp, (void *)trampcode, amd64_tramp_size);
 	trampoline = (void *)trampcode;
 
 	PT4 = (p4_entry_t *)0x0000000040000000;
 	err = BS->AllocatePages(AllocateMaxAddress, EfiLoaderData, 3,
 	    (EFI_PHYSICAL_ADDRESS *)&PT4);
 	bzero(PT4, 3 * EFI_PAGE_SIZE);
 
 	PT3 = &PT4[512];
 	PT2 = &PT3[512];
 
 	/*
 	 * 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 L4 pages points to the same L3 page. */
 		PT4[i] = (p4_entry_t)PT3;
 		PT4[i] |= PG_V | PG_RW | PG_U;
 
 		/* Each slot of the L3 pages points to the same L2 page. */
 		PT3[i] = (p3_entry_t)PT2;
 		PT3[i] |= PG_V | PG_RW | PG_U;
 
 		/* The L2 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;
 	}
 
 	printf("Start @ 0x%lx ...\n", ehdr->e_entry);
 
 	err = bi_load(fp->f_args, &modulep, &kernend);
 	if (err != 0)
 		return(err);
 
 	dev_cleanup();
 
 	trampoline(trampstack, efi_copy_finish, kernend, modulep, PT4,
 	    ehdr->e_entry);
 
 	panic("exec returned");
 }
 
 static int
 elf64_obj_exec(struct preloaded_file *fp)
 {
 	return (EFTYPE);
 }
Index: head/sys/boot/efi/loader/arch/amd64/framebuffer.c
===================================================================
--- head/sys/boot/efi/loader/arch/amd64/framebuffer.c	(revision 293723)
+++ head/sys/boot/efi/loader/arch/amd64/framebuffer.c	(revision 293724)
@@ -1,564 +1,566 @@
 /*-
  * Copyright (c) 2013 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by Benno Rice under sponsorship from
  * the FreeBSD Foundation.
  * 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$");
 
 #include <bootstrap.h>
 #include <sys/endian.h>
 #include <stand.h>
 
 #include <efi.h>
 #include <efilib.h>
 #include <efiuga.h>
 #include <efipciio.h>
 #include <machine/metadata.h>
 
+#include "framebuffer.h"
+
 static EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
 static EFI_GUID pciio_guid = EFI_PCI_IO_PROTOCOL_GUID;
 static EFI_GUID uga_guid = EFI_UGA_DRAW_PROTOCOL_GUID;
 
 static u_int
 efifb_color_depth(struct efi_fb *efifb)
 {
 	uint32_t mask;
 	u_int depth;
 
 	mask = efifb->fb_mask_red | efifb->fb_mask_green |
 	    efifb->fb_mask_blue | efifb->fb_mask_reserved;
 	if (mask == 0)
 		return (0);
 	for (depth = 1; mask != 1; depth++)
 		mask >>= 1;
 	return (depth);
 }
 
 static int
 efifb_mask_from_pixfmt(struct efi_fb *efifb, EFI_GRAPHICS_PIXEL_FORMAT pixfmt,
     EFI_PIXEL_BITMASK *pixinfo)
 {
 	int result;
 
 	result = 0;
 	switch (pixfmt) {
 	case PixelRedGreenBlueReserved8BitPerColor:
 		efifb->fb_mask_red = 0x000000ff;
 		efifb->fb_mask_green = 0x0000ff00;
 		efifb->fb_mask_blue = 0x00ff0000;
 		efifb->fb_mask_reserved = 0xff000000;
 		break;
 	case PixelBlueGreenRedReserved8BitPerColor:
 		efifb->fb_mask_red = 0x00ff0000;
 		efifb->fb_mask_green = 0x0000ff00;
 		efifb->fb_mask_blue = 0x000000ff;
 		efifb->fb_mask_reserved = 0xff000000;
 		break;
 	case PixelBitMask:
 		efifb->fb_mask_red = pixinfo->RedMask;
 		efifb->fb_mask_green = pixinfo->GreenMask;
 		efifb->fb_mask_blue = pixinfo->BlueMask;
 		efifb->fb_mask_reserved = pixinfo->ReservedMask;
 		break;
 	default:
 		result = 1;
 		break;
 	}
 	return (result);
 }
 
 static int
 efifb_from_gop(struct efi_fb *efifb, EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *mode,
     EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info)
 {
 	int result;
 
 	efifb->fb_addr = mode->FrameBufferBase;
 	efifb->fb_size = mode->FrameBufferSize;
 	efifb->fb_height = info->VerticalResolution;
 	efifb->fb_width = info->HorizontalResolution;
 	efifb->fb_stride = info->PixelsPerScanLine;
 	result = efifb_mask_from_pixfmt(efifb, info->PixelFormat,
 	    &info->PixelInformation);
 	return (result);
 }
 
 static ssize_t
 efifb_uga_find_pixel(EFI_UGA_DRAW_PROTOCOL *uga, u_int line,
     EFI_PCI_IO_PROTOCOL *pciio, uint64_t addr, uint64_t size)
 {
 	EFI_UGA_PIXEL pix0, pix1;
 	uint8_t *data1, *data2;
 	size_t count, maxcount = 1024;
 	ssize_t ofs;
 	EFI_STATUS status;
 	u_int idx;
 
 	status = uga->Blt(uga, &pix0, EfiUgaVideoToBltBuffer,
 	    0, line, 0, 0, 1, 1, 0);
 	if (EFI_ERROR(status)) {
 		printf("UGA BLT operation failed (video->buffer)");
 		return (-1);
 	}
 	pix1.Red = ~pix0.Red;
 	pix1.Green = ~pix0.Green;
 	pix1.Blue = ~pix0.Blue;
 	pix1.Reserved = 0;
 
 	data1 = calloc(maxcount, 2);
 	if (data1 == NULL) {
 		printf("Unable to allocate memory");
 		return (-1);
 	}
 	data2 = data1 + maxcount;
 
 	ofs = 0;
 	while (size > 0) {
 		count = min(size, maxcount);
 
 		status = pciio->Mem.Read(pciio, EfiPciIoWidthUint32,
 		    EFI_PCI_IO_PASS_THROUGH_BAR, addr + ofs, count >> 2,
 		    data1);
 		if (EFI_ERROR(status)) {
 			printf("Error reading frame buffer (before)");
 			goto fail;
 		}
 		status = uga->Blt(uga, &pix1, EfiUgaBltBufferToVideo,
 		    0, 0, 0, line, 1, 1, 0);
 		if (EFI_ERROR(status)) {
 			printf("UGA BLT operation failed (modify)");
 			goto fail;
 		}
 		status = pciio->Mem.Read(pciio, EfiPciIoWidthUint32,
 		    EFI_PCI_IO_PASS_THROUGH_BAR, addr + ofs, count >> 2,
 		    data2);
 		if (EFI_ERROR(status)) {
 			printf("Error reading frame buffer (after)");
 			goto fail;
 		}
 		status = uga->Blt(uga, &pix0, EfiUgaBltBufferToVideo,
 		    0, 0, 0, line, 1, 1, 0);
 		if (EFI_ERROR(status)) {
 			printf("UGA BLT operation failed (restore)");
 			goto fail;
 		}
 		for (idx = 0; idx < count; idx++) {
 			if (data1[idx] != data2[idx]) {
 				free(data1);
 				return (ofs + (idx & ~3));
 			}
 		}
 		ofs += count;
 		size -= count;
 	}
 	printf("No change detected in frame buffer");
 
  fail:
 	printf(" -- error %lu\n", EFI_ERROR_CODE(status));
 	free(data1);
 	return (-1);
 }
 
 static EFI_PCI_IO_PROTOCOL *
 efifb_uga_get_pciio(void)
 {
 	EFI_PCI_IO_PROTOCOL *pciio;
 	EFI_HANDLE *buf, *hp;
 	EFI_STATUS status;
 	UINTN bufsz;
 
 	/* Get all handles that support the UGA protocol. */
 	bufsz = 0;
 	status = BS->LocateHandle(ByProtocol, &uga_guid, NULL, &bufsz, NULL);
 	if (status != EFI_BUFFER_TOO_SMALL)
 		return (NULL);
 	buf = malloc(bufsz);
 	status = BS->LocateHandle(ByProtocol, &uga_guid, NULL, &bufsz, buf);
 	if (status != EFI_SUCCESS) {
 		free(buf);
 		return (NULL);
 	}
 	bufsz /= sizeof(EFI_HANDLE);
 
 	/* Get the PCI I/O interface of the first handle that supports it. */
 	pciio = NULL;
 	for (hp = buf; hp < buf + bufsz; hp++) {
 		status = BS->HandleProtocol(*hp, &pciio_guid, (void **)&pciio);
 		if (status == EFI_SUCCESS) {
 			free(buf);
 			return (pciio);
 		}
 	}
 	free(buf);
 	return (NULL);
 }
 
 static EFI_STATUS
 efifb_uga_locate_framebuffer(EFI_PCI_IO_PROTOCOL *pciio, uint64_t *addrp,
     uint64_t *sizep)
 {
 	uint8_t *resattr;
 	uint64_t addr, size;
 	EFI_STATUS status;
 	u_int bar;
 
 	if (pciio == NULL)
 		return (EFI_DEVICE_ERROR);
 
 	/* Attempt to get the frame buffer address (imprecise). */
 	*addrp = 0;
 	*sizep = 0;
 	for (bar = 0; bar < 6; bar++) {
 		status = pciio->GetBarAttributes(pciio, bar, NULL,
 		    (void **)&resattr);
 		if (status != EFI_SUCCESS)
 			continue;
 		/* XXX magic offsets and constants. */
 		if (resattr[0] == 0x87 && resattr[3] == 0) {
 			/* 32-bit address space descriptor (MEMIO) */
 			addr = le32dec(resattr + 10);
 			size = le32dec(resattr + 22);
 		} else if (resattr[0] == 0x8a && resattr[3] == 0) {
 			/* 64-bit address space descriptor (MEMIO) */
 			addr = le64dec(resattr + 14);
 			size = le64dec(resattr + 38);
 		} else {
 			addr = 0;
 			size = 0;
 		}
 		BS->FreePool(resattr);
 		if (addr == 0 || size == 0)
 			continue;
 
 		/* We assume the largest BAR is the frame buffer. */
 		if (size > *sizep) {
 			*addrp = addr;
 			*sizep = size;
 		}
 	}
 	return ((*addrp == 0 || *sizep == 0) ? EFI_DEVICE_ERROR : 0);
 }
 
 static int
 efifb_from_uga(struct efi_fb *efifb, EFI_UGA_DRAW_PROTOCOL *uga)
 {
 	EFI_PCI_IO_PROTOCOL *pciio;
 	char *ev, *p;
 	EFI_STATUS status;
 	ssize_t offset;
-	uint64_t fbaddr, fbsize;
+	uint64_t fbaddr;
 	uint32_t horiz, vert, stride;
 	uint32_t np, depth, refresh;
 
 	status = uga->GetMode(uga, &horiz, &vert, &depth, &refresh);
 	if (EFI_ERROR(status))
 		return (1);
 	efifb->fb_height = vert;
 	efifb->fb_width = horiz;
 	/* Paranoia... */
 	if (efifb->fb_height == 0 || efifb->fb_width == 0)
 		return (1);
 
 	/* The color masks are fixed AFAICT. */
 	efifb_mask_from_pixfmt(efifb, PixelBlueGreenRedReserved8BitPerColor,
 	    NULL);
 
 	/* pciio can be NULL on return! */
 	pciio = efifb_uga_get_pciio();
 
 	/* Try to find the frame buffer. */
 	status = efifb_uga_locate_framebuffer(pciio, &efifb->fb_addr,
 	    &efifb->fb_size);
 	if (EFI_ERROR(status)) {
 		efifb->fb_addr = 0;
 		efifb->fb_size = 0;
 	}
 
 	/*
 	 * There's no reliable way to detect the frame buffer or the
 	 * offset within the frame buffer of the visible region, nor
 	 * the stride. Our only option is to look at the system and
 	 * fill in the blanks based on that. Luckily, UGA was mostly
 	 * only used on Apple hardware.
 	 */
 	offset = -1;
 	ev = getenv("smbios.system.maker");
 	if (ev != NULL && !strcmp(ev, "Apple Inc.")) {
 		ev = getenv("smbios.system.product");
 		if (ev != NULL && !strcmp(ev, "iMac7,1")) {
 			/* These are the expected values we should have. */
 			horiz = 1680;
 			vert = 1050;
 			fbaddr = 0xc0000000;
 			/* These are the missing bits. */
 			offset = 0x10000;
 			stride = 1728;
 		} else if (ev != NULL && !strcmp(ev, "MacBook3,1")) {
 			/* These are the expected values we should have. */
 			horiz = 1280;
 			vert = 800;
 			fbaddr = 0xc0000000;
 			/* These are the missing bits. */
 			offset = 0x0;
 			stride = 2048;
 		}
 	}
 
 	/*
 	 * If this is hardware we know, make sure that it looks familiar
 	 * before we accept our hardcoded values.
 	 */
 	if (offset >= 0 && efifb->fb_width == horiz &&
 	    efifb->fb_height == vert && efifb->fb_addr == fbaddr) {
 		efifb->fb_addr += offset;
 		efifb->fb_size -= offset;
 		efifb->fb_stride = stride;
 		return (0);
 	} else if (offset >= 0) {
 		printf("Hardware make/model known, but graphics not "
 		    "as expected.\n");
 		printf("Console may not work!\n");
 	}
 
 	/*
 	 * The stride is equal or larger to the width. Often it's the
 	 * next larger power of two. We'll start with that...
 	 */
 	efifb->fb_stride = efifb->fb_width;
 	do {
 		np = efifb->fb_stride & (efifb->fb_stride - 1);
 		if (np) {
 			efifb->fb_stride |= (np - 1);
 			efifb->fb_stride++;
 		}
 	} while (np);
 
 	ev = getenv("hw.efifb.address");
 	if (ev == NULL) {
 		if (efifb->fb_addr == 0) {
 			printf("Please set hw.efifb.address and "
 			    "hw.efifb.stride.\n");
 			return (1);
 		}
 
 		/*
 		 * The visible part of the frame buffer may not start at
 		 * offset 0, so try to detect it. Note that we may not
 		 * always be able to read from the frame buffer, which
 		 * means that we may not be able to detect anything. In
 		 * that case, we would take a long time scanning for a
 		 * pixel change in the frame buffer, which would have it
 		 * appear that we're hanging, so we limit the scan to
 		 * 1/256th of the frame buffer. This number is mostly
 		 * based on PR 202730 and the fact that on a MacBoook,
 		 * where we can't read from the frame buffer the offset
 		 * of the visible region is 0. In short: we want to scan
 		 * enough to handle all adapters that have an offset
 		 * larger than 0 and we want to scan as little as we can
 		 * to not appear to hang when we can't read from the
 		 * frame buffer.
 		 */
 		offset = efifb_uga_find_pixel(uga, 0, pciio, efifb->fb_addr,
 		    efifb->fb_size >> 8);
 		if (offset == -1) {
 			printf("Unable to reliably detect frame buffer.\n");
 		} else if (offset > 0) {
 			efifb->fb_addr += offset;
 			efifb->fb_size -= offset;
 		}
 	} else {
 		offset = 0;
 		efifb->fb_size = efifb->fb_height * efifb->fb_stride * 4;
 		efifb->fb_addr = strtoul(ev, &p, 0);
 		if (*p != '\0')
 			return (1);
 	}
 
 	ev = getenv("hw.efifb.stride");
 	if (ev == NULL) {
 		if (pciio != NULL && offset != -1) {
 			/* Determine the stride. */
 			offset = efifb_uga_find_pixel(uga, 1, pciio,
 			    efifb->fb_addr, horiz * 8);
 			if (offset != -1)
 				efifb->fb_stride = offset >> 2;
 		} else {
 			printf("Unable to reliably detect the stride.\n");
 		}
 	} else {
 		efifb->fb_stride = strtoul(ev, &p, 0);
 		if (*p != '\0')
 			return (1);
 	}
 
 	/*
 	 * We finalized on the stride, so recalculate the size of the
 	 * frame buffer.
 	 */
 	efifb->fb_size = efifb->fb_height * efifb->fb_stride * 4;
 	return (0);
 }
 
 int
 efi_find_framebuffer(struct efi_fb *efifb)
 {
 	EFI_GRAPHICS_OUTPUT *gop;
 	EFI_UGA_DRAW_PROTOCOL *uga;
 	EFI_STATUS status;
 
 	status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop);
 	if (status == EFI_SUCCESS)
 		return (efifb_from_gop(efifb, gop->Mode, gop->Mode->Info));
 
 	status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
 	if (status == EFI_SUCCESS)
 		return (efifb_from_uga(efifb, uga));
 
 	return (1);
 }
 
 static void
 print_efifb(int mode, struct efi_fb *efifb, int verbose)
 {
 	u_int depth;
 
 	if (mode >= 0)
 		printf("mode %d: ", mode);
 	depth = efifb_color_depth(efifb);
 	printf("%ux%ux%u, stride=%u", efifb->fb_width, efifb->fb_height,
 	    depth, efifb->fb_stride);
 	if (verbose) {
 		printf("\n    frame buffer: address=%jx, size=%jx",
 		    (uintmax_t)efifb->fb_addr, (uintmax_t)efifb->fb_size);
 		printf("\n    color mask: R=%08x, G=%08x, B=%08x\n",
 		    efifb->fb_mask_red, efifb->fb_mask_green,
 		    efifb->fb_mask_blue);
 	}
 }
 
 COMMAND_SET(gop, "gop", "graphics output protocol", command_gop);
 
 static int
 command_gop(int argc, char *argv[])
 {
 	struct efi_fb efifb;
 	EFI_GRAPHICS_OUTPUT *gop;
 	EFI_STATUS status;
 	u_int mode;
 
 	status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop);
 	if (EFI_ERROR(status)) {
 		sprintf(command_errbuf, "%s: Graphics Output Protocol not "
 		    "present (error=%lu)", argv[0], EFI_ERROR_CODE(status));
 		return (CMD_ERROR);
 	}
 
 	if (argc < 2)
 		goto usage;
 
 	if (!strcmp(argv[1], "set")) {
 		char *cp;
 
 		if (argc != 3)
 			goto usage;
 		mode = strtol(argv[2], &cp, 0);
 		if (cp[0] != '\0') {
 			sprintf(command_errbuf, "mode is an integer");
 			return (CMD_ERROR);
 		}
 		status = gop->SetMode(gop, mode);
 		if (EFI_ERROR(status)) {
 			sprintf(command_errbuf, "%s: Unable to set mode to "
 			    "%u (error=%lu)", argv[0], mode,
 			    EFI_ERROR_CODE(status));
 			return (CMD_ERROR);
 		}
 	} else if (!strcmp(argv[1], "get")) {
 		if (argc != 2)
 			goto usage;
 		efifb_from_gop(&efifb, gop->Mode, gop->Mode->Info);
 		print_efifb(gop->Mode->Mode, &efifb, 1);
 		printf("\n");
 	} else if (!strcmp(argv[1], "list")) {
 		EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
 		UINTN infosz;
 
 		if (argc != 2)
 			goto usage;
 		pager_open();
 		for (mode = 0; mode < gop->Mode->MaxMode; mode++) {
 			status = gop->QueryMode(gop, mode, &infosz, &info);
 			if (EFI_ERROR(status))
 				continue;
 			efifb_from_gop(&efifb, gop->Mode, info);
 			print_efifb(mode, &efifb, 0);
 			if (pager_output("\n"))
 				break;
 		}
 		pager_close();
 	}
 	return (CMD_OK);
 
  usage:
 	sprintf(command_errbuf, "usage: %s [list | get | set <mode>]",
 	    argv[0]);
 	return (CMD_ERROR);
 }
 
 COMMAND_SET(uga, "uga", "universal graphics adapter", command_uga);
 
 static int
 command_uga(int argc, char *argv[])
 {
 	struct efi_fb efifb;
 	EFI_UGA_DRAW_PROTOCOL *uga;
 	EFI_STATUS status;
 
 	status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
 	if (EFI_ERROR(status)) {
 		sprintf(command_errbuf, "%s: UGA Protocol not present "
 		    "(error=%lu)", argv[0], EFI_ERROR_CODE(status));
 		return (CMD_ERROR);
 	}
 
 	if (argc != 1)
 		goto usage;
 
 	if (efifb_from_uga(&efifb, uga) != CMD_OK) {
 		sprintf(command_errbuf, "%s: Unable to get UGA information",
 		    argv[0]);
 		return (CMD_ERROR);
 	}
 
 	print_efifb(-1, &efifb, 1);
 	printf("\n");
 	return (CMD_OK);
 
  usage:
 	sprintf(command_errbuf, "usage: %s", argv[0]);
 	return (CMD_ERROR);
 }
Index: head/sys/boot/efi/loader/arch/arm/exec.c
===================================================================
--- head/sys/boot/efi/loader/arch/arm/exec.c	(revision 293723)
+++ head/sys/boot/efi/loader/arch/arm/exec.c	(revision 293724)
@@ -1,100 +1,100 @@
 /*-
  * Copyright (c) 2001 Benno Rice <benno@FreeBSD.org>
  * Copyright (c) 2007 Semihalf, Rafal Jaworowski <raj@semihalf.com>
  * 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$");
 
 #include <sys/param.h>
 #include <sys/linker.h>
 
 #include <machine/md_var.h>
 #include <machine/metadata.h>
 #include <machine/elf.h>
 
 #include <stand.h>
 
 #include <efi.h>
 #include <efilib.h>
 
 #include "bootstrap.h"
 #include "loader_efi.h"
 
 extern vm_offset_t md_load(char *, vm_offset_t *);
+extern int bi_load(char *, vm_offset_t *, vm_offset_t *);
 
-int
+static int
 __elfN(arm_load)(char *filename, u_int64_t dest,
     struct preloaded_file **result)
 {
 	int r;
 
 	r = __elfN(loadfile)(filename, dest, result);
 	if (r != 0)
 		return (r);
 
 	return (0);
 }
 
-int
+static int
 __elfN(arm_exec)(struct preloaded_file *fp)
 {
 	struct file_metadata *fmp;
 	vm_offset_t modulep, kernend;
 	Elf_Ehdr *e;
 	int error;
 	void (*entry)(void *);
-	EFI_STATUS status;
 
 	if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
 		return (EFTYPE);
 
 	e = (Elf_Ehdr *)&fmp->md_data;
 
 	if ((error = bi_load(fp->f_args, &modulep, &kernend)) != 0)
 		return (error);
 
 	entry = efi_translate(e->e_entry);
 	printf("Kernel entry at 0x%x...\n", (unsigned)entry);
 	printf("Kernel args: %s\n", fp->f_args);
 	printf("modulep: %#x\n", modulep);
 	printf("relocation_offset %llx\n", __elfN(relocation_offset));
 
 	dev_cleanup();
 
 	(*entry)((void *)modulep);
 	panic("exec returned");
 }
 
 static struct file_format arm_elf = {
 	__elfN(arm_load),
 	__elfN(arm_exec)
 };
 
 struct file_format *file_formats[] = {
 	&arm_elf,
 	NULL
 };
 
Index: head/sys/boot/efi/loader/arch/arm64/exec.c
===================================================================
--- head/sys/boot/efi/loader/arch/arm64/exec.c	(revision 293723)
+++ head/sys/boot/efi/loader/arch/arm64/exec.c	(revision 293724)
@@ -1,140 +1,139 @@
 /*-
  * Copyright (c) 2006 Marcel Moolenaar
  * 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 ``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 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$");
 
 #include <stand.h>
 #include <string.h>
 
 #include <sys/param.h>
 #include <sys/linker.h>
 #include <machine/elf.h>
 
 #include <bootstrap.h>
 
 #include <efi.h>
 #include <efilib.h>
 
 #include "loader_efi.h"
 #include "cache.h"
 
 #include "platform/acfreebsd.h"
 #include "acconfig.h"
 #define ACPI_SYSTEM_XFACE
+#define ACPI_USE_SYSTEM_INTTYPES
 #include "actypes.h"
 #include "actbl.h"
 
 static EFI_GUID acpi_guid = ACPI_TABLE_GUID;
 static EFI_GUID acpi20_guid = ACPI_20_TABLE_GUID;
 
 static int elf64_exec(struct preloaded_file *amp);
 static int elf64_obj_exec(struct preloaded_file *amp);
 
 int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
 
 static struct file_format arm64_elf = {
 	elf64_loadfile,
 	elf64_exec
 };
 
 struct file_format *file_formats[] = {
 	&arm64_elf,
 	NULL
 };
 
 static int
 elf64_exec(struct preloaded_file *fp)
 {
 	vm_offset_t modulep, kernendp;
 	vm_offset_t clean_addr;
 	size_t clean_size;
 	struct file_metadata *md;
 	ACPI_TABLE_RSDP *rsdp;
-	EFI_STATUS status;
-	EFI_PHYSICAL_ADDRESS addr;
 	Elf_Ehdr *ehdr;
 	char buf[24];
 	int err, revision;
 	void (*entry)(vm_offset_t);
 
 	rsdp = efi_get_table(&acpi20_guid);
 	if (rsdp == NULL) {
 		rsdp = efi_get_table(&acpi_guid);
 	}
 	if (rsdp != NULL) {
 		sprintf(buf, "0x%016llx", (unsigned long long)rsdp);
 		setenv("hint.acpi.0.rsdp", buf, 1);
 		revision = rsdp->Revision;
 		if (revision == 0)
 			revision = 1;
 		sprintf(buf, "%d", revision);
 		setenv("hint.acpi.0.revision", buf, 1);
 		strncpy(buf, rsdp->OemId, sizeof(rsdp->OemId));
 		buf[sizeof(rsdp->OemId)] = '\0';
 		setenv("hint.acpi.0.oem", buf, 1);
 		sprintf(buf, "0x%016x", rsdp->RsdtPhysicalAddress);
 		setenv("hint.acpi.0.rsdt", buf, 1);
 		if (revision >= 2) {
 			/* XXX extended checksum? */
 			sprintf(buf, "0x%016llx",
 			    (unsigned long long)rsdp->XsdtPhysicalAddress);
 			setenv("hint.acpi.0.xsdt", buf, 1);
 			sprintf(buf, "%d", rsdp->Length);
 			setenv("hint.acpi.0.xsdt_length", buf, 1);
 		}
 	}
 
 	if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
         	return(EFTYPE);
 
 	ehdr = (Elf_Ehdr *)&(md->md_data);
 	entry = efi_translate(ehdr->e_entry);
 
 	err = bi_load(fp->f_args, &modulep, &kernendp);
 	if (err != 0)
 		return (err);
 
 	/* Clean D-cache under kernel area and invalidate whole I-cache */
-	clean_addr = efi_translate(fp->f_addr);
-	clean_size = efi_translate(kernendp) - clean_addr;
+	clean_addr = (vm_offset_t)efi_translate(fp->f_addr);
+	clean_size = (vm_offset_t)efi_translate(kernendp) - clean_addr;
 
 	cpu_flush_dcache((void *)clean_addr, clean_size);
 	cpu_inval_icache(NULL, 0);
 
 	(*entry)(modulep);
 	panic("exec returned");
 }
 
 static int
 elf64_obj_exec(struct preloaded_file *fp)
 {
 
 	printf("%s called for preloaded file %p (=%s):\n", __func__, fp,
 	    fp->f_name);
 	return (ENOSYS);
 }
 
Index: head/sys/boot/efi/loader/autoload.c
===================================================================
--- head/sys/boot/efi/loader/autoload.c	(revision 293723)
+++ head/sys/boot/efi/loader/autoload.c	(revision 293724)
@@ -1,35 +1,37 @@
 /*-
  * Copyright (c) 2010 Rui Paulo <rpaulo@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 ``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 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$");
 
+#include "loader_efi.h"
+
 int
 efi_autoload(void)
 {
 
 	return (0);
 }
Index: head/sys/boot/efi/loader/bootinfo.c
===================================================================
--- head/sys/boot/efi/loader/bootinfo.c	(revision 293723)
+++ head/sys/boot/efi/loader/bootinfo.c	(revision 293724)
@@ -1,461 +1,463 @@
 /*-
  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
  * Copyright (c) 2004, 2006 Marcel Moolenaar
  * Copyright (c) 2014 The FreeBSD Foundation
  * 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$");
 
 #include <stand.h>
 #include <string.h>
 #include <sys/param.h>
 #include <sys/reboot.h>
 #include <sys/linker.h>
 #include <sys/boot.h>
 #include <machine/cpufunc.h>
 #include <machine/elf.h>
 #include <machine/metadata.h>
 #include <machine/psl.h>
 
 #include <efi.h>
 #include <efilib.h>
 
 #include "bootstrap.h"
 #include "loader_efi.h"
 
 #if defined(__amd64__)
 #include <machine/specialreg.h>
 #include "framebuffer.h"
 #endif
 
 #if defined(LOADER_FDT_SUPPORT)
 #include <fdt_platform.h>
 #endif
 
+int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
+
 extern EFI_SYSTEM_TABLE	*ST;
 
 static const char howto_switches[] = "aCdrgDmphsv";
 static int howto_masks[] = {
 	RB_ASKNAME, RB_CDROM, RB_KDB, RB_DFLTROOT, RB_GDB, RB_MULTIPLE,
 	RB_MUTE, RB_PAUSE, RB_SERIAL, RB_SINGLE, RB_VERBOSE
 };
 
 static int
 bi_getboothowto(char *kargs)
 {
 	const char *sw;
 	char *opts;
 	char *console;
 	int howto, i;
 
 	howto = 0;
 
 	/* Get the boot options from the environment first. */
 	for (i = 0; howto_names[i].ev != NULL; i++) {
 		if (getenv(howto_names[i].ev) != NULL)
 			howto |= howto_names[i].mask;
 	}
 
 	console = getenv("console");
 	if (console != NULL) {
 		if (strcmp(console, "comconsole") == 0)
 			howto |= RB_SERIAL;
 		if (strcmp(console, "nullconsole") == 0)
 			howto |= RB_MUTE;
 	}
 
 	/* Parse kargs */
 	if (kargs == NULL)
 		return (howto);
 
 	opts = strchr(kargs, '-');
 	while (opts != NULL) {
 		while (*(++opts) != '\0') {
 			sw = strchr(howto_switches, *opts);
 			if (sw == NULL)
 				break;
 			howto |= howto_masks[sw - howto_switches];
 		}
 		opts = strchr(opts, '-');
 	}
 
 	return (howto);
 }
 
 /*
  * Copy the environment into the load area starting at (addr).
  * Each variable is formatted as <name>=<value>, with a single nul
  * separating each variable, and a double nul terminating the environment.
  */
 static vm_offset_t
 bi_copyenv(vm_offset_t start)
 {
 	struct env_var *ep;
 	vm_offset_t addr, last;
 	size_t len;
 
 	addr = last = start;
 
 	/* Traverse the environment. */
 	for (ep = environ; ep != NULL; ep = ep->ev_next) {
 		len = strlen(ep->ev_name);
-		if (archsw.arch_copyin(ep->ev_name, addr, len) != len)
+		if ((size_t)archsw.arch_copyin(ep->ev_name, addr, len) != len)
 			break;
 		addr += len;
 		if (archsw.arch_copyin("=", addr, 1) != 1)
 			break;
 		addr++;
 		if (ep->ev_value != NULL) {
 			len = strlen(ep->ev_value);
-			if (archsw.arch_copyin(ep->ev_value, addr, len) != len)
+			if ((size_t)archsw.arch_copyin(ep->ev_value, addr, len) != len)
 				break;
 			addr += len;
 		}
 		if (archsw.arch_copyin("", addr, 1) != 1)
 			break;
 		last = ++addr;
 	}
 
 	if (archsw.arch_copyin("", last++, 1) != 1)
 		last = start;
 	return(last);
 }
 
 /*
  * Copy module-related data into the load area, where it can be
  * used as a directory for loaded modules.
  *
  * Module data is presented in a self-describing format.  Each datum
  * is preceded by a 32-bit identifier and a 32-bit size field.
  *
  * Currently, the following data are saved:
  *
  * MOD_NAME	(variable)		module name (string)
  * MOD_TYPE	(variable)		module type (string)
  * MOD_ARGS	(variable)		module parameters (string)
  * MOD_ADDR	sizeof(vm_offset_t)	module load address
  * MOD_SIZE	sizeof(size_t)		module size
  * MOD_METADATA	(variable)		type-specific metadata
  */
 #define	COPY32(v, a, c) {					\
 	uint32_t x = (v);					\
 	if (c)							\
 		archsw.arch_copyin(&x, a, sizeof(x));		\
 	a += sizeof(x);						\
 }
 
 #define	MOD_STR(t, a, s, c) {					\
 	COPY32(t, a, c);					\
 	COPY32(strlen(s) + 1, a, c);				\
 	if (c)							\
 		archsw.arch_copyin(s, a, strlen(s) + 1);	\
 	a += roundup(strlen(s) + 1, sizeof(u_long));		\
 }
 
 #define	MOD_NAME(a, s, c)	MOD_STR(MODINFO_NAME, a, s, c)
 #define	MOD_TYPE(a, s, c)	MOD_STR(MODINFO_TYPE, a, s, c)
 #define	MOD_ARGS(a, s, c)	MOD_STR(MODINFO_ARGS, a, s, c)
 
 #define	MOD_VAR(t, a, s, c) {					\
 	COPY32(t, a, c);					\
 	COPY32(sizeof(s), a, c);				\
 	if (c)							\
 		archsw.arch_copyin(&s, a, sizeof(s));		\
 	a += roundup(sizeof(s), sizeof(u_long));		\
 }
 
 #define	MOD_ADDR(a, s, c)	MOD_VAR(MODINFO_ADDR, a, s, c)
 #define	MOD_SIZE(a, s, c)	MOD_VAR(MODINFO_SIZE, a, s, c)
 
 #define	MOD_METADATA(a, mm, c) {				\
 	COPY32(MODINFO_METADATA | mm->md_type, a, c);		\
 	COPY32(mm->md_size, a, c);				\
 	if (c)							\
 		archsw.arch_copyin(mm->md_data, a, mm->md_size);	\
 	a += roundup(mm->md_size, sizeof(u_long));		\
 }
 
 #define	MOD_END(a, c) {						\
 	COPY32(MODINFO_END, a, c);				\
 	COPY32(0, a, c);					\
 }
 
 static vm_offset_t
 bi_copymodules(vm_offset_t addr)
 {
 	struct preloaded_file *fp;
 	struct file_metadata *md;
 	int c;
 	uint64_t v;
 
 	c = addr != 0;
 	/* Start with the first module on the list, should be the kernel. */
 	for (fp = file_findfile(NULL, NULL); fp != NULL; fp = fp->f_next) {
 		MOD_NAME(addr, fp->f_name, c); /* This must come first. */
 		MOD_TYPE(addr, fp->f_type, c);
 		if (fp->f_args)
 			MOD_ARGS(addr, fp->f_args, c);
 		v = fp->f_addr;
 #if defined(__arm__)
 		v -= __elfN(relocation_offset);
 #endif
 		MOD_ADDR(addr, v, c);
 		v = fp->f_size;
 		MOD_SIZE(addr, v, c);
 		for (md = fp->f_metadata; md != NULL; md = md->md_next)
 			if (!(md->md_type & MODINFOMD_NOCOPY))
 				MOD_METADATA(addr, md, c);
 	}
 	MOD_END(addr, c);
 	return(addr);
 }
 
 static int
 bi_load_efi_data(struct preloaded_file *kfp)
 {
 	EFI_MEMORY_DESCRIPTOR *mm;
 	EFI_PHYSICAL_ADDRESS addr;
 	EFI_STATUS status;
 	size_t efisz;
 	UINTN efi_mapkey;
 	UINTN mmsz, pages, retry, sz;
 	UINT32 mmver;
 	struct efi_map_header *efihdr;
 
 #if defined(__amd64__)
 	struct efi_fb efifb;
 
 	if (efi_find_framebuffer(&efifb) == 0) {
 		printf("EFI framebuffer information:\n");
 		printf("addr, size     0x%lx, 0x%lx\n", efifb.fb_addr,
 		    efifb.fb_size);
 		printf("dimensions     %d x %d\n", efifb.fb_width,
 		    efifb.fb_height);
 		printf("stride         %d\n", efifb.fb_stride);
 		printf("masks          0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
 		    efifb.fb_mask_red, efifb.fb_mask_green, efifb.fb_mask_blue,
 		    efifb.fb_mask_reserved);
 
 		file_addmetadata(kfp, MODINFOMD_EFI_FB, sizeof(efifb), &efifb);
 	}
 #endif
 
 	efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
 
 	/*
 	 * It is possible that the first call to ExitBootServices may change
 	 * the map key. Fetch a new map key and retry ExitBootServices in that
 	 * case.
 	 */
 	for (retry = 2; retry > 0; retry--) {
 		/*
 		 * Allocate enough pages to hold the bootinfo block and the
 		 * memory map EFI will return to us. The memory map has an
 		 * unknown size, so we have to determine that first. Note that
 		 * the AllocatePages call can itself modify the memory map, so
 		 * we have to take that into account as well. The changes to
 		 * the memory map are caused by splitting a range of free
 		 * memory into two (AFAICT), so that one is marked as being
 		 * loader data.
 		 */
 		sz = 0;
 		BS->GetMemoryMap(&sz, NULL, &efi_mapkey, &mmsz, &mmver);
 		sz += mmsz;
 		sz = (sz + 0xf) & ~0xf;
 		pages = EFI_SIZE_TO_PAGES(sz + efisz);
 		status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
 		     pages, &addr);
 		if (EFI_ERROR(status)) {
 			printf("%s: AllocatePages error %lu\n", __func__,
 			    EFI_ERROR_CODE(status));
 			return (ENOMEM);
 		}
 
 		/*
 		 * Read the memory map and stash it after bootinfo. Align the
 		 * memory map on a 16-byte boundary (the bootinfo block is page
 		 * aligned).
 		 */
 		efihdr = (struct efi_map_header *)addr;
 		mm = (void *)((uint8_t *)efihdr + efisz);
 		sz = (EFI_PAGE_SIZE * pages) - efisz;
 
 		status = BS->GetMemoryMap(&sz, mm, &efi_mapkey, &mmsz, &mmver);
 		if (EFI_ERROR(status)) {
 			printf("%s: GetMemoryMap error %lu\n", __func__,
 			    EFI_ERROR_CODE(status));
 			return (EINVAL);
 		}
 		status = BS->ExitBootServices(IH, efi_mapkey);
 		if (EFI_ERROR(status) == 0) {
 			efihdr->memory_size = sz;
 			efihdr->descriptor_size = mmsz;
 			efihdr->descriptor_version = mmver;
 			file_addmetadata(kfp, MODINFOMD_EFI_MAP, efisz + sz,
 			    efihdr);
 			return (0);
 		}
 		BS->FreePages(addr, pages);
 	}
 	printf("ExitBootServices error %lu\n", EFI_ERROR_CODE(status));
 	return (EINVAL);
 }
 
 /*
  * Load the information expected by an amd64 kernel.
  *
  * - The 'boothowto' argument is constructed.
  * - The 'bootdev' argument is constructed.
  * - The 'bootinfo' struct is constructed, and copied into the kernel space.
  * - The kernel environment is copied into kernel space.
  * - Module metadata are formatted and placed in kernel space.
  */
 int
 bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
 {
 	struct preloaded_file *xp, *kfp;
 	struct devdesc *rootdev;
 	struct file_metadata *md;
 	vm_offset_t addr;
 	uint64_t kernend;
 	uint64_t envp;
 	vm_offset_t size;
 	char *rootdevname;
 	int howto;
 #if defined(LOADER_FDT_SUPPORT)
 	vm_offset_t dtbp;
 	int dtb_size;
 #endif
 #if defined(__arm__)
 	vm_offset_t vaddr;
-	int i;
+	size_t i;
 	/*
 	 * These metadata addreses must be converted for kernel after
 	 * relocation.
 	 */
 	uint32_t		mdt[] = {
 	    MODINFOMD_SSYM, MODINFOMD_ESYM, MODINFOMD_KERNEND,
 	    MODINFOMD_ENVP,
 #if defined(LOADER_FDT_SUPPORT)
 	    MODINFOMD_DTBP
 #endif
 	};
 #endif
 
 	howto = bi_getboothowto(args);
 
 	/*
 	 * Allow the environment variable 'rootdev' to override the supplied
 	 * device. This should perhaps go to MI code and/or have $rootdev
 	 * tested/set by MI code before launching the kernel.
 	 */
 	rootdevname = getenv("rootdev");
 	archsw.arch_getdev((void**)(&rootdev), rootdevname, NULL);
 	if (rootdev == NULL) {
 		printf("Can't determine root device.\n");
 		return(EINVAL);
 	}
 
 	/* Try reading the /etc/fstab file to select the root device */
 	getrootmount(efi_fmtdev((void *)rootdev));
 
 	addr = 0;
 	for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
 		if (addr < (xp->f_addr + xp->f_size))
 			addr = xp->f_addr + xp->f_size;
 	}
 
 	/* Pad to a page boundary. */
 	addr = roundup(addr, PAGE_SIZE);
 
 	/* Copy our environment. */
 	envp = addr;
 	addr = bi_copyenv(addr);
 
 	/* Pad to a page boundary. */
 	addr = roundup(addr, PAGE_SIZE);
 
 #if defined(LOADER_FDT_SUPPORT)
 	/* Handle device tree blob */
 	dtbp = addr;
 	dtb_size = fdt_copy(addr);
 		
 	/* Pad to a page boundary */
 	if (dtb_size)
 		addr += roundup(dtb_size, PAGE_SIZE);
 #endif
 
 	kfp = file_findfile(NULL, "elf kernel");
 	if (kfp == NULL)
 		kfp = file_findfile(NULL, "elf64 kernel");
 	if (kfp == NULL)
 		panic("can't find kernel file");
 	kernend = 0;	/* fill it in later */
 	file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto);
 	file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp);
 #if defined(LOADER_FDT_SUPPORT)
 	if (dtb_size)
 		file_addmetadata(kfp, MODINFOMD_DTBP, sizeof dtbp, &dtbp);
 	else
 		pager_output("WARNING! Trying to fire up the kernel, but no "
 		    "device tree blob found!\n");
 #endif
 	file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend);
 	file_addmetadata(kfp, MODINFOMD_FW_HANDLE, sizeof ST, &ST);
 
 	bi_load_efi_data(kfp);
 
 	/* Figure out the size and location of the metadata. */
 	*modulep = addr;
 	size = bi_copymodules(0);
 	kernend = roundup(addr + size, PAGE_SIZE);
 	*kernendp = kernend;
 
 	/* patch MODINFOMD_KERNEND */
 	md = file_findmetadata(kfp, MODINFOMD_KERNEND);
 	bcopy(&kernend, md->md_data, sizeof kernend);
 
 #if defined(__arm__)
 	*modulep -= __elfN(relocation_offset);
 
 	/* Do relocation fixup on metadata of each module. */
 	for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
 		for (i = 0; i < sizeof mdt / sizeof mdt[0]; i++) {
 			md = file_findmetadata(xp, mdt[i]);
 			if (md) {
 				bcopy(md->md_data, &vaddr, sizeof vaddr);
 				vaddr -= __elfN(relocation_offset);
 				bcopy(&vaddr, md->md_data, sizeof vaddr);
 			}
 		}
 	}
 #endif
 
 	/* Copy module list and metadata. */
 	(void)bi_copymodules(addr);
 
 	return (0);
 }
Index: head/sys/boot/efi/loader/copy.c
===================================================================
--- head/sys/boot/efi/loader/copy.c	(revision 293723)
+++ head/sys/boot/efi/loader/copy.c	(revision 293724)
@@ -1,139 +1,141 @@
 /*-
  * Copyright (c) 2013 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by Benno Rice under sponsorship from
  * the FreeBSD Foundation.
  * 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$");
 
 #include <sys/param.h>
 
 #include <stand.h>
 #include <bootstrap.h>
 
 #include <efi.h>
 #include <efilib.h>
 
+#include "loader_efi.h"
+
 #ifndef EFI_STAGING_SIZE
 #define	EFI_STAGING_SIZE	48
 #endif
 
 #define	STAGE_PAGES	EFI_SIZE_TO_PAGES((EFI_STAGING_SIZE) * 1024 * 1024)
 
 EFI_PHYSICAL_ADDRESS	staging, staging_end;
 int			stage_offset_set = 0;
 ssize_t			stage_offset;
 
 int
 efi_copy_init(void)
 {
 	EFI_STATUS	status;
 
 	status = BS->AllocatePages(AllocateAnyPages, EfiLoaderData,
 	    STAGE_PAGES, &staging);
 	if (EFI_ERROR(status)) {
 		printf("failed to allocate staging area: %lu\n",
 		    EFI_ERROR_CODE(status));
 		return (status);
 	}
 	staging_end = staging + STAGE_PAGES * EFI_PAGE_SIZE;
 
 #if defined(__aarch64__) || defined(__arm__)
 	/*
 	 * Round the kernel load address to a 2MiB value. This is needed
 	 * because the kernel builds a page table based on where it has
 	 * been loaded in physical address space. As the kernel will use
 	 * either a 1MiB or 2MiB page for this we need to make sure it
 	 * is correctly aligned for both cases.
 	 */
 	staging = roundup2(staging, 2 * 1024 * 1024);
 #endif
 
 	return (0);
 }
 
 void *
 efi_translate(vm_offset_t ptr)
 {
 
 	return ((void *)(ptr + stage_offset));
 }
 
 ssize_t
 efi_copyin(const void *src, vm_offset_t dest, const size_t len)
 {
 
 	if (!stage_offset_set) {
 		stage_offset = (vm_offset_t)staging - dest;
 		stage_offset_set = 1;
 	}
 
 	/* XXX: Callers do not check for failure. */
 	if (dest + stage_offset + len > staging_end) {
 		errno = ENOMEM;
 		return (-1);
 	}
 	bcopy(src, (void *)(dest + stage_offset), len);
 	return (len);
 }
 
 ssize_t
 efi_copyout(const vm_offset_t src, void *dest, const size_t len)
 {
 
 	/* XXX: Callers do not check for failure. */
 	if (src + stage_offset + len > staging_end) {
 		errno = ENOMEM;
 		return (-1);
 	}
 	bcopy((void *)(src + stage_offset), dest, len);
 	return (len);
 }
 
 
 ssize_t
 efi_readin(const int fd, vm_offset_t dest, const size_t len)
 {
 
 	if (dest + stage_offset + len > staging_end) {
 		errno = ENOMEM;
 		return (-1);
 	}
 	return (read(fd, (void *)(dest + stage_offset), len));
 }
 
 void
 efi_copy_finish(void)
 {
 	uint64_t	*src, *dst, *last;
 
 	src = (uint64_t *)staging;
 	dst = (uint64_t *)(staging - stage_offset);
 	last = (uint64_t *)staging_end;
 
 	while (src < last)
 		*dst++ = *src++;
 }
Index: head/sys/boot/efi/loader/devicename.c
===================================================================
--- head/sys/boot/efi/loader/devicename.c	(revision 293723)
+++ head/sys/boot/efi/loader/devicename.c	(revision 293724)
@@ -1,169 +1,171 @@
 /*-
  * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
  * Copyright (c) 2006 Marcel Moolenaar
  * 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$");
 
 #include <stand.h>
 #include <string.h>
 #include <sys/disklabel.h>
-#include "bootstrap.h"
+#include <bootstrap.h>
 
 #include <efi.h>
 #include <efilib.h>
+
+#include "loader_efi.h"
 
 static int efi_parsedev(struct devdesc **, const char *, const char **);
 
 /*
  * Point (dev) at an allocated device specifier for the device matching the
  * path in (devspec). If it contains an explicit device specification,
  * use that.  If not, use the default device.
  */
 int
 efi_getdev(void **vdev, const char *devspec, const char **path)
 {
 	struct devdesc **dev = (struct devdesc **)vdev;
 	int rv;
 
 	/*
 	 * If it looks like this is just a path and no device, then
 	 * use the current device instead.
 	 */
 	if (devspec == NULL || *devspec == '/' || !strchr(devspec, ':')) {
 		rv = efi_parsedev(dev, getenv("currdev"), NULL);
 		if (rv == 0 && path != NULL)
 			*path = devspec;
 		return (rv);
 	}
 
 	/* Parse the device name off the beginning of the devspec. */
 	return (efi_parsedev(dev, devspec, path));
 }
 
 /*
  * Point (dev) at an allocated device specifier matching the string version
  * at the beginning of (devspec).  Return a pointer to the remaining
  * text in (path).
  *
  * In all cases, the beginning of (devspec) is compared to the names
  * of known devices in the device switch, and then any following text
  * is parsed according to the rules applied to the device type.
  *
  * For disk-type devices, the syntax is:
  *
  * fs<unit>:
  */
 static int
 efi_parsedev(struct devdesc **dev, const char *devspec, const char **path)
 {
 	struct devdesc *idev;
 	struct devsw *dv;
 	char *cp;
 	const char *np;
 	int i, err;
 
 	/* minimum length check */
 	if (strlen(devspec) < 2)
 		return (EINVAL);
 
 	/* look for a device that matches */
 	for (i = 0; devsw[i] != NULL; i++) {
 		dv = devsw[i];
 		if (!strncmp(devspec, dv->dv_name, strlen(dv->dv_name)))
 			break;
 	}
 	if (devsw[i] == NULL)
 		return (ENOENT);
 
 	idev = malloc(sizeof(struct devdesc));
 	if (idev == NULL)
 		return (ENOMEM);
 
 	idev->d_dev = dv;
 	idev->d_type = dv->dv_type;
 	idev->d_unit = -1;
 
 	err = 0;
 	np = devspec + strlen(dv->dv_name);
 	if (*np != '\0' && *np != ':') {
 		idev->d_unit = strtol(np, &cp, 0);
 		if (cp == np) {
 			idev->d_unit = -1;
 			free(idev);
 			return (EUNIT);
 		}
 	}
 	if (*cp != '\0' && *cp != ':') {
 		free(idev);
 		return (EINVAL);
 	}
 
 	if (path != NULL)
 		*path = (*cp == 0) ? cp : cp + 1;
 	if (dev != NULL)
 		*dev = idev;
 	else
 		free(idev);
 	return (0);
 }
 
 char *
 efi_fmtdev(void *vdev)
 {
 	struct devdesc *dev = (struct devdesc *)vdev;
 	static char buf[32];	/* XXX device length constant? */
 
 	switch(dev->d_type) {
 	case DEVT_NONE:
 		strcpy(buf, "(no device)");
 		break;
 
 	default:
 		sprintf(buf, "%s%d:", dev->d_dev->dv_name, dev->d_unit);
 		break;
 	}
 
 	return (buf);
 }
 
 /*
  * Set currdev to suit the value being supplied in (value)
  */
 int
 efi_setcurrdev(struct env_var *ev, int flags, const void *value)
 {
 	struct devdesc *ncurr;
 	int rv;
 
 	rv = efi_parsedev(&ncurr, value, NULL);
 	if (rv != 0)
 		return (rv);
 
 	free(ncurr);
 	env_setenv(ev->ev_name, flags | EV_NOHOOK, value, NULL, NULL);
 	return (0);
 }
Index: head/sys/boot/efi/loader/loader_efi.h
===================================================================
--- head/sys/boot/efi/loader/loader_efi.h	(revision 293723)
+++ head/sys/boot/efi/loader/loader_efi.h	(revision 293724)
@@ -1,49 +1,51 @@
 /*-
  * Copyright (c) 2013 The FreeBSD Foundation
  * All rights reserved.
  *
  * This software was developed by Benno Rice under sponsorship from
  * the FreeBSD Foundation.
  * 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.
  *
  * $FreeBSD$
  */
 
 #ifndef	_LOADER_EFI_COPY_H_
 #define	_LOADER_EFI_COPY_H_
 
+#include <stand.h>
+
 int	efi_autoload(void);
 
 int	efi_getdev(void **vdev, const char *devspec, const char **path);
 char	*efi_fmtdev(void *vdev);
 int	efi_setcurrdev(struct env_var *ev, int flags, const void *value);
 
 int	efi_copy_init(void);
 
 ssize_t	efi_copyin(const void *src, vm_offset_t dest, const size_t len);
 ssize_t	efi_copyout(const vm_offset_t src, void *dest, const size_t len);
 ssize_t	efi_readin(const int fd, vm_offset_t dest, const size_t len);
 void * efi_translate(vm_offset_t ptr);
 
 void	efi_copy_finish(void);
 
 #endif	/* _LOADER_EFI_COPY_H_ */
Index: head/sys/boot/efi/loader/main.c
===================================================================
--- head/sys/boot/efi/loader/main.c	(revision 293723)
+++ head/sys/boot/efi/loader/main.c	(revision 293724)
@@ -1,441 +1,443 @@
 /*-
  * Copyright (c) 2008-2010 Rui Paulo
  * Copyright (c) 2006 Marcel Moolenaar
  * 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 ``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 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$");
 
 #include <stand.h>
 #include <string.h>
 #include <setjmp.h>
 
 #include <efi.h>
 #include <efilib.h>
 
 #include <bootstrap.h>
 #include <smbios.h>
 
 #include "loader_efi.h"
 
 extern char bootprog_name[];
 extern char bootprog_rev[];
 extern char bootprog_date[];
 extern char bootprog_maker[];
 
 struct devdesc currdev;		/* our current device */
 struct arch_switch archsw;	/* MI/MD interface boundary */
 
 EFI_GUID acpi = ACPI_TABLE_GUID;
 EFI_GUID acpi20 = ACPI_20_TABLE_GUID;
 EFI_GUID devid = DEVICE_PATH_PROTOCOL;
 EFI_GUID imgid = LOADED_IMAGE_PROTOCOL;
 EFI_GUID mps = MPS_TABLE_GUID;
 EFI_GUID netid = EFI_SIMPLE_NETWORK_PROTOCOL;
 EFI_GUID smbios = SMBIOS_TABLE_GUID;
 EFI_GUID dxe = DXE_SERVICES_TABLE_GUID;
 EFI_GUID hoblist = HOB_LIST_TABLE_GUID;
 EFI_GUID memtype = MEMORY_TYPE_INFORMATION_TABLE_GUID;
 EFI_GUID debugimg = DEBUG_IMAGE_INFO_TABLE_GUID;
 EFI_GUID fdtdtb = FDT_TABLE_GUID;
 
 EFI_STATUS
 main(int argc, CHAR16 *argv[])
 {
 	char var[128];
 	EFI_LOADED_IMAGE *img;
 	EFI_GUID *guid;
 	int i, j, vargood;
+	UINTN k;
 
 	/*
 	 * XXX Chicken-and-egg problem; we want to have console output
 	 * early, but some console attributes may depend on reading from
 	 * eg. the boot device, which we can't do yet.  We can use
 	 * printf() etc. once this is done.
 	 */
 	cons_probe();
 
 	/*
 	 * Loop through the args, and for each one that contains an '=' that is
 	 * not the first character, add it to the environment.  This allows
 	 * loader and kernel env vars to be passed on the command line.  Convert
 	 * args from UCS-2 to ASCII (16 to 8 bit) as they are copied.
 	 */
 	for (i = 1; i < argc; i++) {
 		vargood = 0;
 		for (j = 0; argv[i][j] != 0; j++) {
 			if (j == sizeof(var)) {
 				vargood = 0;
 				break;
 			}
 			if (j > 0 && argv[i][j] == '=')
 				vargood = 1;
 			var[j] = (char)argv[i][j];
 		}
 		if (vargood) {
 			var[j] = 0;
 			putenv(var);
 		}
 	}
 
 	if (efi_copy_init()) {
 		printf("failed to allocate staging area\n");
 		return (EFI_BUFFER_TOO_SMALL);
 	}
 
 	/*
 	 * March through the device switch probing for things.
 	 */
 	for (i = 0; devsw[i] != NULL; i++)
 		if (devsw[i]->dv_init != NULL)
 			(devsw[i]->dv_init)();
 
 	/* Get our loaded image protocol interface structure. */
 	BS->HandleProtocol(IH, &imgid, (VOID**)&img);
 
 	printf("Image base: 0x%lx\n", (u_long)img->ImageBase);
 	printf("EFI version: %d.%02d\n", ST->Hdr.Revision >> 16,
 	    ST->Hdr.Revision & 0xffff);
 	printf("EFI Firmware: ");
 	/* printf doesn't understand EFI Unicode */
 	ST->ConOut->OutputString(ST->ConOut, ST->FirmwareVendor);
 	printf(" (rev %d.%02d)\n", ST->FirmwareRevision >> 16,
 	    ST->FirmwareRevision & 0xffff);
 
 	printf("\n");
 	printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
 	printf("(%s, %s)\n", bootprog_maker, bootprog_date);
 
 	efi_handle_lookup(img->DeviceHandle, &currdev.d_dev, &currdev.d_unit);
 	currdev.d_type = currdev.d_dev->dv_type;
 
 	/*
 	 * Disable the watchdog timer. By default the boot manager sets
 	 * the timer to 5 minutes before invoking a boot option. If we
 	 * want to return to the boot manager, we have to disable the
 	 * watchdog timer and since we're an interactive program, we don't
 	 * want to wait until the user types "quit". The timer may have
 	 * fired by then. We don't care if this fails. It does not prevent
 	 * normal functioning in any way...
 	 */
 	BS->SetWatchdogTimer(0, 0, 0, NULL);
 
 	env_setenv("currdev", EV_VOLATILE, efi_fmtdev(&currdev),
 	    efi_setcurrdev, env_nounset);
 	env_setenv("loaddev", EV_VOLATILE, efi_fmtdev(&currdev), env_noset,
 	    env_nounset);
 
 	setenv("LINES", "24", 1);	/* optional */
 
 	archsw.arch_autoload = efi_autoload;
 	archsw.arch_getdev = efi_getdev;
 	archsw.arch_copyin = efi_copyin;
 	archsw.arch_copyout = efi_copyout;
 	archsw.arch_readin = efi_readin;
 
-	for (i = 0; i < ST->NumberOfTableEntries; i++) {
-		guid = &ST->ConfigurationTable[i].VendorGuid;
+	for (k = 0; k < ST->NumberOfTableEntries; k++) {
+		guid = &ST->ConfigurationTable[k].VendorGuid;
 		if (!memcmp(guid, &smbios, sizeof(EFI_GUID))) {
-			smbios_detect(ST->ConfigurationTable[i].VendorTable);
+			smbios_detect(ST->ConfigurationTable[k].VendorTable);
 			break;
 		}
 	}
 
 	interact(NULL);			/* doesn't return */
 
 	return (EFI_SUCCESS);		/* keep compiler happy */
 }
 
 COMMAND_SET(reboot, "reboot", "reboot the system", command_reboot);
 
 static int
 command_reboot(int argc, char *argv[])
 {
 	int i;
 
 	for (i = 0; devsw[i] != NULL; ++i)
 		if (devsw[i]->dv_cleanup != NULL)
 			(devsw[i]->dv_cleanup)();
 
 	RS->ResetSystem(EfiResetCold, EFI_SUCCESS, 23,
 	    (CHAR16 *)"Reboot from the loader");
 
 	/* NOTREACHED */
 	return (CMD_ERROR);
 }
 
 COMMAND_SET(quit, "quit", "exit the loader", command_quit);
 
 static int
 command_quit(int argc, char *argv[])
 {
 	exit(0);
 	return (CMD_OK);
 }
 
 COMMAND_SET(memmap, "memmap", "print memory map", command_memmap);
 
 static int
 command_memmap(int argc, char *argv[])
 {
 	UINTN sz;
 	EFI_MEMORY_DESCRIPTOR *map, *p;
 	UINTN key, dsz;
 	UINT32 dver;
 	EFI_STATUS status;
 	int i, ndesc;
 	static char *types[] = {
 	    "Reserved",
 	    "LoaderCode",
 	    "LoaderData",
 	    "BootServicesCode",
 	    "BootServicesData",
 	    "RuntimeServicesCode",
 	    "RuntimeServicesData",
 	    "ConventionalMemory",
 	    "UnusableMemory",
 	    "ACPIReclaimMemory",
 	    "ACPIMemoryNVS",
 	    "MemoryMappedIO",
 	    "MemoryMappedIOPortSpace",
 	    "PalCode"
 	};
 
 	sz = 0;
 	status = BS->GetMemoryMap(&sz, 0, &key, &dsz, &dver);
 	if (status != EFI_BUFFER_TOO_SMALL) {
 		printf("Can't determine memory map size\n");
 		return (CMD_ERROR);
 	}
 	map = malloc(sz);
 	status = BS->GetMemoryMap(&sz, map, &key, &dsz, &dver);
 	if (EFI_ERROR(status)) {
 		printf("Can't read memory map\n");
 		return (CMD_ERROR);
 	}
 
 	ndesc = sz / dsz;
 	printf("%23s %12s %12s %8s %4s\n",
 	    "Type", "Physical", "Virtual", "#Pages", "Attr");
 
 	for (i = 0, p = map; i < ndesc;
 	     i++, p = NextMemoryDescriptor(p, dsz)) {
-		printf("%23s %012lx %012lx %08lx ", types[p->Type],
-		   p->PhysicalStart, p->VirtualStart, p->NumberOfPages);
+		printf("%23s %012jx %012jx %08jx ", types[p->Type],
+		   (uintmax_t)p->PhysicalStart, (uintmax_t)p->VirtualStart,
+		   (uintmax_t)p->NumberOfPages);
 		if (p->Attribute & EFI_MEMORY_UC)
 			printf("UC ");
 		if (p->Attribute & EFI_MEMORY_WC)
 			printf("WC ");
 		if (p->Attribute & EFI_MEMORY_WT)
 			printf("WT ");
 		if (p->Attribute & EFI_MEMORY_WB)
 			printf("WB ");
 		if (p->Attribute & EFI_MEMORY_UCE)
 			printf("UCE ");
 		if (p->Attribute & EFI_MEMORY_WP)
 			printf("WP ");
 		if (p->Attribute & EFI_MEMORY_RP)
 			printf("RP ");
 		if (p->Attribute & EFI_MEMORY_XP)
 			printf("XP ");
 		printf("\n");
 	}
 
 	return (CMD_OK);
 }
 
 COMMAND_SET(configuration, "configuration", "print configuration tables",
     command_configuration);
 
 static const char *
 guid_to_string(EFI_GUID *guid)
 {
 	static char buf[40];
 
 	sprintf(buf, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 	    guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
 	    guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
 	    guid->Data4[5], guid->Data4[6], guid->Data4[7]);
 	return (buf);
 }
 
 static int
 command_configuration(int argc, char *argv[])
 {
-	int i;
+	UINTN i;
 
-	printf("NumberOfTableEntries=%ld\n", ST->NumberOfTableEntries);
+	printf("NumberOfTableEntries=%lu\n",
+		(unsigned long)ST->NumberOfTableEntries);
 	for (i = 0; i < ST->NumberOfTableEntries; i++) {
 		EFI_GUID *guid;
 
 		printf("  ");
 		guid = &ST->ConfigurationTable[i].VendorGuid;
 		if (!memcmp(guid, &mps, sizeof(EFI_GUID)))
 			printf("MPS Table");
 		else if (!memcmp(guid, &acpi, sizeof(EFI_GUID)))
 			printf("ACPI Table");
 		else if (!memcmp(guid, &acpi20, sizeof(EFI_GUID)))
 			printf("ACPI 2.0 Table");
 		else if (!memcmp(guid, &smbios, sizeof(EFI_GUID)))
 			printf("SMBIOS Table");
 		else if (!memcmp(guid, &dxe, sizeof(EFI_GUID)))
 			printf("DXE Table");
 		else if (!memcmp(guid, &hoblist, sizeof(EFI_GUID)))
 			printf("HOB List Table");
 		else if (!memcmp(guid, &memtype, sizeof(EFI_GUID)))
 			printf("Memory Type Information Table");
 		else if (!memcmp(guid, &debugimg, sizeof(EFI_GUID)))
 			printf("Debug Image Info Table");
 		else if (!memcmp(guid, &fdtdtb, sizeof(EFI_GUID)))
 			printf("FDT Table");
 		else
 			printf("Unknown Table (%s)", guid_to_string(guid));
 		printf(" at %p\n", ST->ConfigurationTable[i].VendorTable);
 	}
 
 	return (CMD_OK);
 }
 
 
 COMMAND_SET(mode, "mode", "change or display EFI text modes", command_mode);
 
 static int
 command_mode(int argc, char *argv[])
 {
 	UINTN cols, rows;
 	unsigned int mode;
 	int i;
 	char *cp;
 	char rowenv[8];
 	EFI_STATUS status;
 	SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
 	extern void HO(void);
 
 	conout = ST->ConOut;
 
 	if (argc > 1) {
 		mode = strtol(argv[1], &cp, 0);
 		if (cp[0] != '\0') {
 			printf("Invalid mode\n");
 			return (CMD_ERROR);
 		}
 		status = conout->QueryMode(conout, mode, &cols, &rows);
 		if (EFI_ERROR(status)) {
 			printf("invalid mode %d\n", mode);
 			return (CMD_ERROR);
 		}
 		status = conout->SetMode(conout, mode);
 		if (EFI_ERROR(status)) {
 			printf("couldn't set mode %d\n", mode);
 			return (CMD_ERROR);
 		}
 		sprintf(rowenv, "%u", (unsigned)rows);
 		setenv("LINES", rowenv, 1);
 		HO();		/* set cursor */
 		return (CMD_OK);
 	}
 
 	printf("Current mode: %d\n", conout->Mode->Mode);
 	for (i = 0; i <= conout->Mode->MaxMode; i++) {
 		status = conout->QueryMode(conout, i, &cols, &rows);
 		if (EFI_ERROR(status))
 			continue;
 		printf("Mode %d: %u columns, %u rows\n", i, (unsigned)cols,
 		    (unsigned)rows);
 	}
 
 	if (i != 0)
 		printf("Select a mode with the command \"mode <number>\"\n");
 
 	return (CMD_OK);
 }
 
 
 COMMAND_SET(nvram, "nvram", "get or set NVRAM variables", command_nvram);
 
 static int
 command_nvram(int argc, char *argv[])
 {
 	CHAR16 var[128];
 	CHAR16 *data;
 	EFI_STATUS status;
 	EFI_GUID varguid = { 0,0,0,{0,0,0,0,0,0,0,0} };
-	UINTN varsz, datasz;
+	UINTN varsz, datasz, i;
 	SIMPLE_TEXT_OUTPUT_INTERFACE *conout;
-	int i;
 
 	conout = ST->ConOut;
 
 	/* Initiate the search */
 	status = RS->GetNextVariableName(&varsz, NULL, NULL);
 
 	for (; status != EFI_NOT_FOUND; ) {
 		status = RS->GetNextVariableName(&varsz, var, &varguid);
 		//if (EFI_ERROR(status))
 			//break;
 
 		conout->OutputString(conout, var);
 		printf("=");
 		datasz = 0;
 		status = RS->GetVariable(var, &varguid, NULL, &datasz, NULL);
 		/* XXX: check status */
 		data = malloc(datasz);
 		status = RS->GetVariable(var, &varguid, NULL, &datasz, data);
 		if (EFI_ERROR(status))
 			printf("<error retrieving variable>");
 		else {
 			for (i = 0; i < datasz; i++) {
 				if (isalnum(data[i]) || isspace(data[i]))
 					printf("%c", data[i]);
 				else
 					printf("\\x%02x", data[i]);
 			}
 		}
 		/* XXX */
 		pager_output("\n");
 		free(data);
 	}
 
 	return (CMD_OK);
 }
 
 #ifdef LOADER_FDT_SUPPORT
 extern int command_fdt_internal(int argc, char *argv[]);
 
 /*
  * Since proper fdt command handling function is defined in fdt_loader_cmd.c,
  * and declaring it as extern is in contradiction with COMMAND_SET() macro
  * (which uses static pointer), we're defining wrapper function, which
  * calls the proper fdt handling routine.
  */
 static int
 command_fdt(int argc, char *argv[])
 {
 
 	return (command_fdt_internal(argc, argv));
 }
 
 COMMAND_SET(fdt, "fdt", "flattened device tree handling", command_fdt);
 #endif
Index: head/sys/boot/i386/libi386/smbios.c
===================================================================
--- head/sys/boot/i386/libi386/smbios.c	(revision 293723)
+++ head/sys/boot/i386/libi386/smbios.c	(revision 293724)
@@ -1,447 +1,447 @@
 /*-
  * Copyright (c) 2005-2009 Jung-uk Kim <jkim@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$");
 
 #include <stand.h>
 #include <bootstrap.h>
 #include <sys/endian.h>
 
 #ifdef EFI
 /* In EFI, we don't need PTOV(). */
 #define PTOV(x)		(caddr_t)(x)
 #else
 #include "btxv86.h"
 #endif
 #include "smbios.h"
 
 /*
  * Detect SMBIOS and export information about the SMBIOS into the
  * environment.
  *
  * System Management BIOS Reference Specification, v2.6 Final
  * http://www.dmtf.org/standards/published_documents/DSP0134_2.6.0.pdf
  */
 
 /*
  * 2.1.1 SMBIOS Structure Table Entry Point
  *
  * "On non-EFI systems, the SMBIOS Entry Point structure, described below, can
  * be located by application software by searching for the anchor-string on
  * paragraph (16-byte) boundaries within the physical memory address range
  * 000F0000h to 000FFFFFh. This entry point encapsulates an intermediate anchor
  * string that is used by some existing DMI browsers."
  */
 #define	SMBIOS_START		0xf0000
 #define	SMBIOS_LENGTH		0x10000
 #define	SMBIOS_STEP		0x10
 #define	SMBIOS_SIG		"_SM_"
 #define	SMBIOS_DMI_SIG		"_DMI_"
 
 #define	SMBIOS_GET8(base, off)	(*(uint8_t *)((base) + (off)))
 #define	SMBIOS_GET16(base, off)	(*(uint16_t *)((base) + (off)))
 #define	SMBIOS_GET32(base, off)	(*(uint32_t *)((base) + (off)))
 
 #define	SMBIOS_GETLEN(base)	SMBIOS_GET8(base, 0x01)
 #define	SMBIOS_GETSTR(base)	((base) + SMBIOS_GETLEN(base))
 
 struct smbios_attr {
 	int		probed;
 	caddr_t 	addr;
 	size_t		length;
 	size_t		count;
 	int		major;
 	int		minor;
 	int		ver;
 	const char*	bios_vendor;
 	const char*	maker;
 	const char*	product;
 	uint32_t	enabled_memory;
 	uint32_t	old_enabled_memory;
 	uint8_t		enabled_sockets;
 	uint8_t		populated_sockets;
 };
 
 static struct smbios_attr smbios;
 
 static uint8_t
 smbios_checksum(const caddr_t addr, const uint8_t len)
 {
 	uint8_t		sum;
 	int		i;
 
 	for (sum = 0, i = 0; i < len; i++)
 		sum += SMBIOS_GET8(addr, i);
 	return (sum);
 }
 
 static caddr_t
 smbios_sigsearch(const caddr_t addr, const uint32_t len)
 {
 	caddr_t		cp;
 
 	/* Search on 16-byte boundaries. */
 	for (cp = addr; cp < addr + len; cp += SMBIOS_STEP)
 		if (strncmp(cp, SMBIOS_SIG, 4) == 0 &&
 		    smbios_checksum(cp, SMBIOS_GET8(cp, 0x05)) == 0 &&
 		    strncmp(cp + 0x10, SMBIOS_DMI_SIG, 5) == 0 &&
 		    smbios_checksum(cp + 0x10, 0x0f) == 0)
 			return (cp);
 	return (NULL);
 }
 
 static const char*
 smbios_getstring(caddr_t addr, const int offset)
 {
 	caddr_t		cp;
 	int		i, idx;
 
 	idx = SMBIOS_GET8(addr, offset);
 	if (idx != 0) {
 		cp = SMBIOS_GETSTR(addr);
 		for (i = 1; i < idx; i++)
 			cp += strlen(cp) + 1;
 		return cp;
 	}
 	return (NULL);
 }
 
 static void
 smbios_setenv(const char *name, caddr_t addr, const int offset)
 {
 	const char*	val;
 
 	val = smbios_getstring(addr, offset);
 	if (val != NULL)
 		setenv(name, val, 1);
 }
 
 #ifdef SMBIOS_SERIAL_NUMBERS
 
 #define	UUID_SIZE		16
 #define	UUID_TYPE		uint32_t
 #define	UUID_STEP		sizeof(UUID_TYPE)
 #define	UUID_ALL_BITS		(UUID_SIZE / UUID_STEP)
 #define	UUID_GET(base, off)	(*(UUID_TYPE *)((base) + (off)))
 
 static void
 smbios_setuuid(const char *name, const caddr_t addr, const int ver)
 {
 	char		uuid[37];
 	int		byteorder, i, ones, zeros;
 	UUID_TYPE	n;
 	uint32_t	f1;
 	uint16_t	f2, f3;
 
 	for (i = 0, ones = 0, zeros = 0; i < UUID_SIZE; i += UUID_STEP) {
 		n = UUID_GET(addr, i) + 1;
 		if (zeros == 0 && n == 0)
 			ones++;
 		else if (ones == 0 && n == 1)
 			zeros++;
 		else
 			break;
 	}
 
 	if (ones != UUID_ALL_BITS && zeros != UUID_ALL_BITS) {
 		/*
 		 * 3.3.2.1 System UUID
 		 *
 		 * "Although RFC 4122 recommends network byte order for all
 		 * fields, the PC industry (including the ACPI, UEFI, and
 		 * Microsoft specifications) has consistently used
 		 * little-endian byte encoding for the first three fields:
 		 * time_low, time_mid, time_hi_and_version. The same encoding,
 		 * also known as wire format, should also be used for the
 		 * SMBIOS representation of the UUID."
 		 *
 		 * Note: We use network byte order for backward compatibility
 		 * unless SMBIOS version is 2.6+ or little-endian is forced.
 		 */
 #if defined(SMBIOS_LITTLE_ENDIAN_UUID)
 		byteorder = LITTLE_ENDIAN;
 #elif defined(SMBIOS_NETWORK_ENDIAN_UUID)
 		byteorder = BIG_ENDIAN;
 #else
 		byteorder = ver < 0x0206 ? BIG_ENDIAN : LITTLE_ENDIAN;
 #endif
 		if (byteorder != LITTLE_ENDIAN) {
 			f1 = ntohl(SMBIOS_GET32(addr, 0));
 			f2 = ntohs(SMBIOS_GET16(addr, 4));
 			f3 = ntohs(SMBIOS_GET16(addr, 6));
 		} else {
 			f1 = le32toh(SMBIOS_GET32(addr, 0));
 			f2 = le16toh(SMBIOS_GET16(addr, 4));
 			f3 = le16toh(SMBIOS_GET16(addr, 6));
 		}
 		sprintf(uuid,
 		    "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 		    f1, f2, f3, SMBIOS_GET8(addr, 8), SMBIOS_GET8(addr, 9),
 		    SMBIOS_GET8(addr, 10), SMBIOS_GET8(addr, 11),
 		    SMBIOS_GET8(addr, 12), SMBIOS_GET8(addr, 13),
 		    SMBIOS_GET8(addr, 14), SMBIOS_GET8(addr, 15));
 		setenv(name, uuid, 1);
 	}
 }
 
 #undef UUID_SIZE
 #undef UUID_TYPE
 #undef UUID_STEP
 #undef UUID_ALL_BITS
 #undef UUID_GET
 
 #endif
 
 static caddr_t
 smbios_parse_table(const caddr_t addr)
 {
 	caddr_t		cp;
 	int		proc, size, osize, type;
 
 	type = SMBIOS_GET8(addr, 0);	/* 3.1.2 Structure Header Format */
 	switch(type) {
 	case 0:		/* 3.3.1 BIOS Information (Type 0) */
 		smbios_setenv("smbios.bios.vendor", addr, 0x04);
 		smbios_setenv("smbios.bios.version", addr, 0x05);
 		smbios_setenv("smbios.bios.reldate", addr, 0x08);
 		break;
 
 	case 1:		/* 3.3.2 System Information (Type 1) */
 		smbios_setenv("smbios.system.maker", addr, 0x04);
 		smbios_setenv("smbios.system.product", addr, 0x05);
 		smbios_setenv("smbios.system.version", addr, 0x06);
 #ifdef SMBIOS_SERIAL_NUMBERS
 		smbios_setenv("smbios.system.serial", addr, 0x07);
 		smbios_setuuid("smbios.system.uuid", addr + 0x08, smbios.ver);
 #endif
 		break;
 
 	case 2:		/* 3.3.3 Base Board (or Module) Information (Type 2) */
 		smbios_setenv("smbios.planar.maker", addr, 0x04);
 		smbios_setenv("smbios.planar.product", addr, 0x05);
 		smbios_setenv("smbios.planar.version", addr, 0x06);
 #ifdef SMBIOS_SERIAL_NUMBERS
 		smbios_setenv("smbios.planar.serial", addr, 0x07);
 #endif
 		break;
 
 	case 3:		/* 3.3.4 System Enclosure or Chassis (Type 3) */
 		smbios_setenv("smbios.chassis.maker", addr, 0x04);
 		smbios_setenv("smbios.chassis.version", addr, 0x06);
 #ifdef SMBIOS_SERIAL_NUMBERS
 		smbios_setenv("smbios.chassis.serial", addr, 0x07);
 		smbios_setenv("smbios.chassis.tag", addr, 0x08);
 #endif
 		break;
 
 	case 4:		/* 3.3.5 Processor Information (Type 4) */
 		/*
 		 * Offset 18h: Processor Status
 		 *
 		 * Bit 7	Reserved, must be 0
 		 * Bit 6	CPU Socket Populated
 		 *		1 - CPU Socket Populated
 		 *		0 - CPU Socket Unpopulated
 		 * Bit 5:3	Reserved, must be zero
 		 * Bit 2:0	CPU Status
 		 *		0h - Unknown
 		 *		1h - CPU Enabled
 		 *		2h - CPU Disabled by User via BIOS Setup
 		 *		3h - CPU Disabled by BIOS (POST Error)
 		 *		4h - CPU is Idle, waiting to be enabled
 		 *		5-6h - Reserved
 		 *		7h - Other
 		 */
 		proc = SMBIOS_GET8(addr, 0x18);
 		if ((proc & 0x07) == 1)
 			smbios.enabled_sockets++;
 		if ((proc & 0x40) != 0)
 			smbios.populated_sockets++;
 		break;
 
 	case 6:		/* 3.3.7 Memory Module Information (Type 6, Obsolete) */
 		/*
 		 * Offset 0Ah: Enabled Size
 		 *
 		 * Bit 7	Bank connection
 		 *		1 - Double-bank connection
 		 *		0 - Single-bank connection
 		 * Bit 6:0	Size (n), where 2**n is the size in MB
 		 *		7Dh - Not determinable (Installed Size only)
 		 *		7Eh - Module is installed, but no memory
 		 *		      has been enabled
 		 *		7Fh - Not installed
 		 */
 		osize = SMBIOS_GET8(addr, 0x0a) & 0x7f;
 		if (osize > 0 && osize < 22)
 			smbios.old_enabled_memory += 1 << (osize + 10);
 		break;
 
 	case 17:	/* 3.3.18 Memory Device (Type 17) */
 		/*
 		 * Offset 0Ch: Size
 		 *
 		 * Bit 15	Granularity
 		 *		1 - Value is in kilobytes units
 		 *		0 - Value is in megabytes units
 		 * Bit 14:0	Size
 		 */
 		size = SMBIOS_GET16(addr, 0x0c);
 		if (size != 0 && size != 0xffff)
 			smbios.enabled_memory += (size & 0x8000) != 0 ?
 			    (size & 0x7fff) : (size << 10);
 		break;
 
 	default:	/* skip other types */
 		break;
 	}
 
 	/* Find structure terminator. */
 	cp = SMBIOS_GETSTR(addr);
 	while (SMBIOS_GET16(cp, 0) != 0)
 		cp++;
 
 	return (cp + 2);
 }
 
 static caddr_t
 smbios_find_struct(int type)
 {
 	caddr_t		dmi;
-	int		i;
+	size_t		i;
 
 	if (smbios.addr == NULL)
 		return (NULL);
 
 	for (dmi = smbios.addr, i = 0;
 	     dmi < smbios.addr + smbios.length && i < smbios.count; i++) {
 		if (SMBIOS_GET8(dmi, 0) == type)
 			return dmi;
 		/* Find structure terminator. */
 		dmi = SMBIOS_GETSTR(dmi);
 		while (SMBIOS_GET16(dmi, 0) != 0)
 			dmi++;
 		dmi += 2;
 	}
 
 	return (NULL);
 }
 
 static void
 smbios_probe(const caddr_t addr)
 {
 	caddr_t		saddr, info;
 	uintptr_t	paddr;
 
 	if (smbios.probed)
 		return;
 	smbios.probed = 1;
 
 	/* Search signatures and validate checksums. */
 	saddr = smbios_sigsearch(addr ? addr : PTOV(SMBIOS_START),
 	    SMBIOS_LENGTH);
 	if (saddr == NULL)
 		return;
 
 	smbios.length = SMBIOS_GET16(saddr, 0x16);	/* Structure Table Length */
 	paddr = SMBIOS_GET32(saddr, 0x18);		/* Structure Table Address */
 	smbios.count = SMBIOS_GET16(saddr, 0x1c);	/* No of SMBIOS Structures */
 	smbios.ver = SMBIOS_GET8(saddr, 0x1e);		/* SMBIOS BCD Revision */
 
 	if (smbios.ver != 0) {
 		smbios.major = smbios.ver >> 4;
 		smbios.minor = smbios.ver & 0x0f;
 		if (smbios.major > 9 || smbios.minor > 9)
 			smbios.ver = 0;
 	}
 	if (smbios.ver == 0) {
 		smbios.major = SMBIOS_GET8(saddr, 0x06);/* SMBIOS Major Version */
 		smbios.minor = SMBIOS_GET8(saddr, 0x07);/* SMBIOS Minor Version */
 	}
 	smbios.ver = (smbios.major << 8) | smbios.minor;
 	smbios.addr = PTOV(paddr);
 
 	/* Get system information from SMBIOS */
 	info = smbios_find_struct(0x00);
 	if (info != NULL) {
 		smbios.bios_vendor = smbios_getstring(info, 0x04);
 	}
 	info = smbios_find_struct(0x01);
 	if (info != NULL) {
 		smbios.maker = smbios_getstring(info, 0x04);
 		smbios.product = smbios_getstring(info, 0x05);
 	}
 }
 
 void
 smbios_detect(const caddr_t addr)
 {
 	char		buf[16];
 	caddr_t		dmi;
-	int		i;
+	size_t		i;
 
 	smbios_probe(addr);
 	if (smbios.addr == NULL)
 		return;
 
 	for (dmi = smbios.addr, i = 0;
 	     dmi < smbios.addr + smbios.length && i < smbios.count; i++)
 		dmi = smbios_parse_table(dmi);
 
 	sprintf(buf, "%d.%d", smbios.major, smbios.minor);
 	setenv("smbios.version", buf, 1);
 	if (smbios.enabled_memory > 0 || smbios.old_enabled_memory > 0) {
 		sprintf(buf, "%u", smbios.enabled_memory > 0 ?
 		    smbios.enabled_memory : smbios.old_enabled_memory);
 		setenv("smbios.memory.enabled", buf, 1);
 	}
 	if (smbios.enabled_sockets > 0) {
 		sprintf(buf, "%u", smbios.enabled_sockets);
 		setenv("smbios.socket.enabled", buf, 1);
 	}
 	if (smbios.populated_sockets > 0) {
 		sprintf(buf, "%u", smbios.populated_sockets);
 		setenv("smbios.socket.populated", buf, 1);
 	}
 }
 
 static int
 smbios_match_str(const char* s1, const char* s2)
 {
 	return (s1 == NULL || (s2 != NULL && !strcmp(s1, s2)));
 }
 
 int
 smbios_match(const char* bios_vendor, const char* maker,
     const char* product)
 {
 	/* XXXRP currently, only called from non-EFI. */
 	smbios_probe(NULL);
 	return (smbios_match_str(bios_vendor, smbios.bios_vendor) &&
 	    smbios_match_str(maker, smbios.maker) &&
 	    smbios_match_str(product, smbios.product));
 }