arm.asm revision 1.4
11.4Such; $NetBSD: arm.asm,v 1.4 2004/08/06 18:33:09 uch Exp $ 21.1Such; 31.1Such; Copyright (c) 2001 The NetBSD Foundation, Inc. 41.1Such; All rights reserved. 51.1Such; 61.1Such; This code is derived from software contributed to The NetBSD Foundation 71.1Such; by UCHIYAMA Yasushi. 81.1Such; 91.1Such; Redistribution and use in source and binary forms, with or without 101.1Such; modification, are permitted provided that the following conditions 111.1Such; are met: 121.1Such; 1. Redistributions of source code must retain the above copyright 131.1Such; notice, this list of conditions and the following disclaimer. 141.1Such; 2. Redistributions in binary form must reproduce the above copyright 151.1Such; notice, this list of conditions and the following disclaimer in the 161.1Such; documentation and/or other materials provided with the distribution. 171.1Such; 3. All advertising materials mentioning features or use of this software 181.1Such; must display the following acknowledgement: 191.1Such; This product includes software developed by the NetBSD 201.1Such; Foundation, Inc. and its contributors. 211.1Such; 4. Neither the name of The NetBSD Foundation nor the names of its 221.1Such; contributors may be used to endorse or promote products derived 231.1Such; from this software without specific prior written permission. 241.1Such; 251.1Such; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 261.1Such; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 271.1Such; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 281.1Such; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 291.1Such; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 301.1Such; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 311.1Such; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 321.1Such; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 331.1Such; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 341.1Such; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 351.1Such; POSSIBILITY OF SUCH DAMAGE. 361.1Such; 371.4Such 381.1Such; 391.1Such;armasm.exe $(InputPath) 401.1Such;arm.obj 411.1Such; 421.1Such ; dummy buffer for WritebackDCache 431.1Such EXPORT |dcachebuf| [DATA] 441.1Such AREA |.data|, DATA 451.4Such|dcachebuf| 461.1Such % 8192 ; D-cache size 471.1Such 481.1Such AREA |.text|, CODE, PIC 491.4Such 501.1Such ; 511.1Such ; Operation mode ops. 521.1Such ; 531.1Such EXPORT |SetSVCMode| 541.1Such|SetSVCMode| PROC 551.1Such mrs r0, cpsr 561.1Such bic r0, r0, #0x1f 571.1Such orr r0, r0, #0x13 581.1Such msr cpsr, r0 591.1Such mov pc, lr 601.1Such ENDP ; |SetSVCMode| 611.1Such EXPORT |SetSystemMode| 621.1Such|SetSystemMode| PROC 631.1Such mrs r0, cpsr 641.1Such orr r0, r0, #0x1f 651.1Such msr cpsr, r0 661.1Such mov pc, lr 671.1Such ENDP ; |SetSystemMode| 681.1Such 691.1Such ; 701.1Such ; Interrupt ops. 711.1Such ; 721.1Such EXPORT |DI| 731.1Such|DI| PROC 741.1Such mrs r0, cpsr 751.1Such orr r0, r0, #0xc0 761.1Such msr cpsr, r0 771.1Such mov pc, lr 781.1Such ENDP ; |DI| 791.1Such EXPORT |EI| 801.1Such|EI| PROC 811.1Such mrs r0, cpsr 821.1Such bic r0, r0, #0xc0 831.1Such msr cpsr, r0 841.1Such mov pc, lr 851.1Such ENDP ; |EI| 861.4Such 871.1Such ; 881.1Such ; Cache ops. 891.1Such ; 901.1Such EXPORT |InvalidateICache| 911.1Such|InvalidateICache| PROC 921.1Such ; c7 (CRn) Cache Control Register 931.1Such ; c5, 0 (CRm, opcode_2) Flush I 941.1Such ; r0 (Rd) ignored 951.1Such mcr p15, 0, r0, c7, c5, 0 961.1Such mov pc, lr 971.1Such ENDP ; |InvalidateICache| 981.4Such 991.1Such EXPORT |WritebackDCache| 1001.1Such|WritebackDCache| PROC 1011.1Such ldr r0, [pc, #16] ; dcachebuf 1021.1Such add r1, r0, #8192 ; cache-size is 8Kbyte. 1031.1Such|wbdc1| 1041.1Such ldr r2, [r0], #32 ; line-size is 32byte. 1051.1Such teq r1, r0 1061.1Such bne |wbdc1| 1071.1Such mov pc, lr 1081.1Such DCD |dcachebuf| 1091.1Such ENDP ; |WritebackDCache| 1101.4Such 1111.1Such EXPORT |InvalidateDCache| 1121.1Such|InvalidateDCache| PROC 1131.1Such ; c7 (CRn) Cache Control Register 1141.1Such ; c6, 0 (CRm, opcode_2) Flush D 1151.1Such ; r0 (Rd) ignored 1161.4Such mcr p15, 0, r0, c7, c6, 0 1171.1Such mov pc, lr 1181.1Such ENDP ; |InvalidateDCache| 1191.1Such 1201.1Such EXPORT |WritebackInvalidateDCache| 1211.1Such|WritebackInvalidateDCache| PROC 1221.1Such ldr r0, [pc, #20] ; dcachebuf 1231.1Such add r1, r0, #8192 1241.1Such|wbidc1| 1251.1Such ldr r2, [r0], #32 1261.1Such teq r1, r0 1271.1Such bne |wbidc1| 1281.1Such mcr p15, 0, r0, c7, c6, 0 1291.1Such mov pc, lr 1301.1Such DCD |dcachebuf| 1311.1Such ENDP ; |WritebackInvalidateDCache| 1321.1Such 1331.1Such ; 1341.1Such ; WriteBuffer ops 1351.1Such ; 1361.1Such EXPORT |WritebufferFlush| 1371.1Such|WritebufferFlush| PROC 1381.1Such ; c7 (CRn) Cache Control Register 1391.1Such ; c10, 4(CRm, opcode_2) Flush D 1401.1Such ; r0 (Rd) ignored 1411.1Such mcr p15, 0, r0, c7, c10, 4 1421.1Such mov pc, lr 1431.1Such ENDP ; |WritebufferFlush| 1441.1Such 1451.1Such ; 1461.1Such ; TLB ops. 1471.1Such ; 1481.1Such EXPORT |FlushIDTLB| 1491.1Such|FlushIDTLB| PROC 1501.1Such mcr p15, 0, r0, c8, c7, 0 1511.1Such mov pc, lr 1521.1Such ENDP ; |FlushIDTLB| 1531.1Such 1541.1Such EXPORT |FlushITLB| 1551.1Such|FlushITLB| PROC 1561.1Such mcr p15, 0, r0, c8, c5, 0 1571.1Such mov pc, lr 1581.1Such ENDP ; |FlushITLB| 1591.4Such 1601.1Such EXPORT |FlushDTLB| 1611.1Such|FlushDTLB| PROC 1621.1Such mcr p15, 0, r0, c8, c6, 0 1631.1Such mov pc, lr 1641.1Such ENDP ; |FlushITLB| 1651.1Such 1661.1Such EXPORT |FlushDTLBS| 1671.1Such|FlushDTLBS| PROC 1681.1Such mcr p15, 0, r0, c8, c6, 1 1691.1Such mov pc, lr 1701.1Such ENDP ; |FlushITLBS| 1711.1Such 1721.1Such ; 1731.1Such ; CurrentProgramStatusRegister access. 1741.1Such ; 1751.1Such EXPORT |GetCPSR| 1761.1Such|GetCPSR| PROC 1771.1Such mrs r0, cpsr 1781.1Such mov pc, lr 1791.1Such ENDP ; |GetCPSR| 1801.1Such 1811.4Such EXPORT |SetCPSR| 1821.1Such|SetCPSR| PROC 1831.1Such msr cpsr, r0 1841.1Such mov pc, lr 1851.1Such ENDP ; |SetCPSR| 1861.1Such 1871.1Such ; 1881.1Such ; SA-1100 Coprocessor15 access. 1891.1Such ; 1901.1Such; Reg0 ID (R) 1911.1Such EXPORT |GetCop15Reg0| 1921.1Such|GetCop15Reg0| PROC 1931.1Such mrc p15, 0, r0, c0, c0, 0 1941.1Such ; 0x4401a119 (44|01 = version 4|A11 = SA1100|9 = E stepping) 1951.1Such mov pc, lr 1961.1Such ENDP ; |GetCop15Reg0| 1971.1Such 1981.1Such; Reg1 Control (R/W) 1991.1Such EXPORT |GetCop15Reg1| 2001.1Such|GetCop15Reg1| PROC 2011.1Such mrc p15, 0, r0, c1, c0, 0 2021.1Such ; 0xc007327f (||...........|||..||..|..|||||||) 2031.1Such ; 0 (1)MMU enabled 2041.1Such ; 1 (1)Address fault enabled 2051.1Such ; 2 (1)D-cache enabled 2061.1Such ; 3 (1)Write-buffer enabled 2071.1Such ; 7 (0)little-endian 2081.1Such ; 8 (0)MMU protection (System) 2091.1Such ; 9 (1)MMU protection (ROM) 2101.1Such ; 12 (1)I-cache enabled 2111.1Such ; 13 (1)Base address of interrupt vector is 0xffff0000 2121.1Such mov pc, lr 2131.1Such ENDP ; |GetCop15Reg1| 2141.4Such EXPORT |SetCop15Reg1| 2151.1Such|SetCop15Reg1| PROC 2161.1Such mcr p15, 0, r0, c1, c0, 0 2171.1Such nop 2181.1Such nop 2191.1Such nop 2201.1Such mov pc, lr 2211.1Such ENDP ; |SetCop15Reg1| 2221.4Such 2231.4Such; Reg2 Translation table base (R/W) 2241.4Such EXPORT |GetCop15Reg2| 2251.1Such|GetCop15Reg2| PROC 2261.1Such mrc p15, 0, r0, c2, c0, 0 2271.1Such mov pc, lr 2281.1Such ENDP ; |GetCop15Reg2| 2291.4Such EXPORT |SetCop15Reg2| 2301.1Such|SetCop15Reg2| PROC 2311.1Such mcr p15, 0, r0, c2, c0, 0 2321.1Such mov pc, lr 2331.1Such ENDP ; |SetCop15Reg2| 2341.1Such 2351.1Such; Reg3 Domain access control (R/W) 2361.1Such EXPORT |GetCop15Reg3| 2371.1Such|GetCop15Reg3| PROC 2381.1Such mrc p15, 0, r0, c3, c0, 0 2391.1Such mov pc, lr 2401.1Such ENDP ; |GetCop15Reg3| 2411.4Such EXPORT |SetCop15Reg3| 2421.1Such|SetCop15Reg3| PROC 2431.1Such mcr p15, 0, r0, c3, c0, 0 2441.1Such mov pc, lr 2451.1Such ENDP ; |SetCop15Reg3| 2461.4Such 2471.1Such; Reg5 Fault status (R/W) 2481.4Such EXPORT |GetCop15Reg5| 2491.1Such|GetCop15Reg5| PROC 2501.1Such mrc p15, 0, r0, c5, c0, 0 2511.1Such mov pc, lr 2521.1Such ENDP ; |GetCop15Reg5| 2531.4Such 2541.4Such; Reg6 Fault address (R/W) 2551.4Such EXPORT |GetCop15Reg6| 2561.1Such|GetCop15Reg6| PROC 2571.1Such mrc p15, 0, r0, c6, c0, 0 2581.1Such mov pc, lr 2591.1Such ENDP ; |GetCop15Reg6| 2601.1Such 2611.1Such; Reg7 Cache operations (W) 2621.1Such ; -> Cache ops 2631.1Such; Reg8 TLB operations (Flush) (W) 2641.1Such ; -> TLB ops 2651.4Such; Reg9 Read buffer operations (W) 2661.4Such; Reg13 Process ID (R/W) 2671.4Such EXPORT |GetCop15Reg13| 2681.1Such|GetCop15Reg13| PROC 2691.1Such mrc p15, 0, r0, c13, c0, 0 2701.1Such mov pc, lr 2711.1Such ENDP ; |GetCop15Reg13| 2721.4Such EXPORT |SetCop15Reg13| 2731.1Such|SetCop15Reg13| PROC 2741.1Such mcr p15, 0, r0, c13, c0, 0 2751.1Such mov pc, lr 2761.1Such ENDP ; |SetCop15Reg13| 2771.4Such 2781.1Such; Reg14 Breakpoint (R/W) 2791.4Such EXPORT |GetCop15Reg14| 2801.1Such|GetCop15Reg14| PROC 2811.1Such mrc p15, 0, r0, c14, c0, 0 2821.1Such mov pc, lr 2831.1Such ENDP ; |GetCop15Reg14| 2841.1Such; Reg15 Test, clock, and idle (W) 2851.4Such 2861.1Such ; FlatJump (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack 2871.1Such ; kaddr_t jump) 2881.3Stoshii ; bootinfo boot information block address. 2891.1Such ; pvec page vector of kernel. 2901.1Such ; stack physical address of stack 2911.4Such ; jump physical address of boot function 2921.1Such ; *** MMU and pipeline behavier are SA-1100 specific. *** 2931.1Such EXPORT |FlatJump| 2941.1Such|FlatJump| PROC 2951.1Such ; disable interrupt 2961.1Such mrs r4, cpsr 2971.1Such orr r4, r4, #0xc0 2981.1Such msr cpsr, r4 2991.1Such ; disable MMU, I/D-Cache, Writebuffer. 3001.1Such ; interrupt vector address is 0xffff0000 3011.1Such ; 32bit exception handler/address range. 3021.1Such ldr r4, [pc, #24] 3031.1Such ; Disable WB/Cache/MMU 3041.1Such mcr p15, 0, r4, c1, c0, 0 3051.1Such ; Invalidate I/D-cache. 3061.1Such mcr p15, 0, r4, c7, c7, 0 ; Fetch translated fetch 3071.1Such ; Invalidate TLB entries. 3081.1Such mcr p15, 0, r4, c8, c7, 0 ; Fetch translated decode 3091.1Such ; jump to kernel entry physical address. 3101.1Such mov pc, r3 ; Fetch translated execute 3111.1Such ; NOTREACHED 3121.1Such nop ; Fetch nontranslated cache access 3131.1Such nop ; Fetch nontranslated writeback 3141.1Such mov pc, lr ; Fetch nontranslated 3151.1Such DCD 0x00002030 3161.1Such ENDP ; |FlatJump| 3171.1Such; 3181.1Such; UART test 3191.4Such; 3201.1Such ; boot_func (u_int32_t mapaddr, u_int32_t bootinfo, u_int32_t flags) 3211.1Such ; 3221.1Such EXPORT |boot_func| 3231.1Such|boot_func| PROC 3241.1Such nop ; Cop15 hazard 3251.1Such nop ; Cop15 hazard 3261.1Such nop ; Cop15 hazard 3271.1Such mov sp, r2 ; set bootloader stack 3281.1Such; mov r4, r0 3291.1Such; mov r5, r1 3301.1Such; bl colorbar 3311.1Such; mov r0, r4 3321.1Such; mov r1, r5 3331.1Such bl boot 3341.1Such nop ; NOTREACHED 3351.1Such nop 3361.4Such ENDP ; |boot_func| 3371.4Such 3381.1Such EXPORT |colorbar| 3391.4Such|colorbar| PROC 3401.4Such stmea sp!, {r4-r7, lr} 3411.4Such adr r4, |$FBADDR| 3421.1Such ldr r4, [r4] 3431.4Such 3441.1Such mov r7, #8 3451.1Such add r0, r0, r7 3461.1Such|color_loop| 3471.1Such mov r6, r0 3481.1Such and r6, r6, #7 3491.4Such orr r6, r6, r6, LSL #8 3501.1Such orr r6, r6, r6, LSL #16 3511.1Such add r5, r4, #0x9600 3521.1Such|fb_loop| 3531.1Such str r6, [r4], #4 3541.1Such cmp r4, r5 3551.1Such blt |fb_loop| 3561.4Such 3571.1Such subs r7, r7, #1 3581.4Such bne |color_loop| 3591.4Such 3601.1Such ldmea sp!, {r4-r7, pc} 3611.1Such|$FBADDR| 3621.1Such DCD 0xc0003000 ; use WindowsCE default. 3631.4Such ENDP ; |colorbar| 3641.4Such 3651.1Such EXPORT |boot| 3661.1Such|boot| PROC 3671.1Such; 3681.1Such; UART test code 3691.4Such; 3701.1Such; ; print boot_info address (r0) and page_vector start address (r1). 3711.1Such; mov r4, r0 3721.1Such; mov r5, r1 3731.1Such; mov r0, #'I' 3741.1Such; bl btputc 3751.1Such; mov r0, r4 3761.1Such; bl hexdump 3771.1Such; mov r0, #'P' 3781.1Such; bl btputc 3791.1Such; mov r0, r5 3801.1Such; bl hexdump 3811.1Such; mov r7, r4 3821.4Such; mov r2, r5 ; start 3831.4Such 3841.1Such mov r7, r0 ; if enabled above debug print, remove this. 3851.1Such mov r2, r1 ; if enabled above debug print, remove this. 3861.4Such|page_loop| 3871.1Such mvn r0, #0 ; ~0 3881.1Such cmp r2, r0 3891.1Such beq |page_end| ; if (next == ~0) goto page_end 3901.4Such 3911.1Such mov r1, r2 ; p = next 3921.1Such ldr r2, [r1] ; next 3931.1Such ldr r3, [r1, #4] ; src 3941.1Such ldr r4, [r1, #8] ; dst 3951.1Such ldr r5, [r1, #12] ; sz 3961.4Such 3971.1Such cmp r3, r0 3981.1Such add r6, r4, r5 ; end address 3991.1Such bne |page_memcpy4| ; if (src != ~0) goto page_memcpy4 4001.1Such 4011.4Such mov r0, #0 4021.1Such|page_memset| ; memset (dst, 0, sz) uncached. 4031.1Such str r0, [r4], #4 4041.1Such cmp r4, r6 4051.1Such blt |page_memset| 4061.1Such b |page_loop| 4071.4Such 4081.1Such|page_memcpy4| ; memcpy (dst, src, sz) uncached. 4091.1Such ldr r0, [r3], #4 4101.2Stoshii ldr r5, [r3], #4 4111.1Such str r0, [r4], #4 4121.1Such cmp r4, r6 4131.2Stoshii strlt r5, [r4], #4 4141.2Stoshii cmplt r4, r6 4151.1Such blt |page_memcpy4| 4161.1Such 4171.1Such b |page_loop| 4181.1Such|page_end| 4191.1Such ; 4201.1Such ; jump to kernel 4211.4Such ; 4221.1Such; mov r0, #'E' 4231.1Such; bl btputc 4241.1Such; ldr r0, [r7] 4251.1Such; bl hexdump 4261.1Such; ldr r0, [r7] 4271.1Such; ldr r0, [r0] 4281.1Such; bl hexdump 4291.2Stoshii 4301.2Stoshii ; set stack pointer 4311.2Stoshii mov r5, #4096 4321.2Stoshii add r6, r6, #8192 4331.2Stoshii sub r5, r5, #1 4341.2Stoshii bic sp, r6, r5 4351.2Stoshii 4361.2Stoshii ; set bootargs 4371.2Stoshii ldr r4, [r7] 4381.2Stoshii ldr r0, [r7, #4] 4391.2Stoshii ldr r1, [r7, #8] 4401.2Stoshii ldr r2, [r7, #12] 4411.2Stoshii mov pc, r4 4421.1Such ; NOTREACHED 4431.4Such 4441.1Such|infinite_loop| 4451.1Such nop 4461.1Such nop 4471.1Such nop 4481.1Such nop 4491.1Such nop 4501.1Such b |infinite_loop| 4511.1Such ENDP ; |boot| 4521.4Such 4531.1Such|btputc| PROC 4541.1Such adr r1, |$UARTTXBSY| 4551.1Such ldr r1, [r1] 4561.1Such|btputc_busy| 4571.1Such ldr r2, [r1] 4581.1Such and r2, r2, #1 4591.1Such cmp r2, #1 4601.1Such beq |btputc_busy| 4611.1Such adr r1, |$UARTTXADR| 4621.1Such ldr r1, [r1] 4631.1Such str r0, [r1] 4641.1Such mov pc, lr 4651.1Such ENDP ;|btputc| 4661.1Such 4671.1Such|hexdump| PROC 4681.1Such stmea sp!, {r4-r5, lr} 4691.1Such mov r4, r0 4701.1Such mov r0, #0x30 4711.1Such bl btputc 4721.1Such mov r0, #0x78 4731.1Such bl btputc 4741.1Such mov r0, r4 4751.1Such ; Transmit register address 4761.1Such adr r1, |$UARTTXADR| 4771.1Such ldr r1, [r1] 4781.1Such ; Transmit busy register address 4791.1Such adr r2, |$UARTTXBSY| 4801.1Such ldr r2, [r2] 4811.1Such mov r5, #8 4821.4Such|hex_loop| 4831.1Such mov r3, r0, LSR #28 4841.1Such cmp r3, #9 4851.1Such addgt r3, r3, #0x41 - 10 4861.1Such addle r3, r3, #0x30 4871.1Such|hex_busyloop| 4881.1Such ldr r4, [r2] 4891.1Such and r4, r4, #1 4901.1Such cmp r4, #1 4911.1Such beq |hex_busyloop| 4921.1Such str r3, [r1] 4931.1Such mov r0, r0, LSL #4 4941.1Such subs r5, r5, #1 4951.1Such bne |hex_loop| 4961.1Such mov r0, #0x0d 4971.1Such bl btputc 4981.1Such mov r0, #0x0a 4991.1Such bl btputc 5001.1Such ldmea sp!, {r4-r5, pc} 5011.1Such ENDP ;|hexdump| 5021.4Such 5031.1Such|$UARTTXADR| 5041.1Such DCD 0x80050014 5051.4Such|$UARTTXBSY| 5061.4Such DCD 0x80050020 5071.4Such 5081.1Such EXPORT |boot_func_end| [ DATA ] 5091.4Such|boot_func_end| DCD 0x0 5101.1Such 5111.1Such END 512