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