1*1e72df6aStsutsui; $NetBSD: arm_pxa2x0_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 AREA |.text|, CODE, PIC 32569b7f92Snonaka 33569b7f92Snonaka; 34569b7f92Snonaka;armasm.exe $(InputPath) 35569b7f92Snonaka;arm.obj 36569b7f92Snonaka; 37569b7f92Snonaka ; FlatJump_pxa2x0 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack 38569b7f92Snonaka ; kaddr_t jump) 39569b7f92Snonaka ; bootinfo boot information block address. 40569b7f92Snonaka ; pvec page vector of kernel. 41569b7f92Snonaka ; stack physical address of stack 42569b7f92Snonaka ; jump physical address of boot function 43569b7f92Snonaka EXPORT |FlatJump_pxa2x0| 44569b7f92Snonaka|FlatJump_pxa2x0| PROC 45569b7f92Snonaka ; disable interrupt 46569b7f92Snonaka mrs r4, cpsr 47569b7f92Snonaka orr r4, r4, #0xc0 48569b7f92Snonaka msr cpsr, r4 49569b7f92Snonaka ; Invalidate I/D-cache. 50569b7f92Snonaka mcr p15, 0, r4, c7, c7, 0 51569b7f92Snonaka mov r4, r4 52569b7f92Snonaka sub pc, pc, #4 53569b7f92Snonaka ; disable MMU, I/D-Cache, Writebuffer. 54569b7f92Snonaka ; interrupt vector address is 0xffff0000 55569b7f92Snonaka ; 32bit exception handler/address range. 56569b7f92Snonaka ldr r4, [pc, #20] 57569b7f92Snonaka ; Disable WB/Cache/MMU 58569b7f92Snonaka mcr p15, 0, r4, c1, c0, 0 59569b7f92Snonaka ; Invalidate TLB entries. 60569b7f92Snonaka mcr p15, 0, r4, c8, c7, 0 61569b7f92Snonaka mov r4, r4 ; wait for it to complete 62569b7f92Snonaka sub pc, pc, #4 ; branch to next insn 63569b7f92Snonaka mov pc, r3 64569b7f92Snonaka ; NOTREACHED 65569b7f92Snonaka mov pc, lr 66569b7f92Snonaka DCD 0x00002030 67569b7f92Snonaka ENDP ; |FlatJump_pxa2x0| 68569b7f92Snonaka; 69569b7f92Snonaka; UART test 70569b7f92Snonaka; 71569b7f92Snonaka ; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags) 72569b7f92Snonaka ; 73569b7f92Snonaka EXPORT |boot_func_pxa2x0| 74569b7f92Snonaka|boot_func_pxa2x0| PROC 75569b7f92Snonaka nop ; cop15 hazard 76569b7f92Snonaka nop ; cop15 hazard 77569b7f92Snonaka nop ; cop15 hazard 78569b7f92Snonaka mov sp, r2 ; set bootloader stack 79569b7f92Snonaka bl boot_pxa2x0 80569b7f92Snonaka nop ; NOTREACHED 81569b7f92Snonaka nop 82569b7f92Snonaka ENDP ; |boot_func_pxa2x0| 83569b7f92Snonaka 84569b7f92Snonaka EXPORT |boot_pxa2x0| 85569b7f92Snonaka|boot_pxa2x0| PROC 86569b7f92Snonaka mov r4, r0 87569b7f92Snonaka mov r5, r1 88569b7f92Snonaka 89569b7f92Snonaka; 90569b7f92Snonaka; UART test code 91569b7f92Snonaka; 92569b7f92Snonaka; ; print boot_info address (r0) and page_vector start address (r1). 93569b7f92Snonaka; mov r0, #'I' 94569b7f92Snonaka; bl btputc 95569b7f92Snonaka; mov r0, r4 96569b7f92Snonaka; bl hexdump 97569b7f92Snonaka; mov r0, #'P' 98569b7f92Snonaka; bl btputc 99569b7f92Snonaka; mov r0, r5 100569b7f92Snonaka; bl hexdump 101569b7f92Snonaka 102569b7f92Snonaka mov r7, r4 103569b7f92Snonaka mov r2, r5 ; start 104569b7f92Snonaka|page_loop| 105569b7f92Snonaka mvn r0, #0 ; ~0 106569b7f92Snonaka cmp r2, r0 107569b7f92Snonaka beq |page_end| ; if (next == ~0) goto page_end 108569b7f92Snonaka 109569b7f92Snonaka mov r1, r2 ; p = next 110569b7f92Snonaka ldr r2, [r1] ; next 111569b7f92Snonaka ldr r3, [r1, #4] ; src 112569b7f92Snonaka ldr r4, [r1, #8] ; dst 113569b7f92Snonaka ldr r5, [r1, #12] ; sz 114569b7f92Snonaka 115569b7f92Snonaka bic r4, r4, #0xff000000 116569b7f92Snonaka orr r4, r4, #0xa0000000 117569b7f92Snonaka 118569b7f92Snonaka cmp r3, r0 119569b7f92Snonaka add r6, r4, r5 ; end address 120569b7f92Snonaka bne |page_memcpy4| ; if (src != ~0) goto page_memcpy4 121569b7f92Snonaka 122569b7f92Snonaka mov r0, #0 123569b7f92Snonaka|page_memset| ; memset (dst, 0, sz) uncached. 124569b7f92Snonaka str r0, [r4], #4 125569b7f92Snonaka cmp r4, r6 126569b7f92Snonaka blt |page_memset| 127569b7f92Snonaka b |page_loop| 128569b7f92Snonaka 129569b7f92Snonaka|page_memcpy4| ; memcpy (dst, src, sz) uncached. 130569b7f92Snonaka ldr r0, [r3], #4 131569b7f92Snonaka ldr r5, [r3], #4 132569b7f92Snonaka str r0, [r4], #4 133569b7f92Snonaka cmp r4, r6 134569b7f92Snonaka strlt r5, [r4], #4 135569b7f92Snonaka cmplt r4, r6 136569b7f92Snonaka blt |page_memcpy4| 137569b7f92Snonaka 138569b7f92Snonaka b |page_loop| 139569b7f92Snonaka|page_end| 140569b7f92Snonaka ; 141569b7f92Snonaka ; jump to kernel 142569b7f92Snonaka ; 143569b7f92Snonaka; mov r0, #'E' 144569b7f92Snonaka; bl btputc 145569b7f92Snonaka; ldr r0, [r7] 146569b7f92Snonaka; bl hexdump 147569b7f92Snonaka 148569b7f92Snonaka ; set stack pointer 149569b7f92Snonaka mov r5, #4096 150569b7f92Snonaka add r6, r6, #8192 151569b7f92Snonaka sub r5, r5, #1 152569b7f92Snonaka bic sp, r6, r5 153569b7f92Snonaka 154569b7f92Snonaka ; set bootargs 155569b7f92Snonaka ldr r4, [r7] 156569b7f92Snonaka ldr r0, [r7, #4] 157569b7f92Snonaka ldr r1, [r7, #8] 158569b7f92Snonaka ldr r2, [r7, #12] 159569b7f92Snonaka bic r4, r4, #0xff000000 160569b7f92Snonaka orr r4, r4, #0xa0000000 161569b7f92Snonaka mov pc, r4 162569b7f92Snonaka ; NOTREACHED 163569b7f92Snonaka 164569b7f92Snonaka|infinite_loop| 165569b7f92Snonaka nop 166569b7f92Snonaka nop 167569b7f92Snonaka nop 168569b7f92Snonaka nop 169569b7f92Snonaka nop 170569b7f92Snonaka b |infinite_loop| 171569b7f92Snonaka ENDP ; |boot| 172569b7f92Snonaka 173569b7f92Snonaka|btputc| PROC 174569b7f92Snonaka adr r1, |$UARTTXBSY| 175569b7f92Snonaka ldr r1, [r1] 176569b7f92Snonaka|btputc_busy| 177569b7f92Snonaka ldr r2, [r1] 178569b7f92Snonaka ands r2, r2, #0x20 179569b7f92Snonaka beq |btputc_busy| 180569b7f92Snonaka adr r1, |$UARTTXADR| 181569b7f92Snonaka ldr r1, [r1] 182569b7f92Snonaka str r0, [r1] 183569b7f92Snonaka adr r1, |$UARTINTR| 184569b7f92Snonaka ldr r1, [r1] 185569b7f92Snonaka mov pc, lr 186569b7f92Snonaka ENDP ;|btputc| 187569b7f92Snonaka 188569b7f92Snonaka|hexdump| PROC 189569b7f92Snonaka stmfd sp!, {r4-r5, lr} 190569b7f92Snonaka mov r4, r0 191569b7f92Snonaka mov r0, #0x30 192569b7f92Snonaka bl btputc 193569b7f92Snonaka mov r0, #0x78 194569b7f92Snonaka bl btputc 195569b7f92Snonaka mov r0, r4 196569b7f92Snonaka ; Transmit register address 197569b7f92Snonaka adr r1, |$UARTTXADR| 198569b7f92Snonaka ldr r1, [r1] 199569b7f92Snonaka ; Transmit busy register address 200569b7f92Snonaka adr r2, |$UARTTXBSY| 201569b7f92Snonaka ldr r2, [r2] 202569b7f92Snonaka mov r5, #8 203569b7f92Snonaka|hex_loop| 204569b7f92Snonaka mov r3, r0, LSR #28 205569b7f92Snonaka cmp r3, #9 206569b7f92Snonaka addgt r3, r3, #0x41 - 10 207569b7f92Snonaka addle r3, r3, #0x30 208569b7f92Snonaka|hex_busyloop| 209569b7f92Snonaka ldr r4, [r2] 210569b7f92Snonaka ands r4, r4, #0x20 211569b7f92Snonaka beq |hex_busyloop| 212569b7f92Snonaka str r3, [r1] 213569b7f92Snonaka adr r4, |$UARTINTR| 214569b7f92Snonaka ldr r4, [r4] 215569b7f92Snonaka mov r0, r0, LSL #4 216569b7f92Snonaka subs r5, r5, #1 217569b7f92Snonaka bne |hex_loop| 218569b7f92Snonaka mov r0, #0x0d 219569b7f92Snonaka bl btputc 220569b7f92Snonaka mov r0, #0x0a 221569b7f92Snonaka bl btputc 222569b7f92Snonaka ldmfd sp!, {r4-r5, pc} 223569b7f92Snonaka ENDP ;|hexdump| 224569b7f92Snonaka 225569b7f92Snonaka ; FFUART 226569b7f92Snonaka|$UARTTXADR| 227569b7f92Snonaka DCD 0x40100000 228569b7f92Snonaka|$UARTTXBSY| 229569b7f92Snonaka DCD 0x40100014 230569b7f92Snonaka|$UARTINTR| 231569b7f92Snonaka DCD 0x40100008 232569b7f92Snonaka 233569b7f92Snonaka EXPORT |boot_func_end_pxa2x0| [ DATA ] 234569b7f92Snonaka|boot_func_end_pxa2x0| DCD 0x0 235569b7f92Snonaka 236569b7f92Snonaka END 237