summaryrefslogtreecommitdiff
path: root/sys/arch/landisk/stand/bootxx/boot1.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/landisk/stand/bootxx/boot1.c')
-rw-r--r--sys/arch/landisk/stand/bootxx/boot1.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/sys/arch/landisk/stand/bootxx/boot1.c b/sys/arch/landisk/stand/bootxx/boot1.c
new file mode 100644
index 00000000000..63d46325739
--- /dev/null
+++ b/sys/arch/landisk/stand/bootxx/boot1.c
@@ -0,0 +1,157 @@
+/* $OpenBSD: boot1.c,v 1.1 2006/10/06 21:48:50 mickey Exp $ */
+/* $NetBSD: boot1.c,v 1.1 2006/09/01 21:26:19 uwe Exp $ */
+
+/*-
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by David Laight.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <lib/libsa/stand.h>
+#include <lib/libsa/ufs.h>
+
+#include <sys/disklabel.h>
+
+#define XSTR(x) #x
+#define STR(x) XSTR(x)
+
+static uint32_t bios_sector;
+
+const char *boot1(uint32_t *);
+void putstr(const char *str);
+int raise(int sig);
+int blkdevstrategy(void *, int, daddr_t, size_t, void *, size_t *);
+
+extern struct disklabel ptn_disklabel;
+
+struct fs_ops file_system[] = {
+ { ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek,
+ ufs_stat, nullsys },
+};
+int nfsys = NENTS(file_system);
+
+struct devsw devsw[] = {
+ { "dk", blkdevstrategy, nullsys, nullsys, noioctl },
+};
+int ndevs = NENTS(devsw);
+
+const char *
+boot1(uint32_t *sector)
+{
+ struct stat sb;
+ int fd;
+
+ bios_sector = *sector;
+
+ putstr("\r\nOpenBSD/" MACHINE " Primary Bootstrap\r\n");
+
+ do {
+ /*
+ * Nothing at the start of the MBR partition, fallback on
+ * partition 'a' from the disklabel in this MBR partition.
+ */
+ if (ptn_disklabel.d_magic != DISKMAGIC)
+ break;
+ if (ptn_disklabel.d_magic2 != DISKMAGIC)
+ break;
+ if (ptn_disklabel.d_partitions[0].p_fstype == FS_UNUSED)
+ break;
+
+ bios_sector = ptn_disklabel.d_partitions[0].p_offset;
+ *sector = bios_sector;
+ fd = open("boot", 0);
+ } while (0);
+
+ if (fd == -1 || fstat(fd, &sb) == -1)
+ return "Can't open /boot.\r\n";
+
+#if 0
+ if (sb.st_size > SECONDARY_MAX_LOAD)
+ return "/boot too large.\r\n";
+#endif
+
+ if (read(fd, (void *)LOADADDRESS, sb.st_size) != sb.st_size)
+ return "/boot load failed.\r\n";
+
+ if (*(uint32_t *)(LOADADDRESS + 4) != 0x20041110)
+ return "Invalid /boot file format.\r\n";
+
+ return 0;
+}
+
+int
+blkdevstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize)
+{
+
+ if (flag != F_READ)
+ return EROFS;
+
+ if (size & (DEV_BSIZE - 1))
+ return EINVAL;
+
+ if (rsize)
+ *rsize = size;
+
+ if (size != 0 && readsects(0x40, bios_sector + dblk, buf,
+ size / DEV_BSIZE) != 0)
+ return EIO;
+
+ return 0;
+}
+
+/* ARGUSED */
+int
+raise(int sig)
+{
+
+ return 0;
+}
+
+void
+twiddle(void)
+{
+ static int pos;
+
+ putchar("|/-\\"[pos++ & 3]);
+ putchar('\b');
+}
+
+int
+devopen(struct open_file *f, const char *fname, char **file)
+{
+ *file = (char *)fname;
+ f->f_flags |= F_NODEV;
+ f->f_dev = &devsw[0];
+ return (0);
+}