This file was repocopied to src/sys/boot/ia64/efi.
This commit is contained in:
parent
cce83ffb5a
commit
21321a3432
@ -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) }
|
||||
}
|
@ -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:
|
@ -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>
|
@ -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
|
||||
};
|
@ -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);
|
||||
}
|
@ -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.
|
Loading…
x
Reference in New Issue
Block a user