1/* $NetBSD: romboot.S,v 1.6 2002/02/16 05:26:02 shin Exp $ */ 2 3/*- 4 * Copyright (c) 2001, 2002 Takao Shinohara. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29/* 30 * simple boot loader for ROM 31 * 32 * supported platform: LASER5 L-Router(L-Board) 33 */ 34 35#define zero $0 36#define AT $at 37#define v0 $2 38#define v1 $3 39#define a0 $4 40#define a1 $5 41#define a2 $6 42#define a3 $7 43#define t0 $8 44#define t1 $9 45#define t2 $10 46#define t3 $11 47#define t4 $12 48#define t5 $13 49#define t6 $14 50#define t7 $15 51#define s0 $16 52#define s1 $17 53#define s2 $18 54#define s3 $19 55#define s4 $20 56#define s5 $21 57#define s6 $22 58#define s7 $23 59#define t8 $24 60#define t9 $25 61#define k0 $26 62#define k1 $27 63#define gp $28 64#define sp $29 65#define s8 $30 66#define ra $31 67 68#define MIPS_KSEG0_START 0x80000000 69#define MIPS_KSEG1_START 0xa0000000 70#define KSEG1_KSEG0_DIFF (MIPS_KSEG1_START - MIPS_KSEG0_START) 71#define KERNEL_LOADADDR 0x80001000 72#define MAX_KERNEL_SIZE (1024*1024*6) # 6MB 73#define MAX_DCACHE_SIZE (1024*32) # 32KB 74 75 .text 76 .set noreorder 77 .globl _start 78_start: 79 bal 1f # ra = ROM address + 8 80 nop 811: subu a0, ra, 8 # a0 = ROM address(kseg1) 82 subu a0, KSEG1_KSEG0_DIFF # convert to kseg0 address 83 move s0, a0 # keep it in s0 84 la t0, _etext 85 la t1, _ftext 86 subu t0, t1 # t0 = size of boot loader 87 addu a0, t0 # a0 = kernel address in ROM 88 li a1, KERNEL_LOADADDR 89 li t2, MAX_KERNEL_SIZE # max kernel size = 6MB - boot 90 subu t2, t0 91 addu t2, a1 # kernel end address 92 la t9, 2f 93 addu t9, s0 94 jr t9 # jump to cached address 95 nop 962: 97 lw v0, 0(a0) 98 sw v0, 0(a1) 99 addu a0, 4 100 bltu a1, t2, 2b 101 addu a1, 4 # BDSLOT 102 103 /* purge data cache */ 104 li v0, MAX_DCACHE_SIZE 1053: lw zero, 0(a1) 106 addu a1, 4 107 bnez v0, 3b 108 subu v0, 4 # BDSLOT 109 110 li sp, KERNEL_LOADADDR # initialize stack pointer 111 li a0, 1 # argc = 1 112 addu a1, sp, -16 # argv 113 la t0, argv0 114 addu t0, s0 115 sw t0, 0(a1) # argv[0] = "netbsd" 116 sw zero, 4(a1) # argv[1] = NULL 117 la a2, bootinfo 118 addu a2, s0 119 move a3, zero 120 li t9, KERNEL_LOADADDR 121 jr t9 122 nop 123 124argv0: .asciiz "netbsd" 125 126bootinfo: 127 .word 34 # len 128 .word 0x13536135 # magic 129 .word 0 # fb_addr 130 .word 0, 0 # fb_line_bytes, fb_width, fb_height, fb_type 131 .word 2 # BI_CNUSE_SERIAL 132 .word 0x04104500 # VR4122 133 .word 0x03810200 # LASER5 L-BOARD 134/* 135 * kernel binary image begins here. 136 */ 137