xref: /openbsd/sys/arch/landisk/stand/xxboot/boot1.c (revision 6d62b6ec)
1*6d62b6ecSmiod /*	$OpenBSD: boot1.c,v 1.12 2022/09/02 10:15:35 miod Exp $	*/
2d111cfa0Sderaadt /*	$NetBSD: boot1.c,v 1.1 2006/09/01 21:26:19 uwe Exp $	*/
3d111cfa0Sderaadt 
4d111cfa0Sderaadt /*-
5d111cfa0Sderaadt  * Copyright (c) 2003 The NetBSD Foundation, Inc.
6d111cfa0Sderaadt  * All rights reserved.
7d111cfa0Sderaadt  *
8d111cfa0Sderaadt  * This code is derived from software contributed to The NetBSD Foundation
9d111cfa0Sderaadt  * by David Laight.
10d111cfa0Sderaadt  *
11d111cfa0Sderaadt  * Redistribution and use in source and binary forms, with or without
12d111cfa0Sderaadt  * modification, are permitted provided that the following conditions
13d111cfa0Sderaadt  * are met:
14d111cfa0Sderaadt  * 1. Redistributions of source code must retain the above copyright
15d111cfa0Sderaadt  *    notice, this list of conditions and the following disclaimer.
16d111cfa0Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
17d111cfa0Sderaadt  *    notice, this list of conditions and the following disclaimer in the
18d111cfa0Sderaadt  *    documentation and/or other materials provided with the distribution.
19d111cfa0Sderaadt  *
20d111cfa0Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21d111cfa0Sderaadt  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22d111cfa0Sderaadt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23d111cfa0Sderaadt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24d111cfa0Sderaadt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25d111cfa0Sderaadt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26d111cfa0Sderaadt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27d111cfa0Sderaadt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28d111cfa0Sderaadt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29d111cfa0Sderaadt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30d111cfa0Sderaadt  * POSSIBILITY OF SUCH DAMAGE.
31d111cfa0Sderaadt  */
32d111cfa0Sderaadt 
33d111cfa0Sderaadt #include <sys/param.h>
34d111cfa0Sderaadt #include <lib/libsa/stand.h>
35*6d62b6ecSmiod #include "ufs12.h"
36d111cfa0Sderaadt 
37d111cfa0Sderaadt #include <sys/disklabel.h>
38d111cfa0Sderaadt 
39d111cfa0Sderaadt #define	XSTR(x)	#x
40d111cfa0Sderaadt #define	STR(x)	XSTR(x)
41d111cfa0Sderaadt 
42d111cfa0Sderaadt static uint32_t bios_sector;
43d111cfa0Sderaadt 
44d111cfa0Sderaadt const char *boot1(uint32_t *);
45d111cfa0Sderaadt void putstr(const char *str);
463e58d19eSkrw int blkdevstrategy(void *, int, daddr_t, size_t, void *, size_t *);
47d111cfa0Sderaadt int blkdevopen(struct open_file *, ...);
48d111cfa0Sderaadt int blkdevclose(struct open_file *);
49664fb24aSmiod int readsects(int dev, uint32_t lba, void *buf, size_t size);
50d111cfa0Sderaadt 
51d111cfa0Sderaadt extern struct disklabel ptn_disklabel;
52d111cfa0Sderaadt 
53d111cfa0Sderaadt struct fs_ops file_system[] = {
54*6d62b6ecSmiod 	{ ufs12_open, ufs12_close, ufs12_read, ufs12_write, ufs12_seek,
55*6d62b6ecSmiod 	  ufs12_stat, ufs12_readdir, ufs12_fchmod },
56d111cfa0Sderaadt };
57cf92b8d0Sjasper int nfsys = nitems(file_system);
58d111cfa0Sderaadt 
59d111cfa0Sderaadt struct devsw devsw[] = {
60d111cfa0Sderaadt 	{ "dk", blkdevstrategy, blkdevopen, blkdevclose, noioctl },
61d111cfa0Sderaadt };
62cf92b8d0Sjasper int     ndevs = nitems(devsw);
63d111cfa0Sderaadt 
64d111cfa0Sderaadt const char *
boot1(uint32_t * sector)65d111cfa0Sderaadt boot1(uint32_t *sector)
66d111cfa0Sderaadt {
67d111cfa0Sderaadt         struct stat sb;
68c6519cf2Smiod 	int fd = -1;
69d111cfa0Sderaadt 
70d111cfa0Sderaadt 	bios_sector = *sector;
71d111cfa0Sderaadt 
72d111cfa0Sderaadt 	putstr("\r\nOpenBSD/" MACHINE " Primary Bootstrap\r\n");
73d111cfa0Sderaadt 
74d111cfa0Sderaadt 	do {
75d111cfa0Sderaadt 		/*
76d111cfa0Sderaadt 		 * Nothing at the start of the MBR partition, fallback on
77d111cfa0Sderaadt 		 * partition 'a' from the disklabel in this MBR partition.
78d111cfa0Sderaadt 		 */
79d111cfa0Sderaadt 		if (ptn_disklabel.d_magic != DISKMAGIC)
80d111cfa0Sderaadt 			break;
81d111cfa0Sderaadt 		if (ptn_disklabel.d_magic2 != DISKMAGIC)
82d111cfa0Sderaadt 			break;
83d111cfa0Sderaadt 		if (ptn_disklabel.d_partitions[0].p_fstype == FS_UNUSED)
84d111cfa0Sderaadt 			break;
85d111cfa0Sderaadt 
86d111cfa0Sderaadt 		bios_sector = ptn_disklabel.d_partitions[0].p_offset;
87d111cfa0Sderaadt 		*sector = bios_sector;
88d6da11dcSderaadt 		fd = open("boot", O_RDONLY);
89d111cfa0Sderaadt 	} while (0);
90d111cfa0Sderaadt 
91d111cfa0Sderaadt 	if (fd == -1 || fstat(fd, &sb) == -1)
92d111cfa0Sderaadt 		return "Can't open /boot.\r\n";
93d111cfa0Sderaadt 
94d111cfa0Sderaadt #if 0
95d111cfa0Sderaadt 	if (sb.st_size > SECONDARY_MAX_LOAD)
96d111cfa0Sderaadt 		return "/boot too large.\r\n";
97d111cfa0Sderaadt #endif
98d111cfa0Sderaadt 
99d111cfa0Sderaadt 	if (read(fd, (void *)LOADADDRESS, sb.st_size) != sb.st_size)
100d111cfa0Sderaadt 		return "/boot load failed.\r\n";
101d111cfa0Sderaadt 
102d111cfa0Sderaadt 	if (*(uint32_t *)(LOADADDRESS + 4) != 0x20041110)
103d111cfa0Sderaadt 		return "Invalid /boot file format.\r\n";
104d111cfa0Sderaadt 
105d111cfa0Sderaadt 	return 0;
106d111cfa0Sderaadt }
107d111cfa0Sderaadt 
108d111cfa0Sderaadt int
blkdevopen(struct open_file * f,...)109d111cfa0Sderaadt blkdevopen(struct open_file *f, ...)
110d111cfa0Sderaadt {
111d111cfa0Sderaadt 	return 0;
112d111cfa0Sderaadt }
113d111cfa0Sderaadt int
blkdevclose(struct open_file * f)114d111cfa0Sderaadt blkdevclose(struct open_file *f)
115d111cfa0Sderaadt {
116d111cfa0Sderaadt 	return 0;
117d111cfa0Sderaadt }
118d111cfa0Sderaadt 
119d111cfa0Sderaadt int
blkdevstrategy(void * devdata,int flag,daddr_t dblk,size_t size,void * buf,size_t * rsize)1203e58d19eSkrw blkdevstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize)
121d111cfa0Sderaadt {
122d111cfa0Sderaadt 
123d111cfa0Sderaadt 	if (flag != F_READ)
124d111cfa0Sderaadt 		return EROFS;
125d111cfa0Sderaadt 
126d111cfa0Sderaadt 	if (size & (DEV_BSIZE - 1))
127d111cfa0Sderaadt 		return EINVAL;
128d111cfa0Sderaadt 
129d111cfa0Sderaadt 	if (rsize)
130d111cfa0Sderaadt 		*rsize = size;
131d111cfa0Sderaadt 
132d111cfa0Sderaadt 	if (size != 0 && readsects(0x40, bios_sector + dblk, buf,
133d111cfa0Sderaadt 				   size / DEV_BSIZE) != 0)
134d111cfa0Sderaadt 		return EIO;
135d111cfa0Sderaadt 
136d111cfa0Sderaadt 	return 0;
137d111cfa0Sderaadt }
138d111cfa0Sderaadt 
139d111cfa0Sderaadt void
twiddle(void)140d111cfa0Sderaadt twiddle(void)
141d111cfa0Sderaadt {
142d111cfa0Sderaadt 	static int pos;
143d111cfa0Sderaadt 
144d111cfa0Sderaadt 	putchar("|/-\\"[pos++ & 3]);
145d111cfa0Sderaadt 	putchar('\b');
146d111cfa0Sderaadt }
147d111cfa0Sderaadt 
148d111cfa0Sderaadt int
devopen(struct open_file * f,const char * fname,char ** file)149d111cfa0Sderaadt devopen(struct open_file *f, const char *fname, char **file)
150d111cfa0Sderaadt {
151d111cfa0Sderaadt 	*file = (char *)fname;
152d111cfa0Sderaadt 	f->f_flags |= F_NODEV;
153d111cfa0Sderaadt 	f->f_dev = &devsw[0];
154d111cfa0Sderaadt 	return (0);
155d111cfa0Sderaadt }
156