diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2006-11-08 17:46:57 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2006-11-08 17:46:57 +0000 |
commit | 5e39be0504085820c4397dae0a884c9662787f24 (patch) | |
tree | 92d48315797daf607d549808f2999f6d8fbabbf6 /sys/arch/landisk/stand/xxboot/pbr.S | |
parent | 6eaa3d49ce01c5570839bde7de18ebf3bdfd3db0 (diff) |
this is actually a primary bootblock (xxboot) not a secondary bootblock
(bootxx) thus disklabel -B will automatically pick it up now; ok drahn
Diffstat (limited to 'sys/arch/landisk/stand/xxboot/pbr.S')
-rw-r--r-- | sys/arch/landisk/stand/xxboot/pbr.S | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/sys/arch/landisk/stand/xxboot/pbr.S b/sys/arch/landisk/stand/xxboot/pbr.S new file mode 100644 index 00000000000..2729f648048 --- /dev/null +++ b/sys/arch/landisk/stand/xxboot/pbr.S @@ -0,0 +1,212 @@ +/* $OpenBSD: pbr.S,v 1.1 2006/11/08 17:46:56 deraadt Exp $ */ +/* $NetBSD: pbr.S,v 1.1 2006/09/01 21:26:19 uwe Exp $ */ + +/*- + * Copyright (c) 2005 NONAKA Kimihiro + * All rights reserved. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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 <machine/asm.h> + +#ifdef BOOT_FROM_FAT +#define MBR_AFTERBPB 90 /* BPB size in FAT32 partition BR */ +#else +#define MBR_AFTERBPB 62 /* BPB size in floppy master BR */ +#endif + +ENTRY(start) + bra start0 + .byte 0x11 /* 0x4f11: cmp/pz r15... */ + .asciz "OpenBSD" + + . = _C_LABEL(start) + 0x0b /* move to start of BPB */ + + . = _C_LABEL(start) + 0x1c /* skip BPB */ +start0: + mova pbr_end, r0 + mov.w pbr_size, r2 + sub r2, r0 + mov r0, r11 /* r11: own loaded address */ + + mov.w stack_offset, r1 + add r1, r0 + mov r0, r15 /* r15: stack pointer */ + mov r0, r10 /* r10: load address */ + + /* enable/flush cache */ + mov #0, r4 + mov #6, r0 + trapa #0x3f + + /* Read from start of disk */ + mov #0x40, r4 /* LBA */ + mov #0, r5 /* LBA #0 */ + mov r10, r6 /* buffer address */ + bsr read_sectors_lba + mov #XXBOOT_SECTORS, r7 /* number of sectors */ + + mov.l @r11, r1 + mov.l @r10, r2 + cmp/eq r1, r2 + bt/s pbr_read_ok + mov #0, r9 /* r9: sector # */ + + /* Search bootable partition */ + mov.w part_offset, r12 + add r10, r12 /* r12: pointer to partition entry */ + mov #4, r8 /* r8: partition loop counter */ +loop_part: + mov.b @(4, r12), r0 +#ifdef BOOT_FROM_FAT + cmp/eq #MBR_PTYPE_FAT12, r0 + bt found + cmp/eq #MBR_PTYPE_FAT16S, r0 + bt found + cmp/eq #MBR_PTYPE_FAT16B, r0 + bt found + cmp/eq #MBR_PTYPE_FAT32, r0 + bt found + cmp/eq #MBR_PTYPE_FAT32L, r0 + bt found + cmp/eq #MBR_PTYPE_FAT16L, r0 + bt found +#else + cmp/eq #0xa6, r0 +#endif + bf next_part + +found: + /* found boot partition */ + mov.w @(8, r12), r0 + mov r0, r1 + mov.w @(10, r12), r0 + extu.w r1, r1 + shll16 r0 + or r1, r0 + tst r0, r0 + bt next_part /* start LBA == 0 ? */ + + bra boot_lba + mov r0, r9 + +next_part: + dt r8 + bf/s loop_part + add #16, r12 + +ptn_error: + /* Not found NetBSD partition */ + mova ERR_PTN, r0 +error: + bsr message_crlf + mov r0, r4 +99: bra 99b + nop + +read_error: + bra error + mova ERR_READ, r0 + +magic_error: + bra error + mova ERR_NO_XXBOOT, r0 + +message_crlf: + mov #32, r0 + trapa #0x3f + mova crlf, r0 + mov r0, r4 + mov #32, r0 + trapa #0x3f + rts + nop + +read_sectors_lba: + mov #2, r0 + trapa #0x3f + tst r0, r0 + bf read_error + rts + nop + +boot_lba: + mov #0x40, r4 /* LBA */ + mov r9, r5 /* LBA # */ + mov r10, r6 /* buffer address */ + bsr read_sectors_lba + mov #XXBOOT_SECTORS, r7 /* number of sectors */ + +pbr_read_ok: + mov.l .L.xxboot_magic1, r1 + mov.l .L.xxboot_magic, r2 + mov.l @r2, r2 + cmp/eq r1, r2 + bf magic_error + + /* flush cache */ + mov #0, r4 + mov #6, r0 + trapa #0x3f + + mov.l .L.xxboot_start, r13 + jmp @r13 /* jump to xxboot */ + mov r9, r4 /* pass sector address to xxboot */ + + + .align 1 +pbr_size: .word pbr_end - _C_LABEL(start) + .align 1 +stack_offset: .word 0x1000 + .align 1 +part_offset: .word 0x1be + .align 1 +magic_offset: .word 0x1fe + + .align 2 +.L.xxboot_magic1: + .long 0x20031125 +.L.xxboot_magic: + .long _C_LABEL(xxboot_magic) +.L.xxboot_start: + .long _C_LABEL(xxboot_start) + + .align 2 +crlf: .asciz "\r\n" + + .align 2 +ERR_READ: .asciz "Disk read" + .align 2 +ERR_NO_XXBOOT: .asciz "Not a xxboot image" + .align 2 +ERR_PTN: .asciz "No OpenBSD partition" + + + . = _C_LABEL(start) + 0x1fe +magic: + .word 0xaa55 +pbr_end: + + .global _C_LABEL(ptn_disklabel) +_C_LABEL(ptn_disklabel): + .fill 512 |