1 /* $OpenBSD: cdboot.c,v 1.13 2013/12/28 02:51:07 deraadt 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 <dev/cons.h> 36 #include <machine/pdc.h> 37 #include <machine/cpu.h> 38 #include <stand/boot/bootarg.h> 39 #include "dev_hppa.h" 40 #include "cmd.h" 41 42 dev_t bootdev; 43 int debug = 1; 44 int boottimeout = 5; 45 46 struct fs_ops file_system[] = { 47 { cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek, 48 cd9660_stat, cd9660_readdir }, 49 }; 50 int nfsys = nitems(file_system); 51 52 struct devsw devsw[] = { 53 { "dk", iodcstrategy, dkopen, dkclose, noioctl }, 54 }; 55 int ndevs = nitems(devsw); 56 57 struct consdev constab[] = { 58 { ite_probe, ite_init, ite_getc, ite_putc }, 59 { NULL } 60 }; 61 struct consdev *cn_tab; 62 63 typedef void (*startfuncp)(int, int, int, int, int, int, caddr_t) 64 __attribute__ ((noreturn)); 65 66 char rnddata[BOOTRANDOM_MAX]; /* XXX dummy */ 67 68 void 69 boot(dev_t dev) 70 { 71 u_long marks[MARK_MAX]; 72 char path[128]; 73 74 pdc_init(); 75 cninit(); 76 devboot(dev, path); 77 strncpy(path + strlen(path), ":/bsd.rd", 9); 78 printf(">> OpenBSD/" MACHINE " CDBOOT 0.2\n" 79 "booting %s: ", path); 80 81 marks[MARK_START] = (u_long)DEFAULT_KERNEL_ADDRESS; 82 if (!loadfile(path, marks, LOAD_KERNEL)) { 83 marks[MARK_END] = ALIGN(marks[MARK_END] - 84 (u_long)DEFAULT_KERNEL_ADDRESS); 85 fcacheall(); 86 87 __asm("mtctl %r0, %cr17"); 88 __asm("mtctl %r0, %cr17"); 89 (*(startfuncp)(marks[MARK_ENTRY]))((int)pdc, 0, bootdev, 90 marks[MARK_END], BOOTARG_APIVER, BOOTARG_LEN, 91 (caddr_t)BOOTARG_OFF); 92 /* not reached */ 93 } 94 } 95