diff options
author | marcel <marcel@FreeBSD.org> | 2004-11-23 18:55:24 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2004-11-23 18:55:24 +0000 |
commit | a73c9ef46aca08b05b3abbd9dbd791799d71ea93 (patch) | |
tree | ff5fe01c84615b42580ac73acd1ea5edeca62323 | |
parent | 75d5a09a05cfc84f37a727d8c1598a9337b21c70 (diff) | |
download | FreeBSD-src-a73c9ef46aca08b05b3abbd9dbd791799d71ea93.zip FreeBSD-src-a73c9ef46aca08b05b3abbd9dbd791799d71ea93.tar.gz |
This file was repocopied to src/sys/boot/ia64/efi.
-rw-r--r-- | sys/boot/efi/libefi/arch/ia64/ldscript.ia64 | 73 | ||||
-rw-r--r-- | sys/boot/efi/libefi/arch/ia64/start.S | 314 | ||||
-rw-r--r-- | sys/boot/efi/loader/Makefile | 71 | ||||
-rw-r--r-- | sys/boot/efi/loader/conf.c | 95 | ||||
-rw-r--r-- | sys/boot/efi/loader/main.c | 558 | ||||
-rw-r--r-- | sys/boot/efi/loader/version | 16 |
6 files changed, 0 insertions, 1127 deletions
diff --git a/sys/boot/efi/libefi/arch/ia64/ldscript.ia64 b/sys/boot/efi/libefi/arch/ia64/ldscript.ia64 deleted file mode 100644 index 0f79b67..0000000 --- a/sys/boot/efi/libefi/arch/ia64/ldscript.ia64 +++ /dev/null @@ -1,73 +0,0 @@ -/* $FreeBSD$ */ -OUTPUT_FORMAT("elf64-ia64-little", "elf64-ia64-little", "elf64-ia64-little") -OUTPUT_ARCH(ia64) -ENTRY(_start_plabel) -SECTIONS -{ - /* Read-only sections, merged into text segment: */ - . = 0; - ImageBase = .; - . = SIZEOF_HEADERS; - . = ALIGN(4096); - .text : { - *(.text .stub .text.* .gnu.linkonce.t.*) - /* .gnu.warning sections are handled specially by elf32.em. */ - *(.gnu.warning) - *(.plt) - } =0x00300000010070000002000001000400 - . = ALIGN(4096); - .data : { - *(.rodata .rodata.* .gnu.linkonce.r.*) - *(.rodata1) - *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) - *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) - *(.opd) - *(.IA_64.unwind_info* .gnu.linkonce.ia64unwi.*) - *(.IA_64.unwind* .gnu.linkonce.ia64unw.*) - __start_set_Xcommand_set = .; - *(set_Xcommand_set) - __stop_set_Xcommand_set = .; - *(.data .data.* .gnu.linkonce.d.*) - *(.data1) - *(.plabel) - *(.dynbss) - *(.bss .bss.* .gnu.linkonce.b.*) - *(COMMON) - } - . = ALIGN(4096); - __gp = .; - .sdata : { - *(.got.plt .got) - *(.IA_64.pltoff) - *(.sdata .sdata.* .gnu.linkonce.s.*) - *(dynsbss) - *(.sbss .sbss.* .gnu.linkonce.sb.*) - *(.scommon) - } - . = ALIGN(4096); - .dynamic : { *(.dynamic) } - . = ALIGN(4096); - .rela.dyn : { - *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) - *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) - *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) - *(.rela.got) - *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) - *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) - *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) - *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) - *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) - *(.rela.plt) - *(.rela.IA_64.pltoff) - *(.relaset_*) - *(.rela.dyn .rela.dyn.*) - } - . = ALIGN(4096); - .reloc : { *(.reloc) } - . = ALIGN(4096); - .hash : { *(.hash) } - . = ALIGN(4096); - .dynsym : { *(.dynsym) } - . = ALIGN(4096); - .dynstr : { *(.dynstr) } -} diff --git a/sys/boot/efi/libefi/arch/ia64/start.S b/sys/boot/efi/libefi/arch/ia64/start.S deleted file mode 100644 index 5c2f3e1..0000000 --- a/sys/boot/efi/libefi/arch/ia64/start.S +++ /dev/null @@ -1,314 +0,0 @@ -/*- - * Copyright (c) 2001 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. - * - * $FreeBSD$ - */ - - .text - -#include <machine/asm.h> - -#define EFI_SUCCESS 0 -#define EFI_LOAD_ERROR 1 -#define EFI_BUFFER_TOO_SMALL 5 - -#define DT_NULL 0 /* Terminating entry. */ -#define DT_NEEDED 1 /* String table offset of a needed shared - library. */ -#define DT_PLTRELSZ 2 /* Total size in bytes of PLT relocations. */ -#define DT_PLTGOT 3 /* Processor-dependent address. */ -#define DT_HASH 4 /* Address of symbol hash table. */ -#define DT_STRTAB 5 /* Address of string table. */ -#define DT_SYMTAB 6 /* Address of symbol table. */ -#define DT_RELA 7 /* Address of ElfNN_Rela relocations. */ -#define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */ -#define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */ -#define DT_STRSZ 10 /* Size of string table. */ -#define DT_SYMENT 11 /* Size of each symbol table entry. */ -#define DT_INIT 12 /* Address of initialization function. */ -#define DT_FINI 13 /* Address of finalization function. */ -#define DT_SONAME 14 /* String table offset of shared object - name. */ -#define DT_RPATH 15 /* String table offset of library path. */ -#define DT_SYMBOLIC 16 /* Indicates "symbolic" linking. */ -#define DT_REL 17 /* Address of ElfNN_Rel relocations. */ -#define DT_RELSZ 18 /* Total size of ElfNN_Rel relocations. */ -#define DT_RELENT 19 /* Size of each ElfNN_Rel relocation. */ -#define DT_PLTREL 20 /* Type of relocation used for PLT. */ -#define DT_DEBUG 21 /* Reserved (not used). */ -#define DT_TEXTREL 22 /* Indicates there may be relocations in - non-writable segments. */ -#define DT_JMPREL 23 /* Address of PLT relocations. */ - -#define DT_COUNT 24 /* Number of defined d_tag values. */ - -#define R_IA64_NONE 0 /* None */ -#define R_IA64_DIR64MSB 0x26 /* word64 MSB S + A */ -#define R_IA64_DIR64LSB 0x27 /* word64 LSB S + A */ -#define R_IA64_FPTR64MSB 0x46 /* word64 MSB @fptr(S + A) */ -#define R_IA64_FPTR64LSB 0x47 /* word64 LSB @fptr(S + A) */ -#define R_IA64_REL64MSB 0x6e /* word64 MSB BD + A */ -#define R_IA64_REL32LSB 0x6d /* word32 LSB BD + A */ -#define R_IA64_REL64LSB 0x6f /* word64 LSB BD + A */ -#define R_IA64_IPLTLSB 0x81 /* function descriptor LSB speciaal */ - -ENTRY(_start, 2) - alloc loc0=ar.pfs,2,3,3,0 - mov loc1=rp - movl loc2=@gprel(ImageBase) - ;; - add loc2=gp,loc2 - ;; - mov out0=loc2 - mov out1=in1 - ;; - br.call.sptk.few rp=_reloc // relocate image - - cmp.ne p6,p0=EFI_SUCCESS,r8 // did it work? -(p6) br.cond.dpnt.few 9f - - mov out0=in0 // image_handle - mov out1=in1 // system_table - br.call.sptk.few rp=efi_main -9: - mov ar.pfs=loc0 - mov rp=loc1 - ;; - br.ret.sptk.few rp -END(_start) - - // PLABEL for PE32+ - .section .plabel, "a" - .align 16 - .global _start_plabel -_start_plabel: - data16 @iplt(_start) - .previous - - // A PE32+ relocation entry for the plabel - .section .reloc, "a" - data4 _start_plabel - data4 12 - data2 (10 << 12) + 0 - data2 (10 << 12) + 8 - .previous - -// in0: image base -// in1: system table -// -// XXX Assumes PLT relocations are of type Elf_Rela -// -// r2 = address of fptr_storage -// r3 = address of fptr_storage_end -// r4 = address of first free fptr -// -// r15 = r_offset -// r16 = r_info -OR- d_tag -// r17 = r_addend -OR- d_val (=d_ptr) -// r18 = address of .rela dynamic section -// r19 = size of .rela section -// r20 = size of .rela element (Elf_Rela) -// r21 = address of first PLT relocation -// r22 = size of PLT relocations -// r23 = relocation type -// r24 = address of symbol -// r28 = R_IA64_IPLTLSB -// f8 = address of symbol table -// f9 = size of symtab element - -STATIC_ENTRY(_reloc, 2) - alloc loc0=ar.pfs,2,2,0,0 - ;; - mov loc1=rp - movl r29=@gprel(_DYNAMIC) // find _DYNAMIC etc. - ;; - add r15=r29,gp - movl r29=@gprel(fptr_storage) - ;; - add r2=r29,gp - movl r29=@gprel(fptr_storage_end) - ;; - add r3=r29,gp - mov r4=r2 - mov r19=0 - mov r22=0 - mov r20=24 - mov r28=R_IA64_IPLTLSB - ;; -1: - ld8 r16=[r15],8 // read r15->d_tag - ;; - ld8 r17=[r15],8 // and r15->d_val - ;; - cmp.eq p6,p0=DT_NULL,r16 // done? -(p6) br.cond.dpnt.few 2f - ;; - cmp.eq p6,p0=DT_RELA,r16 // rela section? - ;; -(p6) add r18=r17,in0 - cmp.eq p6,p0=DT_RELASZ,r16 // rela section size? - ;; -(p6) mov r19=r17 - cmp.eq p6,p0=DT_RELAENT,r16 // rela entry size? - ;; -(p6) mov r20=r17 - cmp.eq p6,p0=DT_JMPREL,r16 // PLT relocs? - ;; -(p6) add r21=r17,in0 - cmp.eq p6,p0=DT_PLTRELSZ,r16 // PLT relocs size? - ;; -(p6) mov r22=r17 - cmp.eq p6,p0=DT_SYMTAB,r16 // symbol table? - ;; -(p6) add r29=r17,in0 - ;; -(p6) setf.sig f8=r29 - cmp.eq p6,p0=DT_SYMENT,r16 // symbol entry size? - ;; -(p6) setf.sig f9=r17 - br.dptk 1b - -2: - cmp.lt p6,p0=0,r19 -(p6) br.cond.dptk 3f - ;; - mov r19=r22 - mov r18=r21 - mov r21=0 - mov r22=0 - ;; - cmp.lt p6,p0=0,r19 -(p6) br.cond.dptk 3f - ;; - mov r8=EFI_SUCCESS - br.dptk 9f -3: - ld8 r29=[r18],8 // read r_offset - ;; - ld8 r16=[r18],8 // read r_info - add r15=r29,in0 // relocate r_offset - ;; - ld8 r17=[r18],8 // read r_addend - sub r19=r19,r20 // update relasz - extr.u r23=r16,0,32 // ELF64_R_TYPE(r16) - ;; - cmp.eq p6,p0=R_IA64_NONE,r23 -(p6) br.cond.dpnt.few 2b - ;; - cmp.eq p6,p0=R_IA64_REL32LSB,r23 -(p6) br.cond.dptk.few 3f - ;; - cmp.eq p6,p0=R_IA64_REL64LSB,r23 -(p6) br.cond.dptk.few 4f - ;; - extr.u r29=r16,32,32 // ELF64_R_SYM(r16) - ;; - setf.sig f10=r29 // so we can multiply - ;; - xma.lu f10=f10,f9,f8 // f10=symtab + r_sym*syment - ;; - getf.sig r29=f10 - ;; - add r29=8,r29 // address of st_value - ;; - ld8 r29=[r29] // read symbol value - ;; - add r24=r29,in0 // relocate symbol value - ;; - cmp.eq p6,p0=R_IA64_DIR64LSB,r23 -(p6) br.cond.dptk.few 5f - ;; - cmp.eq p6,p0=R_IA64_FPTR64LSB,r23 -(p6) br.cond.dptk.few 6f - ;; - cmp.ne p6,p0=r28,r23 // IPLTLSB -(p6) br.cond.dptk.few 2b - - // IPLTLSB - add r29=r24,r17 // S + A - ;; - st8 [r15]=r29,8 // fdesc:FP - ;; - st8 [r15]=gp // fdesc:GP - br.cond.sptk.few 2b - - // REL32LSB -3: - add r29=in0,r17 - ;; - st4 [r15]=r29 - br.cond.sptk.few 2b - - // REL64LSB -4: - add r29=in0,r17 // BD + A - ;; - st8 [r15]=r29 // word64 - br.cond.sptk.few 2b - - // DIR64LSB -5: - add r29=r24,r17 // S + A - ;; - st8 [r15]=r29 // word64 - br.cond.sptk.few 2b - -6: - mov r29=r2 // FPTR64LSB - ;; -7: - cmp.geu p6,p0=r29,r4 // end of fptrs? -(p6) br.cond.dpnt.few 8f // can't find existing fptr - ld8 r17=[r29] // read function from fptr - ;; - cmp.eq p6,p0=r24,r17 // same function? - ;; -(p6) st8 [r15]=r29 // reuse fptr -(p6) br.cond.sptk.few 2b // done - add r29=16,r29 // next fptr - br.sptk.few 7b -8: - mov r8=EFI_BUFFER_TOO_SMALL // failure return value - cmp.geu p6,p0=r4,r3 // space left? -(p6) br.cond.dpnt.few 9f // bail out - st8 [r15]=r4 // install fptr - ;; - st8 [r4]=r24,8 // write fptr address - ;; - st8 [r4]=gp,8 // write fptr gp - br.cond.sptk.few 2b - -9: - mov ar.pfs=loc0 - mov rp=loc1 - ;; - br.ret.sptk.few rp -END(_reloc) - - .data - .align 16 -fptr_storage: - .space 1024*16 // XXX -fptr_storage_end: diff --git a/sys/boot/efi/loader/Makefile b/sys/boot/efi/loader/Makefile deleted file mode 100644 index d08c84b..0000000 --- a/sys/boot/efi/loader/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# $FreeBSD$ - -PROG= loader.sym -INTERNALPROG= -NOMAN= -NEWVERSWHAT= "EFI boot" ${MACHINE_ARCH} - -SRCS= start.S main.c conf.c dev_net.c vers.c - -.PATH: ${.CURDIR}/../libefi/arch/${MACHINE_ARCH} - -.if !defined(NOFORTH) -# Enable BootForth -BOOT_FORTH= yes -CFLAGS+= -DBOOT_FORTH -CFLAGS+= -I${.CURDIR}/../../ficl -I${.CURDIR}/../../ficl/${MACHINE_ARCH} -LIBFICL= ${.OBJDIR}/../../ficl/libficl.a -.endif - -LIBEFI= ${.OBJDIR}/../libefi/libefi.a - -# Always add MI sources -.PATH: ${.CURDIR}/../../common -.include "${.CURDIR}/../../common/Makefile.inc" - -CFLAGS+= -I${.CURDIR}/../include -CFLAGS+= -I${.CURDIR}/../include/${MACHINE_ARCH} -CFLAGS+= -I${.CURDIR}/../../common -CFLAGS+= -I${.CURDIR}/../libefi -CFLAGS+= -I${.CURDIR}/../../../../lib/libstand -CFLAGS+= -DLOADER - -LDSCRIPT= ${.CURDIR}/../libefi/arch/${MACHINE_ARCH}/ldscript.${MACHINE_ARCH} -LDFLAGS= -Wl,-T${LDSCRIPT} -shared -symbolic -OBJCOPY?= objcopy - -CLEANFILES= vers.c loader.efi loader.help - -vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version - sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT} - -loader.efi: loader.sym - ${OBJCOPY} -j .text \ - -j .data \ - -j .sdata \ - -j .dynamic \ - -j .rela.dyn \ - -j .reloc \ - -j .hash \ - -j .dynsym \ - -j .dynstr \ - --target=efi-app-${MACHINE_ARCH} \ - loader.sym loader.efi - -loader.help: help.common - cat ${.ALLSRC} | awk -f ${.CURDIR}/../../common/merge_help.awk \ - > ${.TARGET} - -.PATH: ${.CURDIR}/../../forth -FILES= loader.efi loader.help loader.4th support.4th loader.conf -FILESMODE_loader.efi= ${BINMODE} -FILESDIR_loader.conf= /boot/defaults - -.if !exists(${DESTDIR}/boot/loader.rc) -FILES+= loader.rc -.endif - -DPADD= ${LIBFICL} ${LIBEFI} ${LIBSTAND} -LDADD= ${LIBFICL} ${LIBEFI} -lstand - -.include <bsd.prog.mk> diff --git a/sys/boot/efi/loader/conf.c b/sys/boot/efi/loader/conf.c deleted file mode 100644 index 145b16b..0000000 --- a/sys/boot/efi/loader/conf.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 1997 - * Matthias Drochner. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed for the NetBSD Project - * by Matthias Drochner. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 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. - * - * $NetBSD: conf.c,v 1.2 1997/03/22 09:03:29 thorpej Exp $ - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <stand.h> -#include <efi.h> -#include <efilib.h> - -#include "efiboot.h" - -/* - * We could use linker sets for some or all of these, but - * then we would have to control what ended up linked into - * the bootstrap. So it's easier to conditionalise things - * here. - * - * XXX rename these arrays to be consistent and less namespace-hostile - */ - -/* Exported for libstand */ -struct devsw *devsw[] = { - &efifs_dev, - &netdev, - NULL -}; - -struct fs_ops *file_system[] = { - &efi_fsops, -/* &ufs_fsops, */ - &nfs_fsops, - &gzipfs_fsops, - NULL -}; - -struct netif_driver *netif_drivers[] = { - &efi_net, - NULL, -}; - -/* Exported for ia64 only */ -/* - * Sort formats so that those that can detect based on arguments - * rather than reading the file go first. - */ -extern struct file_format ia64_elf; - -struct file_format *file_formats[] = { - &ia64_elf, - NULL -}; - -/* - * Consoles - * - * We don't prototype these in efiboot.h because they require - * data structures from bootstrap.h as well. - */ -extern struct console efi_console; - -struct console *consoles[] = { - &efi_console, - NULL -}; diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c deleted file mode 100644 index 69b6387..0000000 --- a/sys/boot/efi/loader/main.c +++ /dev/null @@ -1,558 +0,0 @@ -/*- - * Copyright (c) 1998 Michael Smith <msmith@freebsd.org> - * Copyright (c) 1998,2000 Doug Rabson <dfr@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 <string.h> -#include <setjmp.h> -#include <machine/sal.h> -#include <machine/pal.h> -#include <machine/pte.h> -#include <machine/dig64.h> - -#include <efi.h> -#include <efilib.h> - -#include "bootstrap.h" -#include "efiboot.h" - -extern char bootprog_name[]; -extern char bootprog_rev[]; -extern char bootprog_date[]; -extern char bootprog_maker[]; - -struct efi_devdesc currdev; /* our current device */ -struct arch_switch archsw; /* MI/MD interface boundary */ - -extern u_int64_t ia64_pal_entry; - -EFI_GUID acpi = ACPI_TABLE_GUID; -EFI_GUID acpi20 = ACPI_20_TABLE_GUID; -EFI_GUID devid = DEVICE_PATH_PROTOCOL; -EFI_GUID hcdp = HCDP_TABLE_GUID; -EFI_GUID imgid = LOADED_IMAGE_PROTOCOL; -EFI_GUID mps = MPS_TABLE_GUID; -EFI_GUID netid = EFI_SIMPLE_NETWORK_PROTOCOL; -EFI_GUID sal = SAL_SYSTEM_TABLE_GUID; -EFI_GUID smbios = SMBIOS_TABLE_GUID; - -static void -find_pal_proc(void) -{ - int i; - struct sal_system_table *saltab = 0; - static int sizes[6] = { - 48, 32, 16, 32, 16, 16 - }; - u_int8_t *p; - - saltab = efi_get_table(&sal); - if (saltab == NULL) { - printf("Can't find SAL System Table\n"); - return; - } - - if (memcmp(saltab->sal_signature, "SST_", 4)) { - printf("Bad signature for SAL System Table\n"); - return; - } - - p = (u_int8_t *) (saltab + 1); - for (i = 0; i < saltab->sal_entry_count; i++) { - if (*p == 0) { - struct sal_entrypoint_descriptor *dp; - dp = (struct sal_entrypoint_descriptor *) p; - ia64_pal_entry = dp->sale_pal_proc; - return; - } - p += sizes[*p]; - } - - printf("Can't find PAL proc\n"); - return; -} - -EFI_STATUS -main(int argc, CHAR16 *argv[]) -{ - EFI_LOADED_IMAGE *img; - int i; - - /* - * 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(); - - /* - * Initialise the block cache - */ - bcache_init(32, 512); /* 16k XXX tune this */ - - find_pal_proc(); - - /* - * 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)(); - - efinet_init_driver(); - - /* Get our loaded image protocol interface structure. */ - BS->HandleProtocol(IH, &imgid, (VOID**)&img); - - printf("Image base: 0x%016lx\n", (u_long)img->ImageBase); - - printf("\n"); - printf("%s, Revision %s\n", bootprog_name, bootprog_rev); - printf("(%s, %s)\n", bootprog_maker, bootprog_date); - - i = efifs_get_unit(img->DeviceHandle); - if (i >= 0) { - currdev.d_dev = devsw[0]; /* XXX disk */ - currdev.d_kind.efidisk.unit = i; - /* XXX should be able to detect this, default to autoprobe */ - currdev.d_kind.efidisk.slice = -1; - currdev.d_kind.efidisk.partition = 0; - } else { - currdev.d_dev = devsw[1]; /* XXX net */ - currdev.d_kind.netif.unit = 0; /* XXX */ - } - 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; - - interact(); /* doesn't return */ - - return (EFI_SUCCESS); /* keep compiler happy */ -} - -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); - 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 "); - if (p->Attribute & EFI_MEMORY_RUNTIME) - printf("RUNTIME"); - 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; - - printf("NumberOfTableEntries=%ld\n", 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, &sal, sizeof(EFI_GUID))) - printf("SAL System Table"); - else if (!memcmp(guid, &hcdp, sizeof(EFI_GUID))) - printf("DIG64 HCDP Table"); - else - printf("Unknown Table (%s)", guid_to_string(guid)); - printf(" at %p\n", ST->ConfigurationTable[i].VendorTable); - } - - return CMD_OK; -} - -COMMAND_SET(sal, "sal", "print SAL System Table", command_sal); - -static int -command_sal(int argc, char *argv[]) -{ - int i; - struct sal_system_table *saltab = 0; - static int sizes[6] = { - 48, 32, 16, 32, 16, 16 - }; - u_int8_t *p; - - saltab = efi_get_table(&sal); - if (saltab == NULL) { - printf("Can't find SAL System Table\n"); - return CMD_ERROR; - } - - if (memcmp(saltab->sal_signature, "SST_", 4)) { - printf("Bad signature for SAL System Table\n"); - return CMD_ERROR; - } - - printf("SAL Revision %x.%02x\n", - saltab->sal_rev[1], - saltab->sal_rev[0]); - printf("SAL A Version %x.%02x\n", - saltab->sal_a_version[1], - saltab->sal_a_version[0]); - printf("SAL B Version %x.%02x\n", - saltab->sal_b_version[1], - saltab->sal_b_version[0]); - - p = (u_int8_t *) (saltab + 1); - for (i = 0; i < saltab->sal_entry_count; i++) { - printf(" Desc %d", *p); - if (*p == 0) { - struct sal_entrypoint_descriptor *dp; - dp = (struct sal_entrypoint_descriptor *) p; - printf("\n"); - printf(" PAL Proc at 0x%lx\n", - dp->sale_pal_proc); - printf(" SAL Proc at 0x%lx\n", - dp->sale_sal_proc); - printf(" SAL GP at 0x%lx\n", - dp->sale_sal_gp); - } else if (*p == 1) { - struct sal_memory_descriptor *dp; - dp = (struct sal_memory_descriptor *) p; - printf(" Type %d.%d, ", - dp->sale_memory_type[0], - dp->sale_memory_type[1]); - printf("Address 0x%lx, ", - dp->sale_physical_address); - printf("Length 0x%x\n", - dp->sale_length); - } else if (*p == 5) { - struct sal_ap_wakeup_descriptor *dp; - dp = (struct sal_ap_wakeup_descriptor *) p; - printf("\n"); - printf(" Mechanism %d\n", dp->sale_mechanism); - printf(" Vector 0x%lx\n", dp->sale_vector); - } else - printf("\n"); - - p += sizes[*p]; - } - - return CMD_OK; -} - -int -print_trs(int type) -{ - struct ia64_pal_result res; - int i, maxtr; - struct { - pt_entry_t pte; - uint64_t itir; - uint64_t ifa; - struct ia64_rr rr; - } buf; - static const char *psnames[] = { - "1B", "2B", "4B", "8B", - "16B", "32B", "64B", "128B", - "256B", "512B", "1K", "2K", - "4K", "8K", "16K", "32K", - "64K", "128K", "256K", "512K", - "1M", "2M", "4M", "8M", - "16M", "32M", "64M", "128M", - "256M", "512M", "1G", "2G" - }; - static const char *manames[] = { - "WB", "bad", "bad", "bad", - "UC", "UCE", "WC", "NaT", - }; - - res = ia64_call_pal_static(PAL_VM_SUMMARY, 0, 0, 0); - if (res.pal_status != 0) { - printf("Can't get VM summary\n"); - return CMD_ERROR; - } - - if (type == 0) - maxtr = (res.pal_result[0] >> 40) & 0xff; - else - maxtr = (res.pal_result[0] >> 32) & 0xff; - - printf("%d translation registers\n", maxtr); - - pager_open(); - pager_output("TR# RID Virtual Page Physical Page PgSz ED AR PL D A MA P KEY\n"); - for (i = 0; i <= maxtr; i++) { - char lbuf[128]; - - bzero(&buf, sizeof(buf)); - res = ia64_call_pal_stacked(PAL_VM_TR_READ, i, type, - (u_int64_t) &buf); - if (res.pal_status != 0) - break; - - /* Only display valid translations */ - if ((buf.ifa & 1) == 0) - continue; - - if (!(res.pal_result[0] & 1)) - buf.pte &= ~PTE_AR_MASK; - if (!(res.pal_result[0] & 2)) - buf.pte &= ~PTE_PL_MASK; - if (!(res.pal_result[0] & 4)) - buf.pte &= ~PTE_DIRTY; - if (!(res.pal_result[0] & 8)) - buf.pte &= ~PTE_MA_MASK; - sprintf(lbuf, "%03d %06x %013lx %013lx %4s %d %d %d %d %d " - "%-3s %d %06x\n", i, buf.rr.rr_rid, buf.ifa >> 12, - (buf.pte & PTE_PPN_MASK) >> 12, - psnames[(buf.itir & ITIR_PS_MASK) >> 2], - (buf.pte & PTE_ED) ? 1 : 0, - (int)(buf.pte & PTE_AR_MASK) >> 9, - (int)(buf.pte & PTE_PL_MASK) >> 7, - (buf.pte & PTE_DIRTY) ? 1 : 0, - (buf.pte & PTE_ACCESSED) ? 1 : 0, - manames[(buf.pte & PTE_MA_MASK) >> 2], - (buf.pte & PTE_PRESENT) ? 1 : 0, - (int)((buf.itir & ITIR_KEY_MASK) >> 8)); - pager_output(lbuf); - } - pager_close(); - - if (res.pal_status != 0) { - printf("Error while getting TR contents\n"); - return CMD_ERROR; - } - return CMD_OK; -} - -COMMAND_SET(itr, "itr", "print instruction TRs", command_itr); - -static int -command_itr(int argc, char *argv[]) -{ - return print_trs(0); -} - -COMMAND_SET(dtr, "dtr", "print data TRs", command_dtr); - -static int -command_dtr(int argc, char *argv[]) -{ - return print_trs(1); -} - -COMMAND_SET(hcdp, "hcdp", "Dump HCDP info", command_hcdp); - -static char * -hcdp_string(char *s, u_int len) -{ - static char buffer[256]; - - memcpy(buffer, s, len); - buffer[len] = 0; - return (buffer); -} - -static int -command_hcdp(int argc, char *argv[]) -{ - struct dig64_hcdp_table *tbl; - struct dig64_hcdp_entry *ent; - struct dig64_gas *gas; - int i; - - tbl = efi_get_table(&hcdp); - if (tbl == NULL) { - printf("No HCDP table present\n"); - return (CMD_OK); - } - if (memcmp(tbl->signature, HCDP_SIGNATURE, sizeof(tbl->signature))) { - printf("HCDP table has invalid signature\n"); - return (CMD_OK); - } - if (tbl->length < sizeof(*tbl) - sizeof(*tbl->entry)) { - printf("HCDP table too short\n"); - return (CMD_OK); - } - printf("HCDP table at 0x%016lx\n", (u_long)tbl); - printf("Signature = %s\n", hcdp_string(tbl->signature, 4)); - printf("Length = %u\n", tbl->length); - printf("Revision = %u\n", tbl->revision); - printf("Checksum = %u\n", tbl->checksum); - printf("OEM Id = %s\n", hcdp_string(tbl->oem_id, 6)); - printf("Table Id = %s\n", hcdp_string(tbl->oem_tbl_id, 8)); - printf("OEM rev = %u\n", tbl->oem_rev); - printf("Creator Id = %s\n", hcdp_string(tbl->creator_id, 4)); - printf("Creator rev= %u\n", tbl->creator_rev); - printf("Entries = %u\n", tbl->entries); - for (i = 0; i < tbl->entries; i++) { - ent = tbl->entry + i; - printf("Entry #%d:\n", i + 1); - printf(" Type = %u\n", ent->type); - printf(" Databits = %u\n", ent->databits); - printf(" Parity = %u\n", ent->parity); - printf(" Stopbits = %u\n", ent->stopbits); - printf(" PCI seg = %u\n", ent->pci_segment); - printf(" PCI bus = %u\n", ent->pci_bus); - printf(" PCI dev = %u\n", ent->pci_device); - printf(" PCI func = %u\n", ent->pci_function); - printf(" Interrupt = %u\n", ent->interrupt); - printf(" PCI flag = %u\n", ent->pci_flag); - printf(" Baudrate = %lu\n", - ((u_long)ent->baud_high << 32) + (u_long)ent->baud_low); - gas = &ent->address; - printf(" Addr space= %u\n", gas->addr_space); - printf(" Bit width = %u\n", gas->bit_width); - printf(" Bit offset= %u\n", gas->bit_offset); - printf(" Address = 0x%016lx\n", - ((u_long)gas->addr_high << 32) + (u_long)gas->addr_low); - printf(" PCI type = %u\n", ent->pci_devid); - printf(" PCI vndr = %u\n", ent->pci_vendor); - printf(" IRQ = %u\n", ent->irq); - printf(" PClock = %u\n", ent->pclock); - printf(" PCI iface = %u\n", ent->pci_interface); - } - printf("<EOT>\n"); - return (CMD_OK); -} diff --git a/sys/boot/efi/loader/version b/sys/boot/efi/loader/version deleted file mode 100644 index 71f9400..0000000 --- a/sys/boot/efi/loader/version +++ /dev/null @@ -1,16 +0,0 @@ -$FreeBSD$ - -NOTE ANY CHANGES YOU MAKE TO THE BOOTBLOCKS HERE. The format of this -file is important. Make sure the current version number is on line 6. - -1.1: Pass the HCDP table address to the kernel via bootinfo if one - is present in the EFI system table. -1.0: Don't map the I/O port range. We expect the kernel to do it. It - was done in the loader as a debugging aid and not intended as a - service/feature. -0.3: Pass the physical address of the bootinfo block in register r8 - to the kernel. Continue to put it at the fixed address for now. -0.2: Much improved version. Significant is the support for passing - the FPSWA interface pointer to the kernel. -0.1: Initial EFI version, germinated from the NetBSD i386 - standalone, but enormously modified. |