xref: /netbsd-src/sys/arch/hpc/stand/hpcboot/arm/arm_sa1100_asm.asm (revision 1e72df6a037fdd3c6d3014a2679ffff7daab84ca)
1*1e72df6aStsutsui;	$NetBSD: arm_sa1100_asm.asm,v 1.2 2019/12/15 16:48:25 tsutsui Exp $
2569b7f92Snonaka;
3569b7f92Snonaka; Copyright (c) 2001 The NetBSD Foundation, Inc.
4569b7f92Snonaka; All rights reserved.
5569b7f92Snonaka;
6569b7f92Snonaka; This code is derived from software contributed to The NetBSD Foundation
7569b7f92Snonaka; by UCHIYAMA Yasushi.
8569b7f92Snonaka;
9569b7f92Snonaka; Redistribution and use in source and binary forms, with or without
10569b7f92Snonaka; modification, are permitted provided that the following conditions
11569b7f92Snonaka; are met:
12569b7f92Snonaka; 1. Redistributions of source code must retain the above copyright
13569b7f92Snonaka;    notice, this list of conditions and the following disclaimer.
14569b7f92Snonaka; 2. Redistributions in binary form must reproduce the above copyright
15569b7f92Snonaka;    notice, this list of conditions and the following disclaimer in the
16569b7f92Snonaka;    documentation and/or other materials provided with the distribution.
17569b7f92Snonaka;
18569b7f92Snonaka; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19569b7f92Snonaka; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20569b7f92Snonaka; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21569b7f92Snonaka; PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22569b7f92Snonaka; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23569b7f92Snonaka; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24569b7f92Snonaka; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25569b7f92Snonaka; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26569b7f92Snonaka; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27569b7f92Snonaka; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28569b7f92Snonaka; POSSIBILITY OF SUCH DAMAGE.
29569b7f92Snonaka;
30569b7f92Snonaka
31569b7f92Snonaka;
32569b7f92Snonaka;armasm.exe $(InputPath)
33569b7f92Snonaka;arm.obj
34569b7f92Snonaka;
35569b7f92Snonaka
36569b7f92Snonaka	AREA	|.text|, CODE, PIC
37569b7f92Snonaka
38569b7f92Snonaka	; FlatJump_sa1100 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack
39569b7f92Snonaka	;		kaddr_t jump)
40569b7f92Snonaka	;	bootinfo	boot information block address.
41569b7f92Snonaka	;	pvec		page vector of kernel.
42569b7f92Snonaka	;	stack		physical address of stack
43569b7f92Snonaka	;	jump		physical address of boot function
44569b7f92Snonaka	; *** MMU and pipeline behavier are SA-1100 specific. ***
45569b7f92Snonaka	EXPORT	|FlatJump_sa1100|
46569b7f92Snonaka|FlatJump_sa1100| PROC
47569b7f92Snonaka	; disable interrupt
48569b7f92Snonaka	mrs	r4, cpsr
49569b7f92Snonaka	orr	r4, r4, #0xc0
50569b7f92Snonaka	msr	cpsr, r4
51569b7f92Snonaka	; disable MMU, I/D-Cache, Writebuffer.
52569b7f92Snonaka	; interrupt vector address is 0xffff0000
53569b7f92Snonaka	; 32bit exception handler/address range.
54569b7f92Snonaka	ldr	r4, [pc, #24]
55569b7f92Snonaka	; Disable WB/Cache/MMU
56569b7f92Snonaka	mcr	p15, 0, r4, c1, c0, 0
57569b7f92Snonaka	; Invalidate I/D-cache.
58569b7f92Snonaka	mcr	p15, 0, r4, c7, c7, 0	; Fetch translated	fetch
59569b7f92Snonaka	; Invalidate TLB entries.
60569b7f92Snonaka	mcr	p15, 0, r4, c8, c7, 0	; Fetch translated	decode
61569b7f92Snonaka	; jump to kernel entry physical address.
62569b7f92Snonaka	mov	pc, r3			; Fetch translated	execute
63569b7f92Snonaka	; NOTREACHED
64569b7f92Snonaka	nop				; Fetch nontranslated	cache access
65569b7f92Snonaka	nop				; Fetch nontranslated	writeback
66569b7f92Snonaka	mov	pc, lr			; Fetch nontranslated
67569b7f92Snonaka	DCD	0x00002030
68569b7f92Snonaka	ENDP  ; |FlatJump_sa1100|
69569b7f92Snonaka;
70569b7f92Snonaka;	UART test
71569b7f92Snonaka;
72569b7f92Snonaka	; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags)
73569b7f92Snonaka	;
74569b7f92Snonaka	EXPORT	|boot_func_sa1100|
75569b7f92Snonaka|boot_func_sa1100| PROC
76569b7f92Snonaka	nop				; Cop15 hazard
77569b7f92Snonaka	nop				; Cop15 hazard
78569b7f92Snonaka	nop				; Cop15 hazard
79569b7f92Snonaka	mov	sp, r2			; set bootloader stack
80569b7f92Snonaka;	mov	r4, r0
81569b7f92Snonaka;	mov	r5, r1
82569b7f92Snonaka;	bl	colorbar
83569b7f92Snonaka;	mov	r0, r4
84569b7f92Snonaka;	mov	r1, r5
85569b7f92Snonaka	bl	boot_sa1100
86569b7f92Snonaka	nop	; NOTREACHED
87569b7f92Snonaka	nop
88569b7f92Snonaka	ENDP  ; |boot_func_sa1100|
89569b7f92Snonaka
90569b7f92Snonaka	EXPORT |colorbar|
91569b7f92Snonaka|colorbar| PROC
92569b7f92Snonaka	stmfd	sp!, {r4-r7, lr}
93569b7f92Snonaka	adr	r4, |$FBADDR|
94569b7f92Snonaka	ldr	r4, [r4]
95569b7f92Snonaka
96569b7f92Snonaka	mov	r7, #8
97569b7f92Snonaka	add	r0, r0, r7
98569b7f92Snonaka|color_loop|
99569b7f92Snonaka	mov	r6, r0
100569b7f92Snonaka	and	r6, r6, #7
101569b7f92Snonaka	orr	r6, r6, r6, LSL #8
102569b7f92Snonaka	orr	r6, r6, r6, LSL #16
103569b7f92Snonaka	add	r5, r4, #0x9600
104569b7f92Snonaka|fb_loop|
105569b7f92Snonaka	str	r6, [r4], #4
106569b7f92Snonaka	cmp	r4, r5
107569b7f92Snonaka	blt	|fb_loop|
108569b7f92Snonaka
109569b7f92Snonaka	subs	r7, r7, #1
110569b7f92Snonaka	bne	|color_loop|
111569b7f92Snonaka
112569b7f92Snonaka	ldmfd	sp!, {r4-r7, pc}
113569b7f92Snonaka|$FBADDR|
114569b7f92Snonaka	DCD	0xc0003000	; use WindowsCE default.
115569b7f92Snonaka	ENDP  ; |colorbar|
116569b7f92Snonaka
117569b7f92Snonaka	EXPORT	|boot_sa1100|
118569b7f92Snonaka|boot_sa1100| PROC
119569b7f92Snonaka;
120569b7f92Snonaka;	UART test code
121569b7f92Snonaka;
122569b7f92Snonaka;	; print boot_info address (r0) and page_vector start address (r1).
123569b7f92Snonaka;	mov	r4, r0
124569b7f92Snonaka;	mov	r5, r1
125569b7f92Snonaka;	mov	r0, #'I'
126569b7f92Snonaka;	bl	btputc
127569b7f92Snonaka;	mov	r0, r4
128569b7f92Snonaka;	bl	hexdump
129569b7f92Snonaka;	mov	r0, #'P'
130569b7f92Snonaka;	bl	btputc
131569b7f92Snonaka;	mov	r0, r5
132569b7f92Snonaka;	bl	hexdump
133569b7f92Snonaka;	mov	r7, r4
134569b7f92Snonaka;	mov	r2, r5		; start
135569b7f92Snonaka
136569b7f92Snonaka	mov	r7, r0		; if enabled above debug print, remove this.
137569b7f92Snonaka	mov	r2, r1		; if enabled above debug print, remove this.
138569b7f92Snonaka|page_loop|
139569b7f92Snonaka	mvn	r0, #0		; ~0
140569b7f92Snonaka	cmp	r2, r0
141569b7f92Snonaka	beq	|page_end|	; if (next == ~0) goto page_end
142569b7f92Snonaka
143569b7f92Snonaka	mov	r1, r2		; p = next
144569b7f92Snonaka	ldr	r2, [r1]	; next
145569b7f92Snonaka	ldr	r3, [r1, #4]	; src
146569b7f92Snonaka	ldr	r4, [r1, #8]	; dst
147569b7f92Snonaka	ldr	r5, [r1, #12]	; sz
148569b7f92Snonaka
149569b7f92Snonaka	cmp	r3, r0
150569b7f92Snonaka	add	r6, r4, r5	; end address
151569b7f92Snonaka	bne	|page_memcpy4|	; if (src != ~0) goto page_memcpy4
152569b7f92Snonaka
153569b7f92Snonaka	mov	r0, #0
154569b7f92Snonaka|page_memset|			; memset (dst, 0, sz) uncached.
155569b7f92Snonaka	str	r0, [r4], #4
156569b7f92Snonaka	cmp	r4, r6
157569b7f92Snonaka	blt	|page_memset|
158569b7f92Snonaka	b	|page_loop|
159569b7f92Snonaka
160569b7f92Snonaka|page_memcpy4|			; memcpy (dst, src, sz) uncached.
161569b7f92Snonaka	ldr	r0, [r3], #4
162569b7f92Snonaka	ldr	r5, [r3], #4
163569b7f92Snonaka	str	r0, [r4], #4
164569b7f92Snonaka	cmp	r4, r6
165569b7f92Snonaka	strlt	r5, [r4], #4
166569b7f92Snonaka	cmplt	r4, r6
167569b7f92Snonaka	blt	|page_memcpy4|
168569b7f92Snonaka
169569b7f92Snonaka	b	|page_loop|
170569b7f92Snonaka|page_end|
171569b7f92Snonaka	;
172569b7f92Snonaka	; jump to kernel
173569b7f92Snonaka	;
174569b7f92Snonaka;	mov	r0, #'E'
175569b7f92Snonaka;	bl	btputc
176569b7f92Snonaka;	ldr	r0, [r7]
177569b7f92Snonaka;	bl	hexdump
178569b7f92Snonaka;	ldr	r0, [r7]
179569b7f92Snonaka;	ldr	r0, [r0]
180569b7f92Snonaka;	bl	hexdump
181569b7f92Snonaka
182569b7f92Snonaka	; set stack pointer
183569b7f92Snonaka	mov	r5, #4096
184569b7f92Snonaka	add	r6, r6, #8192
185569b7f92Snonaka	sub	r5, r5, #1
186569b7f92Snonaka	bic	sp, r6, r5
187569b7f92Snonaka
188569b7f92Snonaka	; set bootargs
189569b7f92Snonaka	ldr	r4, [r7]
190569b7f92Snonaka	ldr	r0, [r7, #4]
191569b7f92Snonaka	ldr	r1, [r7, #8]
192569b7f92Snonaka	ldr	r2, [r7, #12]
193569b7f92Snonaka	mov	pc, r4
194569b7f92Snonaka	; NOTREACHED
195569b7f92Snonaka
196569b7f92Snonaka|infinite_loop|
197569b7f92Snonaka	nop
198569b7f92Snonaka	nop
199569b7f92Snonaka	nop
200569b7f92Snonaka	nop
201569b7f92Snonaka	nop
202569b7f92Snonaka	b	|infinite_loop|
203569b7f92Snonaka	ENDP  ; |boot|
204569b7f92Snonaka
205569b7f92Snonaka|btputc| PROC
206569b7f92Snonaka	adr	r1, |$UARTTXBSY|
207569b7f92Snonaka	ldr	r1, [r1]
208569b7f92Snonaka|btputc_busy|
209569b7f92Snonaka	ldr	r2, [r1]
210569b7f92Snonaka	and	r2, r2, #1
211569b7f92Snonaka	cmp	r2, #1
212569b7f92Snonaka	beq	|btputc_busy|
213569b7f92Snonaka	adr	r1, |$UARTTXADR|
214569b7f92Snonaka	ldr	r1, [r1]
215569b7f92Snonaka	str	r0, [r1]
216569b7f92Snonaka	mov	pc, lr
217569b7f92Snonaka	ENDP	;|btputc|
218569b7f92Snonaka
219569b7f92Snonaka|hexdump| PROC
220569b7f92Snonaka	stmfd	sp!, {r4-r5, lr}
221569b7f92Snonaka	mov	r4, r0
222569b7f92Snonaka	mov	r0, #0x30
223569b7f92Snonaka	bl	btputc
224569b7f92Snonaka	mov	r0, #0x78
225569b7f92Snonaka	bl	btputc
226569b7f92Snonaka	mov	r0, r4
227569b7f92Snonaka	;	Transmit register address
228569b7f92Snonaka	adr	r1, |$UARTTXADR|
229569b7f92Snonaka	ldr	r1, [r1]
230569b7f92Snonaka	;	Transmit busy register address
231569b7f92Snonaka	adr	r2, |$UARTTXBSY|
232569b7f92Snonaka	ldr	r2, [r2]
233569b7f92Snonaka	mov	r5, #8
234569b7f92Snonaka|hex_loop|
235569b7f92Snonaka	mov	r3, r0, LSR #28
236569b7f92Snonaka	cmp	r3, #9
237569b7f92Snonaka	addgt	r3, r3, #0x41 - 10
238569b7f92Snonaka	addle	r3, r3, #0x30
239569b7f92Snonaka|hex_busyloop|
240569b7f92Snonaka	ldr	r4, [r2]
241569b7f92Snonaka	and	r4, r4, #1
242569b7f92Snonaka	cmp	r4, #1
243569b7f92Snonaka	beq	|hex_busyloop|
244569b7f92Snonaka	str	r3, [r1]
245569b7f92Snonaka	mov	r0, r0, LSL #4
246569b7f92Snonaka	subs	r5, r5, #1
247569b7f92Snonaka	bne	|hex_loop|
248569b7f92Snonaka	mov	r0, #0x0d
249569b7f92Snonaka	bl	btputc
250569b7f92Snonaka	mov	r0, #0x0a
251569b7f92Snonaka	bl	btputc
252569b7f92Snonaka	ldmfd	sp!, {r4-r5, pc}
253569b7f92Snonaka	ENDP	;|hexdump|
254569b7f92Snonaka
255569b7f92Snonaka|$UARTTXADR|
256569b7f92Snonaka	DCD	0x80050014
257569b7f92Snonaka|$UARTTXBSY|
258569b7f92Snonaka	DCD	0x80050020
259569b7f92Snonaka
260569b7f92Snonaka	EXPORT	|boot_func_end_sa1100| [ DATA ]
261569b7f92Snonaka|boot_func_end_sa1100|	DCD	0x0
262569b7f92Snonaka
263569b7f92Snonaka	END
264