xref: /openbsd-src/sys/arch/hppa/stand/cdboot/cdboot.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
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