xref: /openbsd/sys/arch/landisk/stand/xxboot/pbr.S (revision 0ee2ce67)
1*0ee2ce67Sguenther/*	$OpenBSD: pbr.S,v 1.3 2022/12/08 02:11:27 guenther Exp $	*/
2d111cfa0Sderaadt/*	$NetBSD: pbr.S,v 1.1 2006/09/01 21:26:19 uwe Exp $	*/
3d111cfa0Sderaadt
4d111cfa0Sderaadt/*-
5d111cfa0Sderaadt * Copyright (c) 2005 NONAKA Kimihiro
6d111cfa0Sderaadt * All rights reserved.
7d111cfa0Sderaadt *
8d111cfa0Sderaadt * Redistribution and use in source and binary forms, with or without
9d111cfa0Sderaadt * modification, are permitted provided that the following conditions
10d111cfa0Sderaadt * are met:
11d111cfa0Sderaadt * 1. Redistributions of source code must retain the above copyright
12d111cfa0Sderaadt *    notice, this list of conditions and the following disclaimer.
13d111cfa0Sderaadt * 2. Redistributions in binary form must reproduce the above copyright
14d111cfa0Sderaadt *    notice, this list of conditions and the following disclaimer in the
15d111cfa0Sderaadt *    documentation and/or other materials provided with the distribution.
16d111cfa0Sderaadt *
17d111cfa0Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18d111cfa0Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19d111cfa0Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20d111cfa0Sderaadt * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21d111cfa0Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22d111cfa0Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23d111cfa0Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24d111cfa0Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25d111cfa0Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26d111cfa0Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27d111cfa0Sderaadt * SUCH DAMAGE.
28d111cfa0Sderaadt */
29d111cfa0Sderaadt
30d111cfa0Sderaadt#include <machine/asm.h>
31d111cfa0Sderaadt
32d111cfa0Sderaadt#ifdef BOOT_FROM_FAT
33d111cfa0Sderaadt#define MBR_AFTERBPB	90		/* BPB size in FAT32 partition BR */
34d111cfa0Sderaadt#else
35d111cfa0Sderaadt#define MBR_AFTERBPB	62		/* BPB size in floppy master BR */
36d111cfa0Sderaadt#endif
37d111cfa0Sderaadt
38d111cfa0SderaadtENTRY(start)
39d111cfa0Sderaadt	bra	start0
40d111cfa0Sderaadt	 .byte	0x11			/* 0x4f11: cmp/pz r15... */
41d111cfa0Sderaadt	.asciz	"OpenBSD"
42d111cfa0Sderaadt
43*0ee2ce67Sguenther	. = start + 0x0b		/* move to start of BPB */
44d111cfa0Sderaadt
45*0ee2ce67Sguenther	. = start + 0x1c		/* skip BPB */
46d111cfa0Sderaadtstart0:
47d111cfa0Sderaadt	mova	pbr_end, r0
48d111cfa0Sderaadt	mov.w	pbr_size, r2
49d111cfa0Sderaadt	sub	r2, r0
50d111cfa0Sderaadt	mov	r0, r11			/* r11: own loaded address */
51d111cfa0Sderaadt
52d111cfa0Sderaadt	mov.w	stack_offset, r1
53d111cfa0Sderaadt	add	r1, r0
54d111cfa0Sderaadt	mov	r0, r15			/* r15: stack pointer */
55d111cfa0Sderaadt	mov	r0, r10			/* r10: load address */
56d111cfa0Sderaadt
57d111cfa0Sderaadt	/* enable/flush cache */
58d111cfa0Sderaadt	mov	#0, r4
59d111cfa0Sderaadt	mov	#6, r0
60d111cfa0Sderaadt	trapa	#0x3f
61d111cfa0Sderaadt
62d111cfa0Sderaadt	/* Read from start of disk */
63d111cfa0Sderaadt	mov	#0x40, r4		/* LBA */
64d111cfa0Sderaadt	mov	#0, r5			/* LBA #0 */
65d111cfa0Sderaadt	mov	r10, r6			/* buffer address */
66d111cfa0Sderaadt	bsr	read_sectors_lba
67d111cfa0Sderaadt	 mov	#XXBOOT_SECTORS, r7	/* number of sectors */
68d111cfa0Sderaadt
69d111cfa0Sderaadt	mov.l	@r11, r1
70d111cfa0Sderaadt	mov.l	@r10, r2
71d111cfa0Sderaadt	cmp/eq	r1, r2
72d111cfa0Sderaadt	bt/s	pbr_read_ok
73d111cfa0Sderaadt	 mov	#0, r9			/* r9: sector # */
74d111cfa0Sderaadt
75d111cfa0Sderaadt	/* Search bootable partition */
76d111cfa0Sderaadt	mov.w	part_offset, r12
77d111cfa0Sderaadt	add	r10, r12		/* r12: pointer to partition entry */
78d111cfa0Sderaadt	mov	#4, r8			/* r8: partition loop counter */
79d111cfa0Sderaadtloop_part:
80d111cfa0Sderaadt	mov.b	@(4, r12), r0
81d111cfa0Sderaadt#ifdef BOOT_FROM_FAT
82d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT12, r0
83d111cfa0Sderaadt	bt	found
84d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT16S, r0
85d111cfa0Sderaadt	bt	found
86d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT16B, r0
87d111cfa0Sderaadt	bt	found
88d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT32, r0
89d111cfa0Sderaadt	bt	found
90d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT32L, r0
91d111cfa0Sderaadt	bt	found
92d111cfa0Sderaadt	cmp/eq	#MBR_PTYPE_FAT16L, r0
93d111cfa0Sderaadt	bt	found
94d111cfa0Sderaadt#else
95d111cfa0Sderaadt	cmp/eq	#0xa6, r0
96d111cfa0Sderaadt#endif
97d111cfa0Sderaadt	bf	next_part
98d111cfa0Sderaadt
99d111cfa0Sderaadtfound:
100d111cfa0Sderaadt	/* found boot partition */
101d111cfa0Sderaadt	mov.w	@(8, r12), r0
102d111cfa0Sderaadt	mov	r0, r1
103d111cfa0Sderaadt	mov.w	@(10, r12), r0
104d111cfa0Sderaadt	extu.w	r1, r1
105d111cfa0Sderaadt	shll16	r0
106d111cfa0Sderaadt	or	r1, r0
107d111cfa0Sderaadt	tst	r0, r0
108d111cfa0Sderaadt	bt	next_part		/* start LBA == 0 ? */
109d111cfa0Sderaadt
110d111cfa0Sderaadt	bra	boot_lba
111d111cfa0Sderaadt	 mov	r0, r9
112d111cfa0Sderaadt
113d111cfa0Sderaadtnext_part:
114d111cfa0Sderaadt	dt	r8
115d111cfa0Sderaadt	bf/s	loop_part
116d111cfa0Sderaadt	 add	#16, r12
117d111cfa0Sderaadt
118d111cfa0Sderaadtptn_error:
119664fb24aSmiod	/* no OpenBSD partition found */
120d111cfa0Sderaadt	mova	ERR_PTN, r0
121d111cfa0Sderaadterror:
122d111cfa0Sderaadt	bsr	message_crlf
123d111cfa0Sderaadt	 mov	r0, r4
124d111cfa0Sderaadt99:	bra	99b
125d111cfa0Sderaadt	 nop
126d111cfa0Sderaadt
127d111cfa0Sderaadtread_error:
128d111cfa0Sderaadt	bra	error
129d111cfa0Sderaadt	 mova	ERR_READ, r0
130d111cfa0Sderaadt
131d111cfa0Sderaadtmagic_error:
132d111cfa0Sderaadt	bra	error
133d111cfa0Sderaadt	 mova	ERR_NO_XXBOOT, r0
134d111cfa0Sderaadt
135d111cfa0Sderaadtmessage_crlf:
136d111cfa0Sderaadt	mov	#32, r0
137d111cfa0Sderaadt	trapa	#0x3f
138d111cfa0Sderaadt	mova	crlf, r0
139d111cfa0Sderaadt	mov	r0, r4
140d111cfa0Sderaadt	mov	#32, r0
141d111cfa0Sderaadt	trapa	#0x3f
142d111cfa0Sderaadt	rts
143d111cfa0Sderaadt	 nop
144d111cfa0Sderaadt
145d111cfa0Sderaadtread_sectors_lba:
146d111cfa0Sderaadt	mov	#2, r0
147d111cfa0Sderaadt	trapa	#0x3f
148d111cfa0Sderaadt	tst	r0, r0
149d111cfa0Sderaadt	bf	read_error
150d111cfa0Sderaadt	rts
151d111cfa0Sderaadt	 nop
152d111cfa0Sderaadt
153d111cfa0Sderaadtboot_lba:
154d111cfa0Sderaadt	mov	#0x40, r4		/* LBA */
155d111cfa0Sderaadt	mov	r9, r5			/* LBA # */
156d111cfa0Sderaadt	mov	r10, r6			/* buffer address */
157d111cfa0Sderaadt	bsr	read_sectors_lba
158d111cfa0Sderaadt	 mov	#XXBOOT_SECTORS, r7	/* number of sectors */
159d111cfa0Sderaadt
160d111cfa0Sderaadtpbr_read_ok:
161d111cfa0Sderaadt	mov.l	.L.xxboot_magic1, r1
162d111cfa0Sderaadt	mov.l	.L.xxboot_magic, r2
163d111cfa0Sderaadt	mov.l	@r2, r2
164d111cfa0Sderaadt	cmp/eq	r1, r2
165d111cfa0Sderaadt	bf	magic_error
166d111cfa0Sderaadt
167d111cfa0Sderaadt	/* flush cache */
168d111cfa0Sderaadt	mov	#0, r4
169d111cfa0Sderaadt	mov	#6, r0
170d111cfa0Sderaadt	trapa	#0x3f
171d111cfa0Sderaadt
172d111cfa0Sderaadt	mov.l	.L.xxboot_start, r13
173d111cfa0Sderaadt	jmp	@r13			/* jump to xxboot */
174d111cfa0Sderaadt	 mov	r9, r4			/* pass sector address to xxboot */
175d111cfa0Sderaadt
176d111cfa0Sderaadt
177d111cfa0Sderaadt	.align	1
178*0ee2ce67Sguentherpbr_size:	.word	pbr_end - start
179d111cfa0Sderaadt	.align	1
180d111cfa0Sderaadtstack_offset:	.word	0x1000
181d111cfa0Sderaadt	.align	1
182d111cfa0Sderaadtpart_offset:	.word	0x1be
183d111cfa0Sderaadt	.align	1
184d111cfa0Sderaadtmagic_offset:	.word	0x1fe
185d111cfa0Sderaadt
186d111cfa0Sderaadt	.align	2
187d111cfa0Sderaadt.L.xxboot_magic1:
188d111cfa0Sderaadt	.long	0x20031125
189d111cfa0Sderaadt.L.xxboot_magic:
190*0ee2ce67Sguenther	.long	xxboot_magic
191d111cfa0Sderaadt.L.xxboot_start:
192*0ee2ce67Sguenther	.long	xxboot_start
193d111cfa0Sderaadt
194d111cfa0Sderaadt	.align	2
195d111cfa0Sderaadtcrlf:		.asciz	"\r\n"
196d111cfa0Sderaadt
197d111cfa0Sderaadt	.align	2
198d111cfa0SderaadtERR_READ:	.asciz  "Disk read"
199d111cfa0Sderaadt	.align	2
200d111cfa0SderaadtERR_NO_XXBOOT:	.asciz  "Not a xxboot image"
201d111cfa0Sderaadt	.align	2
202d111cfa0SderaadtERR_PTN:	.asciz  "No OpenBSD partition"
203d111cfa0Sderaadt
204d111cfa0Sderaadt
205*0ee2ce67Sguenther	. = start + 0x1fe
206d111cfa0Sderaadtmagic:
207d111cfa0Sderaadt	.word	0xaa55
208d111cfa0Sderaadtpbr_end:
209d111cfa0Sderaadt
210*0ee2ce67Sguenther	.global	ptn_disklabel
211*0ee2ce67Sguentherptn_disklabel:
212d111cfa0Sderaadt	.fill	512
213