1;         $NetBSD: arm_pxa2x0_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          AREA      |.text|, CODE, PIC
32
33;
34;armasm.exe $(InputPath)
35;arm.obj
36;
37          ; FlatJump_pxa2x0 (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack
38          ;                   kaddr_t jump)
39          ;         bootinfo  boot information block address.
40          ;         pvec                page vector of kernel.
41          ;         stack               physical address of stack
42          ;         jump                physical address of boot function
43          EXPORT    |FlatJump_pxa2x0|
44|FlatJump_pxa2x0| PROC
45          ; disable interrupt
46          mrs       r4, cpsr
47          orr       r4, r4, #0xc0
48          msr       cpsr, r4
49          ; Invalidate I/D-cache.
50          mcr       p15, 0, r4, c7, c7, 0
51          mov       r4, r4
52          sub       pc, pc, #4
53          ; disable MMU, I/D-Cache, Writebuffer.
54          ; interrupt vector address is 0xffff0000
55          ; 32bit exception handler/address range.
56          ldr       r4, [pc, #20]
57          ; Disable WB/Cache/MMU
58          mcr       p15, 0, r4, c1, c0, 0
59          ; Invalidate TLB entries.
60          mcr       p15, 0, r4, c8, c7, 0
61          mov       r4, r4                        ; wait for it to complete
62          sub       pc, pc, #4                    ; branch to next insn
63          mov       pc, r3
64          ; NOTREACHED
65          mov       pc, lr
66          DCD       0x00002030
67          ENDP  ; |FlatJump_pxa2x0|
68;
69;         UART test
70;
71          ; boot_func (uint32_t mapaddr, uint32_t bootinfo, uint32_t flags)
72          ;
73          EXPORT    |boot_func_pxa2x0|
74|boot_func_pxa2x0| PROC
75          nop                                     ; cop15 hazard
76          nop                                     ; cop15 hazard
77          nop                                     ; cop15 hazard
78          mov       sp, r2                        ; set bootloader stack
79          bl        boot_pxa2x0
80          nop       ; NOTREACHED
81          nop
82          ENDP  ; |boot_func_pxa2x0|
83
84          EXPORT    |boot_pxa2x0|
85|boot_pxa2x0| PROC
86          mov       r4, r0
87          mov       r5, r1
88
89;
90;         UART test code
91;
92;         ; print boot_info address (r0) and page_vector start address (r1).
93;         mov       r0, #'I'
94;         bl        btputc
95;         mov       r0, r4
96;         bl        hexdump
97;         mov       r0, #'P'
98;         bl        btputc
99;         mov       r0, r5
100;         bl        hexdump
101
102          mov       r7, r4
103          mov       r2, r5              ; start
104|page_loop|
105          mvn       r0, #0              ; ~0
106          cmp       r2, r0
107          beq       |page_end|          ; if (next == ~0) goto page_end
108
109          mov       r1, r2              ; p = next
110          ldr       r2, [r1]  ; next
111          ldr       r3, [r1, #4]        ; src
112          ldr       r4, [r1, #8]        ; dst
113          ldr       r5, [r1, #12]       ; sz
114
115          bic       r4, r4, #0xff000000
116          orr       r4, r4, #0xa0000000
117
118          cmp       r3, r0
119          add       r6, r4, r5          ; end address
120          bne       |page_memcpy4|      ; if (src != ~0) goto page_memcpy4
121
122          mov       r0, #0
123|page_memset|                           ; memset (dst, 0, sz) uncached.
124          str       r0, [r4], #4
125          cmp       r4, r6
126          blt       |page_memset|
127          b         |page_loop|
128
129|page_memcpy4|                          ; memcpy (dst, src, sz) uncached.
130          ldr       r0, [r3], #4
131          ldr       r5, [r3], #4
132          str       r0, [r4], #4
133          cmp       r4, r6
134          strlt     r5, [r4], #4
135          cmplt     r4, r6
136          blt       |page_memcpy4|
137
138          b         |page_loop|
139|page_end|
140          ;
141          ; jump to kernel
142          ;
143;         mov       r0, #'E'
144;         bl        btputc
145;         ldr       r0, [r7]
146;         bl        hexdump
147
148          ; set stack pointer
149          mov       r5, #4096
150          add       r6, r6, #8192
151          sub       r5, r5, #1
152          bic       sp, r6, r5
153
154          ; set bootargs
155          ldr       r4, [r7]
156          ldr       r0, [r7, #4]
157          ldr       r1, [r7, #8]
158          ldr       r2, [r7, #12]
159          bic       r4, r4, #0xff000000
160          orr       r4, r4, #0xa0000000
161          mov       pc, r4
162          ; NOTREACHED
163
164|infinite_loop|
165          nop
166          nop
167          nop
168          nop
169          nop
170          b         |infinite_loop|
171          ENDP  ; |boot|
172
173|btputc| PROC
174          adr       r1, |$UARTTXBSY|
175          ldr       r1, [r1]
176|btputc_busy|
177          ldr       r2, [r1]
178          ands      r2, r2, #0x20
179          beq       |btputc_busy|
180          adr       r1, |$UARTTXADR|
181          ldr       r1, [r1]
182          str       r0, [r1]
183          adr       r1, |$UARTINTR|
184          ldr       r1, [r1]
185          mov       pc, lr
186          ENDP      ;|btputc|
187
188|hexdump| PROC
189          stmfd     sp!, {r4-r5, lr}
190          mov       r4, r0
191          mov       r0, #0x30
192          bl        btputc
193          mov       r0, #0x78
194          bl        btputc
195          mov       r0, r4
196          ;         Transmit register address
197          adr       r1, |$UARTTXADR|
198          ldr       r1, [r1]
199          ;         Transmit busy register address
200          adr       r2, |$UARTTXBSY|
201          ldr       r2, [r2]
202          mov       r5, #8
203|hex_loop|
204          mov       r3, r0, LSR #28
205          cmp       r3, #9
206          addgt     r3, r3, #0x41 - 10
207          addle     r3, r3, #0x30
208|hex_busyloop|
209          ldr       r4, [r2]
210          ands      r4, r4, #0x20
211          beq       |hex_busyloop|
212          str       r3, [r1]
213          adr       r4, |$UARTINTR|
214          ldr       r4, [r4]
215          mov       r0, r0, LSL #4
216          subs      r5, r5, #1
217          bne       |hex_loop|
218          mov       r0, #0x0d
219          bl        btputc
220          mov       r0, #0x0a
221          bl        btputc
222          ldmfd     sp!, {r4-r5, pc}
223          ENDP      ;|hexdump|
224
225          ; FFUART
226|$UARTTXADR|
227          DCD       0x40100000
228|$UARTTXBSY|
229          DCD       0x40100014
230|$UARTINTR|
231          DCD       0x40100008
232
233          EXPORT    |boot_func_end_pxa2x0| [ DATA ]
234|boot_func_end_pxa2x0|        DCD       0x0
235
236          END
237