From 88564abfe7f430e9783f4585e0b95e6d83f09bc3 Mon Sep 17 00:00:00 2001 From: kettenis Date: Thu, 27 Apr 2023 15:06:35 +0000 Subject: [PATCH] Remove efi32 and efi64. These are leftovers from a project that didn't go very far and the presence of these directories just confuse people and make them do more work than necessary. ok patrick@, kn@, mlarkin@ --- sys/arch/amd64/stand/efi32/Makefile | 9 - sys/arch/amd64/stand/efi32/Makefile.common | 79 -- sys/arch/amd64/stand/efi32/Makefile.inc | 3 - sys/arch/amd64/stand/efi32/bootia32/Makefile | 18 - sys/arch/amd64/stand/efi32/cmd_i386.c | 162 --- sys/arch/amd64/stand/efi32/conf.c | 95 -- sys/arch/amd64/stand/efi32/dev_i386.c | 207 ---- sys/arch/amd64/stand/efi32/diskprobe.c | 301 ----- sys/arch/amd64/stand/efi32/efiboot.c | 1027 ----------------- sys/arch/amd64/stand/efi32/efiboot.h | 41 - sys/arch/amd64/stand/efi32/eficall.S | 64 -- sys/arch/amd64/stand/efi32/eficall.h | 19 - sys/arch/amd64/stand/efi32/efidev.c | 793 -------------- sys/arch/amd64/stand/efi32/efidev.h | 38 - sys/arch/amd64/stand/efi32/efipxe.c | 306 ------ sys/arch/amd64/stand/efi32/efipxe.h | 21 - sys/arch/amd64/stand/efi32/efirng.c | 90 -- sys/arch/amd64/stand/efi32/exec_i386.c | 208 ---- sys/arch/amd64/stand/efi32/heap.h | 29 - sys/arch/amd64/stand/efi32/ldscript.i386 | 75 -- sys/arch/amd64/stand/efi32/machdep.c | 95 -- sys/arch/amd64/stand/efi32/memprobe.c | 173 --- sys/arch/amd64/stand/efi32/run_i386.S | 115 -- sys/arch/amd64/stand/efi32/run_i386.h | 21 - sys/arch/amd64/stand/efi32/self_reloc.c | 103 -- sys/arch/amd64/stand/efi32/start_i386.S | 68 -- sys/arch/amd64/stand/efi64/Makefile | 9 - sys/arch/amd64/stand/efi64/Makefile.common | 79 -- sys/arch/amd64/stand/efi64/Makefile.inc | 3 - sys/arch/amd64/stand/efi64/bootx64/Makefile | 14 - sys/arch/amd64/stand/efi64/cmd_i386.c | 162 --- sys/arch/amd64/stand/efi64/conf.c | 95 -- sys/arch/amd64/stand/efi64/dev_i386.c | 207 ---- sys/arch/amd64/stand/efi64/diskprobe.c | 301 ----- sys/arch/amd64/stand/efi64/efiboot.c | 1032 ------------------ sys/arch/amd64/stand/efi64/efiboot.h | 41 - sys/arch/amd64/stand/efi64/eficall.S | 64 -- sys/arch/amd64/stand/efi64/eficall.h | 48 - sys/arch/amd64/stand/efi64/efidev.c | 793 -------------- sys/arch/amd64/stand/efi64/efidev.h | 38 - sys/arch/amd64/stand/efi64/efipxe.c | 306 ------ sys/arch/amd64/stand/efi64/efipxe.h | 21 - sys/arch/amd64/stand/efi64/efirng.c | 90 -- sys/arch/amd64/stand/efi64/exec_i386.c | 207 ---- sys/arch/amd64/stand/efi64/heap.h | 29 - sys/arch/amd64/stand/efi64/ldscript.amd64 | 65 -- sys/arch/amd64/stand/efi64/machdep.c | 95 -- sys/arch/amd64/stand/efi64/memprobe.c | 173 --- sys/arch/amd64/stand/efi64/run_i386.S | 115 -- sys/arch/amd64/stand/efi64/run_i386.h | 21 - sys/arch/amd64/stand/efi64/self_reloc.c | 104 -- sys/arch/amd64/stand/efi64/start_amd64.S | 76 -- 52 files changed, 8348 deletions(-) delete mode 100644 sys/arch/amd64/stand/efi32/Makefile delete mode 100644 sys/arch/amd64/stand/efi32/Makefile.common delete mode 100644 sys/arch/amd64/stand/efi32/Makefile.inc delete mode 100644 sys/arch/amd64/stand/efi32/bootia32/Makefile delete mode 100644 sys/arch/amd64/stand/efi32/cmd_i386.c delete mode 100644 sys/arch/amd64/stand/efi32/conf.c delete mode 100644 sys/arch/amd64/stand/efi32/dev_i386.c delete mode 100644 sys/arch/amd64/stand/efi32/diskprobe.c delete mode 100644 sys/arch/amd64/stand/efi32/efiboot.c delete mode 100644 sys/arch/amd64/stand/efi32/efiboot.h delete mode 100644 sys/arch/amd64/stand/efi32/eficall.S delete mode 100644 sys/arch/amd64/stand/efi32/eficall.h delete mode 100644 sys/arch/amd64/stand/efi32/efidev.c delete mode 100644 sys/arch/amd64/stand/efi32/efidev.h delete mode 100644 sys/arch/amd64/stand/efi32/efipxe.c delete mode 100644 sys/arch/amd64/stand/efi32/efipxe.h delete mode 100644 sys/arch/amd64/stand/efi32/efirng.c delete mode 100644 sys/arch/amd64/stand/efi32/exec_i386.c delete mode 100644 sys/arch/amd64/stand/efi32/heap.h delete mode 100644 sys/arch/amd64/stand/efi32/ldscript.i386 delete mode 100644 sys/arch/amd64/stand/efi32/machdep.c delete mode 100644 sys/arch/amd64/stand/efi32/memprobe.c delete mode 100644 sys/arch/amd64/stand/efi32/run_i386.S delete mode 100644 sys/arch/amd64/stand/efi32/run_i386.h delete mode 100644 sys/arch/amd64/stand/efi32/self_reloc.c delete mode 100644 sys/arch/amd64/stand/efi32/start_i386.S delete mode 100644 sys/arch/amd64/stand/efi64/Makefile delete mode 100644 sys/arch/amd64/stand/efi64/Makefile.common delete mode 100644 sys/arch/amd64/stand/efi64/Makefile.inc delete mode 100644 sys/arch/amd64/stand/efi64/bootx64/Makefile delete mode 100644 sys/arch/amd64/stand/efi64/cmd_i386.c delete mode 100644 sys/arch/amd64/stand/efi64/conf.c delete mode 100644 sys/arch/amd64/stand/efi64/dev_i386.c delete mode 100644 sys/arch/amd64/stand/efi64/diskprobe.c delete mode 100644 sys/arch/amd64/stand/efi64/efiboot.c delete mode 100644 sys/arch/amd64/stand/efi64/efiboot.h delete mode 100644 sys/arch/amd64/stand/efi64/eficall.S delete mode 100644 sys/arch/amd64/stand/efi64/eficall.h delete mode 100644 sys/arch/amd64/stand/efi64/efidev.c delete mode 100644 sys/arch/amd64/stand/efi64/efidev.h delete mode 100644 sys/arch/amd64/stand/efi64/efipxe.c delete mode 100644 sys/arch/amd64/stand/efi64/efipxe.h delete mode 100644 sys/arch/amd64/stand/efi64/efirng.c delete mode 100644 sys/arch/amd64/stand/efi64/exec_i386.c delete mode 100644 sys/arch/amd64/stand/efi64/heap.h delete mode 100644 sys/arch/amd64/stand/efi64/ldscript.amd64 delete mode 100644 sys/arch/amd64/stand/efi64/machdep.c delete mode 100644 sys/arch/amd64/stand/efi64/memprobe.c delete mode 100644 sys/arch/amd64/stand/efi64/run_i386.S delete mode 100644 sys/arch/amd64/stand/efi64/run_i386.h delete mode 100644 sys/arch/amd64/stand/efi64/self_reloc.c delete mode 100644 sys/arch/amd64/stand/efi64/start_amd64.S diff --git a/sys/arch/amd64/stand/efi32/Makefile b/sys/arch/amd64/stand/efi32/Makefile deleted file mode 100644 index b0f146442fa..00000000000 --- a/sys/arch/amd64/stand/efi32/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ - -.if ${MACHINE} == "amd64" - -SUBDIR= bootia32 - -.endif - -.include diff --git a/sys/arch/amd64/stand/efi32/Makefile.common b/sys/arch/amd64/stand/efi32/Makefile.common deleted file mode 100644 index 6676e012d48..00000000000 --- a/sys/arch/amd64/stand/efi32/Makefile.common +++ /dev/null @@ -1,79 +0,0 @@ -# $OpenBSD: Makefile.common,v 1.5 2020/03/05 16:36:30 otto Exp $ - -S= ${.CURDIR}/../../../../.. -SADIR= ${.CURDIR}/../.. -EFIDIR= ${S}/stand/efi - -OBJCOPY?= objcopy -OBJDUMP?= objdump - -EFI_HEAP_LIMIT= 0xc00000 - -LDFLAGS+= -nostdlib -T${.CURDIR}/../${LDSCRIPT} -Bsymbolic -shared - -COPTS+= -DEFIBOOT -DFWRANDOM -DNEEDS_HEAP_H -I${.CURDIR}/.. -COPTS+= -I${EFIDIR}/include -I${S}/stand/boot -COPTS+= -ffreestanding -std=gnu99 -COPTS+= -fshort-wchar -fPIC -mno-red-zone -.if ${SOFTRAID:L} == "yes" -COPTS+= -DSOFTRAID -.endif -COPTS+= -D_STANDALONE -nostdinc -fno-builtin - -AFLAGS+= -pipe -fPIC - -.PATH: ${.CURDIR}/.. -SRCS+= self_reloc.c -SRCS+= efiboot.c efidev.c efipxe.c efirng.c -SRCS+= conf.c dev_i386.c cmd_i386.c diskprobe.c exec_i386.c machdep.c -SRCS+= memprobe.c - -.PATH: ${S}/stand/boot -SRCS+= boot.c bootarg.c cmd.c vars.c - -.PATH: ${S}/lib/libsa -SRCS+= alloc.c ctime.c exit.c getchar.c hexdump.c \ - memcmp.c memcpy.c memmove.c memset.c printf.c \ - putchar.c snprintf.c strcmp.c strerror.c strlen.c strncmp.c strncpy.c \ - strtol.c strtoll.c -SRCS+= close.c closeall.c cons.c cread.c dev.c disklabel.c dkcksum.c fchmod.c \ - fstat.c lseek.c open.c read.c readdir.c stat.c -SRCS+= ufs.c ufs2.c cd9660.c -.if ${SOFTRAID:L} == "yes" -SRCS+= aes_xts.c bcrypt_pbkdf.c blowfish.c explicit_bzero.c hmac_sha1.c \ - pkcs5_pbkdf2.c rijndael.c sha1.c sha2.c softraid.c -.endif - -.PATH: ${S}/lib/libz -SRCS+= adler32.c crc32.c inflate.c inftrees.c - -.PATH: ${S}/lib/libkern -SRCS+= divdi3.c moddi3.c qdivrem.c -SRCS+= strlcpy.c - -.PATH: ${SADIR}/libsa -SRCS+= loadfile.c arc4.c elf64.c elf32.c - -.if ${SOFTRAID:L} == "yes" -SRCS+= softraid_amd64.c -.endif - -PROG.so= ${PROG:S/.EFI/.so/} -CLEANFILES+= ${PROG.so} ${PROG.so}.tmp - -${PROG}: ${PROG.so} - ${OBJCOPY} -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ - -j .rel.dyn -j .rela -j .rela.dyn -j .reloc \ - --target=${OBJFMT} ${PROG.so} ${.TARGET} - -.include -CFLAGS+= -Wno-pointer-sign -CPPFLAGS+= -DSMALL -DSLOW -DNOBYFOUR -D__INTERNAL_LIBSA_CREAD -CPPFLAGS+= -DHEAP_LIMIT=${EFI_HEAP_LIMIT} -DHIBERNATE - -${PROG.so}: ${OBJS} - ${LD} ${LDFLAGS} -o ${.TARGET}.tmp ${OBJS} ${LDADD} - @if ${OBJDUMP} -t ${.TARGET}.tmp | grep 'UND'; then \ - (echo Undefined symbols; false); \ - fi - mv ${.TARGET}.tmp ${.TARGET} diff --git a/sys/arch/amd64/stand/efi32/Makefile.inc b/sys/arch/amd64/stand/efi32/Makefile.inc deleted file mode 100644 index 8b33a7be00c..00000000000 --- a/sys/arch/amd64/stand/efi32/Makefile.inc +++ /dev/null @@ -1,3 +0,0 @@ -# $OpenBSD: Makefile.inc,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ - -.include "${.CURDIR}/../../Makefile.inc" diff --git a/sys/arch/amd64/stand/efi32/bootia32/Makefile b/sys/arch/amd64/stand/efi32/bootia32/Makefile deleted file mode 100644 index 15fed1dfcc8..00000000000 --- a/sys/arch/amd64/stand/efi32/bootia32/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2020/06/14 16:00:11 deraadt Exp $ - -.include - -PROG= BOOTIA32.EFI -NOMAN= # -OBJFMT= efi-app-ia32 -SOFTRAID= yes -SRCS+= start_i386.S mdrandom.c -LDSCRIPT= ldscript.i386 - -COPTS= -I${EFIDIR}/include/i386 - -.include "${.CURDIR}/../Makefile.common" - -CFLAGS+= -m32 -AFLAGS+= -m32 -LDFLAGS+= -N diff --git a/sys/arch/amd64/stand/efi32/cmd_i386.c b/sys/arch/amd64/stand/efi32/cmd_i386.c deleted file mode 100644 index 460c618273c..00000000000 --- a/sys/arch/amd64/stand/efi32/cmd_i386.c +++ /dev/null @@ -1,162 +0,0 @@ -/* $OpenBSD: cmd_i386.c,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 1997-1999 Michael Shalayeff - * Copyright (c) 1997 Tobias Weingartner - * 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 REGENTS 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 -#include -#include -#include -#include "disk.h" -#include "biosdev.h" -#include "libsa.h" -#include - -#include "efiboot.h" -#include "efidev.h" - -extern const char version[]; - -int Xboot(void); -int Xcomaddr(void); -int Xdiskinfo(void); -int Xmemory(void); -int Xregs(void); - -/* From gidt.S */ -int bootbuf(void *, int); - -const struct cmd_table cmd_machine[] = { - { "comaddr", CMDT_CMD, Xcomaddr }, - { "diskinfo", CMDT_CMD, Xdiskinfo }, - { "memory", CMDT_CMD, Xmemory }, - { "video", CMDT_CMD, Xvideo_efi }, - { "gop", CMDT_CMD, Xgop_efi }, - { "exit", CMDT_CMD, Xexit_efi }, - { "poweroff", CMDT_CMD, Xpoweroff_efi }, -#ifdef DEBUG - { "regs", CMDT_CMD, Xregs }, -#endif - { NULL, 0 } -}; - -int -Xdiskinfo(void) -{ - efi_dump_diskinfo(); - return 0; -} - -#ifdef DEBUG -int -Xregs(void) -{ - DUMP_REGS; - return 0; -} -#endif - -int -Xmemory(void) -{ - if (cmd.argc >= 2) { - int i; - /* parse the memory specs */ - - for (i = 1; i < cmd.argc; i++) { - char *p; - long long addr, size; - - p = cmd.argv[i]; - - size = strtoll(p + 1, &p, 0); - /* Size the size */ - switch (*p) { - case 'G': - case 'g': - size *= 1024; - case 'M': - case 'm': - size *= 1024; - case 'K': - case 'k': - size *= 1024; - p++; - } - - /* Handle (possibly non-existent) address part */ - switch (*p) { - case '@': - addr = strtoll(p + 1, NULL, 0); - break; - - /* Adjust address if we don't need it */ - default: - if (cmd.argv[i][0] == '=') - addr = -1; - else - addr = 0; - } - - if (addr == 0 || size == 0) { - printf("bad language\n"); - return 0; - } else { - switch (cmd.argv[i][0]) { - case '-': - mem_delete(addr, addr + size); - break; - case '+': - mem_add(addr, addr + size); - break; - case '=': - mem_limit(size); - break; - default : - printf("bad OP\n"); - return 0; - } - } - } - } - - dump_biosmem(NULL); - - return 0; -} - -int -Xcomaddr(void) -{ - extern int com_addr; - - if (cmd.argc >= 2) - com_addr = (int)strtol(cmd.argv[1], NULL, 0); - - return 0; -} diff --git a/sys/arch/amd64/stand/efi32/conf.c b/sys/arch/amd64/stand/efi32/conf.c deleted file mode 100644 index 4ad1d083901..00000000000 --- a/sys/arch/amd64/stand/efi32/conf.c +++ /dev/null @@ -1,95 +0,0 @@ -/* $OpenBSD: conf.c,v 1.11 2022/08/12 20:18:58 stsp Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * 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 REGENTS 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 -#include -#include -#include -#include -#include -#include -#include - -#include "disk.h" -#include "efiboot.h" -#include "efidev.h" -#include "efipxe.h" - -const char version[] = "3.54"; - -#ifdef EFI_DEBUG -int debug = 0; -#endif - -void (*sa_cleanup)(void) = NULL; - - -void (*i386_probe1[])(void) = { - cninit, efi_memprobe -}; -void (*i386_probe2[])(void) = { - efi_pxeprobe, efi_diskprobe, diskprobe -}; - -struct i386_boot_probes probe_list[] = { - { "probing", i386_probe1, nitems(i386_probe1) }, - { "disk", i386_probe2, nitems(i386_probe2) } -}; -int nibprobes = nitems(probe_list); - - -struct fs_ops file_system[] = { - { tftp_open, tftp_close, tftp_read, tftp_write, tftp_seek, - tftp_stat, tftp_readdir }, - { ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, - ufs_stat, ufs_readdir, ufs_fchmod }, - { ufs2_open, ufs2_close, ufs2_read, ufs2_write, ufs2_seek, - ufs2_stat, ufs2_readdir, ufs2_fchmod }, - { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, - cd9660_stat, cd9660_readdir }, -#ifdef notdef - { fat_open, fat_close, fat_read, fat_write, fat_seek, - fat_stat, fat_readdir }, - { nfs_open, nfs_close, nfs_read, nfs_write, nfs_seek, - nfs_stat, nfs_readdir }, -#endif -}; -int nfsys = nitems(file_system); - -struct devsw devsw[] = { - { "TFTP", tftpstrategy, tftpopen, tftpclose, tftpioctl }, - { "EFI", efistrategy, efiopen, eficlose, efiioctl }, -}; -int ndevs = nitems(devsw); - -struct consdev constab[] = { - { efi_cons_probe, efi_cons_init, efi_cons_getc, efi_cons_putc }, - { efi_com_probe, efi_com_init, efi_com_getc, efi_com_putc }, - { NULL } -}; -struct consdev *cn_tab = constab; diff --git a/sys/arch/amd64/stand/efi32/dev_i386.c b/sys/arch/amd64/stand/efi32/dev_i386.c deleted file mode 100644 index 33ce6bf67d8..00000000000 --- a/sys/arch/amd64/stand/efi32/dev_i386.c +++ /dev/null @@ -1,207 +0,0 @@ -/* $OpenBSD: dev_i386.c,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 1996-1999 Michael Shalayeff - * 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 OR HIS RELATIVES 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 MIND, 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 -#include -#include -#include - -#include "libsa.h" -#include "biosdev.h" -#include "disk.h" - -#ifdef SOFTRAID -#include -#include -#include -#include "softraid_amd64.h" -#endif - -extern int debug; - -/* XXX use slot for 'rd' for 'hd' pseudo-device */ -const char bdevs[][4] = { - "wd", "", "fd", "", "sd", "st", "cd", "", - "", "", "", "", "", "", "", "", "", "hd", "" -}; -const int nbdevs = nitems(bdevs); - -const char cdevs[][4] = { - "cn", "", "", "", "", "", "", "", - "com", "", "", "", "pc" -}; -const int ncdevs = nitems(cdevs); - -/* pass dev_t to the open routines */ -int -devopen(struct open_file *f, const char *fname, char **file) -{ - struct devsw *dp = devsw; - register int i, rc = 1; - - *file = (char *)fname; - -#ifdef DEBUG - if (debug) - printf("devopen:"); -#endif - - for (i = 0; i < ndevs && rc != 0; dp++, i++) { -#ifdef DEBUG - if (debug) - printf(" %s: ", dp->dv_name); -#endif - if ((rc = (*dp->dv_open)(f, file)) == 0) { - f->f_dev = dp; - if (strcmp("TFTP", dp->dv_name) != 0) { - /* - * Clear bootmac, to signal that we loaded - * this file from a non-network device. - */ - extern char *bootmac; - bootmac = NULL; - } - return 0; - } -#ifdef DEBUG - else if (debug) - printf("%d", rc); -#endif - - } -#ifdef DEBUG - if (debug) - putchar('\n'); -#endif - - if ((f->f_flags & F_NODEV) == 0) - f->f_dev = dp; - - return rc; -} - -void -devboot(dev_t bootdev, char *p) -{ -#ifdef SOFTRAID - struct sr_boot_volume *bv; - struct sr_boot_chunk *bc; - struct diskinfo *dip = NULL; -#endif - int sr_boot_vol = -1; - int part_type = FS_UNUSED; - - if (!bootdev) { - *p++ = 't'; - *p++ = 'f'; - *p++ = 't'; - *p++ = 'p'; - *p = '\0'; - return; - } - -#ifdef SOFTRAID - /* - * Determine the partition type for the 'a' partition of the - * boot device. - */ - TAILQ_FOREACH(dip, &disklist, list) - if (dip->bios_info.bios_number == bootdev && - (dip->bios_info.flags & BDI_BADLABEL) == 0) - part_type = dip->disklabel.d_partitions[0].p_fstype; - - /* - * See if we booted from a disk that is a member of a bootable - * softraid volume. - */ - SLIST_FOREACH(bv, &sr_volumes, sbv_link) { - if (bv->sbv_flags & BIOC_SCBOOTABLE) - SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) - if (bc->sbc_disk == bootdev) - sr_boot_vol = bv->sbv_unit; - if (sr_boot_vol != -1) - break; - } -#endif - - if (sr_boot_vol != -1 && part_type != FS_BSDFFS) { - *p++ = 's'; - *p++ = 'r'; - *p++ = '0' + sr_boot_vol; - } else if (bootdev & 0x100) { - *p++ = 'c'; - *p++ = 'd'; - *p++ = '0'; - } else { - if (bootdev & 0x80) - *p++ = 'h'; - else - *p++ = 'f'; - *p++ = 'd'; - *p++ = '0' + (bootdev & 0x7f); - } - *p++ = 'a'; - *p = '\0'; -} - -char ttyname_buf[8]; - -char * -ttyname(int fd) -{ - snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d", - cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev)); - - return ttyname_buf; -} - -dev_t -ttydev(char *name) -{ - int i, unit = -1; - char *no = name + strlen(name) - 1; - - while (no >= name && *no >= '0' && *no <= '9') - unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0'; - if (no < name || unit < 0) - return NODEV; - for (i = 0; i < ncdevs; i++) - if (strncmp(name, cdevs[i], no - name + 1) == 0) - return makedev(i, unit); - return NODEV; -} - -int -cnspeed(dev_t dev, int sp) -{ - if (major(dev) == 8) /* comN */ - return comspeed(dev, sp); - - /* pc0 and anything else */ - return 9600; -} diff --git a/sys/arch/amd64/stand/efi32/diskprobe.c b/sys/arch/amd64/stand/efi32/diskprobe.c deleted file mode 100644 index 48f089c296f..00000000000 --- a/sys/arch/amd64/stand/efi32/diskprobe.c +++ /dev/null @@ -1,301 +0,0 @@ -/* $OpenBSD: diskprobe.c,v 1.2 2020/12/09 18:10:18 krw Exp $ */ - -/* - * Copyright (c) 1997 Tobias Weingartner - * 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 REGENTS 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. - * - */ - -/* We want the disk type names from disklabel.h */ -#undef DKTYPENAMES - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "disk.h" -#include "biosdev.h" -#include "libsa.h" - -#ifdef SOFTRAID -#include "softraid_amd64.h" -#endif -#include "efidev.h" - -#define MAX_CKSUMLEN MAXBSIZE / DEV_BSIZE /* Max # of blks to cksum */ - -/* Local Prototypes */ -static int disksum(int); - -int bootdev_has_hibernate(void); /* export for loadfile() */ - -/* List of disk devices we found/probed */ -struct disklist_lh disklist; - -/* Pointer to boot device */ -struct diskinfo *bootdev_dip; - -extern int debug; -extern int bios_bootdev; -extern int bios_cddev; - -static void -efi_hardprobe(void) -{ - int n; - struct diskinfo *dip, *dipt; - u_int bsdunit, type = 0; - u_int scsi= 0, ide = 0, atapi = 0; - extern struct disklist_lh - efi_disklist; - - n = 0; - TAILQ_FOREACH_SAFE(dip, &efi_disklist, list, dipt) { - TAILQ_REMOVE(&efi_disklist, dip, list); - n = scsi + ide; - - /* Try to find the label, to figure out device type */ - if ((efi_getdisklabel(dip->efi_info, &dip->disklabel))) { - type = 0; - printf(" hd%d*", n); - bsdunit = ide++; - } else { - /* Best guess */ - switch (dip->disklabel.d_type) { - case DTYPE_SCSI: - type = 4; - bsdunit = scsi++; - dip->bios_info.flags |= BDI_GOODLABEL; - break; - - case DTYPE_ESDI: - case DTYPE_ST506: - type = 0; - bsdunit = ide++; - dip->bios_info.flags |= BDI_GOODLABEL; - break; - - case DTYPE_ATAPI: - type = 6; - n = atapi; - bsdunit = atapi++; - dip->bios_info.flags |= BDI_GOODLABEL - | BDI_EL_TORITO; - break; - - default: - dip->bios_info.flags |= BDI_BADLABEL; - type = 0; /* XXX Suggest IDE */ - bsdunit = ide++; - } - printf(" %cd%d", (type == 6)? 'c' : 'h', n); - } - if (type != 6) - dip->bios_info.bios_number = 0x80 | n; - else - dip->bios_info.bios_number = 0xe0 | n; - - dip->bios_info.checksum = 0; /* just in case */ - /* Fill out best we can */ - dip->bsddev = dip->bios_info.bsd_dev = - MAKEBOOTDEV(type, 0, 0, bsdunit, RAW_PART); - check_hibernate(dip); - - /* Add to queue of disks */ - TAILQ_INSERT_TAIL(&disklist, dip, list); - n++; - } -} - -/* Probe for all BIOS supported disks */ -u_int32_t bios_cksumlen; -void -diskprobe(void) -{ - struct diskinfo *dip; - int i; - - /* These get passed to kernel */ - bios_diskinfo_t *bios_diskinfo; - - /* Init stuff */ - TAILQ_INIT(&disklist); - - efi_hardprobe(); - -#ifdef SOFTRAID - srprobe(); -#endif - - /* Checksumming of hard disks */ - for (i = 0; disksum(i++) && i < MAX_CKSUMLEN; ) - ; - bios_cksumlen = i; - - /* Get space for passing bios_diskinfo stuff to kernel */ - for (i = 0, dip = TAILQ_FIRST(&disklist); dip; - dip = TAILQ_NEXT(dip, list)) - i++; - bios_diskinfo = alloc(++i * sizeof(bios_diskinfo_t)); - - /* Copy out the bios_diskinfo stuff */ - for (i = 0, dip = TAILQ_FIRST(&disklist); dip; - dip = TAILQ_NEXT(dip, list)) - bios_diskinfo[i++] = dip->bios_info; - - bios_diskinfo[i++].bios_number = -1; - /* Register for kernel use */ - addbootarg(BOOTARG_CKSUMLEN, sizeof(u_int32_t), &bios_cksumlen); - addbootarg(BOOTARG_DISKINFO, i * sizeof(bios_diskinfo_t), - bios_diskinfo); -} - -/* Find info on given BIOS disk */ -struct diskinfo * -dklookup(int dev) -{ - struct diskinfo *dip; - - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) - if (dip->bios_info.bios_number == dev) - return dip; - - return NULL; -} - -void -dump_diskinfo(void) -{ - struct diskinfo *dip; - - printf("Disk\tBIOS#\tType\tCyls\tHeads\tSecs\tFlags\tChecksum\n"); - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) { - bios_diskinfo_t *bdi = &dip->bios_info; - int d = bdi->bios_number; - int u = d & 0x7f; - char c; - - if (bdi->flags & BDI_EL_TORITO) { - c = 'c'; - u = 0; - } else { - c = (d & 0x80) ? 'h' : 'f'; - } - - printf("%cd%d\t0x%x\t%s\t%d\t%d\t%d\t0x%x\t0x%x\n", - c, u, d, - (bdi->flags & BDI_BADLABEL)?"*none*":"label", - bdi->bios_cylinders, bdi->bios_heads, bdi->bios_sectors, - bdi->flags, bdi->checksum); - } -} - -/* Find BIOS portion on given BIOS disk - * XXX - Use dklookup() instead. - */ -bios_diskinfo_t * -bios_dklookup(int dev) -{ - struct diskinfo *dip; - - dip = dklookup(dev); - if (dip) - return &dip->bios_info; - - return NULL; -} - -/* - * Checksum one more block on all harddrives - * - * Use the adler32() function from libz, - * as it is quick, small, and available. - */ -int -disksum(int blk) -{ - struct diskinfo *dip, *dip2; - int st, reprobe = 0; - char buf[DEV_BSIZE]; - - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) { - bios_diskinfo_t *bdi = &dip->bios_info; - - /* Skip this disk if it is not a HD or has had an I/O error */ - if (!(bdi->bios_number & 0x80) || bdi->flags & BDI_INVALID) - continue; - - /* Adler32 checksum */ - st = dip->diskio(F_READ, dip, blk, 1, buf); - if (st) { - bdi->flags |= BDI_INVALID; - continue; - } - bdi->checksum = adler32(bdi->checksum, buf, DEV_BSIZE); - - for (dip2 = TAILQ_FIRST(&disklist); dip2 != dip; - dip2 = TAILQ_NEXT(dip2, list)) { - bios_diskinfo_t *bd = &dip2->bios_info; - if ((bd->bios_number & 0x80) && - !(bd->flags & BDI_INVALID) && - bdi->checksum == bd->checksum) - reprobe = 1; - } - } - - return reprobe; -} - -int -bootdev_has_hibernate(void) -{ - return ((bootdev_dip->bios_info.flags & BDI_HIBVALID)? 1 : 0); -} - -void -check_hibernate(struct diskinfo *dip) -{ - daddr_t sec; - int error; - union hibernate_info hib; - - /* read hibernate */ - if (dip->disklabel.d_partitions[1].p_fstype != FS_SWAP || - DL_GETPSIZE(&dip->disklabel.d_partitions[1]) == 0) - return; - - sec = DL_GETPOFFSET(&dip->disklabel.d_partitions[1]) + - DL_GETPSIZE(&dip->disklabel.d_partitions[1]) - - (sizeof(union hibernate_info) / DEV_BSIZE); - - error = dip->strategy(dip, F_READ, sec, sizeof hib, &hib, NULL); - if (error == 0 && hib.magic == HIBERNATE_MAGIC) - dip->bios_info.flags |= BDI_HIBVALID; /* Hibernate present */ -} diff --git a/sys/arch/amd64/stand/efi32/efiboot.c b/sys/arch/amd64/stand/efi32/efiboot.c deleted file mode 100644 index abfb642a197..00000000000 --- a/sys/arch/amd64/stand/efi32/efiboot.c +++ /dev/null @@ -1,1027 +0,0 @@ -/* $OpenBSD: efiboot.c,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libsa.h" -#include "disk.h" - -#include -#include -#include -#include - -#include "efidev.h" -#include "efiboot.h" -#include "eficall.h" -#include "run_i386.h" - -#define KERN_LOADSPACE_SIZE (32 * 1024 * 1024) - -EFI_SYSTEM_TABLE *ST; -EFI_BOOT_SERVICES *BS; -EFI_RUNTIME_SERVICES *RS; -EFI_HANDLE IH; -EFI_DEVICE_PATH *efi_bootdp = NULL; -EFI_PHYSICAL_ADDRESS heap; -EFI_LOADED_IMAGE *loadedImage; -UINTN heapsiz = 1 * 1024 * 1024; -UINTN mmap_key; -static EFI_GUID imgp_guid = LOADED_IMAGE_PROTOCOL; -static EFI_GUID blkio_guid = BLOCK_IO_PROTOCOL; -static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL; -u_long efi_loadaddr; - -int efi_device_path_depth(EFI_DEVICE_PATH *dp, int); -int efi_device_path_ncmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *, int); -static void efi_heap_init(void); -static void efi_memprobe_internal(void); -static void efi_video_init(void); -static void efi_video_reset(void); -static EFI_STATUS - efi_gop_setmode(int mode); -EFI_STATUS efi_main(EFI_HANDLE, EFI_SYSTEM_TABLE *); - -void (*run_i386)(u_long, u_long, int, int, int, int, int, int, int, int) - __attribute__((noreturn)); - -extern int bios_bootdev; - -EFI_STATUS -efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) -{ - extern char *progname; - EFI_LOADED_IMAGE *imgp; - EFI_DEVICE_PATH *dp0 = NULL, *dp; - EFI_STATUS status; - EFI_PHYSICAL_ADDRESS stack; - - ST = systab; - BS = ST->BootServices; - RS = ST->RuntimeServices; - IH = image; - - /* disable reset by watchdog after 5 minutes */ - EFI_CALL(BS->SetWatchdogTimer, 0, 0, 0, NULL); - - efi_video_init(); - efi_heap_init(); - - status = EFI_CALL(BS->HandleProtocol, image, &imgp_guid, - (void **)&imgp); - if (status == EFI_SUCCESS) - status = EFI_CALL(BS->HandleProtocol, imgp->DeviceHandle, - &devp_guid, (void **)&dp0); - if (status == EFI_SUCCESS) { - for (dp = dp0; !IsDevicePathEnd(dp); - dp = NextDevicePathNode(dp)) { - if (DevicePathType(dp) == MEDIA_DEVICE_PATH && - (DevicePathSubType(dp) == MEDIA_HARDDRIVE_DP || - DevicePathSubType(dp) == MEDIA_CDROM_DP)) { - bios_bootdev = - (DevicePathSubType(dp) == MEDIA_CDROM_DP) - ? 0x1e0 : 0x80; - efi_bootdp = dp0; - break; - } else if (DevicePathType(dp) == MESSAGING_DEVICE_PATH&& - DevicePathSubType(dp) == MSG_MAC_ADDR_DP) { - bios_bootdev = 0x0; - efi_bootdp = dp0; - break; - } - } - } - - /* can't use sa_cleanup since printf is used after sa_cleanup() */ - /* sa_cleanup = efi_cleanup; */ - - progname = "BOOTIA32"; - - /* - * Move the stack before calling boot(). UEFI on some machines - * locate the stack on our kernel load address. - */ - stack = heap + heapsiz; - asm("movl %0, %%esp;" - "movl %1, (%%esp);" - "call boot;" - :: "r"(stack - 32), "r"(bios_bootdev)); - /* must not reach here */ - return (EFI_SUCCESS); -} - -void -efi_cleanup(void) -{ - int retry; - EFI_STATUS status; - - /* retry once in case of failure */ - for (retry = 1; retry >= 0; retry--) { - efi_memprobe_internal(); /* sync the current map */ - status = EFI_CALL(BS->ExitBootServices, IH, mmap_key); - if (status == EFI_SUCCESS) - break; - if (retry == 0) - panic("ExitBootServices failed (%d)", status); - } -} - -/*********************************************************************** - * Disk - ***********************************************************************/ -struct disklist_lh efi_disklist; - -void -efi_diskprobe(void) -{ - int i, bootdev = 0, depth = -1; - UINTN sz; - EFI_STATUS status; - EFI_HANDLE *handles = NULL; - EFI_BLOCK_IO *blkio; - EFI_BLOCK_IO_MEDIA *media; - struct diskinfo *di; - EFI_DEVICE_PATH *dp; - - TAILQ_INIT(&efi_disklist); - - sz = 0; - status = EFI_CALL(BS->LocateHandle, ByProtocol, &blkio_guid, 0, &sz, 0); - if (status == EFI_BUFFER_TOO_SMALL) { - handles = alloc(sz); - status = EFI_CALL(BS->LocateHandle, ByProtocol, &blkio_guid, - 0, &sz, handles); - } - if (handles == NULL || EFI_ERROR(status)) - panic("BS->LocateHandle() returns %d", status); - - if (efi_bootdp != NULL) - depth = efi_device_path_depth(efi_bootdp, MEDIA_DEVICE_PATH); - - /* - * U-Boot incorrectly represents devices with a single - * MEDIA_DEVICE_PATH component. In that case include that - * component into the matching, otherwise we'll blindly select - * the first device. - */ - if (depth == 0) - depth = 1; - - for (i = 0; i < sz / sizeof(EFI_HANDLE); i++) { - status = EFI_CALL(BS->HandleProtocol, handles[i], &blkio_guid, - (void **)&blkio); - if (EFI_ERROR(status)) - panic("BS->HandleProtocol() returns %d", status); - - media = blkio->Media; - if (media->LogicalPartition || !media->MediaPresent) - continue; - di = alloc(sizeof(struct diskinfo)); - efid_init(di, blkio); - - if (efi_bootdp == NULL || depth == -1 || bootdev != 0) - goto next; - status = EFI_CALL(BS->HandleProtocol, handles[i], &devp_guid, - (void **)&dp); - if (EFI_ERROR(status)) - goto next; - if (efi_device_path_ncmp(efi_bootdp, dp, depth) == 0) { - TAILQ_INSERT_HEAD(&efi_disklist, di, list); - bootdev = 1; - continue; - } -next: - TAILQ_INSERT_TAIL(&efi_disklist, di, list); - } - - free(handles, sz); -} - -/* - * Determine the number of nodes up to, but not including, the first - * node of the specified type. - */ -int -efi_device_path_depth(EFI_DEVICE_PATH *dp, int dptype) -{ - int i; - - for (i = 0; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp), i++) { - if (DevicePathType(dp) == dptype) - return (i); - } - - return (-1); -} - -int -efi_device_path_ncmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int deptn) -{ - int i, cmp; - - for (i = 0; i < deptn; i++) { - if (IsDevicePathEnd(dpa) || IsDevicePathEnd(dpb)) - return ((IsDevicePathEnd(dpa) && IsDevicePathEnd(dpb)) - ? 0 : (IsDevicePathEnd(dpa))? -1 : 1); - cmp = DevicePathNodeLength(dpa) - DevicePathNodeLength(dpb); - if (cmp) - return (cmp); - cmp = memcmp(dpa, dpb, DevicePathNodeLength(dpa)); - if (cmp) - return (cmp); - dpa = NextDevicePathNode(dpa); - dpb = NextDevicePathNode(dpb); - } - - return (0); -} - -/*********************************************************************** - * Memory - ***********************************************************************/ -bios_memmap_t bios_memmap[64]; - -static void -efi_heap_init(void) -{ - EFI_STATUS status; - - heap = HEAP_LIMIT; - status = EFI_CALL(BS->AllocatePages, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(heapsiz), &heap); - if (status != EFI_SUCCESS) - panic("BS->AllocatePages()"); -} - -void -efi_memprobe(void) -{ - u_int n = 0; - bios_memmap_t *bm; - EFI_STATUS status; - EFI_PHYSICAL_ADDRESS - addr = 0x10000000ULL; /* Below 256MB */ - - status = EFI_CALL(BS->AllocatePages, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(KERN_LOADSPACE_SIZE), &addr); - if (status != EFI_SUCCESS) - panic("BS->AllocatePages()"); - efi_loadaddr = addr; - - printf(" mem["); - efi_memprobe_internal(); - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->type == BIOS_MAP_FREE && bm->size > 12 * 1024) { - if (n++ != 0) - printf(" "); - if (bm->size > 1024 * 1024) - printf("%uM", bm->size / 1024 / 1024); - else - printf("%uK", bm->size / 1024); - } - } - printf("]"); -} - -static void -efi_memprobe_internal(void) -{ - EFI_STATUS status; - UINTN mapkey, mmsiz, siz; - UINT32 mmver; - EFI_MEMORY_DESCRIPTOR *mm0, *mm; - int i, n; - bios_memmap_t *bm, bm0; - - cnvmem = extmem = 0; - bios_memmap[0].type = BIOS_MAP_END; - - siz = 0; - status = EFI_CALL(BS->GetMemoryMap, &siz, NULL, &mapkey, &mmsiz, - &mmver); - if (status != EFI_BUFFER_TOO_SMALL) - panic("cannot get the size of memory map"); - mm0 = alloc(siz); - status = EFI_CALL(BS->GetMemoryMap, &siz, mm0, &mapkey, &mmsiz, &mmver); - if (status != EFI_SUCCESS) - panic("cannot get the memory map"); - n = siz / mmsiz; - mmap_key = mapkey; - - for (i = 0, mm = mm0; i < n; i++, mm = NextMemoryDescriptor(mm, mmsiz)){ - bm0.type = BIOS_MAP_END; - bm0.addr = mm->PhysicalStart; - bm0.size = mm->NumberOfPages * EFI_PAGE_SIZE; - if (mm->Type == EfiReservedMemoryType || - mm->Type == EfiUnusableMemory || - mm->Type == EfiRuntimeServicesCode || - mm->Type == EfiRuntimeServicesData) - bm0.type = BIOS_MAP_RES; - else if (mm->Type == EfiLoaderCode || - mm->Type == EfiLoaderData || - mm->Type == EfiBootServicesCode || - mm->Type == EfiBootServicesData || - mm->Type == EfiConventionalMemory) - bm0.type = BIOS_MAP_FREE; - else if (mm->Type == EfiACPIReclaimMemory) - bm0.type = BIOS_MAP_ACPI; - else if (mm->Type == EfiACPIMemoryNVS) - bm0.type = BIOS_MAP_NVS; - else - /* - * XXX Is there anything to do for EfiMemoryMappedIO - * XXX EfiMemoryMappedIOPortSpace EfiPalCode? - */ - bm0.type = BIOS_MAP_RES; - - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->type != bm0.type) - continue; - if (bm->addr <= bm0.addr && - bm0.addr <= bm->addr + bm->size) { - bm->size = bm0.addr + bm0.size - bm->addr; - break; - } else if (bm0.addr <= bm->addr && - bm->addr <= bm0.addr + bm0.size) { - bm->size = bm->addr + bm->size - bm0.addr; - bm->addr = bm0.addr; - break; - } - } - if (bm->type == BIOS_MAP_END) { - *bm = bm0; - (++bm)->type = BIOS_MAP_END; - } - } - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->addr < IOM_BEGIN) /* Below memory hole */ - cnvmem = - max(cnvmem, (bm->addr + bm->size) / 1024); - if (bm->addr >= IOM_END /* Above the memory hole */ && - bm->addr / 1024 == extmem + 1024) - extmem += bm->size / 1024; - } - free(mm0, siz); -} - -/*********************************************************************** - * Console - ***********************************************************************/ -static SIMPLE_TEXT_OUTPUT_INTERFACE *conout = NULL; -static SIMPLE_INPUT_INTERFACE *conin; -static EFI_GUID con_guid - = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; -static EFI_GUID gop_guid - = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; -static EFI_GUID serio_guid - = SERIAL_IO_PROTOCOL; -struct efi_video { - int cols; - int rows; -} efi_video[32]; - -static void -efi_video_init(void) -{ - EFI_CONSOLE_CONTROL_PROTOCOL *conctrl = NULL; - int i, mode80x25, mode100x31; - UINTN cols, rows; - EFI_STATUS status; - - conout = ST->ConOut; - status = EFI_CALL(BS->LocateProtocol, &con_guid, NULL, - (void **)&conctrl); - if (status == EFI_SUCCESS) - (void)EFI_CALL(conctrl->SetMode, conctrl, - EfiConsoleControlScreenText); - mode80x25 = -1; - mode100x31 = -1; - for (i = 0; i < conout->Mode->MaxMode; i++) { - status = EFI_CALL(conout->QueryMode, conout, i, &cols, &rows); - if (EFI_ERROR(status)) - continue; - if (mode80x25 < 0 && cols == 80 && rows == 25) - mode80x25 = i; - if (mode100x31 < 0 && cols == 100 && rows == 31) - mode100x31 = i; - if (i < nitems(efi_video)) { - efi_video[i].cols = cols; - efi_video[i].rows = rows; - } - } - if (mode100x31 >= 0) - EFI_CALL(conout->SetMode, conout, mode100x31); - else if (mode80x25 >= 0) - EFI_CALL(conout->SetMode, conout, mode80x25); - conin = ST->ConIn; - efi_video_reset(); -} - -static void -efi_video_reset(void) -{ - EFI_CALL(conout->EnableCursor, conout, TRUE); - EFI_CALL(conout->SetAttribute, conout, - EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK)); - EFI_CALL(conout->ClearScreen, conout); -} - -void -efi_cons_probe(struct consdev *cn) -{ - cn->cn_pri = CN_MIDPRI; - cn->cn_dev = makedev(12, 0); - printf(" pc%d", minor(cn->cn_dev)); -} - -void -efi_cons_init(struct consdev *cp) -{ -} - -int -efi_cons_getc(dev_t dev) -{ - EFI_INPUT_KEY key; - EFI_STATUS status; - UINTN dummy; - static int lastchar = 0; - - if (lastchar) { - int r = lastchar; - if ((dev & 0x80) == 0) - lastchar = 0; - return (r); - } - - status = EFI_CALL(conin->ReadKeyStroke, conin, &key); - while (status == EFI_NOT_READY || key.UnicodeChar == 0) { - if (dev & 0x80) - return (0); - EFI_CALL(BS->WaitForEvent, 1, &conin->WaitForKey, &dummy); - status = EFI_CALL(conin->ReadKeyStroke, conin, &key); - } - - if (dev & 0x80) - lastchar = key.UnicodeChar; - - return (key.UnicodeChar); -} - -void -efi_cons_putc(dev_t dev, int c) -{ - CHAR16 buf[2]; - - if (c == '\n') - efi_cons_putc(dev, '\r'); - - buf[0] = c; - buf[1] = 0; - - EFI_CALL(conout->OutputString, conout, buf); -} - -int -efi_cons_getshifts(dev_t dev) -{ - /* XXX */ - return (0); -} - -int com_addr = -1; -int com_speed = -1; - -static SERIAL_IO_INTERFACE *serios[4]; -const int comports[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; - -/* call with sp == 0 to query the current speed */ -int -pio_comspeed(dev_t dev, int sp) -{ - int port = (com_addr == -1) ? comports[minor(dev)] : com_addr; - int i, newsp; - int err; - - if (sp <= 0) - return com_speed; - /* valid baud rate? */ - if (115200 < sp || sp < 75) - return -1; - - /* - * Accepted speeds: - * 75 150 300 600 1200 2400 4800 9600 19200 38400 76800 and - * 14400 28800 57600 115200 - */ - for (i = sp; i != 75 && i != 14400; i >>= 1) - if (i & 1) - return -1; - -/* ripped screaming from dev/ic/com.c */ -#define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ - newsp = divrnd((COM_FREQ / 16), sp); - if (newsp <= 0) - return -1; - err = divrnd((COM_FREQ / 16) * 1000, sp * newsp) - 1000; - if (err < 0) - err = -err; - if (err > COM_TOLERANCE) - return -1; -#undef divrnd - - if (com_speed != -1 && cn_tab && cn_tab->cn_dev == dev && - com_speed != sp) { - printf("com%d: changing speed to %d baud in 5 seconds, " - "change your terminal to match!\n\a", - minor(dev), sp); - sleep(5); - } - - outb(port + com_cfcr, LCR_DLAB); - outb(port + com_dlbl, newsp); - outb(port + com_dlbh, newsp>>8); - outb(port + com_cfcr, LCR_8BITS); - if (com_speed != -1) - printf("\ncom%d: %d baud\n", minor(dev), sp); - - newsp = com_speed; - com_speed = sp; - return newsp; -} - -int -pio_com_getc(dev_t dev) -{ - int port = (com_addr == -1) ? comports[minor(dev & 0x7f)] : com_addr; - - if (dev & 0x80) - return (inb(port + com_lsr) & LSR_RXRDY); - - while ((inb(port + com_lsr) & LSR_RXRDY) == 0) - ; - - return (inb(port + com_data) & 0xff); -} - -void -pio_com_putc(dev_t dev, int c) -{ - int port = (com_addr == -1) ? comports[minor(dev)] : com_addr; - - while ((inb(port + com_lsr) & LSR_TXRDY) == 0) - ; - - outb(port + com_data, c); -} - -void -efi_com_probe(struct consdev *cn) -{ - EFI_HANDLE *handles = NULL; - SERIAL_IO_INTERFACE *serio; - EFI_STATUS status; - EFI_DEVICE_PATH *dp, *dp0; - EFI_DEV_PATH_PTR dpp; - UINTN sz; - int i, uid = -1; - - cn->cn_pri = CN_LOWPRI; - cn->cn_dev = makedev(8, 0); - - sz = 0; - status = EFI_CALL(BS->LocateHandle, ByProtocol, &serio_guid, 0, &sz, 0); - if (status == EFI_BUFFER_TOO_SMALL) { - handles = alloc(sz); - status = EFI_CALL(BS->LocateHandle, ByProtocol, &serio_guid, - 0, &sz, handles); - } - if (handles == NULL || EFI_ERROR(status)) { - free(handles, sz); - return; - } - - for (i = 0; i < sz / sizeof(EFI_HANDLE); i++) { - /* - * Identify port number of the handle. This assumes ACPI - * UID 0-3 map to legacy COM[1-4] and they use the legacy - * port address. - */ - status = EFI_CALL(BS->HandleProtocol, handles[i], &devp_guid, - (void **)&dp0); - if (EFI_ERROR(status)) - continue; - uid = -1; - for (dp = dp0; !IsDevicePathEnd(dp); - dp = NextDevicePathNode(dp)) { - dpp = (EFI_DEV_PATH_PTR)dp; - if (DevicePathType(dp) == ACPI_DEVICE_PATH && - DevicePathSubType(dp) == ACPI_DP) - if (dpp.Acpi->HID == EFI_PNP_ID(0x0501)) { - uid = dpp.Acpi->UID; - break; - } - } - if (uid < 0 || nitems(serios) <= uid) - continue; - - /* Prepare SERIAL_IO_INTERFACE */ - status = EFI_CALL(BS->HandleProtocol, handles[i], &serio_guid, - (void **)&serio); - if (EFI_ERROR(status)) - continue; - serios[uid] = serio; - } - free(handles, sz); - - for (i = 0; i < nitems(serios); i++) { - if (serios[i] != NULL) - printf(" com%d", i); - } -} - -int -efi_valid_com(dev_t dev) -{ - return (minor(dev) < nitems(serios) && serios[minor(dev)] != NULL); -} - -int -comspeed(dev_t dev, int sp) -{ - EFI_STATUS status; - SERIAL_IO_INTERFACE *serio = serios[minor(dev)]; - int newsp; - - if (sp <= 0) - return com_speed; - - if (!efi_valid_com(dev)) - return pio_comspeed(dev, sp); - - if (serio->Mode->BaudRate != sp) { - status = EFI_CALL(serio->SetAttributes, serio, - sp, serio->Mode->ReceiveFifoDepth, - serio->Mode->Timeout, serio->Mode->Parity, - serio->Mode->DataBits, serio->Mode->StopBits); - if (EFI_ERROR(status)) { - printf("com%d: SetAttribute() failed with status=%d\n", - minor(dev), status); - return (-1); - } - if (com_speed != -1) - printf("\ncom%d: %d baud\n", minor(dev), sp); - } - - /* same as comspeed() in libsa/bioscons.c */ - newsp = com_speed; - com_speed = sp; - - return (newsp); -} - -void -efi_com_init(struct consdev *cn) -{ - if (!efi_valid_com(cn->cn_dev)) - /* This actually happens if the machine has another serial. */ - return; - - if (com_speed == -1) - comspeed(cn->cn_dev, 9600); /* default speed is 9600 baud */ -} - -int -efi_com_getc(dev_t dev) -{ - EFI_STATUS status; - SERIAL_IO_INTERFACE *serio; - UINTN sz; - u_char buf; - static u_char lastchar = 0; - - if (!efi_valid_com(dev & 0x7f)) - return pio_com_getc(dev); - serio = serios[minor(dev & 0x7f)]; - - if (lastchar != 0) { - int r = lastchar; - if ((dev & 0x80) == 0) - lastchar = 0; - return (r); - } - - for (;;) { - sz = 1; - status = EFI_CALL(serio->Read, serio, &sz, &buf); - if (status == EFI_SUCCESS && sz > 0) - break; - if (status != EFI_TIMEOUT && EFI_ERROR(status)) - panic("Error reading from serial status=%d", status); - if (dev & 0x80) - return (0); - } - - if (dev & 0x80) - lastchar = buf; - - return (buf); -} - -void -efi_com_putc(dev_t dev, int c) -{ - SERIAL_IO_INTERFACE *serio; - UINTN sz = 1; - u_char buf; - - if (!efi_valid_com(dev)) { - pio_com_putc(dev, c); - return; - } - serio = serios[minor(dev)]; - buf = c; - EFI_CALL(serio->Write, serio, &sz, &buf); -} - -/*********************************************************************** - * Miscellaneous - ***********************************************************************/ -/* - * ACPI GUID is confusing in UEFI spec. - * {EFI_,}_ACPI_20_TABLE_GUID or EFI_ACPI_TABLE_GUID means - * ACPI 2.0 or above. - */ -static EFI_GUID acpi_guid = ACPI_20_TABLE_GUID; -static EFI_GUID smbios_guid = SMBIOS_TABLE_GUID; -static EFI_GRAPHICS_OUTPUT *gop; -static int gopmode = -1; - -#define efi_guidcmp(_a, _b) memcmp((_a), (_b), sizeof(EFI_GUID)) - -static EFI_STATUS -efi_gop_setmode(int mode) -{ - EFI_STATUS status; - - status = EFI_CALL(gop->SetMode, gop, mode); - if (EFI_ERROR(status) || gop->Mode->Mode != mode) - printf("GOP SetMode() failed (%d)\n", status); - - return (status); -} - -void -efi_makebootargs(void) -{ - int i; - EFI_STATUS status; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION - *gopi; - bios_efiinfo_t ei; - int curmode; - UINTN sz, gopsiz, bestsiz = 0; - - memset(&ei, 0, sizeof(ei)); - /* - * ACPI, BIOS configuration table - */ - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (efi_guidcmp(&acpi_guid, - &ST->ConfigurationTable[i].VendorGuid) == 0) - ei.config_acpi = (intptr_t) - ST->ConfigurationTable[i].VendorTable; - else if (efi_guidcmp(&smbios_guid, - &ST->ConfigurationTable[i].VendorGuid) == 0) - ei.config_smbios = (intptr_t) - ST->ConfigurationTable[i].VendorTable; - } - - /* - * Frame buffer - */ - status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL, - (void **)&gop); - if (!EFI_ERROR(status)) { - if (gopmode < 0) { - for (i = 0; i < gop->Mode->MaxMode; i++) { - status = EFI_CALL(gop->QueryMode, gop, - i, &sz, &gopi); - if (EFI_ERROR(status)) - continue; - gopsiz = gopi->HorizontalResolution * - gopi->VerticalResolution; - if (gopsiz > bestsiz) { - gopmode = i; - bestsiz = gopsiz; - } - } - } - if (gopmode >= 0 && gopmode != gop->Mode->Mode) { - curmode = gop->Mode->Mode; - if (efi_gop_setmode(gopmode) != EFI_SUCCESS) - (void)efi_gop_setmode(curmode); - } - - gopi = gop->Mode->Info; - switch (gopi->PixelFormat) { - case PixelBlueGreenRedReserved8BitPerColor: - ei.fb_red_mask = 0x00ff0000; - ei.fb_green_mask = 0x0000ff00; - ei.fb_blue_mask = 0x000000ff; - ei.fb_reserved_mask = 0xff000000; - break; - case PixelRedGreenBlueReserved8BitPerColor: - ei.fb_red_mask = 0x000000ff; - ei.fb_green_mask = 0x0000ff00; - ei.fb_blue_mask = 0x00ff0000; - ei.fb_reserved_mask = 0xff000000; - break; - case PixelBitMask: - ei.fb_red_mask = gopi->PixelInformation.RedMask; - ei.fb_green_mask = gopi->PixelInformation.GreenMask; - ei.fb_blue_mask = gopi->PixelInformation.BlueMask; - ei.fb_reserved_mask = - gopi->PixelInformation.ReservedMask; - break; - default: - break; - } - ei.fb_addr = gop->Mode->FrameBufferBase; - ei.fb_size = gop->Mode->FrameBufferSize; - ei.fb_height = gopi->VerticalResolution; - ei.fb_width = gopi->HorizontalResolution; - ei.fb_pixpsl = gopi->PixelsPerScanLine; - } - - addbootarg(BOOTARG_EFIINFO, sizeof(ei), &ei); -} - -void -_rtt(void) -{ -#ifdef EFI_DEBUG - printf("Hit any key to reboot\n"); - efi_cons_getc(0); -#endif - EFI_CALL(RS->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL); - for (;;) - continue; -} - -time_t -getsecs(void) -{ - EFI_TIME t; - time_t r = 0; - int y = 0; - const int daytab[][14] = { - { 0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 }, - { 0, -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - }; -#define isleap(_y) (((_y) % 4) == 0 && (((_y) % 100) != 0 || ((_y) % 400) == 0)) - - EFI_CALL(ST->RuntimeServices->GetTime, &t, NULL); - - /* Calc days from UNIX epoch */ - r = (t.Year - 1970) * 365; - for (y = 1970; y < t.Year; y++) { - if (isleap(y)) - r++; - } - r += daytab[isleap(t.Year)? 1 : 0][t.Month] + t.Day; - - /* Calc secs */ - r *= 60 * 60 * 24; - r += ((t.Hour * 60) + t.Minute) * 60 + t.Second; - if (-24 * 60 < t.TimeZone && t.TimeZone < 24 * 60) - r += t.TimeZone * 60; - - return (r); -} - -u_int -sleep(u_int i) -{ - time_t t; - - /* - * Loop for the requested number of seconds, polling, - * so that it may handle interrupts. - */ - for (t = getsecs() + i; getsecs() < t; cnischar()) - ; - - return 0; -} - -/*********************************************************************** - * Commands - ***********************************************************************/ -int -Xexit_efi(void) -{ - EFI_CALL(BS->Exit, IH, 0, 0, NULL); - for (;;) - continue; - return (0); -} - -int -Xvideo_efi(void) -{ - int i, mode = -1; - - if (cmd.argc >= 2) { - mode = strtol(cmd.argv[1], NULL, 10); - if (0 <= mode && mode < nitems(efi_video) && - efi_video[mode].cols > 0) { - EFI_CALL(conout->SetMode, conout, mode); - efi_video_reset(); - } - } else { - for (i = 0; i < nitems(efi_video) && - i < conout->Mode->MaxMode; i++) { - if (efi_video[i].cols > 0) - printf("Mode %d: %d x %d\n", i, - efi_video[i].cols, - efi_video[i].rows); - } - printf("\n"); - } - printf("Current Mode = %d\n", conout->Mode->Mode); - - return (0); -} - -int -Xpoweroff_efi(void) -{ - EFI_CALL(RS->ResetSystem, EfiResetShutdown, EFI_SUCCESS, 0, NULL); - return (0); -} - -int -Xgop_efi(void) -{ - EFI_STATUS status; - int i, mode = -1; - UINTN sz; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION - *gopi; - - status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL, - (void **)&gop); - if (EFI_ERROR(status)) - return (0); - - if (cmd.argc >= 2) { - mode = strtol(cmd.argv[1], NULL, 10); - if (0 <= mode && mode < gop->Mode->MaxMode) { - status = EFI_CALL(gop->QueryMode, gop, mode, - &sz, &gopi); - if (!EFI_ERROR(status)) { - if (efi_gop_setmode(mode) == EFI_SUCCESS) - gopmode = mode; - } - } - } else { - for (i = 0; i < gop->Mode->MaxMode; i++) { - status = EFI_CALL(gop->QueryMode, gop, i, &sz, &gopi); - if (EFI_ERROR(status)) - continue; - printf("Mode %d: %d x %d (stride = %d)\n", i, - gopi->HorizontalResolution, - gopi->VerticalResolution, - gopi->PixelsPerScanLine); - } - printf("\n"); - } - printf("Current Mode = %d\n", gop->Mode->Mode); - - return (0); -} diff --git a/sys/arch/amd64/stand/efi32/efiboot.h b/sys/arch/amd64/stand/efi32/efiboot.h deleted file mode 100644 index beb3be554de..00000000000 --- a/sys/arch/amd64/stand/efi32/efiboot.h +++ /dev/null @@ -1,41 +0,0 @@ -/* $OpenBSD: efiboot.h,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void efi_cleanup(void); -void efi_cons_probe(struct consdev *); -void efi_memprobe(void); -void efi_hardprobe(void); -void efi_diskprobe(void); -void efi_pxeprobe(void); -void efi_cons_init(struct consdev *); -int efi_cons_getc(dev_t); -void efi_cons_putc(dev_t, int); -int efi_cons_getshifts(dev_t dev); -void efi_com_probe(struct consdev *); -void efi_com_init(struct consdev *); -int efi_com_getc(dev_t); -void efi_com_putc(dev_t, int); -int Xvideo_efi(void); -int Xgop_efi(void); -int Xexit_efi(void); -void efi_makebootargs(void); - -int Xpoweroff_efi(void); - -extern void (*run_i386)(u_long, u_long, int, int, int, int, int, int, int, int) - __attribute__ ((noreturn)); diff --git a/sys/arch/amd64/stand/efi32/eficall.S b/sys/arch/amd64/stand/efi32/eficall.S deleted file mode 100644 index fd73a2c6fdd..00000000000 --- a/sys/arch/amd64/stand/efi32/eficall.S +++ /dev/null @@ -1,64 +0,0 @@ -/* $OpenBSD: eficall.S,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -/* - * Rearrange the arguments to call the given function by EFI ABI. - * - * efi_call(nargs, func, arg[0], arg[1], arg[2], arg[3], arg[4], ...) - * ---------------------------------------------------------------------- - * BSD: RDI RSI RDX RCX R8 R9 stack - * EFI: - - RCX RDX R8 R9 stack (w/shadow) - */ -ENTRY(efi_call) - push %rbp - mov %rsp, %rbp - - xchg %rcx, %rdx - mov %rcx, %rax - mov %rdi, %rcx - - /* - * set "nargs - 2 + 4 + 1" (= %rdi + 3) for next call stack size. - * (nargs - 2) is for arguments in stack, +4 for shadow registers - * and +1 for alignment - */ - add $3, %rdi - - shl $3, %rdi /* 64-bit word */ - sub %rdi, %rsp /* get the stack */ - and $(-0x10), %rsp /* align 16 bytes */ - - /* copy args */ - sub $3, %rcx - cmp $1, %rcx - jle 2f - -1: /* loop arg[n-1] .. arg[4] */ - mov 0x8(%rbp, %rcx, 8), %rdi - mov %rdi, 0x18(%rsp, %rcx, 8) - loopnz 1b -2: - mov %rax, %rcx - - call *%rsi - - mov %rbp, %rsp - pop %rbp - retq diff --git a/sys/arch/amd64/stand/efi32/eficall.h b/sys/arch/amd64/stand/efi32/eficall.h deleted file mode 100644 index fc15b0e606c..00000000000 --- a/sys/arch/amd64/stand/efi32/eficall.h +++ /dev/null @@ -1,19 +0,0 @@ -/* $OpenBSD: eficall.h,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#define EFI_CALL(_func_, ...) (_func_)(__VA_ARGS__) diff --git a/sys/arch/amd64/stand/efi32/efidev.c b/sys/arch/amd64/stand/efi32/efidev.c deleted file mode 100644 index a78b65e5aa7..00000000000 --- a/sys/arch/amd64/stand/efi32/efidev.c +++ /dev/null @@ -1,793 +0,0 @@ -/* $OpenBSD: efidev.c,v 1.4 2022/09/01 13:45:26 krw Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * Copyright (c) 2003 Tobias Weingartner - * Copyright (c) 2015 YASUOKA Masahiko - * 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 REGENTS 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 -#include -#include -#include -#include - -#include "libsa.h" -#include "disk.h" - -#ifdef SOFTRAID -#include -#include -#include "softraid_amd64.h" -#endif - -#include -#include "eficall.h" - -extern int debug; - -#include "efidev.h" -#include "biosdev.h" /* for dklookup() */ - -#define EFI_BLKSPERSEC(_ed) ((_ed)->blkio->Media->BlockSize / DEV_BSIZE) -#define EFI_SECTOBLK(_ed, _n) ((_n) * EFI_BLKSPERSEC(_ed)) - -struct efi_diskinfo { - EFI_BLOCK_IO *blkio; - UINT32 mediaid; -}; - -int bios_bootdev; -static EFI_STATUS - efid_io(int, efi_diskinfo_t, u_int, int, void *); -static int efid_diskio(int, struct diskinfo *, u_int, int, void *); -static int efi_getdisklabel_cd9660(efi_diskinfo_t, struct disklabel *); -static u_int findopenbsd(efi_diskinfo_t, const char **); -static u_int findopenbsd_gpt(efi_diskinfo_t, const char **); -static int gpt_chk_mbr(struct dos_partition *, u_int64_t); - -void -efid_init(struct diskinfo *dip, void *handle) -{ - EFI_BLOCK_IO *blkio = handle; - - memset(dip, 0, sizeof(struct diskinfo)); - dip->efi_info = alloc(sizeof(struct efi_diskinfo)); - dip->efi_info->blkio = blkio; - dip->efi_info->mediaid = blkio->Media->MediaId; - dip->diskio = efid_diskio; - dip->strategy = efistrategy; -} - -static EFI_STATUS -efid_io(int rw, efi_diskinfo_t ed, u_int off, int nsect, void *buf) -{ - u_int blks, lba, i_lblks, i_tblks, i_nblks; - EFI_STATUS status = EFI_SUCCESS; - static u_char *iblk = NULL; - static u_int iblksz = 0; - - /* block count of the intrisic block size in DEV_BSIZE */ - blks = EFI_BLKSPERSEC(ed); - if (blks == 0) - /* block size < 512. HP Stream 13 actually has such a disk. */ - return (EFI_UNSUPPORTED); - - /* leading and trailing unaligned blocks in intrisic block */ - i_lblks = ((off % blks) == 0)? 0 : blks - (off % blks); - i_tblks = (nsect > i_lblks)? (off + nsect) % blks : 0; - - /* aligned blocks in intrisic block */ - i_nblks = (nsect > i_lblks + i_tblks)? nsect - (i_lblks + i_tblks) : 0; - - lba = (off + i_lblks) / blks; - - switch (rw) { - case F_READ: - /* allocate the space for reading unaligned blocks */ - if (ed->blkio->Media->BlockSize != DEV_BSIZE) { - if (iblk && iblksz < ed->blkio->Media->BlockSize) { - free(iblk, iblksz); - iblk = NULL; - } - if (iblk == NULL) { - iblk = alloc(ed->blkio->Media->BlockSize); - iblksz = ed->blkio->Media->BlockSize; - } - } - if (i_lblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba - 1, - ed->blkio->Media->BlockSize, iblk); - if (EFI_ERROR(status)) - goto on_eio; - memcpy(buf, iblk + (blks - i_lblks) * DEV_BSIZE, - min(nsect, i_lblks) * DEV_BSIZE); - } - if (i_nblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba, - ed->blkio->Media->BlockSize * (i_nblks / blks), - buf + (i_lblks * DEV_BSIZE)); - if (EFI_ERROR(status)) - goto on_eio; - } - if (i_tblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba + (i_nblks / blks), - ed->blkio->Media->BlockSize, iblk); - if (EFI_ERROR(status)) - goto on_eio; - memcpy(buf + (i_lblks + i_nblks) * DEV_BSIZE, iblk, - i_tblks * DEV_BSIZE); - } - break; - case F_WRITE: - if (ed->blkio->Media->ReadOnly) - goto on_eio; - /* XXX not yet */ - goto on_eio; - break; - } - return (EFI_SUCCESS); - -on_eio: - return (status); -} - -static int -efid_diskio(int rw, struct diskinfo *dip, u_int off, int nsect, void *buf) -{ - EFI_STATUS status; - - status = efid_io(rw, dip->efi_info, off, nsect, buf); - - return ((EFI_ERROR(status))? -1 : 0); -} - -/* - * Returns 0 if the MBR with the provided partition array is a GPT protective - * MBR, and returns 1 otherwise. A GPT protective MBR would have one and only - * one MBR partition, an EFI partition that either covers the whole disk or as - * much of it as is possible with a 32bit size field. - * - * Taken from kern/subr_disk.c. - * - * NOTE: MS always uses a size of UINT32_MAX for the EFI partition!** - */ -static int -gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize) -{ - struct dos_partition *dp2; - int efi, found, i; - u_int32_t psize; - - found = efi = 0; - for (dp2=dp, i=0; i < NDOSPART; i++, dp2++) { - if (dp2->dp_typ == DOSPTYP_UNUSED) - continue; - found++; - if (dp2->dp_typ != DOSPTYP_EFI) - continue; - psize = letoh32(dp2->dp_size); - if (psize == (dsize - 1) || - psize == UINT32_MAX) { - if (letoh32(dp2->dp_start) == 1) - efi++; - } - } - if (found == 1 && efi == 1) - return (0); - - return (1); -} - -/* - * Try to find the disk address of the first MBR OpenBSD partition. - * - * N.B.: must boot from a partition within first 2^32-1 sectors! - * - * Called only if the MBR on sector 0 is *not* a protective MBR - * and *does* have a valid signature. - * - * We don't check the signatures of EBR's, and they cannot be - * protective MBR's so there is no need to check for that. - */ -static u_int -findopenbsd(efi_diskinfo_t ed, const char **err) -{ - EFI_STATUS status; - struct dos_mbr mbr; - struct dos_partition *dp; - u_int mbroff = DOSBBSECTOR; - u_int mbr_eoff = DOSBBSECTOR; /* Offset of MBR extended partition. */ - int i, maxebr = DOS_MAXEBR, nextebr; - -again: - if (!maxebr--) { - *err = "too many extended partitions"; - return (-1); - } - - /* Read MBR */ - bzero(&mbr, sizeof(mbr)); - status = efid_io(F_READ, ed, mbroff, 1, &mbr); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - - /* Search for OpenBSD partition */ - nextebr = 0; - for (i = 0; i < NDOSPART; i++) { - dp = &mbr.dmbr_parts[i]; - if (!dp->dp_size) - continue; -#ifdef BIOS_DEBUG - if (debug) - printf("found partition %u: " - "type %u (0x%x) offset %u (0x%x)\n", - (int)(dp - mbr.dmbr_parts), - dp->dp_typ, dp->dp_typ, - dp->dp_start, dp->dp_start); -#endif - if (dp->dp_typ == DOSPTYP_OPENBSD) { - if (dp->dp_start > (dp->dp_start + mbroff)) - continue; - return (dp->dp_start + mbroff); - } - - /* - * Record location of next ebr if and only if this is the first - * extended partition in this boot record! - */ - if (!nextebr && (dp->dp_typ == DOSPTYP_EXTEND || - dp->dp_typ == DOSPTYP_EXTENDL)) { - nextebr = dp->dp_start + mbr_eoff; - if (nextebr < dp->dp_start) - nextebr = (u_int)-1; - if (mbr_eoff == DOSBBSECTOR) - mbr_eoff = dp->dp_start; - } - } - - if (nextebr && nextebr != (u_int)-1) { - mbroff = nextebr; - goto again; - } - - return (-1); -} - -/* - * Try to find the disk address of the first GPT OpenBSD partition. - * - * N.B.: must boot from a partition within first 2^32-1 sectors! - * - * Called only if the MBR on sector 0 *is* a protective MBR - * with a valid signature and sector 1 is a valid GPT header. - */ -static u_int -findopenbsd_gpt(efi_diskinfo_t ed, const char **err) -{ - EFI_STATUS status; - struct gpt_header gh; - int i, part, found; - uint64_t lba; - uint32_t orig_csum, new_csum; - uint32_t ghsize, ghpartsize, ghpartnum, ghpartspersec; - uint32_t gpsectors; - const char openbsd_uuid_code[] = GPT_UUID_OPENBSD; - struct gpt_partition gp; - static struct uuid *openbsd_uuid = NULL, openbsd_uuid_space; - static u_char buf[4096]; - - /* Prepare OpenBSD UUID */ - if (openbsd_uuid == NULL) { - /* XXX: should be replaced by uuid_dec_be() */ - memcpy(&openbsd_uuid_space, openbsd_uuid_code, - sizeof(openbsd_uuid_space)); - openbsd_uuid_space.time_low = - betoh32(openbsd_uuid_space.time_low); - openbsd_uuid_space.time_mid = - betoh16(openbsd_uuid_space.time_mid); - openbsd_uuid_space.time_hi_and_version = - betoh16(openbsd_uuid_space.time_hi_and_version); - - openbsd_uuid = &openbsd_uuid_space; - } - - if (EFI_BLKSPERSEC(ed) > 8) { - *err = "disk sector > 4096 bytes\n"; - return (-1); - } - - /* LBA1: GPT Header */ - lba = 1; - status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed), - buf); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - memcpy(&gh, buf, sizeof(gh)); - - /* Check signature */ - if (letoh64(gh.gh_sig) != GPTSIGNATURE) { - *err = "bad GPT signature\n"; - return (-1); - } - - if (letoh32(gh.gh_rev) != GPTREVISION) { - *err = "bad GPT revision\n"; - return (-1); - } - - ghsize = letoh32(gh.gh_size); - if (ghsize < GPTMINHDRSIZE || ghsize > sizeof(struct gpt_header)) { - *err = "bad GPT header size\n"; - return (-1); - } - - /* Check checksum */ - orig_csum = gh.gh_csum; - gh.gh_csum = 0; - new_csum = crc32(0, (unsigned char *)&gh, ghsize); - gh.gh_csum = orig_csum; - if (letoh32(orig_csum) != new_csum) { - *err = "bad GPT header checksum\n"; - return (-1); - } - - lba = letoh64(gh.gh_part_lba); - ghpartsize = letoh32(gh.gh_part_size); - ghpartspersec = ed->blkio->Media->BlockSize / ghpartsize; - ghpartnum = letoh32(gh.gh_part_num); - gpsectors = (ghpartnum + ghpartspersec - 1) / ghpartspersec; - new_csum = crc32(0L, Z_NULL, 0); - found = 0; - for (i = 0; i < gpsectors; i++, lba++) { - status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), - EFI_BLKSPERSEC(ed), buf); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - for (part = 0; part < ghpartspersec; part++) { - if (ghpartnum == 0) - break; - new_csum = crc32(new_csum, buf + part * sizeof(gp), - sizeof(gp)); - ghpartnum--; - if (found) - continue; - memcpy(&gp, buf + part * sizeof(gp), sizeof(gp)); - if (memcmp(&gp.gp_type, openbsd_uuid, - sizeof(struct uuid)) == 0) - found = 1; - } - } - if (new_csum != letoh32(gh.gh_part_csum)) { - *err = "bad GPT entries checksum\n"; - return (-1); - } - if (found) { - lba = letoh64(gp.gp_lba_start); - /* Bootloaders do not current handle addresses > UINT_MAX! */ - if (lba > UINT_MAX || EFI_SECTOBLK(ed, lba) > UINT_MAX) { - *err = "OpenBSD Partition LBA > 2**32 - 1"; - return (-1); - } - return (u_int)lba; - } - - return (-1); -} - -const char * -efi_getdisklabel(efi_diskinfo_t ed, struct disklabel *label) -{ - u_int start = 0; - uint8_t buf[DEV_BSIZE]; - struct dos_partition dosparts[NDOSPART]; - EFI_STATUS status; - const char *err = NULL; - int error; - - /* - * Read sector 0. Ensure it has a valid MBR signature. - * - * If it's a protective MBR then try to find the disklabel via - * GPT. If it's not a protective MBR, try to find the disklabel - * via MBR. - */ - memset(buf, 0, sizeof(buf)); - status = efid_io(F_READ, ed, DOSBBSECTOR, 1, buf); - if (EFI_ERROR(status)) - return ("Disk I/O Error"); - - /* Check MBR signature. */ - if (buf[510] != 0x55 || buf[511] != 0xaa) { - if (efi_getdisklabel_cd9660(ed, label) == 0) - return (NULL); - return ("invalid MBR signature"); - } - - memcpy(dosparts, buf+DOSPARTOFF, sizeof(dosparts)); - - /* check for GPT protective MBR. */ - if (gpt_chk_mbr(dosparts, ed->blkio->Media->LastBlock + 1) == 0) { - start = findopenbsd_gpt(ed, &err); - if (start == (u_int)-1) { - if (err != NULL) - return (err); - return ("no OpenBSD GPT partition"); - } - } else { - start = findopenbsd(ed, &err); - if (start == (u_int)-1) { - if (err != NULL) - return (err); - return "no OpenBSD MBR partition\n"; - } - } - - /* Load BSD disklabel */ -#ifdef BIOS_DEBUG - if (debug) - printf("loading disklabel @ %u\n", start + DOS_LABELSECTOR); -#endif - /* read disklabel */ - error = efid_io(F_READ, ed, EFI_SECTOBLK(ed, start) + DOS_LABELSECTOR, - 1, buf); - - if (error) - return "failed to read disklabel"; - - /* Fill in disklabel */ - return (getdisklabel(buf, label)); -} - -static int -efi_getdisklabel_cd9660(efi_diskinfo_t ed, struct disklabel *label) -{ - int off; - uint8_t buf[DEV_BSIZE]; - EFI_STATUS status; - - for (off = 0; off < 100; off++) { - status = efid_io(F_READ, ed, - EFI_BLKSPERSEC(ed) * (16 + off), 1, buf); - if (EFI_ERROR(status)) - return (-1); - if (bcmp(buf + 1, ISO_STANDARD_ID, 5) != 0 || - buf[0] == ISO_VD_END) - return (-1); - if (buf[0] == ISO_VD_PRIMARY) - break; - } - if (off >= 100) - return (-1); - - /* Create an imaginary disk label */ - label->d_secsize = 2048; - label->d_ntracks = 1; - label->d_nsectors = 100; - label->d_ncylinders = 1; - label->d_secpercyl = label->d_ntracks * label->d_nsectors; - - strncpy(label->d_typename, "ATAPI CD-ROM", sizeof(label->d_typename)); - label->d_type = DTYPE_ATAPI; - - strncpy(label->d_packname, "fictitious", sizeof(label->d_packname)); - DL_SETDSIZE(label, 100); - - /* 'a' partition covering the "whole" disk */ - DL_SETPOFFSET(&label->d_partitions[0], 0); - DL_SETPSIZE(&label->d_partitions[0], 100); - label->d_partitions[0].p_fstype = FS_UNUSED; - - /* The raw partition is special */ - DL_SETPOFFSET(&label->d_partitions[RAW_PART], 0); - DL_SETPSIZE(&label->d_partitions[RAW_PART], 100); - label->d_partitions[RAW_PART].p_fstype = FS_UNUSED; - - label->d_npartitions = MAXPARTITIONS; - - label->d_magic = DISKMAGIC; - label->d_magic2 = DISKMAGIC; - label->d_checksum = dkcksum(label); - - return (0); -} - -int -efiopen(struct open_file *f, ...) -{ -#ifdef SOFTRAID - struct sr_boot_volume *bv; -#endif - register char *cp, **file; - dev_t maj, unit, part; - struct diskinfo *dip; - int biosdev, devlen; -#if 0 - const char *st; -#endif - va_list ap; - char *dev; - - va_start(ap, f); - cp = *(file = va_arg(ap, char **)); - va_end(ap); - -#ifdef EFI_DEBUG - if (debug) - printf("%s\n", cp); -#endif - - f->f_devdata = NULL; - - /* Search for device specification. */ - dev = cp; - if (cp[4] == ':') - devlen = 2; - else if (cp[5] == ':') - devlen = 3; - else - return ENOENT; - cp += devlen; - - /* Get unit. */ - if ('0' <= *cp && *cp <= '9') - unit = *cp++ - '0'; - else { - printf("Bad unit number\n"); - return EUNIT; - } - - /* Get partition. */ - if ('a' <= *cp && *cp <= 'p') - part = *cp++ - 'a'; - else { - printf("Bad partition\n"); - return EPART; - } - - /* Get filename. */ - cp++; /* skip ':' */ - if (*cp != 0) - *file = cp; - else - f->f_flags |= F_RAW; - -#ifdef SOFTRAID - /* Intercept softraid disks. */ - if (strncmp("sr", dev, 2) == 0) { - - /* Create a fake diskinfo for this softraid volume. */ - SLIST_FOREACH(bv, &sr_volumes, sbv_link) - if (bv->sbv_unit == unit) - break; - if (bv == NULL) { - printf("Unknown device: sr%d\n", unit); - return EADAPT; - } - - if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) && - bv->sbv_keys == NULL) { - if (sr_crypto_unlock_volume(bv) != 0) - return EPERM; - } - - if (bv->sbv_diskinfo == NULL) { - dip = alloc(sizeof(struct diskinfo)); - bzero(dip, sizeof(*dip)); - dip->diskio = efid_diskio; - dip->strategy = efistrategy; - bv->sbv_diskinfo = dip; - dip->sr_vol = bv; - dip->bios_info.flags |= BDI_BADLABEL; - } - - dip = bv->sbv_diskinfo; - - if (dip->bios_info.flags & BDI_BADLABEL) { - /* Attempt to read disklabel. */ - bv->sbv_part = 'c'; - if (sr_getdisklabel(bv, &dip->disklabel)) - return ERDLAB; - dip->bios_info.flags &= ~BDI_BADLABEL; - check_hibernate(dip); - } - - bv->sbv_part = part + 'a'; - - bootdev_dip = dip; - f->f_devdata = dip; - - return 0; - } -#endif - for (maj = 0; maj < nbdevs && - strncmp(dev, bdevs[maj], devlen); maj++); - if (maj >= nbdevs) { - printf("Unknown device: "); - for (cp = *file; *cp != ':'; cp++) - putchar(*cp); - putchar('\n'); - return EADAPT; - } - - biosdev = unit; - switch (maj) { - case 0: /* wd */ - case 4: /* sd */ - case 17: /* hd */ - biosdev |= 0x80; - break; - case 2: /* fd */ - break; - case 6: /* cd */ - biosdev |= 0xe0; - break; - default: - return ENXIO; - } - - /* Find device */ - dip = dklookup(biosdev); - if (dip == NULL) - return ENXIO; - bootdev_dip = dip; - - /* Fix up bootdev */ - { dev_t bsd_dev; - bsd_dev = dip->bios_info.bsd_dev; - dip->bsddev = MAKEBOOTDEV(B_TYPE(bsd_dev), B_ADAPTOR(bsd_dev), - B_CONTROLLER(bsd_dev), unit, part); - dip->bootdev = MAKEBOOTDEV(B_TYPE(bsd_dev), B_ADAPTOR(bsd_dev), - B_CONTROLLER(bsd_dev), B_UNIT(bsd_dev), part); - } - -#if 0 - dip->bios_info.bsd_dev = dip->bootdev; - bootdev = dip->bootdev; -#endif - -#ifdef EFI_DEBUG - if (debug) { - printf("BIOS geometry: heads=%u, s/t=%u; EDD=%d\n", - dip->bios_info.bios_heads, dip->bios_info.bios_sectors, - dip->bios_info.bios_edd); - } -#endif - -#if 0 -/* - * XXX In UEFI, media change can be detected by MediaID - */ - /* Try for disklabel again (might be removable media) */ - if (dip->bios_info.flags & BDI_BADLABEL) { - st = efi_getdisklabel(dip->efi_info, &dip->disklabel); -#ifdef EFI_DEBUG - if (debug && st) - printf("%s\n", st); -#endif - if (!st) { - dip->bios_info.flags &= ~BDI_BADLABEL; - dip->bios_info.flags |= BDI_GOODLABEL; - } else - return ERDLAB; - } -#endif - f->f_devdata = dip; - - return 0; -} - -int -efistrategy(void *devdata, int rw, daddr_t blk, size_t size, void *buf, - size_t *rsize) -{ - struct diskinfo *dip = (struct diskinfo *)devdata; - u_int8_t error = 0; - size_t nsect; - -#ifdef SOFTRAID - /* Intercept strategy for softraid volumes. */ - if (dip->sr_vol) - return sr_strategy(dip->sr_vol, rw, blk, size, buf, rsize); -#endif - nsect = (size + DEV_BSIZE - 1) / DEV_BSIZE; - blk += DL_SECTOBLK(&dip->disklabel, - dip->disklabel.d_partitions[B_PARTITION(dip->bsddev)].p_offset); - - if (blk < 0) - error = EINVAL; - else - error = dip->diskio(rw, dip, blk, nsect, buf); - -#ifdef EFI_DEBUG - if (debug) { - if (error != 0) - printf("=0x%x(%s)", error, error); - putchar('\n'); - } -#endif - if (rsize != NULL) - *rsize = nsect * DEV_BSIZE; - - return (error); -} - -int -eficlose(struct open_file *f) -{ - f->f_devdata = NULL; - - return 0; -} - -int -efiioctl(struct open_file *f, u_long cmd, void *data) -{ - - return 0; -} - -void -efi_dump_diskinfo(void) -{ - efi_diskinfo_t ed; - struct diskinfo *dip; - bios_diskinfo_t *bdi; - uint64_t siz; - const char *sizu; - - printf("Disk\tBlkSiz\tIoAlign\tSize\tFlags\tChecksum\n"); - TAILQ_FOREACH(dip, &disklist, list) { - bdi = &dip->bios_info; - ed = dip->efi_info; - - siz = (ed->blkio->Media->LastBlock + 1) * - ed->blkio->Media->BlockSize; - siz /= 1024 * 1024; - if (siz < 10000) - sizu = "MB"; - else { - siz /= 1024; - sizu = "GB"; - } - - printf("%cd%d\t%u\t%u\t%u%s\t0x%x\t0x%x\t%s\n", - (B_TYPE(bdi->bsd_dev) == 6)? 'c' : 'h', - (bdi->bios_number & 0x1f), - ed->blkio->Media->BlockSize, - ed->blkio->Media->IoAlign, (unsigned)siz, sizu, - bdi->flags, bdi->checksum, - (ed->blkio->Media->RemovableMedia)? "Removable" : ""); - } -} diff --git a/sys/arch/amd64/stand/efi32/efidev.h b/sys/arch/amd64/stand/efi32/efidev.h deleted file mode 100644 index 48c2e7e82ee..00000000000 --- a/sys/arch/amd64/stand/efi32/efidev.h +++ /dev/null @@ -1,38 +0,0 @@ -/* $OpenBSD: efidev.h,v 1.2 2020/12/09 18:10:18 krw Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * Copyright (c) 2015 YASUOKA Masahiko - * 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 REGENTS 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. - * - */ - -/* efidev.c */ -void efid_init(struct diskinfo *, void *handle); -const char *efi_getdisklabel(efi_diskinfo_t, struct disklabel *); -int efiopen(struct open_file *, ...); -int efistrategy(void *, int, daddr_t, size_t, void *, size_t *); -int eficlose(struct open_file *); -int efiioctl(struct open_file *, u_long, void *); -void efi_dump_diskinfo(void); diff --git a/sys/arch/amd64/stand/efi32/efipxe.c b/sys/arch/amd64/stand/efi32/efipxe.c deleted file mode 100644 index f8dd6af5883..00000000000 --- a/sys/arch/amd64/stand/efi32/efipxe.c +++ /dev/null @@ -1,306 +0,0 @@ -/* $OpenBSD: efipxe.c,v 1.6 2021/03/11 11:16:55 jsg Exp $ */ -/* - * Copyright (c) 2017 Patrick Wildt - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include - -#include -#include - -#include "disk.h" - -#include -#include -#include "eficall.h" -#include "efiboot.h" - -extern EFI_BOOT_SERVICES *BS; -extern EFI_DEVICE_PATH *efi_bootdp; - -extern char *bootmac; -static UINT8 boothw[16]; -static EFI_IP_ADDRESS bootip, servip; -static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL; -static EFI_GUID pxe_guid = EFI_PXE_BASE_CODE_PROTOCOL; -static EFI_PXE_BASE_CODE *PXE = NULL; - -extern int efi_device_path_depth(EFI_DEVICE_PATH *dp, int); -extern int efi_device_path_ncmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *, int); - -/* - * TFTP initial probe. This function discovers PXE handles and tries - * to figure out if there has already been a successful PXE handshake. - * If so, set the PXE variable. - */ -void -efi_pxeprobe(void) -{ - EFI_PXE_BASE_CODE *pxe; - EFI_DEVICE_PATH *dp0; - EFI_HANDLE *handles; - EFI_STATUS status; - UINTN nhandles; - int i, depth; - - if (efi_bootdp == NULL) - return; - - status = EFI_CALL(BS->LocateHandleBuffer, ByProtocol, &pxe_guid, NULL, - &nhandles, &handles); - if (status != EFI_SUCCESS) - return; - - for (i = 0; i < nhandles; i++) { - EFI_PXE_BASE_CODE_DHCPV4_PACKET *dhcp; - - status = EFI_CALL(BS->HandleProtocol, handles[i], - &devp_guid, (void **)&dp0); - if (status != EFI_SUCCESS) - continue; - - depth = efi_device_path_depth(efi_bootdp, MESSAGING_DEVICE_PATH); - if (depth == -1 || efi_device_path_ncmp(efi_bootdp, dp0, depth)) - continue; - - status = EFI_CALL(BS->HandleProtocol, handles[i], &pxe_guid, - (void **)&pxe); - if (status != EFI_SUCCESS) - continue; - - if (pxe->Mode == NULL) - continue; - - dhcp = (EFI_PXE_BASE_CODE_DHCPV4_PACKET *)&pxe->Mode->DhcpAck; - memcpy(&bootip, dhcp->BootpYiAddr, sizeof(bootip)); - memcpy(&servip, dhcp->BootpSiAddr, sizeof(servip)); - memcpy(boothw, dhcp->BootpHwAddr, sizeof(boothw)); - bootmac = boothw; - PXE = pxe; - - /* - * It is expected that bootdev_dip exists. Usually - * efiopen() sets the pointer. Create a fake disk - * for the TFTP case. - */ - bootdev_dip = alloc(sizeof(struct diskinfo)); - memset(bootdev_dip, 0, sizeof(struct diskinfo)); - memset(bootdev_dip->disklabel.d_uid, 0xff, - sizeof(bootdev_dip->disklabel.d_uid)); - break; - } -} - -/* - * TFTP filesystem layer implementation. - */ -struct tftp_handle { - unsigned char *inbuf; /* input buffer */ - size_t inbufsize; - off_t inbufoff; -}; - -struct fs_ops tftp_fs = { - tftp_open, tftp_close, tftp_read, tftp_write, tftp_seek, - tftp_stat, tftp_readdir -}; - -int -tftp_open(char *path, struct open_file *f) -{ - struct tftp_handle *tftpfile; - EFI_PHYSICAL_ADDRESS addr; - EFI_STATUS status; - UINT64 size; - - if (strcmp("TFTP", f->f_dev->dv_name) != 0) - return ENXIO; - - if (PXE == NULL) - return ENXIO; - - tftpfile = alloc(sizeof(*tftpfile)); - if (tftpfile == NULL) - return ENOMEM; - memset(tftpfile, 0, sizeof(*tftpfile)); - - status = EFI_CALL(PXE->Mtftp, PXE, EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, - NULL, FALSE, &size, NULL, &servip, path, NULL, FALSE); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENOENT; - } - tftpfile->inbufsize = size; - - if (tftpfile->inbufsize == 0) - goto out; - - status = EFI_CALL(BS->AllocatePages, AllocateAnyPages, EfiLoaderData, - EFI_SIZE_TO_PAGES(tftpfile->inbufsize), &addr); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENOMEM; - } - tftpfile->inbuf = (unsigned char *)((paddr_t)addr); - - status = EFI_CALL(PXE->Mtftp, PXE, EFI_PXE_BASE_CODE_TFTP_READ_FILE, - tftpfile->inbuf, FALSE, &size, NULL, &servip, path, NULL, FALSE); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENXIO; - } -out: - f->f_fsdata = tftpfile; - return 0; -} - -int -tftp_close(struct open_file *f) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - if (tftpfile->inbuf != NULL) - EFI_CALL(BS->FreePages, (paddr_t)tftpfile->inbuf, - EFI_SIZE_TO_PAGES(tftpfile->inbufsize)); - free(tftpfile, sizeof(*tftpfile)); - return 0; -} - -int -tftp_read(struct open_file *f, void *addr, size_t size, size_t *resid) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - size_t toread; - - if (size > tftpfile->inbufsize - tftpfile->inbufoff) - toread = tftpfile->inbufsize - tftpfile->inbufoff; - else - toread = size; - - if (toread != 0) { - memcpy(addr, tftpfile->inbuf + tftpfile->inbufoff, toread); - tftpfile->inbufoff += toread; - } - - if (resid != NULL) - *resid = size - toread; - return 0; -} - -int -tftp_write(struct open_file *f, void *start, size_t size, size_t *resid) -{ - return EROFS; -} - -off_t -tftp_seek(struct open_file *f, off_t offset, int where) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - switch(where) { - case SEEK_CUR: - if (tftpfile->inbufoff + offset < 0 || - tftpfile->inbufoff + offset > tftpfile->inbufsize) { - errno = EOFFSET; - break; - } - tftpfile->inbufoff += offset; - return (tftpfile->inbufoff); - case SEEK_SET: - if (offset < 0 || offset > tftpfile->inbufsize) { - errno = EOFFSET; - break; - } - tftpfile->inbufoff = offset; - return (tftpfile->inbufoff); - case SEEK_END: - tftpfile->inbufoff = tftpfile->inbufsize; - return (tftpfile->inbufoff); - default: - errno = EINVAL; - } - return((off_t)-1); -} - -int -tftp_stat(struct open_file *f, struct stat *sb) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - sb->st_mode = 0444; - sb->st_nlink = 1; - sb->st_uid = 0; - sb->st_gid = 0; - sb->st_size = tftpfile->inbufsize; - - return 0; -} - -int -tftp_readdir(struct open_file *f, char *name) -{ - return EOPNOTSUPP; -} - -/* - * Dummy TFTP network device. - */ -int -tftpopen(struct open_file *f, ...) -{ - char **fname, *p; - va_list ap; - - va_start(ap, f); - fname = va_arg(ap, char **); - va_end(ap); - - /* No PXE set -> no PXE available */ - if (PXE == NULL) - return 1; - - /* Parse tftp:bsd into "tftp" and "bsd" */ - for (p = *fname; *p != ':' && *p != '\0'; p++) - ; - if (*p != ':') - return 1; - if (strncmp(*fname, "tftp", p - *fname) != 0) - return 1; - - *fname = p + 1; - return 0; -} - -int -tftpclose(struct open_file *f) -{ - return 0; -} - -int -tftpioctl(struct open_file *f, u_long cmd, void *data) -{ - return EOPNOTSUPP; -} - -int -tftpstrategy(void *devdata, int rw, daddr_t blk, size_t size, void *buf, - size_t *rsize) -{ - return EOPNOTSUPP; -} diff --git a/sys/arch/amd64/stand/efi32/efipxe.h b/sys/arch/amd64/stand/efi32/efipxe.h deleted file mode 100644 index 34347b03773..00000000000 --- a/sys/arch/amd64/stand/efi32/efipxe.h +++ /dev/null @@ -1,21 +0,0 @@ -/* $OpenBSD: efipxe.h,v 1.2 2020/12/09 18:10:18 krw Exp $ */ -/* - * Copyright (c) 2017 Patrick Wildt - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -int tftpopen(struct open_file *, ...); -int tftpclose(struct open_file *); -int tftpioctl(struct open_file *, u_long, void *); -int tftpstrategy(void *, int, daddr_t, size_t, void *, size_t *); diff --git a/sys/arch/amd64/stand/efi32/efirng.c b/sys/arch/amd64/stand/efi32/efirng.c deleted file mode 100644 index 2f503909488..00000000000 --- a/sys/arch/amd64/stand/efi32/efirng.c +++ /dev/null @@ -1,90 +0,0 @@ -/* $OpenBSD: efirng.c,v 1.2 2020/05/25 14:53:59 deraadt Exp $ */ - -/* - * Copyright (c) 2018 Mark Kettenis - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -#include -#include - -#include "eficall.h" -#include "libsa.h" - -extern EFI_BOOT_SERVICES *BS; - -/* Random Number Generator Protocol */ - -#define EFI_RNG_PROTOCOL_GUID \ - { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} } - -INTERFACE_DECL(_EFI_RNG_PROTOCOL); - -typedef EFI_GUID EFI_RNG_ALGORITHM; - -typedef -EFI_STATUS -(EFIAPI *EFI_RNG_GET_INFO) ( - IN struct _EFI_RNG_PROTOCOL *This, - IN OUT UINTN *RNGAlgorithmListSize, - OUT EFI_RNG_ALGORITHM *RNGAlgorithmList - ); - -typedef -EFI_STATUS -(EFIAPI *EFI_RNG_GET_RNG) ( - IN struct _EFI_RNG_PROTOCOL *This, - IN EFI_RNG_ALGORITHM *RNGAlgorithm, OPTIONAL - IN UINTN RNGValueLength, - OUT UINT8 *RNGValue - ); - -typedef struct _EFI_RNG_PROTOCOL { - EFI_RNG_GET_INFO GetInfo; - EFI_RNG_GET_RNG GetRNG; -} EFI_RNG_PROTOCOL; - -static EFI_GUID rng_guid = EFI_RNG_PROTOCOL_GUID; - -int -fwrandom(char *buf, size_t buflen) -{ - EFI_STATUS status; - EFI_RNG_PROTOCOL *rng = NULL; - UINT8 *random; - size_t i; - int ret = 0; - - status = EFI_CALL(BS->LocateProtocol, &rng_guid, NULL, (void **)&rng); - if (rng == NULL || EFI_ERROR(status)) - return -1; - - random = alloc(buflen); - - status = EFI_CALL(rng->GetRNG, rng, NULL, buflen, random); - if (EFI_ERROR(status)) { - printf("RNG GetRNG() failed (%d)\n", status); - ret = -1; - goto out; - } - - for (i = 0; i < buflen; i++) - buf[i] ^= random[i]; - -out: - free(random, buflen); - return ret; -} diff --git a/sys/arch/amd64/stand/efi32/exec_i386.c b/sys/arch/amd64/stand/efi32/exec_i386.c deleted file mode 100644 index 5e09c28e3ce..00000000000 --- a/sys/arch/amd64/stand/efi32/exec_i386.c +++ /dev/null @@ -1,208 +0,0 @@ -/* $OpenBSD: exec_i386.c,v 1.4 2023/02/23 19:48:21 miod Exp $ */ - -/* - * Copyright (c) 1997-1998 Michael Shalayeff - * Copyright (c) 1997 Tobias Weingartner - * 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 ``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 REGENTS 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 -#include -#include -#include -#include -#include -#include - -#include "cmd.h" -#include "disk.h" -#include "libsa.h" - -#ifdef SOFTRAID -#include -#include -#include "softraid_amd64.h" -#endif - -#include "efiboot.h" - -typedef void (*startfuncp)(int, int, int, int, int, int, int, int) - __attribute__ ((noreturn)); - -void ucode_load(void); -extern struct cmd_state cmd; - -char *bootmac = NULL; - -void -run_loadfile(uint64_t *marks, int howto) -{ - u_long entry; -#ifdef EXEC_DEBUG - extern int debug; -#endif - dev_t bootdev = bootdev_dip->bootdev; - size_t ac = BOOTARG_LEN; - caddr_t av = (caddr_t)BOOTARG_OFF; - bios_consdev_t cd; - extern int com_speed; /* from bioscons.c */ - extern int com_addr; - bios_ddb_t ddb; - extern int db_console; - bios_bootduid_t bootduid; -#ifdef SOFTRAID - bios_bootsr_t bootsr; - struct sr_boot_volume *bv; -#endif - int i; - u_long delta; - extern u_long efi_loadaddr; - - if ((av = alloc(ac)) == NULL) - panic("alloc for bootarg"); - efi_makebootargs(); - delta = -efi_loadaddr; - if (sa_cleanup != NULL) - (*sa_cleanup)(); - - cd.consdev = cn_tab->cn_dev; - cd.conspeed = com_speed; - cd.consaddr = com_addr; - cd.consfreq = 0; - addbootarg(BOOTARG_CONSDEV, sizeof(cd), &cd); - - if (bootmac != NULL) - addbootarg(BOOTARG_BOOTMAC, sizeof(bios_bootmac_t), bootmac); - - if (db_console != -1) { - ddb.db_console = db_console; - addbootarg(BOOTARG_DDB, sizeof(ddb), &ddb); - } - - bcopy(bootdev_dip->disklabel.d_uid, &bootduid.duid, sizeof(bootduid)); - addbootarg(BOOTARG_BOOTDUID, sizeof(bootduid), &bootduid); - - ucode_load(); - -#ifdef SOFTRAID - if (bootdev_dip->sr_vol != NULL) { - bv = bootdev_dip->sr_vol; - bzero(&bootsr, sizeof(bootsr)); - bcopy(&bv->sbv_uuid, &bootsr.uuid, sizeof(bootsr.uuid)); - if (bv->sbv_maskkey != NULL) - bcopy(bv->sbv_maskkey, &bootsr.maskkey, - sizeof(bootsr.maskkey)); - addbootarg(BOOTARG_BOOTSR, sizeof(bios_bootsr_t), &bootsr); - explicit_bzero(&bootsr, sizeof(bootsr)); - } - - sr_clear_keys(); -#endif - - entry = marks[MARK_ENTRY] & 0x0fffffff; - entry += delta; - - printf("entry point at 0x%lx\n", entry); - - /* Sync the memory map and call ExitBootServices() */ - efi_cleanup(); - - /* Pass memory map to the kernel */ - mem_pass(); - - makebootargs(av, &ac); - - /* - * Move the loaded kernel image to the usual place after calling - * ExitBootServices(). - */ - memmove((void *)marks[MARK_START] + delta, (void *)marks[MARK_START], - marks[MARK_END] - marks[MARK_START]); - for (i = 0; i < MARK_MAX; i++) - marks[i] += delta; - - /* stack and the gung is ok at this point, so, no need for asm setup */ - (*(startfuncp)entry)(howto, bootdev, BOOTARG_APIVER, marks[MARK_END], - extmem, cnvmem, ac, (int)av); - - /* not reached */ -} - -void -ucode_load(void) -{ - uint32_t model, family, stepping; - uint32_t dummy, signature; - uint32_t vendor[4]; - bios_ucode_t uc; - struct stat sb; - char path[128]; - size_t buflen; - char *buf; - int fd; - - CPUID(0, dummy, vendor[0], vendor[2], vendor[1]); - vendor[3] = 0; /* NULL-terminate */ - if (strcmp((char *)vendor, "GenuineIntel") != 0) - return; - - CPUID(1, signature, dummy, dummy, dummy); - family = (signature >> 8) & 0x0f; - model = (signature >> 4) & 0x0f; - if (family == 0x6 || family == 0xf) { - family += (signature >> 20) & 0xff; - model += ((signature >> 16) & 0x0f) << 4; - } - stepping = (signature >> 0) & 0x0f; - - snprintf(path, sizeof(path), "%s:/etc/firmware/intel/%02x-%02x-%02x", - cmd.bootdev, family, model, stepping); - - fd = open(path, O_RDONLY); - if (fd == -1) - return; - - if (fstat(fd, &sb) == -1) - return; - - buflen = sb.st_size; - if (buflen > 128*1024) { - printf("ucode too large\n"); - return; - } - - buf = (char *)(1*1024*1024); - - if (read(fd, buf, buflen) != buflen) { - close(fd); - return; - } - - uc.uc_addr = (uint64_t)buf; - uc.uc_size = (uint64_t)buflen; - addbootarg(BOOTARG_UCODE, sizeof(uc), &uc); - - close(fd); -} diff --git a/sys/arch/amd64/stand/efi32/heap.h b/sys/arch/amd64/stand/efi32/heap.h deleted file mode 100644 index 618db452cf8..00000000000 --- a/sys/arch/amd64/stand/efi32/heap.h +++ /dev/null @@ -1,29 +0,0 @@ -/* $OpenBSD: heap.h,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -#include - -static char *top = NULL; -#define NEEDS_HEAP_INIT 1 - -static void -heap_init(void) -{ - extern EFI_PHYSICAL_ADDRESS heap; - if (top == NULL) - top = (char *)(uintptr_t)heap; -} diff --git a/sys/arch/amd64/stand/efi32/ldscript.i386 b/sys/arch/amd64/stand/efi32/ldscript.i386 deleted file mode 100644 index 975e36c14f5..00000000000 --- a/sys/arch/amd64/stand/efi32/ldscript.i386 +++ /dev/null @@ -1,75 +0,0 @@ -OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") -OUTPUT_ARCH(i386) -ENTRY(_start) -SECTIONS -{ - . = 0; - ImageBase = .; - .hash : { *(.hash) } /* this MUST come first! */ - . = ALIGN(4096); - .text : - { - *(.text) - *(.text.*) - *(.gnu.linkonce.t.*) - } - . = ALIGN(4096); - .sdata : - { - *(.got.plt) - *(.got) - *(.srodata) - *(.sdata) - *(.sbss) - *(.scommon) - } - . = ALIGN(4096); - .data : - { - *(.rodata*) - *(.data) - *(.data1) - *(.data.*) - *(.sdata) - *(.got.plt) - *(.got) - /* the EFI loader doesn't seem to like a .bss section, so we stick - it all into .data: */ - *(.sbss) - *(.scommon) - *(.dynbss) - *(.bss) - *(COMMON) - } - . = ALIGN(4096); - .dynamic : { *(.dynamic) } - . = ALIGN(4096); - .rel : - { - *(.rel.data) - *(.rel.data.*) - *(.rel.got) - *(.rel.stab) - *(.data.rel.ro.local) - *(.data.rel.local) - *(.data.rel.ro) - *(.data.rel*) - } - . = ALIGN(4096); - .reloc : /* This is the PECOFF .reloc section! */ - { - *(.reloc) - } - . = ALIGN(4096); - .dynsym : { *(.dynsym) } - . = ALIGN(4096); - .dynstr : { *(.dynstr) } - . = ALIGN(4096); - /DISCARD/ : - { - *(.rel.reloc) - *(.eh_frame) - *(.note.GNU-stack) - } - .comment 0 : { *(.comment) } -} diff --git a/sys/arch/amd64/stand/efi32/machdep.c b/sys/arch/amd64/stand/efi32/machdep.c deleted file mode 100644 index 5e50922f3c8..00000000000 --- a/sys/arch/amd64/stand/efi32/machdep.c +++ /dev/null @@ -1,95 +0,0 @@ -/* $OpenBSD: machdep.c,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 2004 Tom Cosgrove - * Copyright (c) 1997-1999 Michael Shalayeff - * 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 OR HIS RELATIVES 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 MIND, 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 "libsa.h" -#include "biosdev.h" -#include -#include -#include -#include - -#include "efiboot.h" - -volatile struct BIOS_regs BIOS_regs; - -#if defined(DEBUG) -#define CKPT(c) (*(u_int16_t*)0xb8148 = 0x4700 + (c)) -#else -#define CKPT(c) /* c */ -#endif - -const char *vmm_hv_signature = VMM_HV_SIGNATURE; - -void -machdep(void) -{ - int i, j, vmm = 0; - struct i386_boot_probes *pr; - uint32_t dummy, ebx, ecx, edx; - dev_t dev; - - /* - * The list of probe routines is now in conf.c. - */ - for (i = 0; i < nibprobes; i++) { - pr = &probe_list[i]; - if (pr != NULL) { - printf("%s:", pr->name); - - for (j = 0; j < pr->count; j++) { - (*(pr->probes)[j])(); - } - - printf("\n"); - } - } - - CPUID(0x1, dummy, dummy, ecx, dummy); - if (ecx & CPUIDECX_HV) { - CPUID(0x40000000, dummy, ebx, ecx, edx); - if (memcmp(&ebx, &vmm_hv_signature[0], sizeof(uint32_t)) == 0 && - memcmp(&ecx, &vmm_hv_signature[4], sizeof(uint32_t)) == 0 && - memcmp(&edx, &vmm_hv_signature[8], sizeof(uint32_t)) == 0) - vmm = 1; - } - - /* Set console to com0/115200 by default in vmm */ - if (vmm) { - dev = ttydev("com0"); - cnspeed(dev, 115200); - cnset(dev); - } -} - -int -check_skip_conf(void) -{ - /* Return non-zero (skip boot.conf) if Control "shift" key down */ - return (efi_cons_getshifts(0) & 0x04); -} diff --git a/sys/arch/amd64/stand/efi32/memprobe.c b/sys/arch/amd64/stand/efi32/memprobe.c deleted file mode 100644 index e119a990737..00000000000 --- a/sys/arch/amd64/stand/efi32/memprobe.c +++ /dev/null @@ -1,173 +0,0 @@ -/* $OpenBSD: memprobe.c,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 1997-1999 Michael Shalayeff - * Copyright (c) 1997-1999 Tobias Weingartner - * 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 REGENTS 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 -#include -#include -#include -#include "libsa.h" - -u_int cnvmem, extmem; /* XXX - compatibility */ - -bios_memmap_t bios_memmap[64]; /* This is easier */ - -void -dump_biosmem(bios_memmap_t *tm) -{ - register bios_memmap_t *p; - register u_int total = 0; - - if (tm == NULL) - tm = bios_memmap; - - for (p = tm; p->type != BIOS_MAP_END; p++) { - printf("Region %ld: type %u at 0x%llx for %uKB\n", - (long)(p - tm), p->type, p->addr, - (u_int)(p->size / 1024)); - - if (p->type == BIOS_MAP_FREE) - total += p->size / 1024; - } - - printf("Low ram: %dKB High ram: %dKB\n", cnvmem, extmem); - printf("Total free memory: %uKB\n", total); -} - -int -mem_limit(long long ml) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - if (p->type != BIOS_MAP_FREE) - continue; - - /* Wholly above limit, nuke it */ - if ((sp >= ml) && (ep >= ml)) { - bcopy (p + 1, p, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p); - } else if ((sp < ml) && (ep >= ml)) { - p->size -= (ep - ml); - } - } - return 0; -} - -int -mem_delete(long long sa, long long ea) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - if (p->type == BIOS_MAP_FREE) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - /* can we eat it as a whole? */ - if ((sa - sp) <= PAGE_SIZE && (ep - ea) <= PAGE_SIZE) { - bcopy(p + 1, p, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p); - break; - /* eat head or legs */ - } else if (sa <= sp && sp < ea) { - p->addr = ea; - p->size = ep - ea; - break; - } else if (sa < ep && ep <= ea) { - p->size = sa - sp; - break; - } else if (sp < sa && ea < ep) { - /* bite in half */ - bcopy(p, p + 1, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p - - sizeof(bios_memmap[0])); - p[1].addr = ea; - p[1].size = ep - ea; - p->size = sa - sp; - break; - } - } - } - return 0; -} - -int -mem_add(long long sa, long long ea) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - if (p->type == BIOS_MAP_FREE) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - /* is it already there? */ - if (sp <= sa && ea <= ep) { - break; - /* join head or legs */ - } else if (sa < sp && sp <= ea) { - p->addr = sa; - p->size = ep - sa; - break; - } else if (sa <= ep && ep < ea) { - p->size = ea - sp; - break; - } else if (ea < sp) { - /* insert before */ - bcopy(p, p + 1, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)(p - 1)); - p->addr = sa; - p->size = ea - sa; - break; - } - } - } - - /* meaning add new item at the end of the list */ - if (p->type == BIOS_MAP_END) { - p[1] = p[0]; - p->type = BIOS_MAP_FREE; - p->addr = sa; - p->size = ea - sa; - } - - return 0; -} - -void -mem_pass(void) -{ - bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) - ; - addbootarg(BOOTARG_MEMMAP, (p - bios_memmap + 1) * sizeof *bios_memmap, - bios_memmap); -} diff --git a/sys/arch/amd64/stand/efi32/run_i386.S b/sys/arch/amd64/stand/efi32/run_i386.S deleted file mode 100644 index 82bc512b2cc..00000000000 --- a/sys/arch/amd64/stand/efi32/run_i386.S +++ /dev/null @@ -1,115 +0,0 @@ -/* $OpenBSD: run_i386.S,v 1.3 2022/12/08 01:25:44 guenther Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#define CODE_SEGMENT 0x10 -#define DATA_SEGMENT 0x18 - - .globl run_i386_size -run_i386_size: - .long run_i386_end - run_i386_start - - .align 4 - .text - .globl run_i386_start -run_i386_start: -start: - /* - * run_i386(_start) is to call the loaded kernel's start() with - * 32bit segment mode from x64 mode. - * %rdi == loaded start address, %rsi == kernel start address - */ - - /* re-arrange the parameters for the x86 calling convention */ - mov %edx, (run_i386_end - start - 0x20)(%rdi) - mov %ecx, (run_i386_end - start - 0x1c)(%rdi) - mov %r8d, (run_i386_end - start - 0x18)(%rdi) - mov %r9d, (run_i386_end - start - 0x14)(%rdi) - mov 0x8(%rsp), %edx - mov %edx, (run_i386_end - start - 0x10)(%rdi) - mov 0x10(%rsp), %edx - mov %edx, (run_i386_end - start - 0xc)(%rdi) - mov 0x18(%rsp), %edx - mov %edx, (run_i386_end - start - 0x8)(%rdi) - mov 0x20(%rsp), %edx - mov %edx, (run_i386_end - start - 0x4)(%rdi) - - /* Prepare jump address */ - lea (start32a - start)(%rdi), %rax - movl %eax, (start32r - start)(%rdi) - - cli - - /* Setup GDT */ - lea (gdt - start)(%rdi), %rax - mov %rax, (gdtrr - start)(%rdi) - lgdt (gdtr - start)(%rdi) - - /* Jump to set %cs */ - ljmp *(start32r - start)(%rdi) - - .align 4 -start32a: - .code32 - movl $DATA_SEGMENT, %eax - movl %eax, %ds - movl %eax, %es - movl %eax, %fs - movl %eax, %gs - movl %eax, %ss - - lea (run_i386_end - start - 0x20)(%edi), %eax - mov %eax, %esp - - /* Disable Paging in CR0 */ - movl %cr0, %eax - andl $(~CR0_PG), %eax - movl %eax, %cr0 - - /* Disable PAE in CR4 */ - movl %cr4, %eax - andl $(~CR4_PAE), %eax - movl %eax, %cr4 - - jmp start32b -start32b: - .code32 - - call *%esi - - .align 4 -start32r: - .long 0 - .long CODE_SEGMENT - .align 4 -gdt: - .long 0, 0 - .long 0, 0 - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00 - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00 -gdtr: - .word gdtr - gdt -gdtrr: - .quad -start32end: - /* Space for the stack */ - .align 4 - .space 8192 -run_i386_end: diff --git a/sys/arch/amd64/stand/efi32/run_i386.h b/sys/arch/amd64/stand/efi32/run_i386.h deleted file mode 100644 index f20d2d4f19a..00000000000 --- a/sys/arch/amd64/stand/efi32/run_i386.h +++ /dev/null @@ -1,21 +0,0 @@ -/* $OpenBSD: run_i386.h,v 1.1 2019/05/11 02:33:34 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -extern void run_i386_start(u_long, u_long, int, int, int, int, int, int, - int, int) __attribute__ ((noreturn)); -extern u_int run_i386_size; diff --git a/sys/arch/amd64/stand/efi32/self_reloc.c b/sys/arch/amd64/stand/efi32/self_reloc.c deleted file mode 100644 index c3997763dae..00000000000 --- a/sys/arch/amd64/stand/efi32/self_reloc.c +++ /dev/null @@ -1,103 +0,0 @@ -/* $OpenBSD: self_reloc.c,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ -/*- - * Copyright (c) 2008-2010 Rui Paulo - * 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 -#include - -#define ELFSIZE 32 -#define ElfW_Rel Elf32_Rel -#define ElfW_Dyn Elf32_Dyn -#define ELFW_R_TYPE ELF32_R_TYPE - -#include - -#define RELOC_TYPE_NONE R_386_NONE -#define RELOC_TYPE_RELATIVE R_386_RELATIVE - -/* - * A simple elf relocator. - */ -void -self_reloc(Elf_Addr baseaddr, ElfW_Dyn *dynamic) -{ - Elf_Word relsz, relent; - Elf_Addr *newaddr; - ElfW_Rel *rel = NULL; - 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. We rely on the object having been - * linked at 0, so that the difference between the load and link - * address is the same as the load address. - */ - 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: - newaddr = (Elf_Addr *)(rel->r_offset + baseaddr); -#ifdef ELF_RELA - /* Addend relative to the base address. */ - *newaddr = baseaddr + rel->r_addend; -#else - /* Address relative to the base address. */ - *newaddr += baseaddr; -#endif - break; - default: - /* XXX: do we need other relocations ? */ - break; - } - rel = (ElfW_Rel *) ((caddr_t) rel + relent); - } -} diff --git a/sys/arch/amd64/stand/efi32/start_i386.S b/sys/arch/amd64/stand/efi32/start_i386.S deleted file mode 100644 index 016ab93d15a..00000000000 --- a/sys/arch/amd64/stand/efi32/start_i386.S +++ /dev/null @@ -1,68 +0,0 @@ -/*- - * Copyright (c) 2008-2010 Rui Paulo - * 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: head/sys/boot/efi/loader/arch/i386/start.S 282728 2015-05-10 13:30:21Z ian $ - */ - - .text - -#include - -#define EFI_SUCCESS 0 - -/* - * EFI entry point. - * _start(EFI_IMAGE image_handle, EFI_SYSTEM_TABLE *system_table); - * - * We calculate the base address along with _DYNAMIC, relocate us and finally - * pass control to efi_main. - */ - -ENTRY(_start) - pushl %ebp - movl %esp, %ebp - - pushl 12(%ebp) /* image_handle */ - pushl 8(%ebp) /* system_table */ - call 0f -0: popl %eax - movl %eax, %ebx - addl $ImageBase-0b, %eax - addl $_DYNAMIC-0b, %ebx - pushl %ebx /* dynamic */ - pushl %eax /* ImageBase */ - call self_reloc - popl %ebx /* remove ImageBase from the stack */ - popl %ebx /* remove dynamic from the stack */ - call efi_main -1: leave - ret -END(_start) - - .data - .section .reloc, "a" - .long 0 - .long 10 - .word 0 diff --git a/sys/arch/amd64/stand/efi64/Makefile b/sys/arch/amd64/stand/efi64/Makefile deleted file mode 100644 index db770e703e5..00000000000 --- a/sys/arch/amd64/stand/efi64/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ - -.if ${MACHINE} == "amd64" - -SUBDIR= bootx64 - -.endif - -.include diff --git a/sys/arch/amd64/stand/efi64/Makefile.common b/sys/arch/amd64/stand/efi64/Makefile.common deleted file mode 100644 index 6676e012d48..00000000000 --- a/sys/arch/amd64/stand/efi64/Makefile.common +++ /dev/null @@ -1,79 +0,0 @@ -# $OpenBSD: Makefile.common,v 1.5 2020/03/05 16:36:30 otto Exp $ - -S= ${.CURDIR}/../../../../.. -SADIR= ${.CURDIR}/../.. -EFIDIR= ${S}/stand/efi - -OBJCOPY?= objcopy -OBJDUMP?= objdump - -EFI_HEAP_LIMIT= 0xc00000 - -LDFLAGS+= -nostdlib -T${.CURDIR}/../${LDSCRIPT} -Bsymbolic -shared - -COPTS+= -DEFIBOOT -DFWRANDOM -DNEEDS_HEAP_H -I${.CURDIR}/.. -COPTS+= -I${EFIDIR}/include -I${S}/stand/boot -COPTS+= -ffreestanding -std=gnu99 -COPTS+= -fshort-wchar -fPIC -mno-red-zone -.if ${SOFTRAID:L} == "yes" -COPTS+= -DSOFTRAID -.endif -COPTS+= -D_STANDALONE -nostdinc -fno-builtin - -AFLAGS+= -pipe -fPIC - -.PATH: ${.CURDIR}/.. -SRCS+= self_reloc.c -SRCS+= efiboot.c efidev.c efipxe.c efirng.c -SRCS+= conf.c dev_i386.c cmd_i386.c diskprobe.c exec_i386.c machdep.c -SRCS+= memprobe.c - -.PATH: ${S}/stand/boot -SRCS+= boot.c bootarg.c cmd.c vars.c - -.PATH: ${S}/lib/libsa -SRCS+= alloc.c ctime.c exit.c getchar.c hexdump.c \ - memcmp.c memcpy.c memmove.c memset.c printf.c \ - putchar.c snprintf.c strcmp.c strerror.c strlen.c strncmp.c strncpy.c \ - strtol.c strtoll.c -SRCS+= close.c closeall.c cons.c cread.c dev.c disklabel.c dkcksum.c fchmod.c \ - fstat.c lseek.c open.c read.c readdir.c stat.c -SRCS+= ufs.c ufs2.c cd9660.c -.if ${SOFTRAID:L} == "yes" -SRCS+= aes_xts.c bcrypt_pbkdf.c blowfish.c explicit_bzero.c hmac_sha1.c \ - pkcs5_pbkdf2.c rijndael.c sha1.c sha2.c softraid.c -.endif - -.PATH: ${S}/lib/libz -SRCS+= adler32.c crc32.c inflate.c inftrees.c - -.PATH: ${S}/lib/libkern -SRCS+= divdi3.c moddi3.c qdivrem.c -SRCS+= strlcpy.c - -.PATH: ${SADIR}/libsa -SRCS+= loadfile.c arc4.c elf64.c elf32.c - -.if ${SOFTRAID:L} == "yes" -SRCS+= softraid_amd64.c -.endif - -PROG.so= ${PROG:S/.EFI/.so/} -CLEANFILES+= ${PROG.so} ${PROG.so}.tmp - -${PROG}: ${PROG.so} - ${OBJCOPY} -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ - -j .rel.dyn -j .rela -j .rela.dyn -j .reloc \ - --target=${OBJFMT} ${PROG.so} ${.TARGET} - -.include -CFLAGS+= -Wno-pointer-sign -CPPFLAGS+= -DSMALL -DSLOW -DNOBYFOUR -D__INTERNAL_LIBSA_CREAD -CPPFLAGS+= -DHEAP_LIMIT=${EFI_HEAP_LIMIT} -DHIBERNATE - -${PROG.so}: ${OBJS} - ${LD} ${LDFLAGS} -o ${.TARGET}.tmp ${OBJS} ${LDADD} - @if ${OBJDUMP} -t ${.TARGET}.tmp | grep 'UND'; then \ - (echo Undefined symbols; false); \ - fi - mv ${.TARGET}.tmp ${.TARGET} diff --git a/sys/arch/amd64/stand/efi64/Makefile.inc b/sys/arch/amd64/stand/efi64/Makefile.inc deleted file mode 100644 index da89f9b0106..00000000000 --- a/sys/arch/amd64/stand/efi64/Makefile.inc +++ /dev/null @@ -1,3 +0,0 @@ -# $OpenBSD: Makefile.inc,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ - -.include "${.CURDIR}/../../Makefile.inc" diff --git a/sys/arch/amd64/stand/efi64/bootx64/Makefile b/sys/arch/amd64/stand/efi64/bootx64/Makefile deleted file mode 100644 index 0222168b753..00000000000 --- a/sys/arch/amd64/stand/efi64/bootx64/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# $OpenBSD: Makefile,v 1.2 2020/06/14 16:00:11 deraadt Exp $ - -.include - -PROG= BOOTX64.EFI -NOMAN= # -OBJFMT= efi-app-x86_64 -SOFTRAID= yes -COPTS+= -I${EFIDIR}/include/amd64 -SRCS+= start_amd64.S run_i386.S mdrandom.c eficall.S -LDSCRIPT= ldscript.amd64 - -.include "${.CURDIR}/../Makefile.common" - diff --git a/sys/arch/amd64/stand/efi64/cmd_i386.c b/sys/arch/amd64/stand/efi64/cmd_i386.c deleted file mode 100644 index 95702c29a96..00000000000 --- a/sys/arch/amd64/stand/efi64/cmd_i386.c +++ /dev/null @@ -1,162 +0,0 @@ -/* $OpenBSD: cmd_i386.c,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 1997-1999 Michael Shalayeff - * Copyright (c) 1997 Tobias Weingartner - * 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 REGENTS 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 -#include -#include -#include -#include "disk.h" -#include "biosdev.h" -#include "libsa.h" -#include - -#include "efiboot.h" -#include "efidev.h" - -extern const char version[]; - -int Xboot(void); -int Xcomaddr(void); -int Xdiskinfo(void); -int Xmemory(void); -int Xregs(void); - -/* From gidt.S */ -int bootbuf(void *, int); - -const struct cmd_table cmd_machine[] = { - { "comaddr", CMDT_CMD, Xcomaddr }, - { "diskinfo", CMDT_CMD, Xdiskinfo }, - { "memory", CMDT_CMD, Xmemory }, - { "video", CMDT_CMD, Xvideo_efi }, - { "gop", CMDT_CMD, Xgop_efi }, - { "exit", CMDT_CMD, Xexit_efi }, - { "poweroff", CMDT_CMD, Xpoweroff_efi }, -#ifdef DEBUG - { "regs", CMDT_CMD, Xregs }, -#endif - { NULL, 0 } -}; - -int -Xdiskinfo(void) -{ - efi_dump_diskinfo(); - return 0; -} - -#ifdef DEBUG -int -Xregs(void) -{ - DUMP_REGS; - return 0; -} -#endif - -int -Xmemory(void) -{ - if (cmd.argc >= 2) { - int i; - /* parse the memory specs */ - - for (i = 1; i < cmd.argc; i++) { - char *p; - long long addr, size; - - p = cmd.argv[i]; - - size = strtoll(p + 1, &p, 0); - /* Size the size */ - switch (*p) { - case 'G': - case 'g': - size *= 1024; - case 'M': - case 'm': - size *= 1024; - case 'K': - case 'k': - size *= 1024; - p++; - } - - /* Handle (possibly non-existent) address part */ - switch (*p) { - case '@': - addr = strtoll(p + 1, NULL, 0); - break; - - /* Adjust address if we don't need it */ - default: - if (cmd.argv[i][0] == '=') - addr = -1; - else - addr = 0; - } - - if (addr == 0 || size == 0) { - printf("bad language\n"); - return 0; - } else { - switch (cmd.argv[i][0]) { - case '-': - mem_delete(addr, addr + size); - break; - case '+': - mem_add(addr, addr + size); - break; - case '=': - mem_limit(size); - break; - default : - printf("bad OP\n"); - return 0; - } - } - } - } - - dump_biosmem(NULL); - - return 0; -} - -int -Xcomaddr(void) -{ - extern int com_addr; - - if (cmd.argc >= 2) - com_addr = (int)strtol(cmd.argv[1], NULL, 0); - - return 0; -} diff --git a/sys/arch/amd64/stand/efi64/conf.c b/sys/arch/amd64/stand/efi64/conf.c deleted file mode 100644 index 19428b00efa..00000000000 --- a/sys/arch/amd64/stand/efi64/conf.c +++ /dev/null @@ -1,95 +0,0 @@ -/* $OpenBSD: conf.c,v 1.10 2022/08/12 20:18:58 stsp Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * 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 REGENTS 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 -#include -#include -#include -#include -#include -#include -#include - -#include "disk.h" -#include "efiboot.h" -#include "efidev.h" -#include "efipxe.h" - -const char version[] = "3.54"; - -#ifdef EFI_DEBUG -int debug = 0; -#endif - -void (*sa_cleanup)(void) = NULL; - - -void (*i386_probe1[])(void) = { - cninit, efi_memprobe -}; -void (*i386_probe2[])(void) = { - efi_pxeprobe, efi_diskprobe, diskprobe -}; - -struct i386_boot_probes probe_list[] = { - { "probing", i386_probe1, nitems(i386_probe1) }, - { "disk", i386_probe2, nitems(i386_probe2) } -}; -int nibprobes = nitems(probe_list); - - -struct fs_ops file_system[] = { - { tftp_open, tftp_close, tftp_read, tftp_write, tftp_seek, - tftp_stat, tftp_readdir }, - { ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, - ufs_stat, ufs_readdir, ufs_fchmod }, - { ufs2_open, ufs2_close, ufs2_read, ufs2_write, ufs2_seek, - ufs2_stat, ufs2_readdir, ufs2_fchmod }, - { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, - cd9660_stat, cd9660_readdir }, -#ifdef notdef - { fat_open, fat_close, fat_read, fat_write, fat_seek, - fat_stat, fat_readdir }, - { nfs_open, nfs_close, nfs_read, nfs_write, nfs_seek, - nfs_stat, nfs_readdir }, -#endif -}; -int nfsys = nitems(file_system); - -struct devsw devsw[] = { - { "TFTP", tftpstrategy, tftpopen, tftpclose, tftpioctl }, - { "EFI", efistrategy, efiopen, eficlose, efiioctl }, -}; -int ndevs = nitems(devsw); - -struct consdev constab[] = { - { efi_cons_probe, efi_cons_init, efi_cons_getc, efi_cons_putc }, - { efi_com_probe, efi_com_init, efi_com_getc, efi_com_putc }, - { NULL } -}; -struct consdev *cn_tab = constab; diff --git a/sys/arch/amd64/stand/efi64/dev_i386.c b/sys/arch/amd64/stand/efi64/dev_i386.c deleted file mode 100644 index 6ffd87f8975..00000000000 --- a/sys/arch/amd64/stand/efi64/dev_i386.c +++ /dev/null @@ -1,207 +0,0 @@ -/* $OpenBSD: dev_i386.c,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 1996-1999 Michael Shalayeff - * 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 OR HIS RELATIVES 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 MIND, 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 -#include -#include -#include - -#include "libsa.h" -#include "biosdev.h" -#include "disk.h" - -#ifdef SOFTRAID -#include -#include -#include -#include "softraid_amd64.h" -#endif - -extern int debug; - -/* XXX use slot for 'rd' for 'hd' pseudo-device */ -const char bdevs[][4] = { - "wd", "", "fd", "", "sd", "st", "cd", "", - "", "", "", "", "", "", "", "", "", "hd", "" -}; -const int nbdevs = nitems(bdevs); - -const char cdevs[][4] = { - "cn", "", "", "", "", "", "", "", - "com", "", "", "", "pc" -}; -const int ncdevs = nitems(cdevs); - -/* pass dev_t to the open routines */ -int -devopen(struct open_file *f, const char *fname, char **file) -{ - struct devsw *dp = devsw; - register int i, rc = 1; - - *file = (char *)fname; - -#ifdef DEBUG - if (debug) - printf("devopen:"); -#endif - - for (i = 0; i < ndevs && rc != 0; dp++, i++) { -#ifdef DEBUG - if (debug) - printf(" %s: ", dp->dv_name); -#endif - if ((rc = (*dp->dv_open)(f, file)) == 0) { - f->f_dev = dp; - if (strcmp("TFTP", dp->dv_name) != 0) { - /* - * Clear bootmac, to signal that we loaded - * this file from a non-network device. - */ - extern char *bootmac; - bootmac = NULL; - } - return 0; - } -#ifdef DEBUG - else if (debug) - printf("%d", rc); -#endif - - } -#ifdef DEBUG - if (debug) - putchar('\n'); -#endif - - if ((f->f_flags & F_NODEV) == 0) - f->f_dev = dp; - - return rc; -} - -void -devboot(dev_t bootdev, char *p) -{ -#ifdef SOFTRAID - struct sr_boot_volume *bv; - struct sr_boot_chunk *bc; - struct diskinfo *dip = NULL; -#endif - int sr_boot_vol = -1; - int part_type = FS_UNUSED; - - if (!bootdev) { - *p++ = 't'; - *p++ = 'f'; - *p++ = 't'; - *p++ = 'p'; - *p = '\0'; - return; - } - -#ifdef SOFTRAID - /* - * Determine the partition type for the 'a' partition of the - * boot device. - */ - TAILQ_FOREACH(dip, &disklist, list) - if (dip->bios_info.bios_number == bootdev && - (dip->bios_info.flags & BDI_BADLABEL) == 0) - part_type = dip->disklabel.d_partitions[0].p_fstype; - - /* - * See if we booted from a disk that is a member of a bootable - * softraid volume. - */ - SLIST_FOREACH(bv, &sr_volumes, sbv_link) { - if (bv->sbv_flags & BIOC_SCBOOTABLE) - SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) - if (bc->sbc_disk == bootdev) - sr_boot_vol = bv->sbv_unit; - if (sr_boot_vol != -1) - break; - } -#endif - - if (sr_boot_vol != -1 && part_type != FS_BSDFFS) { - *p++ = 's'; - *p++ = 'r'; - *p++ = '0' + sr_boot_vol; - } else if (bootdev & 0x100) { - *p++ = 'c'; - *p++ = 'd'; - *p++ = '0'; - } else { - if (bootdev & 0x80) - *p++ = 'h'; - else - *p++ = 'f'; - *p++ = 'd'; - *p++ = '0' + (bootdev & 0x7f); - } - *p++ = 'a'; - *p = '\0'; -} - -char ttyname_buf[8]; - -char * -ttyname(int fd) -{ - snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d", - cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev)); - - return ttyname_buf; -} - -dev_t -ttydev(char *name) -{ - int i, unit = -1; - char *no = name + strlen(name) - 1; - - while (no >= name && *no >= '0' && *no <= '9') - unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0'; - if (no < name || unit < 0) - return NODEV; - for (i = 0; i < ncdevs; i++) - if (strncmp(name, cdevs[i], no - name + 1) == 0) - return makedev(i, unit); - return NODEV; -} - -int -cnspeed(dev_t dev, int sp) -{ - if (major(dev) == 8) /* comN */ - return comspeed(dev, sp); - - /* pc0 and anything else */ - return 9600; -} diff --git a/sys/arch/amd64/stand/efi64/diskprobe.c b/sys/arch/amd64/stand/efi64/diskprobe.c deleted file mode 100644 index 48f089c296f..00000000000 --- a/sys/arch/amd64/stand/efi64/diskprobe.c +++ /dev/null @@ -1,301 +0,0 @@ -/* $OpenBSD: diskprobe.c,v 1.2 2020/12/09 18:10:18 krw Exp $ */ - -/* - * Copyright (c) 1997 Tobias Weingartner - * 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 REGENTS 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. - * - */ - -/* We want the disk type names from disklabel.h */ -#undef DKTYPENAMES - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "disk.h" -#include "biosdev.h" -#include "libsa.h" - -#ifdef SOFTRAID -#include "softraid_amd64.h" -#endif -#include "efidev.h" - -#define MAX_CKSUMLEN MAXBSIZE / DEV_BSIZE /* Max # of blks to cksum */ - -/* Local Prototypes */ -static int disksum(int); - -int bootdev_has_hibernate(void); /* export for loadfile() */ - -/* List of disk devices we found/probed */ -struct disklist_lh disklist; - -/* Pointer to boot device */ -struct diskinfo *bootdev_dip; - -extern int debug; -extern int bios_bootdev; -extern int bios_cddev; - -static void -efi_hardprobe(void) -{ - int n; - struct diskinfo *dip, *dipt; - u_int bsdunit, type = 0; - u_int scsi= 0, ide = 0, atapi = 0; - extern struct disklist_lh - efi_disklist; - - n = 0; - TAILQ_FOREACH_SAFE(dip, &efi_disklist, list, dipt) { - TAILQ_REMOVE(&efi_disklist, dip, list); - n = scsi + ide; - - /* Try to find the label, to figure out device type */ - if ((efi_getdisklabel(dip->efi_info, &dip->disklabel))) { - type = 0; - printf(" hd%d*", n); - bsdunit = ide++; - } else { - /* Best guess */ - switch (dip->disklabel.d_type) { - case DTYPE_SCSI: - type = 4; - bsdunit = scsi++; - dip->bios_info.flags |= BDI_GOODLABEL; - break; - - case DTYPE_ESDI: - case DTYPE_ST506: - type = 0; - bsdunit = ide++; - dip->bios_info.flags |= BDI_GOODLABEL; - break; - - case DTYPE_ATAPI: - type = 6; - n = atapi; - bsdunit = atapi++; - dip->bios_info.flags |= BDI_GOODLABEL - | BDI_EL_TORITO; - break; - - default: - dip->bios_info.flags |= BDI_BADLABEL; - type = 0; /* XXX Suggest IDE */ - bsdunit = ide++; - } - printf(" %cd%d", (type == 6)? 'c' : 'h', n); - } - if (type != 6) - dip->bios_info.bios_number = 0x80 | n; - else - dip->bios_info.bios_number = 0xe0 | n; - - dip->bios_info.checksum = 0; /* just in case */ - /* Fill out best we can */ - dip->bsddev = dip->bios_info.bsd_dev = - MAKEBOOTDEV(type, 0, 0, bsdunit, RAW_PART); - check_hibernate(dip); - - /* Add to queue of disks */ - TAILQ_INSERT_TAIL(&disklist, dip, list); - n++; - } -} - -/* Probe for all BIOS supported disks */ -u_int32_t bios_cksumlen; -void -diskprobe(void) -{ - struct diskinfo *dip; - int i; - - /* These get passed to kernel */ - bios_diskinfo_t *bios_diskinfo; - - /* Init stuff */ - TAILQ_INIT(&disklist); - - efi_hardprobe(); - -#ifdef SOFTRAID - srprobe(); -#endif - - /* Checksumming of hard disks */ - for (i = 0; disksum(i++) && i < MAX_CKSUMLEN; ) - ; - bios_cksumlen = i; - - /* Get space for passing bios_diskinfo stuff to kernel */ - for (i = 0, dip = TAILQ_FIRST(&disklist); dip; - dip = TAILQ_NEXT(dip, list)) - i++; - bios_diskinfo = alloc(++i * sizeof(bios_diskinfo_t)); - - /* Copy out the bios_diskinfo stuff */ - for (i = 0, dip = TAILQ_FIRST(&disklist); dip; - dip = TAILQ_NEXT(dip, list)) - bios_diskinfo[i++] = dip->bios_info; - - bios_diskinfo[i++].bios_number = -1; - /* Register for kernel use */ - addbootarg(BOOTARG_CKSUMLEN, sizeof(u_int32_t), &bios_cksumlen); - addbootarg(BOOTARG_DISKINFO, i * sizeof(bios_diskinfo_t), - bios_diskinfo); -} - -/* Find info on given BIOS disk */ -struct diskinfo * -dklookup(int dev) -{ - struct diskinfo *dip; - - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) - if (dip->bios_info.bios_number == dev) - return dip; - - return NULL; -} - -void -dump_diskinfo(void) -{ - struct diskinfo *dip; - - printf("Disk\tBIOS#\tType\tCyls\tHeads\tSecs\tFlags\tChecksum\n"); - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) { - bios_diskinfo_t *bdi = &dip->bios_info; - int d = bdi->bios_number; - int u = d & 0x7f; - char c; - - if (bdi->flags & BDI_EL_TORITO) { - c = 'c'; - u = 0; - } else { - c = (d & 0x80) ? 'h' : 'f'; - } - - printf("%cd%d\t0x%x\t%s\t%d\t%d\t%d\t0x%x\t0x%x\n", - c, u, d, - (bdi->flags & BDI_BADLABEL)?"*none*":"label", - bdi->bios_cylinders, bdi->bios_heads, bdi->bios_sectors, - bdi->flags, bdi->checksum); - } -} - -/* Find BIOS portion on given BIOS disk - * XXX - Use dklookup() instead. - */ -bios_diskinfo_t * -bios_dklookup(int dev) -{ - struct diskinfo *dip; - - dip = dklookup(dev); - if (dip) - return &dip->bios_info; - - return NULL; -} - -/* - * Checksum one more block on all harddrives - * - * Use the adler32() function from libz, - * as it is quick, small, and available. - */ -int -disksum(int blk) -{ - struct diskinfo *dip, *dip2; - int st, reprobe = 0; - char buf[DEV_BSIZE]; - - for (dip = TAILQ_FIRST(&disklist); dip; dip = TAILQ_NEXT(dip, list)) { - bios_diskinfo_t *bdi = &dip->bios_info; - - /* Skip this disk if it is not a HD or has had an I/O error */ - if (!(bdi->bios_number & 0x80) || bdi->flags & BDI_INVALID) - continue; - - /* Adler32 checksum */ - st = dip->diskio(F_READ, dip, blk, 1, buf); - if (st) { - bdi->flags |= BDI_INVALID; - continue; - } - bdi->checksum = adler32(bdi->checksum, buf, DEV_BSIZE); - - for (dip2 = TAILQ_FIRST(&disklist); dip2 != dip; - dip2 = TAILQ_NEXT(dip2, list)) { - bios_diskinfo_t *bd = &dip2->bios_info; - if ((bd->bios_number & 0x80) && - !(bd->flags & BDI_INVALID) && - bdi->checksum == bd->checksum) - reprobe = 1; - } - } - - return reprobe; -} - -int -bootdev_has_hibernate(void) -{ - return ((bootdev_dip->bios_info.flags & BDI_HIBVALID)? 1 : 0); -} - -void -check_hibernate(struct diskinfo *dip) -{ - daddr_t sec; - int error; - union hibernate_info hib; - - /* read hibernate */ - if (dip->disklabel.d_partitions[1].p_fstype != FS_SWAP || - DL_GETPSIZE(&dip->disklabel.d_partitions[1]) == 0) - return; - - sec = DL_GETPOFFSET(&dip->disklabel.d_partitions[1]) + - DL_GETPSIZE(&dip->disklabel.d_partitions[1]) - - (sizeof(union hibernate_info) / DEV_BSIZE); - - error = dip->strategy(dip, F_READ, sec, sizeof hib, &hib, NULL); - if (error == 0 && hib.magic == HIBERNATE_MAGIC) - dip->bios_info.flags |= BDI_HIBVALID; /* Hibernate present */ -} diff --git a/sys/arch/amd64/stand/efi64/efiboot.c b/sys/arch/amd64/stand/efi64/efiboot.c deleted file mode 100644 index 12b945c2095..00000000000 --- a/sys/arch/amd64/stand/efi64/efiboot.c +++ /dev/null @@ -1,1032 +0,0 @@ -/* $OpenBSD: efiboot.c,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libsa.h" -#include "disk.h" - -#include -#include -#include -#include - -#include "efidev.h" -#include "efiboot.h" -#include "eficall.h" -#include "run_i386.h" - -#define KERN_LOADSPACE_SIZE (32 * 1024 * 1024) - -EFI_SYSTEM_TABLE *ST; -EFI_BOOT_SERVICES *BS; -EFI_RUNTIME_SERVICES *RS; -EFI_HANDLE IH; -EFI_DEVICE_PATH *efi_bootdp = NULL; -EFI_PHYSICAL_ADDRESS heap; -EFI_LOADED_IMAGE *loadedImage; -UINTN heapsiz = 1 * 1024 * 1024; -UINTN mmap_key; -static EFI_GUID imgp_guid = LOADED_IMAGE_PROTOCOL; -static EFI_GUID blkio_guid = BLOCK_IO_PROTOCOL; -static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL; -u_long efi_loadaddr; - -int efi_device_path_depth(EFI_DEVICE_PATH *dp, int); -int efi_device_path_ncmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *, int); -static void efi_heap_init(void); -static void efi_memprobe_internal(void); -static void efi_video_init(void); -static void efi_video_reset(void); -static EFI_STATUS - efi_gop_setmode(int mode); -EFI_STATUS efi_main(EFI_HANDLE, EFI_SYSTEM_TABLE *); - -void (*run_i386)(u_long, u_long, int, int, int, int, int, int, int, int) - __attribute__((noreturn)); - -extern int bios_bootdev; - -EFI_STATUS -efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) -{ - extern char *progname; - EFI_LOADED_IMAGE *imgp; - EFI_DEVICE_PATH *dp0 = NULL, *dp; - EFI_STATUS status; - EFI_PHYSICAL_ADDRESS stack; - - ST = systab; - BS = ST->BootServices; - RS = ST->RuntimeServices; - IH = image; - - /* disable reset by watchdog after 5 minutes */ - EFI_CALL(BS->SetWatchdogTimer, 0, 0, 0, NULL); - - efi_video_init(); - efi_heap_init(); - - status = EFI_CALL(BS->HandleProtocol, image, &imgp_guid, - (void **)&imgp); - if (status == EFI_SUCCESS) - status = EFI_CALL(BS->HandleProtocol, imgp->DeviceHandle, - &devp_guid, (void **)&dp0); - if (status == EFI_SUCCESS) { - for (dp = dp0; !IsDevicePathEnd(dp); - dp = NextDevicePathNode(dp)) { - if (DevicePathType(dp) == MEDIA_DEVICE_PATH && - (DevicePathSubType(dp) == MEDIA_HARDDRIVE_DP || - DevicePathSubType(dp) == MEDIA_CDROM_DP)) { - bios_bootdev = - (DevicePathSubType(dp) == MEDIA_CDROM_DP) - ? 0x1e0 : 0x80; - efi_bootdp = dp0; - break; - } else if (DevicePathType(dp) == MESSAGING_DEVICE_PATH&& - DevicePathSubType(dp) == MSG_MAC_ADDR_DP) { - bios_bootdev = 0x0; - efi_bootdp = dp0; - break; - } - } - } - - /* allocate run_i386_start() on heap */ - if ((run_i386 = alloc(run_i386_size)) == NULL) - panic("alloc() failed"); - memcpy(run_i386, run_i386_start, run_i386_size); - - /* can't use sa_cleanup since printf is used after sa_cleanup() */ - /* sa_cleanup = efi_cleanup; */ - - progname = "BOOTX64"; - - /* - * Move the stack before calling boot(). UEFI on some machines - * locate the stack on our kernel load address. - */ - stack = heap + heapsiz; - asm("movq %0, %%rsp;" - "mov %1, %%edi;" - "call boot;" - :: "r"(stack - 32), "r"(bios_bootdev)); - /* must not reach here */ - return (EFI_SUCCESS); -} - -void -efi_cleanup(void) -{ - int retry; - EFI_STATUS status; - - /* retry once in case of failure */ - for (retry = 1; retry >= 0; retry--) { - efi_memprobe_internal(); /* sync the current map */ - status = EFI_CALL(BS->ExitBootServices, IH, mmap_key); - if (status == EFI_SUCCESS) - break; - if (retry == 0) - panic("ExitBootServices failed (%d)", status); - } -} - -/*********************************************************************** - * Disk - ***********************************************************************/ -struct disklist_lh efi_disklist; - -void -efi_diskprobe(void) -{ - int i, bootdev = 0, depth = -1; - UINTN sz; - EFI_STATUS status; - EFI_HANDLE *handles = NULL; - EFI_BLOCK_IO *blkio; - EFI_BLOCK_IO_MEDIA *media; - struct diskinfo *di; - EFI_DEVICE_PATH *dp; - - TAILQ_INIT(&efi_disklist); - - sz = 0; - status = EFI_CALL(BS->LocateHandle, ByProtocol, &blkio_guid, 0, &sz, 0); - if (status == EFI_BUFFER_TOO_SMALL) { - handles = alloc(sz); - status = EFI_CALL(BS->LocateHandle, ByProtocol, &blkio_guid, - 0, &sz, handles); - } - if (handles == NULL || EFI_ERROR(status)) - panic("BS->LocateHandle() returns %d", status); - - if (efi_bootdp != NULL) - depth = efi_device_path_depth(efi_bootdp, MEDIA_DEVICE_PATH); - - /* - * U-Boot incorrectly represents devices with a single - * MEDIA_DEVICE_PATH component. In that case include that - * component into the matching, otherwise we'll blindly select - * the first device. - */ - if (depth == 0) - depth = 1; - - for (i = 0; i < sz / sizeof(EFI_HANDLE); i++) { - status = EFI_CALL(BS->HandleProtocol, handles[i], &blkio_guid, - (void **)&blkio); - if (EFI_ERROR(status)) - panic("BS->HandleProtocol() returns %d", status); - - media = blkio->Media; - if (media->LogicalPartition || !media->MediaPresent) - continue; - di = alloc(sizeof(struct diskinfo)); - efid_init(di, blkio); - - if (efi_bootdp == NULL || depth == -1 || bootdev != 0) - goto next; - status = EFI_CALL(BS->HandleProtocol, handles[i], &devp_guid, - (void **)&dp); - if (EFI_ERROR(status)) - goto next; - if (efi_device_path_ncmp(efi_bootdp, dp, depth) == 0) { - TAILQ_INSERT_HEAD(&efi_disklist, di, list); - bootdev = 1; - continue; - } -next: - TAILQ_INSERT_TAIL(&efi_disklist, di, list); - } - - free(handles, sz); -} - -/* - * Determine the number of nodes up to, but not including, the first - * node of the specified type. - */ -int -efi_device_path_depth(EFI_DEVICE_PATH *dp, int dptype) -{ - int i; - - for (i = 0; !IsDevicePathEnd(dp); dp = NextDevicePathNode(dp), i++) { - if (DevicePathType(dp) == dptype) - return (i); - } - - return (-1); -} - -int -efi_device_path_ncmp(EFI_DEVICE_PATH *dpa, EFI_DEVICE_PATH *dpb, int deptn) -{ - int i, cmp; - - for (i = 0; i < deptn; i++) { - if (IsDevicePathEnd(dpa) || IsDevicePathEnd(dpb)) - return ((IsDevicePathEnd(dpa) && IsDevicePathEnd(dpb)) - ? 0 : (IsDevicePathEnd(dpa))? -1 : 1); - cmp = DevicePathNodeLength(dpa) - DevicePathNodeLength(dpb); - if (cmp) - return (cmp); - cmp = memcmp(dpa, dpb, DevicePathNodeLength(dpa)); - if (cmp) - return (cmp); - dpa = NextDevicePathNode(dpa); - dpb = NextDevicePathNode(dpb); - } - - return (0); -} - -/*********************************************************************** - * Memory - ***********************************************************************/ -bios_memmap_t bios_memmap[64]; - -static void -efi_heap_init(void) -{ - EFI_STATUS status; - - heap = HEAP_LIMIT; - status = EFI_CALL(BS->AllocatePages, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(heapsiz), &heap); - if (status != EFI_SUCCESS) - panic("BS->AllocatePages()"); -} - -void -efi_memprobe(void) -{ - u_int n = 0; - bios_memmap_t *bm; - EFI_STATUS status; - EFI_PHYSICAL_ADDRESS - addr = 0x10000000ULL; /* Below 256MB */ - - status = EFI_CALL(BS->AllocatePages, AllocateMaxAddress, EfiLoaderData, - EFI_SIZE_TO_PAGES(KERN_LOADSPACE_SIZE), &addr); - if (status != EFI_SUCCESS) - panic("BS->AllocatePages()"); - efi_loadaddr = addr; - - printf(" mem["); - efi_memprobe_internal(); - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->type == BIOS_MAP_FREE && bm->size > 12 * 1024) { - if (n++ != 0) - printf(" "); - if (bm->size > 1024 * 1024) - printf("%uM", bm->size / 1024 / 1024); - else - printf("%uK", bm->size / 1024); - } - } - printf("]"); -} - -static void -efi_memprobe_internal(void) -{ - EFI_STATUS status; - UINTN mapkey, mmsiz, siz; - UINT32 mmver; - EFI_MEMORY_DESCRIPTOR *mm0, *mm; - int i, n; - bios_memmap_t *bm, bm0; - - cnvmem = extmem = 0; - bios_memmap[0].type = BIOS_MAP_END; - - siz = 0; - status = EFI_CALL(BS->GetMemoryMap, &siz, NULL, &mapkey, &mmsiz, - &mmver); - if (status != EFI_BUFFER_TOO_SMALL) - panic("cannot get the size of memory map"); - mm0 = alloc(siz); - status = EFI_CALL(BS->GetMemoryMap, &siz, mm0, &mapkey, &mmsiz, &mmver); - if (status != EFI_SUCCESS) - panic("cannot get the memory map"); - n = siz / mmsiz; - mmap_key = mapkey; - - for (i = 0, mm = mm0; i < n; i++, mm = NextMemoryDescriptor(mm, mmsiz)){ - bm0.type = BIOS_MAP_END; - bm0.addr = mm->PhysicalStart; - bm0.size = mm->NumberOfPages * EFI_PAGE_SIZE; - if (mm->Type == EfiReservedMemoryType || - mm->Type == EfiUnusableMemory || - mm->Type == EfiRuntimeServicesCode || - mm->Type == EfiRuntimeServicesData) - bm0.type = BIOS_MAP_RES; - else if (mm->Type == EfiLoaderCode || - mm->Type == EfiLoaderData || - mm->Type == EfiBootServicesCode || - mm->Type == EfiBootServicesData || - mm->Type == EfiConventionalMemory) - bm0.type = BIOS_MAP_FREE; - else if (mm->Type == EfiACPIReclaimMemory) - bm0.type = BIOS_MAP_ACPI; - else if (mm->Type == EfiACPIMemoryNVS) - bm0.type = BIOS_MAP_NVS; - else - /* - * XXX Is there anything to do for EfiMemoryMappedIO - * XXX EfiMemoryMappedIOPortSpace EfiPalCode? - */ - bm0.type = BIOS_MAP_RES; - - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->type != bm0.type) - continue; - if (bm->addr <= bm0.addr && - bm0.addr <= bm->addr + bm->size) { - bm->size = bm0.addr + bm0.size - bm->addr; - break; - } else if (bm0.addr <= bm->addr && - bm->addr <= bm0.addr + bm0.size) { - bm->size = bm->addr + bm->size - bm0.addr; - bm->addr = bm0.addr; - break; - } - } - if (bm->type == BIOS_MAP_END) { - *bm = bm0; - (++bm)->type = BIOS_MAP_END; - } - } - for (bm = bios_memmap; bm->type != BIOS_MAP_END; bm++) { - if (bm->addr < IOM_BEGIN) /* Below memory hole */ - cnvmem = - max(cnvmem, (bm->addr + bm->size) / 1024); - if (bm->addr >= IOM_END /* Above the memory hole */ && - bm->addr / 1024 == extmem + 1024) - extmem += bm->size / 1024; - } - free(mm0, siz); -} - -/*********************************************************************** - * Console - ***********************************************************************/ -static SIMPLE_TEXT_OUTPUT_INTERFACE *conout = NULL; -static SIMPLE_INPUT_INTERFACE *conin; -static EFI_GUID con_guid - = EFI_CONSOLE_CONTROL_PROTOCOL_GUID; -static EFI_GUID gop_guid - = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; -static EFI_GUID serio_guid - = SERIAL_IO_PROTOCOL; -struct efi_video { - int cols; - int rows; -} efi_video[32]; - -static void -efi_video_init(void) -{ - EFI_CONSOLE_CONTROL_PROTOCOL *conctrl = NULL; - int i, mode80x25, mode100x31; - UINTN cols, rows; - EFI_STATUS status; - - conout = ST->ConOut; - status = EFI_CALL(BS->LocateProtocol, &con_guid, NULL, - (void **)&conctrl); - if (status == EFI_SUCCESS) - (void)EFI_CALL(conctrl->SetMode, conctrl, - EfiConsoleControlScreenText); - mode80x25 = -1; - mode100x31 = -1; - for (i = 0; i < conout->Mode->MaxMode; i++) { - status = EFI_CALL(conout->QueryMode, conout, i, &cols, &rows); - if (EFI_ERROR(status)) - continue; - if (mode80x25 < 0 && cols == 80 && rows == 25) - mode80x25 = i; - if (mode100x31 < 0 && cols == 100 && rows == 31) - mode100x31 = i; - if (i < nitems(efi_video)) { - efi_video[i].cols = cols; - efi_video[i].rows = rows; - } - } - if (mode100x31 >= 0) - EFI_CALL(conout->SetMode, conout, mode100x31); - else if (mode80x25 >= 0) - EFI_CALL(conout->SetMode, conout, mode80x25); - conin = ST->ConIn; - efi_video_reset(); -} - -static void -efi_video_reset(void) -{ - EFI_CALL(conout->EnableCursor, conout, TRUE); - EFI_CALL(conout->SetAttribute, conout, - EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK)); - EFI_CALL(conout->ClearScreen, conout); -} - -void -efi_cons_probe(struct consdev *cn) -{ - cn->cn_pri = CN_MIDPRI; - cn->cn_dev = makedev(12, 0); - printf(" pc%d", minor(cn->cn_dev)); -} - -void -efi_cons_init(struct consdev *cp) -{ -} - -int -efi_cons_getc(dev_t dev) -{ - EFI_INPUT_KEY key; - EFI_STATUS status; - UINTN dummy; - static int lastchar = 0; - - if (lastchar) { - int r = lastchar; - if ((dev & 0x80) == 0) - lastchar = 0; - return (r); - } - - status = EFI_CALL(conin->ReadKeyStroke, conin, &key); - while (status == EFI_NOT_READY || key.UnicodeChar == 0) { - if (dev & 0x80) - return (0); - EFI_CALL(BS->WaitForEvent, 1, &conin->WaitForKey, &dummy); - status = EFI_CALL(conin->ReadKeyStroke, conin, &key); - } - - if (dev & 0x80) - lastchar = key.UnicodeChar; - - return (key.UnicodeChar); -} - -void -efi_cons_putc(dev_t dev, int c) -{ - CHAR16 buf[2]; - - if (c == '\n') - efi_cons_putc(dev, '\r'); - - buf[0] = c; - buf[1] = 0; - - EFI_CALL(conout->OutputString, conout, buf); -} - -int -efi_cons_getshifts(dev_t dev) -{ - /* XXX */ - return (0); -} - -int com_addr = -1; -int com_speed = -1; - -static SERIAL_IO_INTERFACE *serios[4]; -const int comports[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; - -/* call with sp == 0 to query the current speed */ -int -pio_comspeed(dev_t dev, int sp) -{ - int port = (com_addr == -1) ? comports[minor(dev)] : com_addr; - int i, newsp; - int err; - - if (sp <= 0) - return com_speed; - /* valid baud rate? */ - if (115200 < sp || sp < 75) - return -1; - - /* - * Accepted speeds: - * 75 150 300 600 1200 2400 4800 9600 19200 38400 76800 and - * 14400 28800 57600 115200 - */ - for (i = sp; i != 75 && i != 14400; i >>= 1) - if (i & 1) - return -1; - -/* ripped screaming from dev/ic/com.c */ -#define divrnd(n, q) (((n)*2/(q)+1)/2) /* divide and round off */ - newsp = divrnd((COM_FREQ / 16), sp); - if (newsp <= 0) - return -1; - err = divrnd((COM_FREQ / 16) * 1000, sp * newsp) - 1000; - if (err < 0) - err = -err; - if (err > COM_TOLERANCE) - return -1; -#undef divrnd - - if (com_speed != -1 && cn_tab && cn_tab->cn_dev == dev && - com_speed != sp) { - printf("com%d: changing speed to %d baud in 5 seconds, " - "change your terminal to match!\n\a", - minor(dev), sp); - sleep(5); - } - - outb(port + com_cfcr, LCR_DLAB); - outb(port + com_dlbl, newsp); - outb(port + com_dlbh, newsp>>8); - outb(port + com_cfcr, LCR_8BITS); - if (com_speed != -1) - printf("\ncom%d: %d baud\n", minor(dev), sp); - - newsp = com_speed; - com_speed = sp; - return newsp; -} - -int -pio_com_getc(dev_t dev) -{ - int port = (com_addr == -1) ? comports[minor(dev & 0x7f)] : com_addr; - - if (dev & 0x80) - return (inb(port + com_lsr) & LSR_RXRDY); - - while ((inb(port + com_lsr) & LSR_RXRDY) == 0) - ; - - return (inb(port + com_data) & 0xff); -} - -void -pio_com_putc(dev_t dev, int c) -{ - int port = (com_addr == -1) ? comports[minor(dev)] : com_addr; - - while ((inb(port + com_lsr) & LSR_TXRDY) == 0) - ; - - outb(port + com_data, c); -} - -void -efi_com_probe(struct consdev *cn) -{ - EFI_HANDLE *handles = NULL; - SERIAL_IO_INTERFACE *serio; - EFI_STATUS status; - EFI_DEVICE_PATH *dp, *dp0; - EFI_DEV_PATH_PTR dpp; - UINTN sz; - int i, uid = -1; - - cn->cn_pri = CN_LOWPRI; - cn->cn_dev = makedev(8, 0); - - sz = 0; - status = EFI_CALL(BS->LocateHandle, ByProtocol, &serio_guid, 0, &sz, 0); - if (status == EFI_BUFFER_TOO_SMALL) { - handles = alloc(sz); - status = EFI_CALL(BS->LocateHandle, ByProtocol, &serio_guid, - 0, &sz, handles); - } - if (handles == NULL || EFI_ERROR(status)) { - free(handles, sz); - return; - } - - for (i = 0; i < sz / sizeof(EFI_HANDLE); i++) { - /* - * Identify port number of the handle. This assumes ACPI - * UID 0-3 map to legacy COM[1-4] and they use the legacy - * port address. - */ - status = EFI_CALL(BS->HandleProtocol, handles[i], &devp_guid, - (void **)&dp0); - if (EFI_ERROR(status)) - continue; - uid = -1; - for (dp = dp0; !IsDevicePathEnd(dp); - dp = NextDevicePathNode(dp)) { - dpp = (EFI_DEV_PATH_PTR)dp; - if (DevicePathType(dp) == ACPI_DEVICE_PATH && - DevicePathSubType(dp) == ACPI_DP) - if (dpp.Acpi->HID == EFI_PNP_ID(0x0501)) { - uid = dpp.Acpi->UID; - break; - } - } - if (uid < 0 || nitems(serios) <= uid) - continue; - - /* Prepare SERIAL_IO_INTERFACE */ - status = EFI_CALL(BS->HandleProtocol, handles[i], &serio_guid, - (void **)&serio); - if (EFI_ERROR(status)) - continue; - serios[uid] = serio; - } - free(handles, sz); - - for (i = 0; i < nitems(serios); i++) { - if (serios[i] != NULL) - printf(" com%d", i); - } -} - -int -efi_valid_com(dev_t dev) -{ - return (minor(dev) < nitems(serios) && serios[minor(dev)] != NULL); -} - -int -comspeed(dev_t dev, int sp) -{ - EFI_STATUS status; - SERIAL_IO_INTERFACE *serio = serios[minor(dev)]; - int newsp; - - if (sp <= 0) - return com_speed; - - if (!efi_valid_com(dev)) - return pio_comspeed(dev, sp); - - if (serio->Mode->BaudRate != sp) { - status = EFI_CALL(serio->SetAttributes, serio, - sp, serio->Mode->ReceiveFifoDepth, - serio->Mode->Timeout, serio->Mode->Parity, - serio->Mode->DataBits, serio->Mode->StopBits); - if (EFI_ERROR(status)) { - printf("com%d: SetAttribute() failed with status=%d\n", - minor(dev), status); - return (-1); - } - if (com_speed != -1) - printf("\ncom%d: %d baud\n", minor(dev), sp); - } - - /* same as comspeed() in libsa/bioscons.c */ - newsp = com_speed; - com_speed = sp; - - return (newsp); -} - -void -efi_com_init(struct consdev *cn) -{ - if (!efi_valid_com(cn->cn_dev)) - /* This actually happens if the machine has another serial. */ - return; - - if (com_speed == -1) - comspeed(cn->cn_dev, 9600); /* default speed is 9600 baud */ -} - -int -efi_com_getc(dev_t dev) -{ - EFI_STATUS status; - SERIAL_IO_INTERFACE *serio; - UINTN sz; - u_char buf; - static u_char lastchar = 0; - - if (!efi_valid_com(dev & 0x7f)) - return pio_com_getc(dev); - serio = serios[minor(dev & 0x7f)]; - - if (lastchar != 0) { - int r = lastchar; - if ((dev & 0x80) == 0) - lastchar = 0; - return (r); - } - - for (;;) { - sz = 1; - status = EFI_CALL(serio->Read, serio, &sz, &buf); - if (status == EFI_SUCCESS && sz > 0) - break; - if (status != EFI_TIMEOUT && EFI_ERROR(status)) - panic("Error reading from serial status=%d", status); - if (dev & 0x80) - return (0); - } - - if (dev & 0x80) - lastchar = buf; - - return (buf); -} - -void -efi_com_putc(dev_t dev, int c) -{ - SERIAL_IO_INTERFACE *serio; - UINTN sz = 1; - u_char buf; - - if (!efi_valid_com(dev)) { - pio_com_putc(dev, c); - return; - } - serio = serios[minor(dev)]; - buf = c; - EFI_CALL(serio->Write, serio, &sz, &buf); -} - -/*********************************************************************** - * Miscellaneous - ***********************************************************************/ -/* - * ACPI GUID is confusing in UEFI spec. - * {EFI_,}_ACPI_20_TABLE_GUID or EFI_ACPI_TABLE_GUID means - * ACPI 2.0 or above. - */ -static EFI_GUID acpi_guid = ACPI_20_TABLE_GUID; -static EFI_GUID smbios_guid = SMBIOS_TABLE_GUID; -static EFI_GRAPHICS_OUTPUT *gop; -static int gopmode = -1; - -#define efi_guidcmp(_a, _b) memcmp((_a), (_b), sizeof(EFI_GUID)) - -static EFI_STATUS -efi_gop_setmode(int mode) -{ - EFI_STATUS status; - - status = EFI_CALL(gop->SetMode, gop, mode); - if (EFI_ERROR(status) || gop->Mode->Mode != mode) - printf("GOP SetMode() failed (%d)\n", status); - - return (status); -} - -void -efi_makebootargs(void) -{ - int i; - EFI_STATUS status; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION - *gopi; - bios_efiinfo_t ei; - int curmode; - UINTN sz, gopsiz, bestsiz = 0; - - memset(&ei, 0, sizeof(ei)); - /* - * ACPI, BIOS configuration table - */ - for (i = 0; i < ST->NumberOfTableEntries; i++) { - if (efi_guidcmp(&acpi_guid, - &ST->ConfigurationTable[i].VendorGuid) == 0) - ei.config_acpi = (intptr_t) - ST->ConfigurationTable[i].VendorTable; - else if (efi_guidcmp(&smbios_guid, - &ST->ConfigurationTable[i].VendorGuid) == 0) - ei.config_smbios = (intptr_t) - ST->ConfigurationTable[i].VendorTable; - } - - /* - * Frame buffer - */ - status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL, - (void **)&gop); - if (!EFI_ERROR(status)) { - if (gopmode < 0) { - for (i = 0; i < gop->Mode->MaxMode; i++) { - status = EFI_CALL(gop->QueryMode, gop, - i, &sz, &gopi); - if (EFI_ERROR(status)) - continue; - gopsiz = gopi->HorizontalResolution * - gopi->VerticalResolution; - if (gopsiz > bestsiz) { - gopmode = i; - bestsiz = gopsiz; - } - } - } - if (gopmode >= 0 && gopmode != gop->Mode->Mode) { - curmode = gop->Mode->Mode; - if (efi_gop_setmode(gopmode) != EFI_SUCCESS) - (void)efi_gop_setmode(curmode); - } - - gopi = gop->Mode->Info; - switch (gopi->PixelFormat) { - case PixelBlueGreenRedReserved8BitPerColor: - ei.fb_red_mask = 0x00ff0000; - ei.fb_green_mask = 0x0000ff00; - ei.fb_blue_mask = 0x000000ff; - ei.fb_reserved_mask = 0xff000000; - break; - case PixelRedGreenBlueReserved8BitPerColor: - ei.fb_red_mask = 0x000000ff; - ei.fb_green_mask = 0x0000ff00; - ei.fb_blue_mask = 0x00ff0000; - ei.fb_reserved_mask = 0xff000000; - break; - case PixelBitMask: - ei.fb_red_mask = gopi->PixelInformation.RedMask; - ei.fb_green_mask = gopi->PixelInformation.GreenMask; - ei.fb_blue_mask = gopi->PixelInformation.BlueMask; - ei.fb_reserved_mask = - gopi->PixelInformation.ReservedMask; - break; - default: - break; - } - ei.fb_addr = gop->Mode->FrameBufferBase; - ei.fb_size = gop->Mode->FrameBufferSize; - ei.fb_height = gopi->VerticalResolution; - ei.fb_width = gopi->HorizontalResolution; - ei.fb_pixpsl = gopi->PixelsPerScanLine; - } - - addbootarg(BOOTARG_EFIINFO, sizeof(ei), &ei); -} - -void -_rtt(void) -{ -#ifdef EFI_DEBUG - printf("Hit any key to reboot\n"); - efi_cons_getc(0); -#endif - EFI_CALL(RS->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL); - for (;;) - continue; -} - -time_t -getsecs(void) -{ - EFI_TIME t; - time_t r = 0; - int y = 0; - const int daytab[][14] = { - { 0, -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 }, - { 0, -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, - }; -#define isleap(_y) (((_y) % 4) == 0 && (((_y) % 100) != 0 || ((_y) % 400) == 0)) - - EFI_CALL(ST->RuntimeServices->GetTime, &t, NULL); - - /* Calc days from UNIX epoch */ - r = (t.Year - 1970) * 365; - for (y = 1970; y < t.Year; y++) { - if (isleap(y)) - r++; - } - r += daytab[isleap(t.Year)? 1 : 0][t.Month] + t.Day; - - /* Calc secs */ - r *= 60 * 60 * 24; - r += ((t.Hour * 60) + t.Minute) * 60 + t.Second; - if (-24 * 60 < t.TimeZone && t.TimeZone < 24 * 60) - r += t.TimeZone * 60; - - return (r); -} - -u_int -sleep(u_int i) -{ - time_t t; - - /* - * Loop for the requested number of seconds, polling, - * so that it may handle interrupts. - */ - for (t = getsecs() + i; getsecs() < t; cnischar()) - ; - - return 0; -} - -/*********************************************************************** - * Commands - ***********************************************************************/ -int -Xexit_efi(void) -{ - EFI_CALL(BS->Exit, IH, 0, 0, NULL); - for (;;) - continue; - return (0); -} - -int -Xvideo_efi(void) -{ - int i, mode = -1; - - if (cmd.argc >= 2) { - mode = strtol(cmd.argv[1], NULL, 10); - if (0 <= mode && mode < nitems(efi_video) && - efi_video[mode].cols > 0) { - EFI_CALL(conout->SetMode, conout, mode); - efi_video_reset(); - } - } else { - for (i = 0; i < nitems(efi_video) && - i < conout->Mode->MaxMode; i++) { - if (efi_video[i].cols > 0) - printf("Mode %d: %d x %d\n", i, - efi_video[i].cols, - efi_video[i].rows); - } - printf("\n"); - } - printf("Current Mode = %d\n", conout->Mode->Mode); - - return (0); -} - -int -Xpoweroff_efi(void) -{ - EFI_CALL(RS->ResetSystem, EfiResetShutdown, EFI_SUCCESS, 0, NULL); - return (0); -} - -int -Xgop_efi(void) -{ - EFI_STATUS status; - int i, mode = -1; - UINTN sz; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION - *gopi; - - status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL, - (void **)&gop); - if (EFI_ERROR(status)) - return (0); - - if (cmd.argc >= 2) { - mode = strtol(cmd.argv[1], NULL, 10); - if (0 <= mode && mode < gop->Mode->MaxMode) { - status = EFI_CALL(gop->QueryMode, gop, mode, - &sz, &gopi); - if (!EFI_ERROR(status)) { - if (efi_gop_setmode(mode) == EFI_SUCCESS) - gopmode = mode; - } - } - } else { - for (i = 0; i < gop->Mode->MaxMode; i++) { - status = EFI_CALL(gop->QueryMode, gop, i, &sz, &gopi); - if (EFI_ERROR(status)) - continue; - printf("Mode %d: %d x %d (stride = %d)\n", i, - gopi->HorizontalResolution, - gopi->VerticalResolution, - gopi->PixelsPerScanLine); - } - printf("\n"); - } - printf("Current Mode = %d\n", gop->Mode->Mode); - - return (0); -} diff --git a/sys/arch/amd64/stand/efi64/efiboot.h b/sys/arch/amd64/stand/efi64/efiboot.h deleted file mode 100644 index 74fa5281f85..00000000000 --- a/sys/arch/amd64/stand/efi64/efiboot.h +++ /dev/null @@ -1,41 +0,0 @@ -/* $OpenBSD: efiboot.h,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -void efi_cleanup(void); -void efi_cons_probe(struct consdev *); -void efi_memprobe(void); -void efi_hardprobe(void); -void efi_diskprobe(void); -void efi_pxeprobe(void); -void efi_cons_init(struct consdev *); -int efi_cons_getc(dev_t); -void efi_cons_putc(dev_t, int); -int efi_cons_getshifts(dev_t dev); -void efi_com_probe(struct consdev *); -void efi_com_init(struct consdev *); -int efi_com_getc(dev_t); -void efi_com_putc(dev_t, int); -int Xvideo_efi(void); -int Xgop_efi(void); -int Xexit_efi(void); -void efi_makebootargs(void); - -int Xpoweroff_efi(void); - -extern void (*run_i386)(u_long, u_long, int, int, int, int, int, int, int, int) - __attribute__ ((noreturn)); diff --git a/sys/arch/amd64/stand/efi64/eficall.S b/sys/arch/amd64/stand/efi64/eficall.S deleted file mode 100644 index cb7300adc13..00000000000 --- a/sys/arch/amd64/stand/efi64/eficall.S +++ /dev/null @@ -1,64 +0,0 @@ -/* $OpenBSD: eficall.S,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -/* - * Rearrange the arguments to call the given function by EFI ABI. - * - * efi_call(nargs, func, arg[0], arg[1], arg[2], arg[3], arg[4], ...) - * ---------------------------------------------------------------------- - * BSD: RDI RSI RDX RCX R8 R9 stack - * EFI: - - RCX RDX R8 R9 stack (w/shadow) - */ -ENTRY(efi_call) - push %rbp - mov %rsp, %rbp - - xchg %rcx, %rdx - mov %rcx, %rax - mov %rdi, %rcx - - /* - * set "nargs - 2 + 4 + 1" (= %rdi + 3) for next call stack size. - * (nargs - 2) is for arguments in stack, +4 for shadow registers - * and +1 for alignment - */ - add $3, %rdi - - shl $3, %rdi /* 64-bit word */ - sub %rdi, %rsp /* get the stack */ - and $(-0x10), %rsp /* align 16 bytes */ - - /* copy args */ - sub $3, %rcx - cmp $1, %rcx - jle 2f - -1: /* loop arg[n-1] .. arg[4] */ - mov 0x8(%rbp, %rcx, 8), %rdi - mov %rdi, 0x18(%rsp, %rcx, 8) - loopnz 1b -2: - mov %rax, %rcx - - call *%rsi - - mov %rbp, %rsp - pop %rbp - retq diff --git a/sys/arch/amd64/stand/efi64/eficall.h b/sys/arch/amd64/stand/efi64/eficall.h deleted file mode 100644 index 4781622daf9..00000000000 --- a/sys/arch/amd64/stand/efi64/eficall.h +++ /dev/null @@ -1,48 +0,0 @@ -/* $OpenBSD: eficall.h,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -extern uint64_t efi_call(int, void *, ...); - -#define _call_0(_func) \ - efi_call(0, (_func)) -#define _call_1(_func, _1) \ - efi_call(1, (_func), (_1)) -#define _call_2(_func, _1, _2) \ - efi_call(2, (_func), (_1), (_2)) -#define _call_3(_func, _1, _2, _3) \ - efi_call(3, (_func), (_1), (_2), (_3)) -#define _call_4(_func, _1, _2, _3, _4) \ - efi_call(4, (_func), (_1), (_2), (_3), (_4)) -#define _call_5(_func, _1, _2, _3, _4, _5) \ - efi_call(5, (_func), (_1), (_2), (_3), (_4), (_5)) -#define _call_6(_func, _1, _2, _3, _4, _5, _6) \ - efi_call(6, (_func), (_1), (_2), (_3), (_4), (_5), (_6)) -#define _call_7(_func, _1, _2, _3, _4, _5, _6, _7) \ - efi_call(7, (_func), (_1), (_2), (_3), (_4), (_5), (_6), (_7)) -#define _call_8(_func, _1, _2, _3, _4, _5, _6, _7, _8) \ - efi_call(8, (_func), (_1), (_2), (_3), (_4), (_5), (_6), (_7), (_8)) -#define _call_9(_func, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ - efi_call(9, (_func), (_1), (_2), (_3), (_4), (_5), (_6), (_7), (_8), (_9)) -#define _call_10(_func, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ - efi_call(10, (_func), (_1), (_2), (_3), (_4), (_5), (_6), (_7), (_8), (_9), (_10)) - -#define _efi_call_fn(_func, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _fn, ...) _fn - -#define EFI_CALL(...) \ - _efi_call_fn(__VA_ARGS__, _call_10, _call_9, _call_8, _call_7, _call_6, \ - _call_5, _call_4, _call_3, _call_2, _call_1, _call_0)(__VA_ARGS__) diff --git a/sys/arch/amd64/stand/efi64/efidev.c b/sys/arch/amd64/stand/efi64/efidev.c deleted file mode 100644 index a78b65e5aa7..00000000000 --- a/sys/arch/amd64/stand/efi64/efidev.c +++ /dev/null @@ -1,793 +0,0 @@ -/* $OpenBSD: efidev.c,v 1.4 2022/09/01 13:45:26 krw Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * Copyright (c) 2003 Tobias Weingartner - * Copyright (c) 2015 YASUOKA Masahiko - * 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 REGENTS 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 -#include -#include -#include -#include - -#include "libsa.h" -#include "disk.h" - -#ifdef SOFTRAID -#include -#include -#include "softraid_amd64.h" -#endif - -#include -#include "eficall.h" - -extern int debug; - -#include "efidev.h" -#include "biosdev.h" /* for dklookup() */ - -#define EFI_BLKSPERSEC(_ed) ((_ed)->blkio->Media->BlockSize / DEV_BSIZE) -#define EFI_SECTOBLK(_ed, _n) ((_n) * EFI_BLKSPERSEC(_ed)) - -struct efi_diskinfo { - EFI_BLOCK_IO *blkio; - UINT32 mediaid; -}; - -int bios_bootdev; -static EFI_STATUS - efid_io(int, efi_diskinfo_t, u_int, int, void *); -static int efid_diskio(int, struct diskinfo *, u_int, int, void *); -static int efi_getdisklabel_cd9660(efi_diskinfo_t, struct disklabel *); -static u_int findopenbsd(efi_diskinfo_t, const char **); -static u_int findopenbsd_gpt(efi_diskinfo_t, const char **); -static int gpt_chk_mbr(struct dos_partition *, u_int64_t); - -void -efid_init(struct diskinfo *dip, void *handle) -{ - EFI_BLOCK_IO *blkio = handle; - - memset(dip, 0, sizeof(struct diskinfo)); - dip->efi_info = alloc(sizeof(struct efi_diskinfo)); - dip->efi_info->blkio = blkio; - dip->efi_info->mediaid = blkio->Media->MediaId; - dip->diskio = efid_diskio; - dip->strategy = efistrategy; -} - -static EFI_STATUS -efid_io(int rw, efi_diskinfo_t ed, u_int off, int nsect, void *buf) -{ - u_int blks, lba, i_lblks, i_tblks, i_nblks; - EFI_STATUS status = EFI_SUCCESS; - static u_char *iblk = NULL; - static u_int iblksz = 0; - - /* block count of the intrisic block size in DEV_BSIZE */ - blks = EFI_BLKSPERSEC(ed); - if (blks == 0) - /* block size < 512. HP Stream 13 actually has such a disk. */ - return (EFI_UNSUPPORTED); - - /* leading and trailing unaligned blocks in intrisic block */ - i_lblks = ((off % blks) == 0)? 0 : blks - (off % blks); - i_tblks = (nsect > i_lblks)? (off + nsect) % blks : 0; - - /* aligned blocks in intrisic block */ - i_nblks = (nsect > i_lblks + i_tblks)? nsect - (i_lblks + i_tblks) : 0; - - lba = (off + i_lblks) / blks; - - switch (rw) { - case F_READ: - /* allocate the space for reading unaligned blocks */ - if (ed->blkio->Media->BlockSize != DEV_BSIZE) { - if (iblk && iblksz < ed->blkio->Media->BlockSize) { - free(iblk, iblksz); - iblk = NULL; - } - if (iblk == NULL) { - iblk = alloc(ed->blkio->Media->BlockSize); - iblksz = ed->blkio->Media->BlockSize; - } - } - if (i_lblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba - 1, - ed->blkio->Media->BlockSize, iblk); - if (EFI_ERROR(status)) - goto on_eio; - memcpy(buf, iblk + (blks - i_lblks) * DEV_BSIZE, - min(nsect, i_lblks) * DEV_BSIZE); - } - if (i_nblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba, - ed->blkio->Media->BlockSize * (i_nblks / blks), - buf + (i_lblks * DEV_BSIZE)); - if (EFI_ERROR(status)) - goto on_eio; - } - if (i_tblks > 0) { - status = EFI_CALL(ed->blkio->ReadBlocks, - ed->blkio, ed->mediaid, lba + (i_nblks / blks), - ed->blkio->Media->BlockSize, iblk); - if (EFI_ERROR(status)) - goto on_eio; - memcpy(buf + (i_lblks + i_nblks) * DEV_BSIZE, iblk, - i_tblks * DEV_BSIZE); - } - break; - case F_WRITE: - if (ed->blkio->Media->ReadOnly) - goto on_eio; - /* XXX not yet */ - goto on_eio; - break; - } - return (EFI_SUCCESS); - -on_eio: - return (status); -} - -static int -efid_diskio(int rw, struct diskinfo *dip, u_int off, int nsect, void *buf) -{ - EFI_STATUS status; - - status = efid_io(rw, dip->efi_info, off, nsect, buf); - - return ((EFI_ERROR(status))? -1 : 0); -} - -/* - * Returns 0 if the MBR with the provided partition array is a GPT protective - * MBR, and returns 1 otherwise. A GPT protective MBR would have one and only - * one MBR partition, an EFI partition that either covers the whole disk or as - * much of it as is possible with a 32bit size field. - * - * Taken from kern/subr_disk.c. - * - * NOTE: MS always uses a size of UINT32_MAX for the EFI partition!** - */ -static int -gpt_chk_mbr(struct dos_partition *dp, u_int64_t dsize) -{ - struct dos_partition *dp2; - int efi, found, i; - u_int32_t psize; - - found = efi = 0; - for (dp2=dp, i=0; i < NDOSPART; i++, dp2++) { - if (dp2->dp_typ == DOSPTYP_UNUSED) - continue; - found++; - if (dp2->dp_typ != DOSPTYP_EFI) - continue; - psize = letoh32(dp2->dp_size); - if (psize == (dsize - 1) || - psize == UINT32_MAX) { - if (letoh32(dp2->dp_start) == 1) - efi++; - } - } - if (found == 1 && efi == 1) - return (0); - - return (1); -} - -/* - * Try to find the disk address of the first MBR OpenBSD partition. - * - * N.B.: must boot from a partition within first 2^32-1 sectors! - * - * Called only if the MBR on sector 0 is *not* a protective MBR - * and *does* have a valid signature. - * - * We don't check the signatures of EBR's, and they cannot be - * protective MBR's so there is no need to check for that. - */ -static u_int -findopenbsd(efi_diskinfo_t ed, const char **err) -{ - EFI_STATUS status; - struct dos_mbr mbr; - struct dos_partition *dp; - u_int mbroff = DOSBBSECTOR; - u_int mbr_eoff = DOSBBSECTOR; /* Offset of MBR extended partition. */ - int i, maxebr = DOS_MAXEBR, nextebr; - -again: - if (!maxebr--) { - *err = "too many extended partitions"; - return (-1); - } - - /* Read MBR */ - bzero(&mbr, sizeof(mbr)); - status = efid_io(F_READ, ed, mbroff, 1, &mbr); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - - /* Search for OpenBSD partition */ - nextebr = 0; - for (i = 0; i < NDOSPART; i++) { - dp = &mbr.dmbr_parts[i]; - if (!dp->dp_size) - continue; -#ifdef BIOS_DEBUG - if (debug) - printf("found partition %u: " - "type %u (0x%x) offset %u (0x%x)\n", - (int)(dp - mbr.dmbr_parts), - dp->dp_typ, dp->dp_typ, - dp->dp_start, dp->dp_start); -#endif - if (dp->dp_typ == DOSPTYP_OPENBSD) { - if (dp->dp_start > (dp->dp_start + mbroff)) - continue; - return (dp->dp_start + mbroff); - } - - /* - * Record location of next ebr if and only if this is the first - * extended partition in this boot record! - */ - if (!nextebr && (dp->dp_typ == DOSPTYP_EXTEND || - dp->dp_typ == DOSPTYP_EXTENDL)) { - nextebr = dp->dp_start + mbr_eoff; - if (nextebr < dp->dp_start) - nextebr = (u_int)-1; - if (mbr_eoff == DOSBBSECTOR) - mbr_eoff = dp->dp_start; - } - } - - if (nextebr && nextebr != (u_int)-1) { - mbroff = nextebr; - goto again; - } - - return (-1); -} - -/* - * Try to find the disk address of the first GPT OpenBSD partition. - * - * N.B.: must boot from a partition within first 2^32-1 sectors! - * - * Called only if the MBR on sector 0 *is* a protective MBR - * with a valid signature and sector 1 is a valid GPT header. - */ -static u_int -findopenbsd_gpt(efi_diskinfo_t ed, const char **err) -{ - EFI_STATUS status; - struct gpt_header gh; - int i, part, found; - uint64_t lba; - uint32_t orig_csum, new_csum; - uint32_t ghsize, ghpartsize, ghpartnum, ghpartspersec; - uint32_t gpsectors; - const char openbsd_uuid_code[] = GPT_UUID_OPENBSD; - struct gpt_partition gp; - static struct uuid *openbsd_uuid = NULL, openbsd_uuid_space; - static u_char buf[4096]; - - /* Prepare OpenBSD UUID */ - if (openbsd_uuid == NULL) { - /* XXX: should be replaced by uuid_dec_be() */ - memcpy(&openbsd_uuid_space, openbsd_uuid_code, - sizeof(openbsd_uuid_space)); - openbsd_uuid_space.time_low = - betoh32(openbsd_uuid_space.time_low); - openbsd_uuid_space.time_mid = - betoh16(openbsd_uuid_space.time_mid); - openbsd_uuid_space.time_hi_and_version = - betoh16(openbsd_uuid_space.time_hi_and_version); - - openbsd_uuid = &openbsd_uuid_space; - } - - if (EFI_BLKSPERSEC(ed) > 8) { - *err = "disk sector > 4096 bytes\n"; - return (-1); - } - - /* LBA1: GPT Header */ - lba = 1; - status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), EFI_BLKSPERSEC(ed), - buf); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - memcpy(&gh, buf, sizeof(gh)); - - /* Check signature */ - if (letoh64(gh.gh_sig) != GPTSIGNATURE) { - *err = "bad GPT signature\n"; - return (-1); - } - - if (letoh32(gh.gh_rev) != GPTREVISION) { - *err = "bad GPT revision\n"; - return (-1); - } - - ghsize = letoh32(gh.gh_size); - if (ghsize < GPTMINHDRSIZE || ghsize > sizeof(struct gpt_header)) { - *err = "bad GPT header size\n"; - return (-1); - } - - /* Check checksum */ - orig_csum = gh.gh_csum; - gh.gh_csum = 0; - new_csum = crc32(0, (unsigned char *)&gh, ghsize); - gh.gh_csum = orig_csum; - if (letoh32(orig_csum) != new_csum) { - *err = "bad GPT header checksum\n"; - return (-1); - } - - lba = letoh64(gh.gh_part_lba); - ghpartsize = letoh32(gh.gh_part_size); - ghpartspersec = ed->blkio->Media->BlockSize / ghpartsize; - ghpartnum = letoh32(gh.gh_part_num); - gpsectors = (ghpartnum + ghpartspersec - 1) / ghpartspersec; - new_csum = crc32(0L, Z_NULL, 0); - found = 0; - for (i = 0; i < gpsectors; i++, lba++) { - status = efid_io(F_READ, ed, EFI_SECTOBLK(ed, lba), - EFI_BLKSPERSEC(ed), buf); - if (EFI_ERROR(status)) { - *err = "Disk I/O Error"; - return (-1); - } - for (part = 0; part < ghpartspersec; part++) { - if (ghpartnum == 0) - break; - new_csum = crc32(new_csum, buf + part * sizeof(gp), - sizeof(gp)); - ghpartnum--; - if (found) - continue; - memcpy(&gp, buf + part * sizeof(gp), sizeof(gp)); - if (memcmp(&gp.gp_type, openbsd_uuid, - sizeof(struct uuid)) == 0) - found = 1; - } - } - if (new_csum != letoh32(gh.gh_part_csum)) { - *err = "bad GPT entries checksum\n"; - return (-1); - } - if (found) { - lba = letoh64(gp.gp_lba_start); - /* Bootloaders do not current handle addresses > UINT_MAX! */ - if (lba > UINT_MAX || EFI_SECTOBLK(ed, lba) > UINT_MAX) { - *err = "OpenBSD Partition LBA > 2**32 - 1"; - return (-1); - } - return (u_int)lba; - } - - return (-1); -} - -const char * -efi_getdisklabel(efi_diskinfo_t ed, struct disklabel *label) -{ - u_int start = 0; - uint8_t buf[DEV_BSIZE]; - struct dos_partition dosparts[NDOSPART]; - EFI_STATUS status; - const char *err = NULL; - int error; - - /* - * Read sector 0. Ensure it has a valid MBR signature. - * - * If it's a protective MBR then try to find the disklabel via - * GPT. If it's not a protective MBR, try to find the disklabel - * via MBR. - */ - memset(buf, 0, sizeof(buf)); - status = efid_io(F_READ, ed, DOSBBSECTOR, 1, buf); - if (EFI_ERROR(status)) - return ("Disk I/O Error"); - - /* Check MBR signature. */ - if (buf[510] != 0x55 || buf[511] != 0xaa) { - if (efi_getdisklabel_cd9660(ed, label) == 0) - return (NULL); - return ("invalid MBR signature"); - } - - memcpy(dosparts, buf+DOSPARTOFF, sizeof(dosparts)); - - /* check for GPT protective MBR. */ - if (gpt_chk_mbr(dosparts, ed->blkio->Media->LastBlock + 1) == 0) { - start = findopenbsd_gpt(ed, &err); - if (start == (u_int)-1) { - if (err != NULL) - return (err); - return ("no OpenBSD GPT partition"); - } - } else { - start = findopenbsd(ed, &err); - if (start == (u_int)-1) { - if (err != NULL) - return (err); - return "no OpenBSD MBR partition\n"; - } - } - - /* Load BSD disklabel */ -#ifdef BIOS_DEBUG - if (debug) - printf("loading disklabel @ %u\n", start + DOS_LABELSECTOR); -#endif - /* read disklabel */ - error = efid_io(F_READ, ed, EFI_SECTOBLK(ed, start) + DOS_LABELSECTOR, - 1, buf); - - if (error) - return "failed to read disklabel"; - - /* Fill in disklabel */ - return (getdisklabel(buf, label)); -} - -static int -efi_getdisklabel_cd9660(efi_diskinfo_t ed, struct disklabel *label) -{ - int off; - uint8_t buf[DEV_BSIZE]; - EFI_STATUS status; - - for (off = 0; off < 100; off++) { - status = efid_io(F_READ, ed, - EFI_BLKSPERSEC(ed) * (16 + off), 1, buf); - if (EFI_ERROR(status)) - return (-1); - if (bcmp(buf + 1, ISO_STANDARD_ID, 5) != 0 || - buf[0] == ISO_VD_END) - return (-1); - if (buf[0] == ISO_VD_PRIMARY) - break; - } - if (off >= 100) - return (-1); - - /* Create an imaginary disk label */ - label->d_secsize = 2048; - label->d_ntracks = 1; - label->d_nsectors = 100; - label->d_ncylinders = 1; - label->d_secpercyl = label->d_ntracks * label->d_nsectors; - - strncpy(label->d_typename, "ATAPI CD-ROM", sizeof(label->d_typename)); - label->d_type = DTYPE_ATAPI; - - strncpy(label->d_packname, "fictitious", sizeof(label->d_packname)); - DL_SETDSIZE(label, 100); - - /* 'a' partition covering the "whole" disk */ - DL_SETPOFFSET(&label->d_partitions[0], 0); - DL_SETPSIZE(&label->d_partitions[0], 100); - label->d_partitions[0].p_fstype = FS_UNUSED; - - /* The raw partition is special */ - DL_SETPOFFSET(&label->d_partitions[RAW_PART], 0); - DL_SETPSIZE(&label->d_partitions[RAW_PART], 100); - label->d_partitions[RAW_PART].p_fstype = FS_UNUSED; - - label->d_npartitions = MAXPARTITIONS; - - label->d_magic = DISKMAGIC; - label->d_magic2 = DISKMAGIC; - label->d_checksum = dkcksum(label); - - return (0); -} - -int -efiopen(struct open_file *f, ...) -{ -#ifdef SOFTRAID - struct sr_boot_volume *bv; -#endif - register char *cp, **file; - dev_t maj, unit, part; - struct diskinfo *dip; - int biosdev, devlen; -#if 0 - const char *st; -#endif - va_list ap; - char *dev; - - va_start(ap, f); - cp = *(file = va_arg(ap, char **)); - va_end(ap); - -#ifdef EFI_DEBUG - if (debug) - printf("%s\n", cp); -#endif - - f->f_devdata = NULL; - - /* Search for device specification. */ - dev = cp; - if (cp[4] == ':') - devlen = 2; - else if (cp[5] == ':') - devlen = 3; - else - return ENOENT; - cp += devlen; - - /* Get unit. */ - if ('0' <= *cp && *cp <= '9') - unit = *cp++ - '0'; - else { - printf("Bad unit number\n"); - return EUNIT; - } - - /* Get partition. */ - if ('a' <= *cp && *cp <= 'p') - part = *cp++ - 'a'; - else { - printf("Bad partition\n"); - return EPART; - } - - /* Get filename. */ - cp++; /* skip ':' */ - if (*cp != 0) - *file = cp; - else - f->f_flags |= F_RAW; - -#ifdef SOFTRAID - /* Intercept softraid disks. */ - if (strncmp("sr", dev, 2) == 0) { - - /* Create a fake diskinfo for this softraid volume. */ - SLIST_FOREACH(bv, &sr_volumes, sbv_link) - if (bv->sbv_unit == unit) - break; - if (bv == NULL) { - printf("Unknown device: sr%d\n", unit); - return EADAPT; - } - - if ((bv->sbv_level == 'C' || bv->sbv_level == 0x1C) && - bv->sbv_keys == NULL) { - if (sr_crypto_unlock_volume(bv) != 0) - return EPERM; - } - - if (bv->sbv_diskinfo == NULL) { - dip = alloc(sizeof(struct diskinfo)); - bzero(dip, sizeof(*dip)); - dip->diskio = efid_diskio; - dip->strategy = efistrategy; - bv->sbv_diskinfo = dip; - dip->sr_vol = bv; - dip->bios_info.flags |= BDI_BADLABEL; - } - - dip = bv->sbv_diskinfo; - - if (dip->bios_info.flags & BDI_BADLABEL) { - /* Attempt to read disklabel. */ - bv->sbv_part = 'c'; - if (sr_getdisklabel(bv, &dip->disklabel)) - return ERDLAB; - dip->bios_info.flags &= ~BDI_BADLABEL; - check_hibernate(dip); - } - - bv->sbv_part = part + 'a'; - - bootdev_dip = dip; - f->f_devdata = dip; - - return 0; - } -#endif - for (maj = 0; maj < nbdevs && - strncmp(dev, bdevs[maj], devlen); maj++); - if (maj >= nbdevs) { - printf("Unknown device: "); - for (cp = *file; *cp != ':'; cp++) - putchar(*cp); - putchar('\n'); - return EADAPT; - } - - biosdev = unit; - switch (maj) { - case 0: /* wd */ - case 4: /* sd */ - case 17: /* hd */ - biosdev |= 0x80; - break; - case 2: /* fd */ - break; - case 6: /* cd */ - biosdev |= 0xe0; - break; - default: - return ENXIO; - } - - /* Find device */ - dip = dklookup(biosdev); - if (dip == NULL) - return ENXIO; - bootdev_dip = dip; - - /* Fix up bootdev */ - { dev_t bsd_dev; - bsd_dev = dip->bios_info.bsd_dev; - dip->bsddev = MAKEBOOTDEV(B_TYPE(bsd_dev), B_ADAPTOR(bsd_dev), - B_CONTROLLER(bsd_dev), unit, part); - dip->bootdev = MAKEBOOTDEV(B_TYPE(bsd_dev), B_ADAPTOR(bsd_dev), - B_CONTROLLER(bsd_dev), B_UNIT(bsd_dev), part); - } - -#if 0 - dip->bios_info.bsd_dev = dip->bootdev; - bootdev = dip->bootdev; -#endif - -#ifdef EFI_DEBUG - if (debug) { - printf("BIOS geometry: heads=%u, s/t=%u; EDD=%d\n", - dip->bios_info.bios_heads, dip->bios_info.bios_sectors, - dip->bios_info.bios_edd); - } -#endif - -#if 0 -/* - * XXX In UEFI, media change can be detected by MediaID - */ - /* Try for disklabel again (might be removable media) */ - if (dip->bios_info.flags & BDI_BADLABEL) { - st = efi_getdisklabel(dip->efi_info, &dip->disklabel); -#ifdef EFI_DEBUG - if (debug && st) - printf("%s\n", st); -#endif - if (!st) { - dip->bios_info.flags &= ~BDI_BADLABEL; - dip->bios_info.flags |= BDI_GOODLABEL; - } else - return ERDLAB; - } -#endif - f->f_devdata = dip; - - return 0; -} - -int -efistrategy(void *devdata, int rw, daddr_t blk, size_t size, void *buf, - size_t *rsize) -{ - struct diskinfo *dip = (struct diskinfo *)devdata; - u_int8_t error = 0; - size_t nsect; - -#ifdef SOFTRAID - /* Intercept strategy for softraid volumes. */ - if (dip->sr_vol) - return sr_strategy(dip->sr_vol, rw, blk, size, buf, rsize); -#endif - nsect = (size + DEV_BSIZE - 1) / DEV_BSIZE; - blk += DL_SECTOBLK(&dip->disklabel, - dip->disklabel.d_partitions[B_PARTITION(dip->bsddev)].p_offset); - - if (blk < 0) - error = EINVAL; - else - error = dip->diskio(rw, dip, blk, nsect, buf); - -#ifdef EFI_DEBUG - if (debug) { - if (error != 0) - printf("=0x%x(%s)", error, error); - putchar('\n'); - } -#endif - if (rsize != NULL) - *rsize = nsect * DEV_BSIZE; - - return (error); -} - -int -eficlose(struct open_file *f) -{ - f->f_devdata = NULL; - - return 0; -} - -int -efiioctl(struct open_file *f, u_long cmd, void *data) -{ - - return 0; -} - -void -efi_dump_diskinfo(void) -{ - efi_diskinfo_t ed; - struct diskinfo *dip; - bios_diskinfo_t *bdi; - uint64_t siz; - const char *sizu; - - printf("Disk\tBlkSiz\tIoAlign\tSize\tFlags\tChecksum\n"); - TAILQ_FOREACH(dip, &disklist, list) { - bdi = &dip->bios_info; - ed = dip->efi_info; - - siz = (ed->blkio->Media->LastBlock + 1) * - ed->blkio->Media->BlockSize; - siz /= 1024 * 1024; - if (siz < 10000) - sizu = "MB"; - else { - siz /= 1024; - sizu = "GB"; - } - - printf("%cd%d\t%u\t%u\t%u%s\t0x%x\t0x%x\t%s\n", - (B_TYPE(bdi->bsd_dev) == 6)? 'c' : 'h', - (bdi->bios_number & 0x1f), - ed->blkio->Media->BlockSize, - ed->blkio->Media->IoAlign, (unsigned)siz, sizu, - bdi->flags, bdi->checksum, - (ed->blkio->Media->RemovableMedia)? "Removable" : ""); - } -} diff --git a/sys/arch/amd64/stand/efi64/efidev.h b/sys/arch/amd64/stand/efi64/efidev.h deleted file mode 100644 index 48c2e7e82ee..00000000000 --- a/sys/arch/amd64/stand/efi64/efidev.h +++ /dev/null @@ -1,38 +0,0 @@ -/* $OpenBSD: efidev.h,v 1.2 2020/12/09 18:10:18 krw Exp $ */ - -/* - * Copyright (c) 1996 Michael Shalayeff - * Copyright (c) 2015 YASUOKA Masahiko - * 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 REGENTS 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. - * - */ - -/* efidev.c */ -void efid_init(struct diskinfo *, void *handle); -const char *efi_getdisklabel(efi_diskinfo_t, struct disklabel *); -int efiopen(struct open_file *, ...); -int efistrategy(void *, int, daddr_t, size_t, void *, size_t *); -int eficlose(struct open_file *); -int efiioctl(struct open_file *, u_long, void *); -void efi_dump_diskinfo(void); diff --git a/sys/arch/amd64/stand/efi64/efipxe.c b/sys/arch/amd64/stand/efi64/efipxe.c deleted file mode 100644 index f8dd6af5883..00000000000 --- a/sys/arch/amd64/stand/efi64/efipxe.c +++ /dev/null @@ -1,306 +0,0 @@ -/* $OpenBSD: efipxe.c,v 1.6 2021/03/11 11:16:55 jsg Exp $ */ -/* - * Copyright (c) 2017 Patrick Wildt - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include - -#include -#include - -#include "disk.h" - -#include -#include -#include "eficall.h" -#include "efiboot.h" - -extern EFI_BOOT_SERVICES *BS; -extern EFI_DEVICE_PATH *efi_bootdp; - -extern char *bootmac; -static UINT8 boothw[16]; -static EFI_IP_ADDRESS bootip, servip; -static EFI_GUID devp_guid = DEVICE_PATH_PROTOCOL; -static EFI_GUID pxe_guid = EFI_PXE_BASE_CODE_PROTOCOL; -static EFI_PXE_BASE_CODE *PXE = NULL; - -extern int efi_device_path_depth(EFI_DEVICE_PATH *dp, int); -extern int efi_device_path_ncmp(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *, int); - -/* - * TFTP initial probe. This function discovers PXE handles and tries - * to figure out if there has already been a successful PXE handshake. - * If so, set the PXE variable. - */ -void -efi_pxeprobe(void) -{ - EFI_PXE_BASE_CODE *pxe; - EFI_DEVICE_PATH *dp0; - EFI_HANDLE *handles; - EFI_STATUS status; - UINTN nhandles; - int i, depth; - - if (efi_bootdp == NULL) - return; - - status = EFI_CALL(BS->LocateHandleBuffer, ByProtocol, &pxe_guid, NULL, - &nhandles, &handles); - if (status != EFI_SUCCESS) - return; - - for (i = 0; i < nhandles; i++) { - EFI_PXE_BASE_CODE_DHCPV4_PACKET *dhcp; - - status = EFI_CALL(BS->HandleProtocol, handles[i], - &devp_guid, (void **)&dp0); - if (status != EFI_SUCCESS) - continue; - - depth = efi_device_path_depth(efi_bootdp, MESSAGING_DEVICE_PATH); - if (depth == -1 || efi_device_path_ncmp(efi_bootdp, dp0, depth)) - continue; - - status = EFI_CALL(BS->HandleProtocol, handles[i], &pxe_guid, - (void **)&pxe); - if (status != EFI_SUCCESS) - continue; - - if (pxe->Mode == NULL) - continue; - - dhcp = (EFI_PXE_BASE_CODE_DHCPV4_PACKET *)&pxe->Mode->DhcpAck; - memcpy(&bootip, dhcp->BootpYiAddr, sizeof(bootip)); - memcpy(&servip, dhcp->BootpSiAddr, sizeof(servip)); - memcpy(boothw, dhcp->BootpHwAddr, sizeof(boothw)); - bootmac = boothw; - PXE = pxe; - - /* - * It is expected that bootdev_dip exists. Usually - * efiopen() sets the pointer. Create a fake disk - * for the TFTP case. - */ - bootdev_dip = alloc(sizeof(struct diskinfo)); - memset(bootdev_dip, 0, sizeof(struct diskinfo)); - memset(bootdev_dip->disklabel.d_uid, 0xff, - sizeof(bootdev_dip->disklabel.d_uid)); - break; - } -} - -/* - * TFTP filesystem layer implementation. - */ -struct tftp_handle { - unsigned char *inbuf; /* input buffer */ - size_t inbufsize; - off_t inbufoff; -}; - -struct fs_ops tftp_fs = { - tftp_open, tftp_close, tftp_read, tftp_write, tftp_seek, - tftp_stat, tftp_readdir -}; - -int -tftp_open(char *path, struct open_file *f) -{ - struct tftp_handle *tftpfile; - EFI_PHYSICAL_ADDRESS addr; - EFI_STATUS status; - UINT64 size; - - if (strcmp("TFTP", f->f_dev->dv_name) != 0) - return ENXIO; - - if (PXE == NULL) - return ENXIO; - - tftpfile = alloc(sizeof(*tftpfile)); - if (tftpfile == NULL) - return ENOMEM; - memset(tftpfile, 0, sizeof(*tftpfile)); - - status = EFI_CALL(PXE->Mtftp, PXE, EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, - NULL, FALSE, &size, NULL, &servip, path, NULL, FALSE); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENOENT; - } - tftpfile->inbufsize = size; - - if (tftpfile->inbufsize == 0) - goto out; - - status = EFI_CALL(BS->AllocatePages, AllocateAnyPages, EfiLoaderData, - EFI_SIZE_TO_PAGES(tftpfile->inbufsize), &addr); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENOMEM; - } - tftpfile->inbuf = (unsigned char *)((paddr_t)addr); - - status = EFI_CALL(PXE->Mtftp, PXE, EFI_PXE_BASE_CODE_TFTP_READ_FILE, - tftpfile->inbuf, FALSE, &size, NULL, &servip, path, NULL, FALSE); - if (status != EFI_SUCCESS) { - free(tftpfile, sizeof(*tftpfile)); - return ENXIO; - } -out: - f->f_fsdata = tftpfile; - return 0; -} - -int -tftp_close(struct open_file *f) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - if (tftpfile->inbuf != NULL) - EFI_CALL(BS->FreePages, (paddr_t)tftpfile->inbuf, - EFI_SIZE_TO_PAGES(tftpfile->inbufsize)); - free(tftpfile, sizeof(*tftpfile)); - return 0; -} - -int -tftp_read(struct open_file *f, void *addr, size_t size, size_t *resid) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - size_t toread; - - if (size > tftpfile->inbufsize - tftpfile->inbufoff) - toread = tftpfile->inbufsize - tftpfile->inbufoff; - else - toread = size; - - if (toread != 0) { - memcpy(addr, tftpfile->inbuf + tftpfile->inbufoff, toread); - tftpfile->inbufoff += toread; - } - - if (resid != NULL) - *resid = size - toread; - return 0; -} - -int -tftp_write(struct open_file *f, void *start, size_t size, size_t *resid) -{ - return EROFS; -} - -off_t -tftp_seek(struct open_file *f, off_t offset, int where) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - switch(where) { - case SEEK_CUR: - if (tftpfile->inbufoff + offset < 0 || - tftpfile->inbufoff + offset > tftpfile->inbufsize) { - errno = EOFFSET; - break; - } - tftpfile->inbufoff += offset; - return (tftpfile->inbufoff); - case SEEK_SET: - if (offset < 0 || offset > tftpfile->inbufsize) { - errno = EOFFSET; - break; - } - tftpfile->inbufoff = offset; - return (tftpfile->inbufoff); - case SEEK_END: - tftpfile->inbufoff = tftpfile->inbufsize; - return (tftpfile->inbufoff); - default: - errno = EINVAL; - } - return((off_t)-1); -} - -int -tftp_stat(struct open_file *f, struct stat *sb) -{ - struct tftp_handle *tftpfile = f->f_fsdata; - - sb->st_mode = 0444; - sb->st_nlink = 1; - sb->st_uid = 0; - sb->st_gid = 0; - sb->st_size = tftpfile->inbufsize; - - return 0; -} - -int -tftp_readdir(struct open_file *f, char *name) -{ - return EOPNOTSUPP; -} - -/* - * Dummy TFTP network device. - */ -int -tftpopen(struct open_file *f, ...) -{ - char **fname, *p; - va_list ap; - - va_start(ap, f); - fname = va_arg(ap, char **); - va_end(ap); - - /* No PXE set -> no PXE available */ - if (PXE == NULL) - return 1; - - /* Parse tftp:bsd into "tftp" and "bsd" */ - for (p = *fname; *p != ':' && *p != '\0'; p++) - ; - if (*p != ':') - return 1; - if (strncmp(*fname, "tftp", p - *fname) != 0) - return 1; - - *fname = p + 1; - return 0; -} - -int -tftpclose(struct open_file *f) -{ - return 0; -} - -int -tftpioctl(struct open_file *f, u_long cmd, void *data) -{ - return EOPNOTSUPP; -} - -int -tftpstrategy(void *devdata, int rw, daddr_t blk, size_t size, void *buf, - size_t *rsize) -{ - return EOPNOTSUPP; -} diff --git a/sys/arch/amd64/stand/efi64/efipxe.h b/sys/arch/amd64/stand/efi64/efipxe.h deleted file mode 100644 index 34347b03773..00000000000 --- a/sys/arch/amd64/stand/efi64/efipxe.h +++ /dev/null @@ -1,21 +0,0 @@ -/* $OpenBSD: efipxe.h,v 1.2 2020/12/09 18:10:18 krw Exp $ */ -/* - * Copyright (c) 2017 Patrick Wildt - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -int tftpopen(struct open_file *, ...); -int tftpclose(struct open_file *); -int tftpioctl(struct open_file *, u_long, void *); -int tftpstrategy(void *, int, daddr_t, size_t, void *, size_t *); diff --git a/sys/arch/amd64/stand/efi64/efirng.c b/sys/arch/amd64/stand/efi64/efirng.c deleted file mode 100644 index 2f503909488..00000000000 --- a/sys/arch/amd64/stand/efi64/efirng.c +++ /dev/null @@ -1,90 +0,0 @@ -/* $OpenBSD: efirng.c,v 1.2 2020/05/25 14:53:59 deraadt Exp $ */ - -/* - * Copyright (c) 2018 Mark Kettenis - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -#include -#include - -#include "eficall.h" -#include "libsa.h" - -extern EFI_BOOT_SERVICES *BS; - -/* Random Number Generator Protocol */ - -#define EFI_RNG_PROTOCOL_GUID \ - { 0x3152bca5, 0xeade, 0x433d, {0x86, 0x2e, 0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44} } - -INTERFACE_DECL(_EFI_RNG_PROTOCOL); - -typedef EFI_GUID EFI_RNG_ALGORITHM; - -typedef -EFI_STATUS -(EFIAPI *EFI_RNG_GET_INFO) ( - IN struct _EFI_RNG_PROTOCOL *This, - IN OUT UINTN *RNGAlgorithmListSize, - OUT EFI_RNG_ALGORITHM *RNGAlgorithmList - ); - -typedef -EFI_STATUS -(EFIAPI *EFI_RNG_GET_RNG) ( - IN struct _EFI_RNG_PROTOCOL *This, - IN EFI_RNG_ALGORITHM *RNGAlgorithm, OPTIONAL - IN UINTN RNGValueLength, - OUT UINT8 *RNGValue - ); - -typedef struct _EFI_RNG_PROTOCOL { - EFI_RNG_GET_INFO GetInfo; - EFI_RNG_GET_RNG GetRNG; -} EFI_RNG_PROTOCOL; - -static EFI_GUID rng_guid = EFI_RNG_PROTOCOL_GUID; - -int -fwrandom(char *buf, size_t buflen) -{ - EFI_STATUS status; - EFI_RNG_PROTOCOL *rng = NULL; - UINT8 *random; - size_t i; - int ret = 0; - - status = EFI_CALL(BS->LocateProtocol, &rng_guid, NULL, (void **)&rng); - if (rng == NULL || EFI_ERROR(status)) - return -1; - - random = alloc(buflen); - - status = EFI_CALL(rng->GetRNG, rng, NULL, buflen, random); - if (EFI_ERROR(status)) { - printf("RNG GetRNG() failed (%d)\n", status); - ret = -1; - goto out; - } - - for (i = 0; i < buflen; i++) - buf[i] ^= random[i]; - -out: - free(random, buflen); - return ret; -} diff --git a/sys/arch/amd64/stand/efi64/exec_i386.c b/sys/arch/amd64/stand/efi64/exec_i386.c deleted file mode 100644 index 03b67c90d38..00000000000 --- a/sys/arch/amd64/stand/efi64/exec_i386.c +++ /dev/null @@ -1,207 +0,0 @@ -/* $OpenBSD: exec_i386.c,v 1.4 2023/02/23 19:48:21 miod Exp $ */ - -/* - * Copyright (c) 1997-1998 Michael Shalayeff - * Copyright (c) 1997 Tobias Weingartner - * 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 ``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 REGENTS 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 -#include -#include -#include -#include -#include -#include - -#include "cmd.h" -#include "disk.h" -#include "libsa.h" - -#ifdef SOFTRAID -#include -#include -#include "softraid_amd64.h" -#endif - -#include "efiboot.h" - -typedef void (*startfuncp)(int, int, int, int, int, int, int, int) - __attribute__ ((noreturn)); - -void ucode_load(void); -extern struct cmd_state cmd; - -char *bootmac = NULL; - -void -run_loadfile(uint64_t *marks, int howto) -{ - u_long entry; -#ifdef EXEC_DEBUG - extern int debug; -#endif - dev_t bootdev = bootdev_dip->bootdev; - size_t ac = BOOTARG_LEN; - caddr_t av = (caddr_t)BOOTARG_OFF; - bios_consdev_t cd; - extern int com_speed; /* from bioscons.c */ - extern int com_addr; - bios_ddb_t ddb; - extern int db_console; - bios_bootduid_t bootduid; -#ifdef SOFTRAID - bios_bootsr_t bootsr; - struct sr_boot_volume *bv; -#endif - int i; - u_long delta; - extern u_long efi_loadaddr; - - if ((av = alloc(ac)) == NULL) - panic("alloc for bootarg"); - efi_makebootargs(); - delta = -efi_loadaddr; - if (sa_cleanup != NULL) - (*sa_cleanup)(); - - cd.consdev = cn_tab->cn_dev; - cd.conspeed = com_speed; - cd.consaddr = com_addr; - cd.consfreq = 0; - addbootarg(BOOTARG_CONSDEV, sizeof(cd), &cd); - - if (bootmac != NULL) - addbootarg(BOOTARG_BOOTMAC, sizeof(bios_bootmac_t), bootmac); - - if (db_console != -1) { - ddb.db_console = db_console; - addbootarg(BOOTARG_DDB, sizeof(ddb), &ddb); - } - - bcopy(bootdev_dip->disklabel.d_uid, &bootduid.duid, sizeof(bootduid)); - addbootarg(BOOTARG_BOOTDUID, sizeof(bootduid), &bootduid); - - ucode_load(); - -#ifdef SOFTRAID - if (bootdev_dip->sr_vol != NULL) { - bv = bootdev_dip->sr_vol; - bzero(&bootsr, sizeof(bootsr)); - bcopy(&bv->sbv_uuid, &bootsr.uuid, sizeof(bootsr.uuid)); - if (bv->sbv_maskkey != NULL) - bcopy(bv->sbv_maskkey, &bootsr.maskkey, - sizeof(bootsr.maskkey)); - addbootarg(BOOTARG_BOOTSR, sizeof(bios_bootsr_t), &bootsr); - explicit_bzero(&bootsr, sizeof(bootsr)); - } - - sr_clear_keys(); -#endif - - entry = marks[MARK_ENTRY] & 0x0fffffff; - entry += delta; - - printf("entry point at 0x%lx\n", entry); - - /* Sync the memory map and call ExitBootServices() */ - efi_cleanup(); - - /* Pass memory map to the kernel */ - mem_pass(); - - makebootargs32(av, &ac); - - /* - * Move the loaded kernel image to the usual place after calling - * ExitBootServices(). - */ - memmove((void *)marks[MARK_START] + delta, (void *)marks[MARK_START], - marks[MARK_END] - marks[MARK_START]); - for (i = 0; i < MARK_MAX; i++) - marks[i] += delta; - - (*run_i386)((u_long)run_i386, entry, howto, bootdev, BOOTARG_APIVER, - marks[MARK_END], extmem, cnvmem, ac, (intptr_t)av); - - /* not reached */ -} - -void -ucode_load(void) -{ - uint32_t model, family, stepping; - uint32_t dummy, signature; - uint32_t vendor[4]; - bios_ucode_t uc; - struct stat sb; - char path[128]; - size_t buflen; - char *buf; - int fd; - - CPUID(0, dummy, vendor[0], vendor[2], vendor[1]); - vendor[3] = 0; /* NULL-terminate */ - if (strcmp((char *)vendor, "GenuineIntel") != 0) - return; - - CPUID(1, signature, dummy, dummy, dummy); - family = (signature >> 8) & 0x0f; - model = (signature >> 4) & 0x0f; - if (family == 0x6 || family == 0xf) { - family += (signature >> 20) & 0xff; - model += ((signature >> 16) & 0x0f) << 4; - } - stepping = (signature >> 0) & 0x0f; - - snprintf(path, sizeof(path), "%s:/etc/firmware/intel/%02x-%02x-%02x", - cmd.bootdev, family, model, stepping); - - fd = open(path, O_RDONLY); - if (fd == -1) - return; - - if (fstat(fd, &sb) == -1) - return; - - buflen = sb.st_size; - if (buflen > 128*1024) { - printf("ucode too large\n"); - return; - } - - buf = (char *)(1*1024*1024); - - if (read(fd, buf, buflen) != buflen) { - close(fd); - return; - } - - uc.uc_addr = (uint64_t)buf; - uc.uc_size = (uint64_t)buflen; - addbootarg(BOOTARG_UCODE, sizeof(uc), &uc); - - close(fd); -} diff --git a/sys/arch/amd64/stand/efi64/heap.h b/sys/arch/amd64/stand/efi64/heap.h deleted file mode 100644 index 0f9e1ba79b9..00000000000 --- a/sys/arch/amd64/stand/efi64/heap.h +++ /dev/null @@ -1,29 +0,0 @@ -/* $OpenBSD: heap.h,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -#include - -static char *top = NULL; -#define NEEDS_HEAP_INIT 1 - -static void -heap_init(void) -{ - extern EFI_PHYSICAL_ADDRESS heap; - if (top == NULL) - top = (char *)(uintptr_t)heap; -} diff --git a/sys/arch/amd64/stand/efi64/ldscript.amd64 b/sys/arch/amd64/stand/efi64/ldscript.amd64 deleted file mode 100644 index ab3ab48c3a9..00000000000 --- a/sys/arch/amd64/stand/efi64/ldscript.amd64 +++ /dev/null @@ -1,65 +0,0 @@ -/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ -OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") -OUTPUT_ARCH(i386:x86-64) -ENTRY(_start) -SECTIONS -{ - . = 0; - ImageBase = .; - .hash : { *(.hash) } /* this MUST come first! */ - . = ALIGN(4096); - .eh_frame : - { - *(.eh_frame) - } - . = ALIGN(4096); - .text : - { - *(.text) - *(.text.*) - *(.gnu.linkonce.t.*) - } - . = ALIGN(4096); - .reloc : - { - *(.reloc) - } - . = ALIGN(4096); - .data : - { - *(.rodata*) - *(.got.plt) - *(.got) - *(.data*) - *(.sdata) - /* the EFI loader doesn't seem to like a .bss section, so we stick - it all into .data: */ - *(.sbss) - *(.scommon) - *(.dynbss) - *(.bss) - *(COMMON) - *(.rel.local) - } - . = ALIGN(4096); - .dynamic : { *(.dynamic) } - . = ALIGN(4096); - .rela : - { - *(.rela.data*) - *(.rela.got) - *(.rela.stab) - } - . = ALIGN(4096); - .dynsym : { *(.dynsym) } - . = ALIGN(4096); - .dynstr : { *(.dynstr) } - . = ALIGN(4096); - .ignored.reloc : - { - *(.rela.reloc) - *(.eh_frame) - *(.note.GNU-stack) - } - .comment 0 : { *(.comment) } -} diff --git a/sys/arch/amd64/stand/efi64/machdep.c b/sys/arch/amd64/stand/efi64/machdep.c deleted file mode 100644 index 9d6ba9cbfc5..00000000000 --- a/sys/arch/amd64/stand/efi64/machdep.c +++ /dev/null @@ -1,95 +0,0 @@ -/* $OpenBSD: machdep.c,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 2004 Tom Cosgrove - * Copyright (c) 1997-1999 Michael Shalayeff - * 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 OR HIS RELATIVES 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 MIND, 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 "libsa.h" -#include "biosdev.h" -#include -#include -#include -#include - -#include "efiboot.h" - -volatile struct BIOS_regs BIOS_regs; - -#if defined(DEBUG) -#define CKPT(c) (*(u_int16_t*)0xb8148 = 0x4700 + (c)) -#else -#define CKPT(c) /* c */ -#endif - -const char *vmm_hv_signature = VMM_HV_SIGNATURE; - -void -machdep(void) -{ - int i, j, vmm = 0; - struct i386_boot_probes *pr; - uint32_t dummy, ebx, ecx, edx; - dev_t dev; - - /* - * The list of probe routines is now in conf.c. - */ - for (i = 0; i < nibprobes; i++) { - pr = &probe_list[i]; - if (pr != NULL) { - printf("%s:", pr->name); - - for (j = 0; j < pr->count; j++) { - (*(pr->probes)[j])(); - } - - printf("\n"); - } - } - - CPUID(0x1, dummy, dummy, ecx, dummy); - if (ecx & CPUIDECX_HV) { - CPUID(0x40000000, dummy, ebx, ecx, edx); - if (memcmp(&ebx, &vmm_hv_signature[0], sizeof(uint32_t)) == 0 && - memcmp(&ecx, &vmm_hv_signature[4], sizeof(uint32_t)) == 0 && - memcmp(&edx, &vmm_hv_signature[8], sizeof(uint32_t)) == 0) - vmm = 1; - } - - /* Set console to com0/115200 by default in vmm */ - if (vmm) { - dev = ttydev("com0"); - cnspeed(dev, 115200); - cnset(dev); - } -} - -int -check_skip_conf(void) -{ - /* Return non-zero (skip boot.conf) if Control "shift" key down */ - return (efi_cons_getshifts(0) & 0x04); -} diff --git a/sys/arch/amd64/stand/efi64/memprobe.c b/sys/arch/amd64/stand/efi64/memprobe.c deleted file mode 100644 index 40304e04a56..00000000000 --- a/sys/arch/amd64/stand/efi64/memprobe.c +++ /dev/null @@ -1,173 +0,0 @@ -/* $OpenBSD: memprobe.c,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 1997-1999 Michael Shalayeff - * Copyright (c) 1997-1999 Tobias Weingartner - * 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 REGENTS 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 -#include -#include -#include -#include "libsa.h" - -u_int cnvmem, extmem; /* XXX - compatibility */ - -bios_memmap_t bios_memmap[64]; /* This is easier */ - -void -dump_biosmem(bios_memmap_t *tm) -{ - register bios_memmap_t *p; - register u_int total = 0; - - if (tm == NULL) - tm = bios_memmap; - - for (p = tm; p->type != BIOS_MAP_END; p++) { - printf("Region %ld: type %u at 0x%llx for %uKB\n", - (long)(p - tm), p->type, p->addr, - (u_int)(p->size / 1024)); - - if (p->type == BIOS_MAP_FREE) - total += p->size / 1024; - } - - printf("Low ram: %dKB High ram: %dKB\n", cnvmem, extmem); - printf("Total free memory: %uKB\n", total); -} - -int -mem_limit(long long ml) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - if (p->type != BIOS_MAP_FREE) - continue; - - /* Wholly above limit, nuke it */ - if ((sp >= ml) && (ep >= ml)) { - bcopy (p + 1, p, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p); - } else if ((sp < ml) && (ep >= ml)) { - p->size -= (ep - ml); - } - } - return 0; -} - -int -mem_delete(long long sa, long long ea) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - if (p->type == BIOS_MAP_FREE) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - /* can we eat it as a whole? */ - if ((sa - sp) <= PAGE_SIZE && (ep - ea) <= PAGE_SIZE) { - bcopy(p + 1, p, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p); - break; - /* eat head or legs */ - } else if (sa <= sp && sp < ea) { - p->addr = ea; - p->size = ep - ea; - break; - } else if (sa < ep && ep <= ea) { - p->size = sa - sp; - break; - } else if (sp < sa && ea < ep) { - /* bite in half */ - bcopy(p, p + 1, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)p - - sizeof(bios_memmap[0])); - p[1].addr = ea; - p[1].size = ep - ea; - p->size = sa - sp; - break; - } - } - } - return 0; -} - -int -mem_add(long long sa, long long ea) -{ - register bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) { - if (p->type == BIOS_MAP_FREE) { - register int64_t sp = p->addr, ep = p->addr + p->size; - - /* is it already there? */ - if (sp <= sa && ea <= ep) { - break; - /* join head or legs */ - } else if (sa < sp && sp <= ea) { - p->addr = sa; - p->size = ep - sa; - break; - } else if (sa <= ep && ep < ea) { - p->size = ea - sp; - break; - } else if (ea < sp) { - /* insert before */ - bcopy(p, p + 1, (char *)bios_memmap + - sizeof(bios_memmap) - (char *)(p - 1)); - p->addr = sa; - p->size = ea - sa; - break; - } - } - } - - /* meaning add new item at the end of the list */ - if (p->type == BIOS_MAP_END) { - p[1] = p[0]; - p->type = BIOS_MAP_FREE; - p->addr = sa; - p->size = ea - sa; - } - - return 0; -} - -void -mem_pass(void) -{ - bios_memmap_t *p; - - for (p = bios_memmap; p->type != BIOS_MAP_END; p++) - ; - addbootarg(BOOTARG_MEMMAP, (p - bios_memmap + 1) * sizeof *bios_memmap, - bios_memmap); -} diff --git a/sys/arch/amd64/stand/efi64/run_i386.S b/sys/arch/amd64/stand/efi64/run_i386.S deleted file mode 100644 index 82bc512b2cc..00000000000 --- a/sys/arch/amd64/stand/efi64/run_i386.S +++ /dev/null @@ -1,115 +0,0 @@ -/* $OpenBSD: run_i386.S,v 1.3 2022/12/08 01:25:44 guenther Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include - -#define CODE_SEGMENT 0x10 -#define DATA_SEGMENT 0x18 - - .globl run_i386_size -run_i386_size: - .long run_i386_end - run_i386_start - - .align 4 - .text - .globl run_i386_start -run_i386_start: -start: - /* - * run_i386(_start) is to call the loaded kernel's start() with - * 32bit segment mode from x64 mode. - * %rdi == loaded start address, %rsi == kernel start address - */ - - /* re-arrange the parameters for the x86 calling convention */ - mov %edx, (run_i386_end - start - 0x20)(%rdi) - mov %ecx, (run_i386_end - start - 0x1c)(%rdi) - mov %r8d, (run_i386_end - start - 0x18)(%rdi) - mov %r9d, (run_i386_end - start - 0x14)(%rdi) - mov 0x8(%rsp), %edx - mov %edx, (run_i386_end - start - 0x10)(%rdi) - mov 0x10(%rsp), %edx - mov %edx, (run_i386_end - start - 0xc)(%rdi) - mov 0x18(%rsp), %edx - mov %edx, (run_i386_end - start - 0x8)(%rdi) - mov 0x20(%rsp), %edx - mov %edx, (run_i386_end - start - 0x4)(%rdi) - - /* Prepare jump address */ - lea (start32a - start)(%rdi), %rax - movl %eax, (start32r - start)(%rdi) - - cli - - /* Setup GDT */ - lea (gdt - start)(%rdi), %rax - mov %rax, (gdtrr - start)(%rdi) - lgdt (gdtr - start)(%rdi) - - /* Jump to set %cs */ - ljmp *(start32r - start)(%rdi) - - .align 4 -start32a: - .code32 - movl $DATA_SEGMENT, %eax - movl %eax, %ds - movl %eax, %es - movl %eax, %fs - movl %eax, %gs - movl %eax, %ss - - lea (run_i386_end - start - 0x20)(%edi), %eax - mov %eax, %esp - - /* Disable Paging in CR0 */ - movl %cr0, %eax - andl $(~CR0_PG), %eax - movl %eax, %cr0 - - /* Disable PAE in CR4 */ - movl %cr4, %eax - andl $(~CR4_PAE), %eax - movl %eax, %cr4 - - jmp start32b -start32b: - .code32 - - call *%esi - - .align 4 -start32r: - .long 0 - .long CODE_SEGMENT - .align 4 -gdt: - .long 0, 0 - .long 0, 0 - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00 - .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00 -gdtr: - .word gdtr - gdt -gdtrr: - .quad -start32end: - /* Space for the stack */ - .align 4 - .space 8192 -run_i386_end: diff --git a/sys/arch/amd64/stand/efi64/run_i386.h b/sys/arch/amd64/stand/efi64/run_i386.h deleted file mode 100644 index b6fd7e3a6c2..00000000000 --- a/sys/arch/amd64/stand/efi64/run_i386.h +++ /dev/null @@ -1,21 +0,0 @@ -/* $OpenBSD: run_i386.h,v 1.1 2019/05/11 02:36:10 mlarkin Exp $ */ - -/* - * Copyright (c) 2015 YASUOKA Masahiko - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -extern void run_i386_start(u_long, u_long, int, int, int, int, int, int, - int, int) __attribute__ ((noreturn)); -extern u_int run_i386_size; diff --git a/sys/arch/amd64/stand/efi64/self_reloc.c b/sys/arch/amd64/stand/efi64/self_reloc.c deleted file mode 100644 index 9e56103b332..00000000000 --- a/sys/arch/amd64/stand/efi64/self_reloc.c +++ /dev/null @@ -1,104 +0,0 @@ -/* $OpenBSD: self_reloc.c,v 1.2 2019/05/11 19:14:41 mlarkin Exp $ */ -/*- - * Copyright (c) 2008-2010 Rui Paulo - * 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 -#include - -#define ELFSIZE 64 -#define ElfW_Rel Elf64_Rela -#define ElfW_Dyn Elf64_Dyn -#define ELFW_R_TYPE ELF64_R_TYPE -#define ELF_RELA - -#include - -#define RELOC_TYPE_NONE R_X86_64_NONE -#define RELOC_TYPE_RELATIVE R_X86_64_RELATIVE - -/* - * A simple elf relocator. - */ -void -self_reloc(Elf_Addr baseaddr, ElfW_Dyn *dynamic) -{ - Elf_Word relsz, relent; - Elf_Addr *newaddr; - ElfW_Rel *rel = NULL; - 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. We rely on the object having been - * linked at 0, so that the difference between the load and link - * address is the same as the load address. - */ - 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: - newaddr = (Elf_Addr *)(rel->r_offset + baseaddr); -#ifdef ELF_RELA - /* Addend relative to the base address. */ - *newaddr = baseaddr + rel->r_addend; -#else - /* Address relative to the base address. */ - *newaddr += baseaddr; -#endif - break; - default: - /* XXX: do we need other relocations ? */ - break; - } - rel = (ElfW_Rel *) ((caddr_t) rel + relent); - } -} diff --git a/sys/arch/amd64/stand/efi64/start_amd64.S b/sys/arch/amd64/stand/efi64/start_amd64.S deleted file mode 100644 index 171dbff3d0a..00000000000 --- a/sys/arch/amd64/stand/efi64/start_amd64.S +++ /dev/null @@ -1,76 +0,0 @@ -/*- - * Copyright (C) 1999 Hewlett-Packard Co. - * Contributed by David Mosberger . - * Copyright (C) 2005 Intel Co. - * Contributed by Fenghua Yu . - * 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. Neither the name of Hewlett-Packard Co. nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * 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 - * OWNER 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. - */ - -/* - * crt0-efi-x86_64.S - x86_64 EFI startup code. - * $FreeBSD: head/sys/boot/efi/loader/arch/amd64/start.S 282727 2015-05-10 13:24:26Z ian $ - */ - - .text - .align 4 - - .globl _start -_start: - subq $8, %rsp - pushq %rcx - pushq %rdx - -0: - lea ImageBase(%rip), %rdi - lea _DYNAMIC(%rip), %rsi - - popq %rcx - popq %rdx - pushq %rcx - pushq %rdx - call self_reloc - - popq %rdi - popq %rsi - - call efi_main - addq $8, %rsp - -.exit: - ret - - /* - * hand-craft a dummy .reloc section so EFI knows it's a relocatable - * executable: - */ - - .data - .section .reloc, "a" - .long 0 - .long 10 - .word 0 -- 2.20.1