xref: /openbsd/sys/arch/hppa/stand/cdboot/cdboot.c (revision a4f11372)
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 
43 dev_t bootdev;
44 int debug = 1;
45 int boottimeout = 5;
46 
47 struct fs_ops file_system[] = {
48 	{ cd9660_open, cd9660_close, cd9660_read, cd9660_write, cd9660_seek,
49 	  cd9660_stat, cd9660_readdir },
50 };
51 int nfsys = nitems(file_system);
52 
53 struct devsw devsw[] = {
54 	{ "dk",	iodcstrategy, dkopen, dkclose, noioctl },
55 };
56 int	ndevs = nitems(devsw);
57 
58 struct consdev	constab[] = {
59 	{ ite_probe, ite_init, ite_getc, ite_putc },
60 	{ NULL }
61 };
62 struct consdev *cn_tab;
63 
64 typedef void (*startfuncp)(int, int, int, int, int, int, caddr_t)
65     __attribute__ ((noreturn));
66 
67 char   rnddata[BOOTRANDOM_MAX];		/* XXX dummy */
68 struct rc4_ctx randomctx;
69 
70 void
boot(dev_t dev)71 boot(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