Home | History | Annotate | Line # | Download | only in mbr
mbr.S revision 1.1.12.2
      1  1.1.12.2  yamt /*	$NetBSD: mbr.S,v 1.1.12.2 2006/12/30 20:46:24 yamt Exp $	*/
      2  1.1.12.2  yamt 
      3  1.1.12.2  yamt /*-
      4  1.1.12.2  yamt  * Copyright (c) 2005 NONAKA Kimihiro
      5  1.1.12.2  yamt  * All rights reserved.
      6  1.1.12.2  yamt  *
      7  1.1.12.2  yamt  * Redistribution and use in source and binary forms, with or without
      8  1.1.12.2  yamt  * modification, are permitted provided that the following conditions
      9  1.1.12.2  yamt  * are met:
     10  1.1.12.2  yamt  * 1. Redistributions of source code must retain the above copyright
     11  1.1.12.2  yamt  *    notice, this list of conditions and the following disclaimer.
     12  1.1.12.2  yamt  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1.12.2  yamt  *    notice, this list of conditions and the following disclaimer in the
     14  1.1.12.2  yamt  *    documentation and/or other materials provided with the distribution.
     15  1.1.12.2  yamt  *
     16  1.1.12.2  yamt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     17  1.1.12.2  yamt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.1.12.2  yamt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.1.12.2  yamt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     20  1.1.12.2  yamt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  1.1.12.2  yamt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  1.1.12.2  yamt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  1.1.12.2  yamt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  1.1.12.2  yamt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1.12.2  yamt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1.12.2  yamt  * SUCH DAMAGE.
     27  1.1.12.2  yamt  */
     28  1.1.12.2  yamt 
     29  1.1.12.2  yamt #include <machine/asm.h>
     30  1.1.12.2  yamt #include <sys/bootblock.h>
     31  1.1.12.2  yamt 
     32  1.1.12.2  yamt ENTRY(start)
     33  1.1.12.2  yamt 	mova	mbr_end, r0
     34  1.1.12.2  yamt 	mov	r0, r11			/* r11: relocate address */
     35  1.1.12.2  yamt 
     36  1.1.12.2  yamt 	mov.w	mbr_size, r2
     37  1.1.12.2  yamt 	sub	r2, r0
     38  1.1.12.2  yamt 	mov	r0, r10			/* r10: loaded address */
     39  1.1.12.2  yamt 
     40  1.1.12.2  yamt 	mov.w	stack_offset, r1
     41  1.1.12.2  yamt 	add	r1, r0
     42  1.1.12.2  yamt 	mov	r0, r15			/* r15: stack pointer */
     43  1.1.12.2  yamt 
     44  1.1.12.2  yamt 	/* relocate code */
     45  1.1.12.2  yamt 	mova	jmp_start, r0
     46  1.1.12.2  yamt 	mov	r0, r13
     47  1.1.12.2  yamt 	add	r2, r13			/* calc jump address */
     48  1.1.12.2  yamt 
     49  1.1.12.2  yamt 	mov	r10, r0
     50  1.1.12.2  yamt 	mov	r11, r1
     51  1.1.12.2  yamt 1:	mov.b	@r0+, r3
     52  1.1.12.2  yamt 	dt	r2
     53  1.1.12.2  yamt 	mov.b	r3, @r1
     54  1.1.12.2  yamt 	bf/s	1b
     55  1.1.12.2  yamt 	 add	#1, r1
     56  1.1.12.2  yamt 
     57  1.1.12.2  yamt 	jmp	@r13
     58  1.1.12.2  yamt 	 nop
     59  1.1.12.2  yamt 
     60  1.1.12.2  yamt 	.align	2
     61  1.1.12.2  yamt jmp_start:
     62  1.1.12.2  yamt 	/* enable cache */
     63  1.1.12.2  yamt 	mov	#0, r4
     64  1.1.12.2  yamt 	mov	#6, r0
     65  1.1.12.2  yamt 	trapa	#0x3f
     66  1.1.12.2  yamt 
     67  1.1.12.2  yamt #ifndef	NO_BANNER
     68  1.1.12.2  yamt 	/* print banner */
     69  1.1.12.2  yamt 	mova	banner, r0
     70  1.1.12.2  yamt 	bsr	message_crlf
     71  1.1.12.2  yamt 	 mov	r0, r4
     72  1.1.12.2  yamt #endif
     73  1.1.12.2  yamt 
     74  1.1.12.2  yamt 	/* search bootable partition */
     75  1.1.12.2  yamt 	mov.w	part_offset, r12
     76  1.1.12.2  yamt 	add	r11, r12		/* r12: pointer to partition entry */
     77  1.1.12.2  yamt 	mov	#MBR_PART_COUNT, r8	/* r8: partition loop counter */
     78  1.1.12.2  yamt loop_part:
     79  1.1.12.2  yamt 	mov.b	@(4, r12), r0
     80  1.1.12.2  yamt 	cmp/eq	#MBR_PTYPE_UNUSED, r0
     81  1.1.12.2  yamt 	bt	next_part
     82  1.1.12.2  yamt 
     83  1.1.12.2  yamt 	/* check active partition */
     84  1.1.12.2  yamt 	mov.b	@(0, r12), r0
     85  1.1.12.2  yamt 	cmp/eq	#0x80, r0
     86  1.1.12.2  yamt 	bf	next_part
     87  1.1.12.2  yamt 
     88  1.1.12.2  yamt 	/* found bootable partition */
     89  1.1.12.2  yamt 	mov.w	@(8, r12), r0		/* load unaligned 32bit data */
     90  1.1.12.2  yamt 	mov	r0, r1
     91  1.1.12.2  yamt 	mov.w	@(10, r12), r0
     92  1.1.12.2  yamt 	extu.w	r1, r1
     93  1.1.12.2  yamt 	shll16	r0
     94  1.1.12.2  yamt 	or	r1, r0
     95  1.1.12.2  yamt 
     96  1.1.12.2  yamt 	mov	r0, r3
     97  1.1.12.2  yamt 	mova	found_sector, r0
     98  1.1.12.2  yamt 	bra	boot_lba
     99  1.1.12.2  yamt 	 mov.l	r3, @r0
    100  1.1.12.2  yamt 
    101  1.1.12.2  yamt next_part:
    102  1.1.12.2  yamt 	dt	r8
    103  1.1.12.2  yamt 	bf/s	loop_part
    104  1.1.12.2  yamt 	 add	#16, r12
    105  1.1.12.2  yamt 
    106  1.1.12.2  yamt noos_error:
    107  1.1.12.2  yamt 	/* Not found bootable partition */
    108  1.1.12.2  yamt 	mova	ERR_NOOS, r0
    109  1.1.12.2  yamt error:
    110  1.1.12.2  yamt 	bsr	message_crlf
    111  1.1.12.2  yamt 	 mov	r0, r4
    112  1.1.12.2  yamt 99:	bra	99b
    113  1.1.12.2  yamt 	 nop
    114  1.1.12.2  yamt 
    115  1.1.12.2  yamt read_error:
    116  1.1.12.2  yamt 	bra	error
    117  1.1.12.2  yamt 	 mova	ERR_READ, r0
    118  1.1.12.2  yamt 
    119  1.1.12.2  yamt message_crlf:
    120  1.1.12.2  yamt 	mov	#32, r0
    121  1.1.12.2  yamt 	trapa	#0x3f
    122  1.1.12.2  yamt 	mova	crlf, r0
    123  1.1.12.2  yamt 	mov	r0, r4
    124  1.1.12.2  yamt 	mov	#32, r0
    125  1.1.12.2  yamt 	trapa	#0x3f
    126  1.1.12.2  yamt 	rts
    127  1.1.12.2  yamt 	 nop
    128  1.1.12.2  yamt 
    129  1.1.12.2  yamt read_sector_lba:
    130  1.1.12.2  yamt 	mov	#1, r7
    131  1.1.12.2  yamt 	mov	#2, r0
    132  1.1.12.2  yamt 	trapa	#0x3f
    133  1.1.12.2  yamt 	tst	r0, r0
    134  1.1.12.2  yamt 	bf	read_error
    135  1.1.12.2  yamt 	rts
    136  1.1.12.2  yamt 	 nop
    137  1.1.12.2  yamt 
    138  1.1.12.2  yamt boot_lba:
    139  1.1.12.2  yamt 	/* read PBR sector */
    140  1.1.12.2  yamt 	mova	found_sector, r0
    141  1.1.12.2  yamt 	mov	#0x40, r4
    142  1.1.12.2  yamt 	mov.l	@r0, r5
    143  1.1.12.2  yamt 	bsr	read_sector_lba
    144  1.1.12.2  yamt 	 mov	r10, r6
    145  1.1.12.2  yamt 
    146  1.1.12.2  yamt 	/* flush cache */
    147  1.1.12.2  yamt 	mov	#0, r4
    148  1.1.12.2  yamt 	mov	#6, r0
    149  1.1.12.2  yamt 	trapa	#0x3f
    150  1.1.12.2  yamt 
    151  1.1.12.2  yamt 	/* check signature */
    152  1.1.12.2  yamt 	mov.b	@(0, r10), r0
    153  1.1.12.2  yamt 	tst	r0, r0
    154  1.1.12.2  yamt 	bt	noos_error		/* first byte non-zero */
    155  1.1.12.2  yamt 	mov.w	magic_offset, r0
    156  1.1.12.2  yamt 	mov.w	@(r0, r10), r1
    157  1.1.12.2  yamt 	mov.w	magic, r2
    158  1.1.12.2  yamt 	cmp/eq	r1, r2
    159  1.1.12.2  yamt 	bf	noos_error		/* magic */
    160  1.1.12.2  yamt 
    161  1.1.12.2  yamt 	/* now jump to PBR */
    162  1.1.12.2  yamt 	mov	r10, r0
    163  1.1.12.2  yamt 	jmp	@r10
    164  1.1.12.2  yamt 	 nop
    165  1.1.12.2  yamt 
    166  1.1.12.2  yamt 
    167  1.1.12.2  yamt 	.align	1
    168  1.1.12.2  yamt mbr_size:	.word	mbr_end - _C_LABEL(start)
    169  1.1.12.2  yamt 	.align	1
    170  1.1.12.2  yamt stack_offset:	.word	0x1000
    171  1.1.12.2  yamt 	.align	1
    172  1.1.12.2  yamt part_offset:	.word	MBR_PART_OFFSET
    173  1.1.12.2  yamt 	.align	1
    174  1.1.12.2  yamt magic_offset:	.word	MBR_MAGIC_OFFSET
    175  1.1.12.2  yamt 
    176  1.1.12.2  yamt 	.align	2
    177  1.1.12.2  yamt found_sector:	.long	0
    178  1.1.12.2  yamt 
    179  1.1.12.2  yamt #ifndef	NO_BANNER
    180  1.1.12.2  yamt 	.align	2
    181  1.1.12.2  yamt banner:		.asciz	"\r\nNetBSD MBR boot"
    182  1.1.12.2  yamt #endif
    183  1.1.12.2  yamt 	.align	2
    184  1.1.12.2  yamt crlf:		.asciz	"\r\n"
    185  1.1.12.2  yamt 
    186  1.1.12.2  yamt 	.align	2
    187  1.1.12.2  yamt ERR_INVPART:	.asciz	"No active partition"
    188  1.1.12.2  yamt 	.align	2
    189  1.1.12.2  yamt ERR_READ:	.asciz	"Disk read error"
    190  1.1.12.2  yamt 	.align	2
    191  1.1.12.2  yamt ERR_NOOS:	.asciz	"No operating system"
    192  1.1.12.2  yamt 
    193  1.1.12.2  yamt 
    194  1.1.12.2  yamt /* space for mbr_dsn */
    195  1.1.12.2  yamt 	. = _C_LABEL(start) + MBR_DSN_OFFSET
    196  1.1.12.2  yamt 	.long	0
    197  1.1.12.2  yamt 
    198  1.1.12.2  yamt /* mbr_bootsel_magic */
    199  1.1.12.2  yamt 	. = _C_LABEL(start) + MBR_BS_MAGIC_OFFSET
    200  1.1.12.2  yamt 	.word	MBR_BS_MAGIC
    201  1.1.12.2  yamt 
    202  1.1.12.2  yamt /*
    203  1.1.12.2  yamt  * MBR partition table
    204  1.1.12.2  yamt  */
    205  1.1.12.2  yamt 	. = _C_LABEL(start) + MBR_PART_OFFSET
    206  1.1.12.2  yamt _pbr_part0:
    207  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    208  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    209  1.1.12.2  yamt _pbr_part1:
    210  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    211  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    212  1.1.12.2  yamt _pbr_part2:
    213  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    214  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    215  1.1.12.2  yamt _pbr_part3:
    216  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    217  1.1.12.2  yamt 	.byte	0, 0, 0, 0, 0, 0, 0, 0
    218  1.1.12.2  yamt 
    219  1.1.12.2  yamt 	. = _C_LABEL(start) + MBR_MAGIC_OFFSET
    220  1.1.12.2  yamt magic:
    221  1.1.12.2  yamt 	.word	MBR_MAGIC
    222  1.1.12.2  yamt mbr_end:
    223