ブートローダもどき

これの後に objcopy で binary に変換したカーネルなどのファイルをくっつけたファイルを作って、uARM に喰わせるとつっくけたファイルが起動します。
ブートローダもどきの .Lkernel_secsize にくっつけたファイルのサイズ÷512 を指定しましょう。ファイルサイズ以上のセクタを読みに行くとエラーが表示されます。まあエラーが表示されるだけなんでファイルサイズが小さい場合はいじらなくてもいいけど。

/*	$NetBSD$	*/

/*-
 * Copyright (C) 2013 NONAKA Kimihiro <nonaka@netbsd.org>
 * 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 AUTHOR ``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 AUTHOR 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>
#include <arm/armreg.h>

#define	HYPERCALL	0xF7BBBBBB
#define	SECSIZE		512

	.text

	.thumb
        .global _C_LABEL(_start)
_C_LABEL(_start):
	adr	r0, .Lstart
	bx	r0

	.align 4
	.code 32
.Lstart:
	/* banner */
	mov	r0, #'H'
	bl	.Lputchar
	mov	r0, #'e'
	bl	.Lputchar
	mov	r0, #'l'
	bl	.Lputchar
	mov	r0, #'l'
	bl	.Lputchar
	mov	r0, #'o'
	bl	.Lputchar
	mov	r0, #','
	bl	.Lputchar
	mov	r0, #' '
	bl	.Lputchar
	mov	r0, #'N'
	bl	.Lputchar
	mov	r0, #'e'
	bl	.Lputchar
	mov	r0, #'t'
	bl	.Lputchar
	mov	r0, #'B'
	bl	.Lputchar
	mov	r0, #'S'
	bl	.Lputchar
	mov	r0, #'D'
	bl	.Lputchar
	mov	r0, #'!'
	bl	.Lputchar
	mov	r0, #'\r'
	bl	.Lputchar
	mov	r0, #'\n'
	bl	.Lputchar

	/* load kernel */
	ldr	r8, .Lkernel_text
	mov	r9, #1
	ldr	r10, .Lkernel_secsize
1:
	mov	r0, r8
	mov	r1, r9
	bl	.Lreadsec
	mov	r0, #'.'
	bl	.Lputchar
	add	r8, r8, #SECSIZE
	add	r9, r9, #1
	subs	r10, r10, #1
	bgt	1b

	/* banner */
	mov	r0, #'B'
	bl	.Lputchar
	mov	r0, #'o'
	bl	.Lputchar
	mov	r0, #'o'
	bl	.Lputchar
	mov	r0, #'t'
	bl	.Lputchar
	mov	r0, #'\r'
	bl	.Lputchar
	mov	r0, #'\n'
	bl	.Lputchar

	/* jump into kernel */
	ldr	r0, .Lkernel_text
	bx	r0

	mov	r12, #0
	.word	HYPERCALL
99:	b	99b

.Lkernel_text:
	.word	0xa0200000
.Lkernel_secsize:
	.word	5053

	/* r0: char */
.Lputchar:
			/* r0: char */
	mov	r12, #2
	.word	HYPERCALL
	mov	pc, lr

	/* r0: buffer address */
	/* r1: sector */
.Lreadsec:
	mov	r3, r0
	/* read from disk */
	mov	r0, #1	/* r0: 0:size, 1:read, 2:write */
			/* r1: sector */
	mov	r12, #4
	.word	HYPERCALL

	/* read from buffer */
	mov	r4, #0
	mov	r5, #SECSIZE
1:
	mov	r1, r4
	mov	r2, #0
	mov	r12, #5
	.word	HYPERCALL
	str	r0, [r3], #4
	add	r4, r4, #1
	subs	r5, r5, #4
	bgt	1b
	mov	pc,lr


	.align 1
/*
 * MBR partition table
 */
	. = _C_LABEL(_start) + MBR_PART_OFFSET
_pbr_part0:
	.byte	0, 0, 0, 0, 0, 0, 0, 0
	.byte	0, 0, 0, 0, 0, 0, 0, 0
_pbr_part1:
	.byte	0, 0, 0, 0, 0, 0, 0, 0
	.byte	0, 0, 0, 0, 0, 0, 0, 0
_pbr_part2:
	.byte	0, 0, 0, 0, 0, 0, 0, 0
	.byte	0, 0, 0, 0, 0, 0, 0, 0
_pbr_part3:
	.byte	0, 0, 0, 0, 0, 0, 0, 0
	.byte	0, 0, 0, 0, 0, 0, 0, 0

	. = _C_LABEL(_start) + MBR_MAGIC_OFFSET
magic:
	.short	MBR_MAGIC