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