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