/*      $NetBSD: romboot.S,v 1.8 2005/12/11 12:17:34 christos Exp $     */

/*-
* Copyright (c) 2001, 2002, 2003 Takao Shinohara.
*
* 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.
*/

/*
* simple boot loader for ROM
*
* supported platform: LASER5 L-Router(L-Board)
*/

#define zero    $0
#define AT      $at
#define v0      $2
#define v1      $3
#define a0      $4
#define a1      $5
#define a2      $6
#define a3      $7
#define t0      $8
#define t1      $9
#define t2      $10
#define t3      $11
#define t4      $12
#define t5      $13
#define t6      $14
#define t7      $15
#define s0      $16
#define s1      $17
#define s2      $18
#define s3      $19
#define s4      $20
#define s5      $21
#define s6      $22
#define s7      $23
#define t8      $24
#define t9      $25
#define k0      $26
#define k1      $27
#define gp      $28
#define sp      $29
#define s8      $30
#define ra      $31

#define MIPS_KSEG0_START        0x80000000
#define MIPS_KSEG1_START        0xa0000000
#define KSEG1_KSEG0_DIFF        (MIPS_KSEG1_START - MIPS_KSEG0_START)
#define KERNEL_LOADADDR         0x80001000
#define MAX_KERNEL_SIZE         (1024*1024*6)   # 6MB
#define MAX_DCACHE_SIZE         (1024*32)       # 32KB

       .text
       .set    noreorder
       .globl  _start
_start:
       bal     1f                      # ra = ROM address + 8
       nop
1:      subu    a0, ra, 8               # a0 = ROM address(kseg1)
       subu    a0, KSEG1_KSEG0_DIFF    # convert to kseg0 address
       move    s0, a0                  # keep it in s0
       la      t0, _etext
       la      t1, _ftext
       subu    t0, t1                  # t0 = size of boot loader
       addu    a0, t0                  # a0 = kernel address in ROM
       li      a1, KERNEL_LOADADDR
       li      t2, MAX_KERNEL_SIZE     # max kernel size = 6MB - boot
       subu    t2, t0
       addu    t2, a1                  # kernel end address
       la      t9, 2f
       addu    t9, s0
       jr      t9                      # jump to cached address
       nop
2:
       lw      v0, 0(a0)
       sw      v0, 0(a1)
       addu    a0, 4
       bltu    a1, t2, 2b
       addu    a1, 4                   # BDSLOT

       /* purge data cache */
       li      v0, MAX_DCACHE_SIZE
3:      lw      zero, 0(a1)
       addu    a1, 4
       bnez    v0, 3b
       subu    v0, 4                   # BDSLOT

       li      sp, KERNEL_LOADADDR     # initialize stack pointer
       li      a0, 1                   # argc = 1
       addu    a1, sp, -16             # argv
       la      t0, argv0
       addu    t0, s0
       sw      t0, 0(a1)               # argv[0] = "netbsd"
       sw      zero, 4(a1)             # argv[1] = NULL
       la      a2, bootinfo
       addu    a2, s0
       move    a3, zero
       li      t9, KERNEL_LOADADDR
       jr      t9
       nop

argv0:  .asciiz "netbsd"

bootinfo:
       .word   34              # len
       .word   0x13536135      # magic
       .word   0               # fb_addr
       .word   0, 0            # fb_line_bytes, fb_width, fb_height, fb_type
       .word   2               # BI_CNUSE_SERIAL
       .word   0x04104500      # VR4122
       .word   0x03810200      # LASER5 L-BOARD
/*
* kernel binary image begins here.
*/