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