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