1/* $OpenBSD: cdboot.c,v 1.16 2023/02/23 19:48:22 miod Exp $ */ 2 3/* 4 * Copyright (c) 2003 Michael Shalayeff 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26 * THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include <sys/param.h> 30#include <sys/reboot.h> 31#include <sys/stat.h> 32#include <libsa.h> 33#include <lib/libsa/cd9660.h> 34#include <lib/libsa/loadfile.h> 35#include <lib/libsa/arc4.h> 36#include <dev/cons.h> 37#include <machine/pdc.h> 38#include <machine/cpu.h> 39#include <stand/boot/bootarg.h> 40#include "dev_hppa.h" 41#include "cmd.h" 42 43dev_t bootdev; 44int debug = 1; 45int boottimeout = 5; 46 47struct fs_ops file_system[] = { 48 { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, 49 cd9660_stat, cd9660_readdir }, 50}; 51int nfsys = nitems(file_system); 52 53struct devsw devsw[] = { 54 { "dk", iodcstrategy, dkopen, dkclose, noioctl }, 55}; 56int ndevs = nitems(devsw); 57 58struct consdev constab[] = { 59 { ite_probe, ite_init, ite_getc, ite_putc }, 60 { NULL } 61}; 62struct consdev *cn_tab; 63 64typedef void (*startfuncp)(int, int, int, int, int, int, caddr_t) 65 __attribute__ ((noreturn)); 66 67char rnddata[BOOTRANDOM_MAX]; /* XXX dummy */ 68struct rc4_ctx randomctx; 69 70void 71boot(dev_t dev) 72{ 73 uint64_t marks[MARK_MAX]; 74 char path[128]; 75 76 pdc_init(); 77 cninit(); 78 devboot(dev, path); 79 strncpy(path + strlen(path), ":/bsd.rd", 9); 80 printf(">> OpenBSD/" MACHINE " CDBOOT 0.2\n" 81 "booting %s: ", path); 82 83 /* XXX note that rnddata is not initialized */ 84 rc4_keysetup(&randomctx, rnddata, sizeof rnddata); 85 rc4_skip(&randomctx, 1536); 86 87 marks[MARK_START] = 0; 88 if (!loadfile(path, marks, LOAD_KERNEL)) { 89 marks[MARK_END] = ALIGN(marks[MARK_END]); 90 fcacheall(); 91 92 __asm("mtctl %r0, %cr17"); 93 __asm("mtctl %r0, %cr17"); 94 (*(startfuncp)((u_long)marks[MARK_ENTRY]))((int)pdc, 0, bootdev, 95 (u_long)marks[MARK_END], BOOTARG_APIVER, BOOTARG_LEN, 96 (caddr_t)BOOTARG_OFF); 97 /* not reached */ 98 } 99} 100