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