xref: /netbsd-src/sys/arch/hpc/stand/hpcboot/arm/arm_sa1100_asm.asm (revision 1e72df6a037fdd3c6d3014a2679ffff7daab84ca)
1;	$NetBSD: arm_sa1100_asm.asm,v 1.2 2019/12/15 16:48:25 tsutsui Exp $
2;
3; Copyright (c) 2001 The NetBSD Foundation, Inc.
4; All rights reserved.
5;
6; This code is derived from software contributed to The NetBSD Foundation
7; by UCHIYAMA Yasushi.
8;
9; Redistribution and use in source and binary forms, with or without
10; modification, are permitted provided that the following conditions
11; are met:
12; 1. Redistributions of source code must retain the above copyright
13;    notice, this list of conditions and the following disclaimer.
14; 2. Redistributions in binary form must reproduce the above copyright
15;    notice, this list of conditions and the following disclaimer in the
16;    documentation and/or other materials provided with the distribution.
17;
18; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21; PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28; POSSIBILITY OF SUCH DAMAGE.
29;
30
31;
32;armasm.exe $(InputPath)
33;arm.obj
34;
35
36	AREA	|.text|, CODE, PIC
37
38	; FlatJump_sa1100 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack
39	;		kaddr_t jump)
40	;	bootinfo	boot information block address.
41	;	pvec		page vector of kernel.
42	;	stack		physical address of stack
43	;	jump		physical address of boot function
44	; *** MMU and pipeline behavier are SA-1100 specific. ***
45	EXPORT	|FlatJump_sa1100|
46|FlatJump_sa1100| PROC
47	; disable interrupt
48	mrs	r4, cpsr
49	orr	r4, r4, #0xc0
50	msr	cpsr, r4
51	; disable MMU, I/D-Cache, Writebuffer.
52	; interrupt vector address is 0xffff0000
53	; 32bit exception handler/address range.
54	ldr	r4, [pc, #24]
55	; Disable WB/Cache/MMU
56	mcr	p15, 0, r4, c1, c0, 0
57	; Invalidate I/D-cache.
58	mcr	p15, 0, r4, c7, c7, 0	; Fetch translated	fetch
59	; Invalidate TLB entries.
60	mcr	p15, 0, r4, c8, c7, 0	; Fetch translated	decode
61	; jump to kernel entry physical address.
62	mov	pc, r3			; Fetch translated	execute
63	; NOTREACHED
64	nop				; Fetch nontranslated	cache access
65	nop				; Fetch nontranslated	writeback
66	mov	pc, lr			; Fetch nontranslated
67	DCD	0x00002030
68	ENDP  ; |FlatJump_sa1100|
69;
70;	UART test
71;
72	; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags)
73	;
74	EXPORT	|boot_func_sa1100|
75|boot_func_sa1100| PROC
76	nop				; Cop15 hazard
77	nop				; Cop15 hazard
78	nop				; Cop15 hazard
79	mov	sp, r2			; set bootloader stack
80;	mov	r4, r0
81;	mov	r5, r1
82;	bl	colorbar
83;	mov	r0, r4
84;	mov	r1, r5
85	bl	boot_sa1100
86	nop	; NOTREACHED
87	nop
88	ENDP  ; |boot_func_sa1100|
89
90	EXPORT |colorbar|
91|colorbar| PROC
92	stmfd	sp!, {r4-r7, lr}
93	adr	r4, |$FBADDR|
94	ldr	r4, [r4]
95
96	mov	r7, #8
97	add	r0, r0, r7
98|color_loop|
99	mov	r6, r0
100	and	r6, r6, #7
101	orr	r6, r6, r6, LSL #8
102	orr	r6, r6, r6, LSL #16
103	add	r5, r4, #0x9600
104|fb_loop|
105	str	r6, [r4], #4
106	cmp	r4, r5
107	blt	|fb_loop|
108
109	subs	r7, r7, #1
110	bne	|color_loop|
111
112	ldmfd	sp!, {r4-r7, pc}
113|$FBADDR|
114	DCD	0xc0003000	; use WindowsCE default.
115	ENDP  ; |colorbar|
116
117	EXPORT	|boot_sa1100|
118|boot_sa1100| PROC
119;
120;	UART test code
121;
122;	; print boot_info address (r0) and page_vector start address (r1).
123;	mov	r4, r0
124;	mov	r5, r1
125;	mov	r0, #'I'
126;	bl	btputc
127;	mov	r0, r4
128;	bl	hexdump
129;	mov	r0, #'P'
130;	bl	btputc
131;	mov	r0, r5
132;	bl	hexdump
133;	mov	r7, r4
134;	mov	r2, r5		; start
135
136	mov	r7, r0		; if enabled above debug print, remove this.
137	mov	r2, r1		; if enabled above debug print, remove this.
138|page_loop|
139	mvn	r0, #0		; ~0
140	cmp	r2, r0
141	beq	|page_end|	; if (next == ~0) goto page_end
142
143	mov	r1, r2		; p = next
144	ldr	r2, [r1]	; next
145	ldr	r3, [r1, #4]	; src
146	ldr	r4, [r1, #8]	; dst
147	ldr	r5, [r1, #12]	; sz
148
149	cmp	r3, r0
150	add	r6, r4, r5	; end address
151	bne	|page_memcpy4|	; if (src != ~0) goto page_memcpy4
152
153	mov	r0, #0
154|page_memset|			; memset (dst, 0, sz) uncached.
155	str	r0, [r4], #4
156	cmp	r4, r6
157	blt	|page_memset|
158	b	|page_loop|
159
160|page_memcpy4|			; memcpy (dst, src, sz) uncached.
161	ldr	r0, [r3], #4
162	ldr	r5, [r3], #4
163	str	r0, [r4], #4
164	cmp	r4, r6
165	strlt	r5, [r4], #4
166	cmplt	r4, r6
167	blt	|page_memcpy4|
168
169	b	|page_loop|
170|page_end|
171	;
172	; jump to kernel
173	;
174;	mov	r0, #'E'
175;	bl	btputc
176;	ldr	r0, [r7]
177;	bl	hexdump
178;	ldr	r0, [r7]
179;	ldr	r0, [r0]
180;	bl	hexdump
181
182	; set stack pointer
183	mov	r5, #4096
184	add	r6, r6, #8192
185	sub	r5, r5, #1
186	bic	sp, r6, r5
187
188	; set bootargs
189	ldr	r4, [r7]
190	ldr	r0, [r7, #4]
191	ldr	r1, [r7, #8]
192	ldr	r2, [r7, #12]
193	mov	pc, r4
194	; NOTREACHED
195
196|infinite_loop|
197	nop
198	nop
199	nop
200	nop
201	nop
202	b	|infinite_loop|
203	ENDP  ; |boot|
204
205|btputc| PROC
206	adr	r1, |$UARTTXBSY|
207	ldr	r1, [r1]
208|btputc_busy|
209	ldr	r2, [r1]
210	and	r2, r2, #1
211	cmp	r2, #1
212	beq	|btputc_busy|
213	adr	r1, |$UARTTXADR|
214	ldr	r1, [r1]
215	str	r0, [r1]
216	mov	pc, lr
217	ENDP	;|btputc|
218
219|hexdump| PROC
220	stmfd	sp!, {r4-r5, lr}
221	mov	r4, r0
222	mov	r0, #0x30
223	bl	btputc
224	mov	r0, #0x78
225	bl	btputc
226	mov	r0, r4
227	;	Transmit register address
228	adr	r1, |$UARTTXADR|
229	ldr	r1, [r1]
230	;	Transmit busy register address
231	adr	r2, |$UARTTXBSY|
232	ldr	r2, [r2]
233	mov	r5, #8
234|hex_loop|
235	mov	r3, r0, LSR #28
236	cmp	r3, #9
237	addgt	r3, r3, #0x41 - 10
238	addle	r3, r3, #0x30
239|hex_busyloop|
240	ldr	r4, [r2]
241	and	r4, r4, #1
242	cmp	r4, #1
243	beq	|hex_busyloop|
244	str	r3, [r1]
245	mov	r0, r0, LSL #4
246	subs	r5, r5, #1
247	bne	|hex_loop|
248	mov	r0, #0x0d
249	bl	btputc
250	mov	r0, #0x0a
251	bl	btputc
252	ldmfd	sp!, {r4-r5, pc}
253	ENDP	;|hexdump|
254
255|$UARTTXADR|
256	DCD	0x80050014
257|$UARTTXBSY|
258	DCD	0x80050020
259
260	EXPORT	|boot_func_end_sa1100| [ DATA ]
261|boot_func_end_sa1100|	DCD	0x0
262
263	END
264