arm.asm revision 1.1
11.1Such;	$NetBSD: arm.asm,v 1.1 2001/02/09 18:34:49 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.1Such	
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.1Such|dcachebuf|	
461.1Such	%	8192	; D-cache size
471.1Such
481.1Such	AREA	|.text|, CODE, PIC
491.1Such	
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.1Such	
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.1Such	
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.1Such	
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.1Such	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.1Such	
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.1Such	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.1Such	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.1Such	
2231.1Such; Reg2	Translation table base (R/W)	
2241.1Such	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.1Such	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.1Such	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.1Such	
2471.1Such; Reg5	Fault status (R/W)
2481.1Such	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.1Such	
2541.1Such; Reg6	Fault address (R/W)	
2551.1Such	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.1Such; Reg9	Read buffer operations (W)	
2661.1Such; Reg13	Process ID (R/W)	
2671.1Such	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.1Such	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.1Such	
2781.1Such; Reg14	Breakpoint (R/W)
2791.1Such	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.1Such	
2861.1Such	; FlatJump (kaddr_t bootinfo, kaddr_t pvec, kaddr_t stack
2871.1Such	;		kaddr_t jump)
2881.1Such	;	bootinfo	boot infomation block address.
2891.1Such	;	pvec		page vector of kernel.
2901.1Such	;	stack		physical address of stack
2911.1Such	;	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.1Such;	
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.1Such	ENDP  ; |boot_func|	
3371.1Such	
3381.1Such	EXPORT |colorbar|
3391.1Such|colorbar| PROC	
3401.1Such	stmea	sp!, {r4-r7, lr}	
3411.1Such	adr	r4, |$FBADDR|	
3421.1Such	ldr	r4, [r4]
3431.1Such	
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.1Such	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.1Such	
3571.1Such	subs	r7, r7, #1
3581.1Such	bne	|color_loop|	
3591.1Such	
3601.1Such	ldmea	sp!, {r4-r7, pc}
3611.1Such|$FBADDR|
3621.1Such	DCD	0xc0003000	; use WindowsCE default.
3631.1Such	ENDP  ; |colorbar|	
3641.1Such	
3651.1Such	EXPORT	|boot|
3661.1Such|boot| PROC
3671.1Such;
3681.1Such;	UART test code
3691.1Such;	
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.1Such;	mov	r2, r5		; start	
3831.1Such	
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.1Such|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.1Such	
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.1Such	
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.1Such	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.1Such	
4081.1Such|page_memcpy4|			; memcpy (dst, src, sz) uncached.
4091.1Such	ldr	r0, [r3], #4
4101.1Such	str	r0, [r4], #4
4111.1Such	cmp	r4, r6
4121.1Such	blt	|page_memcpy4|
4131.1Such
4141.1Such	b	|page_loop|
4151.1Such|page_end|
4161.1Such	;
4171.1Such	; jump to kernel
4181.1Such	;	
4191.1Such;	mov	r0, #'E'
4201.1Such;	bl	btputc
4211.1Such;	ldr	r0, [r7]
4221.1Such;	bl	hexdump
4231.1Such;	ldr	r0, [r7]
4241.1Such;	ldr	r0, [r0]
4251.1Such;	bl	hexdump	
4261.1Such	
4271.1Such	ldr	r0, [r7]
4281.1Such	mov	pc, r0
4291.1Such	; NOTREACHED
4301.1Such	
4311.1Such|infinite_loop|
4321.1Such	nop
4331.1Such	nop
4341.1Such	nop
4351.1Such	nop
4361.1Such	nop
4371.1Such	b	|infinite_loop|
4381.1Such	ENDP  ; |boot|
4391.1Such	
4401.1Such|btputc| PROC
4411.1Such	adr	r1, |$UARTTXBSY|
4421.1Such	ldr	r1, [r1]
4431.1Such|btputc_busy|
4441.1Such	ldr	r2, [r1]
4451.1Such	and	r2, r2, #1
4461.1Such	cmp	r2, #1
4471.1Such	beq	|btputc_busy|
4481.1Such	adr	r1, |$UARTTXADR|
4491.1Such	ldr	r1, [r1]
4501.1Such	str	r0, [r1]
4511.1Such	mov	pc, lr
4521.1Such	ENDP	;|btputc|
4531.1Such
4541.1Such|hexdump| PROC
4551.1Such	stmea	sp!, {r4-r5, lr}
4561.1Such	mov	r4, r0
4571.1Such	mov	r0, #0x30
4581.1Such	bl	btputc
4591.1Such	mov	r0, #0x78
4601.1Such	bl	btputc
4611.1Such	mov	r0, r4
4621.1Such	;	Transmit register address
4631.1Such	adr	r1, |$UARTTXADR|
4641.1Such	ldr	r1, [r1]
4651.1Such	;	Transmit busy register address
4661.1Such	adr	r2, |$UARTTXBSY|
4671.1Such	ldr	r2, [r2]
4681.1Such	mov	r5, #8
4691.1Such|hex_loop|	
4701.1Such	mov	r3, r0, LSR #28
4711.1Such	cmp	r3, #9
4721.1Such	addgt	r3, r3, #0x41 - 10
4731.1Such	addle	r3, r3, #0x30
4741.1Such|hex_busyloop|
4751.1Such	 ldr	r4, [r2]
4761.1Such	and	r4, r4, #1
4771.1Such	cmp	r4, #1
4781.1Such	beq	|hex_busyloop|
4791.1Such	str	r3, [r1]
4801.1Such	mov	r0, r0, LSL #4
4811.1Such	subs	r5, r5, #1
4821.1Such	bne	|hex_loop|
4831.1Such	mov	r0, #0x0d
4841.1Such	bl	btputc
4851.1Such	mov	r0, #0x0a
4861.1Such	bl	btputc
4871.1Such	ldmea	sp!, {r4-r5, pc}
4881.1Such	ENDP	;|hexdump|
4891.1Such	
4901.1Such|$UARTTXADR|
4911.1Such	DCD	0x80050014
4921.1Such|$UARTTXBSY|	
4931.1Such	DCD	0x80050020	
4941.1Such	
4951.1Such	EXPORT	|boot_func_end| [ DATA ]
4961.1Such|boot_func_end|	DCD	0x0	
4971.1Such
4981.1Such	END
499