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