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