1; $NetBSD: arm_sa1100_asm.asm,v 1.2 2019/12/15 16:48:25 tsutsui Exp $ 2; 3; Copyright (c) 2001 The NetBSD Foundation, Inc. 4; All rights reserved. 5; 6; This code is derived from software contributed to The NetBSD Foundation 7; by UCHIYAMA Yasushi. 8; 9; Redistribution and use in source and binary forms, with or without 10; modification, are permitted provided that the following conditions 11; are met: 12; 1. Redistributions of source code must retain the above copyright 13; notice, this list of conditions and the following disclaimer. 14; 2. Redistributions in binary form must reproduce the above copyright 15; notice, this list of conditions and the following disclaimer in the 16; documentation and/or other materials provided with the distribution. 17; 18; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28; POSSIBILITY OF SUCH DAMAGE. 29; 30 31; 32;armasm.exe $(InputPath) 33;arm.obj 34; 35 36 AREA |.text|, CODE, PIC 37 38 ; FlatJump_sa1100 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack 39 ; kaddr_t jump) 40 ; bootinfo boot information block address. 41 ; pvec page vector of kernel. 42 ; stack physical address of stack 43 ; jump physical address of boot function 44 ; *** MMU and pipeline behavier are SA-1100 specific. *** 45 EXPORT |FlatJump_sa1100| 46|FlatJump_sa1100| PROC 47 ; disable interrupt 48 mrs r4, cpsr 49 orr r4, r4, #0xc0 50 msr cpsr, r4 51 ; disable MMU, I/D-Cache, Writebuffer. 52 ; interrupt vector address is 0xffff0000 53 ; 32bit exception handler/address range. 54 ldr r4, [pc, #24] 55 ; Disable WB/Cache/MMU 56 mcr p15, 0, r4, c1, c0, 0 57 ; Invalidate I/D-cache. 58 mcr p15, 0, r4, c7, c7, 0 ; Fetch translated fetch 59 ; Invalidate TLB entries. 60 mcr p15, 0, r4, c8, c7, 0 ; Fetch translated decode 61 ; jump to kernel entry physical address. 62 mov pc, r3 ; Fetch translated execute 63 ; NOTREACHED 64 nop ; Fetch nontranslated cache access 65 nop ; Fetch nontranslated writeback 66 mov pc, lr ; Fetch nontranslated 67 DCD 0x00002030 68 ENDP ; |FlatJump_sa1100| 69; 70; UART test 71; 72 ; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags) 73 ; 74 EXPORT |boot_func_sa1100| 75|boot_func_sa1100| PROC 76 nop ; Cop15 hazard 77 nop ; Cop15 hazard 78 nop ; Cop15 hazard 79 mov sp, r2 ; set bootloader stack 80; mov r4, r0 81; mov r5, r1 82; bl colorbar 83; mov r0, r4 84; mov r1, r5 85 bl boot_sa1100 86 nop ; NOTREACHED 87 nop 88 ENDP ; |boot_func_sa1100| 89 90 EXPORT |colorbar| 91|colorbar| PROC 92 stmfd sp!, {r4-r7, lr} 93 adr r4, |$FBADDR| 94 ldr r4, [r4] 95 96 mov r7, #8 97 add r0, r0, r7 98|color_loop| 99 mov r6, r0 100 and r6, r6, #7 101 orr r6, r6, r6, LSL #8 102 orr r6, r6, r6, LSL #16 103 add r5, r4, #0x9600 104|fb_loop| 105 str r6, [r4], #4 106 cmp r4, r5 107 blt |fb_loop| 108 109 subs r7, r7, #1 110 bne |color_loop| 111 112 ldmfd sp!, {r4-r7, pc} 113|$FBADDR| 114 DCD 0xc0003000 ; use WindowsCE default. 115 ENDP ; |colorbar| 116 117 EXPORT |boot_sa1100| 118|boot_sa1100| PROC 119; 120; UART test code 121; 122; ; print boot_info address (r0) and page_vector start address (r1). 123; mov r4, r0 124; mov r5, r1 125; mov r0, #'I' 126; bl btputc 127; mov r0, r4 128; bl hexdump 129; mov r0, #'P' 130; bl btputc 131; mov r0, r5 132; bl hexdump 133; mov r7, r4 134; mov r2, r5 ; start 135 136 mov r7, r0 ; if enabled above debug print, remove this. 137 mov r2, r1 ; if enabled above debug print, remove this. 138|page_loop| 139 mvn r0, #0 ; ~0 140 cmp r2, r0 141 beq |page_end| ; if (next == ~0) goto page_end 142 143 mov r1, r2 ; p = next 144 ldr r2, [r1] ; next 145 ldr r3, [r1, #4] ; src 146 ldr r4, [r1, #8] ; dst 147 ldr r5, [r1, #12] ; sz 148 149 cmp r3, r0 150 add r6, r4, r5 ; end address 151 bne |page_memcpy4| ; if (src != ~0) goto page_memcpy4 152 153 mov r0, #0 154|page_memset| ; memset (dst, 0, sz) uncached. 155 str r0, [r4], #4 156 cmp r4, r6 157 blt |page_memset| 158 b |page_loop| 159 160|page_memcpy4| ; memcpy (dst, src, sz) uncached. 161 ldr r0, [r3], #4 162 ldr r5, [r3], #4 163 str r0, [r4], #4 164 cmp r4, r6 165 strlt r5, [r4], #4 166 cmplt r4, r6 167 blt |page_memcpy4| 168 169 b |page_loop| 170|page_end| 171 ; 172 ; jump to kernel 173 ; 174; mov r0, #'E' 175; bl btputc 176; ldr r0, [r7] 177; bl hexdump 178; ldr r0, [r7] 179; ldr r0, [r0] 180; bl hexdump 181 182 ; set stack pointer 183 mov r5, #4096 184 add r6, r6, #8192 185 sub r5, r5, #1 186 bic sp, r6, r5 187 188 ; set bootargs 189 ldr r4, [r7] 190 ldr r0, [r7, #4] 191 ldr r1, [r7, #8] 192 ldr r2, [r7, #12] 193 mov pc, r4 194 ; NOTREACHED 195 196|infinite_loop| 197 nop 198 nop 199 nop 200 nop 201 nop 202 b |infinite_loop| 203 ENDP ; |boot| 204 205|btputc| PROC 206 adr r1, |$UARTTXBSY| 207 ldr r1, [r1] 208|btputc_busy| 209 ldr r2, [r1] 210 and r2, r2, #1 211 cmp r2, #1 212 beq |btputc_busy| 213 adr r1, |$UARTTXADR| 214 ldr r1, [r1] 215 str r0, [r1] 216 mov pc, lr 217 ENDP ;|btputc| 218 219|hexdump| PROC 220 stmfd sp!, {r4-r5, lr} 221 mov r4, r0 222 mov r0, #0x30 223 bl btputc 224 mov r0, #0x78 225 bl btputc 226 mov r0, r4 227 ; Transmit register address 228 adr r1, |$UARTTXADR| 229 ldr r1, [r1] 230 ; Transmit busy register address 231 adr r2, |$UARTTXBSY| 232 ldr r2, [r2] 233 mov r5, #8 234|hex_loop| 235 mov r3, r0, LSR #28 236 cmp r3, #9 237 addgt r3, r3, #0x41 - 10 238 addle r3, r3, #0x30 239|hex_busyloop| 240 ldr r4, [r2] 241 and r4, r4, #1 242 cmp r4, #1 243 beq |hex_busyloop| 244 str r3, [r1] 245 mov r0, r0, LSL #4 246 subs r5, r5, #1 247 bne |hex_loop| 248 mov r0, #0x0d 249 bl btputc 250 mov r0, #0x0a 251 bl btputc 252 ldmfd sp!, {r4-r5, pc} 253 ENDP ;|hexdump| 254 255|$UARTTXADR| 256 DCD 0x80050014 257|$UARTTXBSY| 258 DCD 0x80050020 259 260 EXPORT |boot_func_end_sa1100| [ DATA ] 261|boot_func_end_sa1100| DCD 0x0 262 263 END 264