11.2Stsutsui;	$NetBSD: arm_pxa2x0_asm.asm,v 1.2 2019/12/15 16:48:25 tsutsui Exp $	
21.1Snonaka;
31.1Snonaka; Copyright (c) 2001 The NetBSD Foundation, Inc.
41.1Snonaka; All rights reserved.
51.1Snonaka;
61.1Snonaka; This code is derived from software contributed to The NetBSD Foundation
71.1Snonaka; by UCHIYAMA Yasushi.
81.1Snonaka;
91.1Snonaka; Redistribution and use in source and binary forms, with or without
101.1Snonaka; modification, are permitted provided that the following conditions
111.1Snonaka; are met:
121.1Snonaka; 1. Redistributions of source code must retain the above copyright
131.1Snonaka;    notice, this list of conditions and the following disclaimer.
141.1Snonaka; 2. Redistributions in binary form must reproduce the above copyright
151.1Snonaka;    notice, this list of conditions and the following disclaimer in the
161.1Snonaka;    documentation and/or other materials provided with the distribution.
171.1Snonaka;
181.1Snonaka; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
191.1Snonaka; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
201.1Snonaka; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
211.1Snonaka; PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
221.1Snonaka; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
231.1Snonaka; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
241.1Snonaka; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
251.1Snonaka; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
261.1Snonaka; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
271.1Snonaka; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
281.1Snonaka; POSSIBILITY OF SUCH DAMAGE.
291.1Snonaka;
301.1Snonaka
311.1Snonaka	AREA	|.text|, CODE, PIC
321.1Snonaka
331.1Snonaka;
341.1Snonaka;armasm.exe $(InputPath)
351.1Snonaka;arm.obj
361.1Snonaka;
371.1Snonaka	; FlatJump_pxa2x0 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack
381.1Snonaka	;		kaddr_t jump)
391.1Snonaka	;	bootinfo	boot information block address.
401.1Snonaka	;	pvec		page vector of kernel.
411.1Snonaka	;	stack		physical address of stack
421.1Snonaka	;	jump		physical address of boot function
431.1Snonaka	EXPORT	|FlatJump_pxa2x0|
441.1Snonaka|FlatJump_pxa2x0| PROC
451.1Snonaka	; disable interrupt
461.1Snonaka	mrs	r4, cpsr
471.1Snonaka	orr	r4, r4, #0xc0
481.1Snonaka	msr	cpsr, r4
491.1Snonaka	; Invalidate I/D-cache.
501.1Snonaka	mcr	p15, 0, r4, c7, c7, 0
511.1Snonaka	mov	r4, r4
521.1Snonaka	sub	pc, pc, #4
531.1Snonaka	; disable MMU, I/D-Cache, Writebuffer.
541.1Snonaka	; interrupt vector address is 0xffff0000
551.1Snonaka	; 32bit exception handler/address range.
561.1Snonaka	ldr	r4, [pc, #20]
571.1Snonaka	; Disable WB/Cache/MMU
581.1Snonaka	mcr	p15, 0, r4, c1, c0, 0
591.1Snonaka	; Invalidate TLB entries.
601.1Snonaka	mcr	p15, 0, r4, c8, c7, 0
611.1Snonaka	mov	r4, r4			; wait for it to complete
621.1Snonaka	sub	pc, pc, #4		; branch to next insn
631.1Snonaka	mov	pc, r3
641.1Snonaka	; NOTREACHED
651.1Snonaka	mov	pc, lr
661.1Snonaka	DCD	0x00002030
671.1Snonaka	ENDP  ; |FlatJump_pxa2x0|
681.1Snonaka;
691.1Snonaka;	UART test
701.1Snonaka;
711.1Snonaka	; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags)
721.1Snonaka	;
731.1Snonaka	EXPORT	|boot_func_pxa2x0|
741.1Snonaka|boot_func_pxa2x0| PROC
751.1Snonaka	nop				; cop15 hazard
761.1Snonaka	nop				; cop15 hazard
771.1Snonaka	nop				; cop15 hazard
781.1Snonaka	mov	sp, r2			; set bootloader stack
791.1Snonaka	bl	boot_pxa2x0
801.1Snonaka	nop	; NOTREACHED
811.1Snonaka	nop
821.1Snonaka	ENDP  ; |boot_func_pxa2x0|
831.1Snonaka
841.1Snonaka	EXPORT	|boot_pxa2x0|
851.1Snonaka|boot_pxa2x0| PROC
861.1Snonaka	mov	r4, r0
871.1Snonaka	mov	r5, r1
881.1Snonaka
891.1Snonaka;
901.1Snonaka;	UART test code
911.1Snonaka;
921.1Snonaka;	; print boot_info address (r0) and page_vector start address (r1).
931.1Snonaka;	mov	r0, #'I'
941.1Snonaka;	bl	btputc
951.1Snonaka;	mov	r0, r4
961.1Snonaka;	bl	hexdump
971.1Snonaka;	mov	r0, #'P'
981.1Snonaka;	bl	btputc
991.1Snonaka;	mov	r0, r5
1001.1Snonaka;	bl	hexdump
1011.1Snonaka
1021.1Snonaka	mov	r7, r4
1031.1Snonaka	mov	r2, r5		; start
1041.1Snonaka|page_loop|
1051.1Snonaka	mvn	r0, #0		; ~0
1061.1Snonaka	cmp	r2, r0
1071.1Snonaka	beq	|page_end|	; if (next == ~0) goto page_end
1081.1Snonaka
1091.1Snonaka	mov	r1, r2		; p = next
1101.1Snonaka	ldr	r2, [r1]	; next
1111.1Snonaka	ldr	r3, [r1, #4]	; src
1121.1Snonaka	ldr	r4, [r1, #8]	; dst
1131.1Snonaka	ldr	r5, [r1, #12]	; sz
1141.1Snonaka
1151.1Snonaka	bic	r4, r4, #0xff000000
1161.1Snonaka	orr	r4, r4, #0xa0000000
1171.1Snonaka
1181.1Snonaka	cmp	r3, r0
1191.1Snonaka	add	r6, r4, r5	; end address
1201.1Snonaka	bne	|page_memcpy4|	; if (src != ~0) goto page_memcpy4
1211.1Snonaka
1221.1Snonaka	mov	r0, #0
1231.1Snonaka|page_memset|			; memset (dst, 0, sz) uncached.
1241.1Snonaka	str	r0, [r4], #4
1251.1Snonaka	cmp	r4, r6
1261.1Snonaka	blt	|page_memset|
1271.1Snonaka	b	|page_loop|
1281.1Snonaka
1291.1Snonaka|page_memcpy4|			; memcpy (dst, src, sz) uncached.
1301.1Snonaka	ldr	r0, [r3], #4
1311.1Snonaka	ldr	r5, [r3], #4
1321.1Snonaka	str	r0, [r4], #4
1331.1Snonaka	cmp	r4, r6
1341.1Snonaka	strlt	r5, [r4], #4
1351.1Snonaka	cmplt	r4, r6
1361.1Snonaka	blt	|page_memcpy4|
1371.1Snonaka
1381.1Snonaka	b	|page_loop|
1391.1Snonaka|page_end|
1401.1Snonaka	;
1411.1Snonaka	; jump to kernel
1421.1Snonaka	;
1431.1Snonaka;	mov	r0, #'E'
1441.1Snonaka;	bl	btputc
1451.1Snonaka;	ldr	r0, [r7]
1461.1Snonaka;	bl	hexdump
1471.1Snonaka
1481.1Snonaka	; set stack pointer
1491.1Snonaka	mov	r5, #4096
1501.1Snonaka	add	r6, r6, #8192
1511.1Snonaka	sub	r5, r5, #1
1521.1Snonaka	bic	sp, r6, r5
1531.1Snonaka
1541.1Snonaka	; set bootargs
1551.1Snonaka	ldr	r4, [r7]
1561.1Snonaka	ldr	r0, [r7, #4]
1571.1Snonaka	ldr	r1, [r7, #8]
1581.1Snonaka	ldr	r2, [r7, #12]
1591.1Snonaka	bic	r4, r4, #0xff000000
1601.1Snonaka	orr	r4, r4, #0xa0000000
1611.1Snonaka	mov	pc, r4
1621.1Snonaka	; NOTREACHED
1631.1Snonaka
1641.1Snonaka|infinite_loop|
1651.1Snonaka	nop
1661.1Snonaka	nop
1671.1Snonaka	nop
1681.1Snonaka	nop
1691.1Snonaka	nop
1701.1Snonaka	b	|infinite_loop|
1711.1Snonaka	ENDP  ; |boot|
1721.1Snonaka
1731.1Snonaka|btputc| PROC
1741.1Snonaka	adr	r1, |$UARTTXBSY|
1751.1Snonaka	ldr	r1, [r1]
1761.1Snonaka|btputc_busy|
1771.1Snonaka	ldr	r2, [r1]
1781.1Snonaka	ands	r2, r2, #0x20
1791.1Snonaka	beq	|btputc_busy|
1801.1Snonaka	adr	r1, |$UARTTXADR|
1811.1Snonaka	ldr	r1, [r1]
1821.1Snonaka	str	r0, [r1]
1831.1Snonaka	adr	r1, |$UARTINTR|
1841.1Snonaka	ldr	r1, [r1]
1851.1Snonaka	mov	pc, lr
1861.1Snonaka	ENDP	;|btputc|
1871.1Snonaka
1881.1Snonaka|hexdump| PROC
1891.1Snonaka	stmfd	sp!, {r4-r5, lr}
1901.1Snonaka	mov	r4, r0
1911.1Snonaka	mov	r0, #0x30
1921.1Snonaka	bl	btputc
1931.1Snonaka	mov	r0, #0x78
1941.1Snonaka	bl	btputc
1951.1Snonaka	mov	r0, r4
1961.1Snonaka	;	Transmit register address
1971.1Snonaka	adr	r1, |$UARTTXADR|
1981.1Snonaka	ldr	r1, [r1]
1991.1Snonaka	;	Transmit busy register address
2001.1Snonaka	adr	r2, |$UARTTXBSY|
2011.1Snonaka	ldr	r2, [r2]
2021.1Snonaka	mov	r5, #8
2031.1Snonaka|hex_loop|
2041.1Snonaka	mov	r3, r0, LSR #28
2051.1Snonaka	cmp	r3, #9
2061.1Snonaka	addgt	r3, r3, #0x41 - 10
2071.1Snonaka	addle	r3, r3, #0x30
2081.1Snonaka|hex_busyloop|
2091.1Snonaka	ldr	r4, [r2]
2101.1Snonaka	ands	r4, r4, #0x20
2111.1Snonaka	beq	|hex_busyloop|
2121.1Snonaka	str	r3, [r1]
2131.1Snonaka	adr	r4, |$UARTINTR|
2141.1Snonaka	ldr	r4, [r4]
2151.1Snonaka	mov	r0, r0, LSL #4
2161.1Snonaka	subs	r5, r5, #1
2171.1Snonaka	bne	|hex_loop|
2181.1Snonaka	mov	r0, #0x0d
2191.1Snonaka	bl	btputc
2201.1Snonaka	mov	r0, #0x0a
2211.1Snonaka	bl	btputc
2221.1Snonaka	ldmfd	sp!, {r4-r5, pc}
2231.1Snonaka	ENDP	;|hexdump|
2241.1Snonaka
2251.1Snonaka	; FFUART
2261.1Snonaka|$UARTTXADR|
2271.1Snonaka	DCD	0x40100000
2281.1Snonaka|$UARTTXBSY|
2291.1Snonaka	DCD	0x40100014
2301.1Snonaka|$UARTINTR|
2311.1Snonaka	DCD	0x40100008
2321.1Snonaka
2331.1Snonaka	EXPORT	|boot_func_end_pxa2x0| [ DATA ]
2341.1Snonaka|boot_func_end_pxa2x0|	DCD	0x0
2351.1Snonaka
2361.1Snonaka	END
237