; $NetBSD: arm.asm,v 1.9 2010/04/06 16:20:28 nonaka Exp $ ; ; Copyright (c) 2001 The NetBSD Foundation, Inc. ; All rights reserved. ; ; This code is derived from software contributed to The NetBSD Foundation ; by UCHIYAMA Yasushi. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions ; are met: ; 1. Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; 2. Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in the ; documentation and/or other materials provided with the distribution. ; ; THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ; ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS ; BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ; POSSIBILITY OF SUCH DAMAGE. ; ; ;armasm.exe $(InputPath) ;arm.obj ; ; dummy buffer for WritebackDCache EXPORT |dcachesize| [DATA] EXPORT |dcachebuf| [DATA] AREA |.data|, DATA |dcachesize| DCD 8192 ; for SA1100 |dcachebuf| % 65536 ; max D-cache size AREA |.text|, CODE, PIC ; ; Operation mode ops. ; EXPORT |SetSVCMode| |SetSVCMode| PROC mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0x13 msr cpsr, r0 mov pc, lr ENDP ; |SetSVCMode| EXPORT |SetSystemMode| |SetSystemMode| PROC mrs r0, cpsr orr r0, r0, #0x1f msr cpsr, r0 mov pc, lr ENDP ; |SetSystemMode| ; ; Interrupt ops. ; EXPORT |DI| |DI| PROC mrs r0, cpsr orr r0, r0, #0xc0 msr cpsr, r0 mov pc, lr ENDP ; |DI| EXPORT |EI| |EI| PROC mrs r0, cpsr bic r0, r0, #0xc0 msr cpsr, r0 mov pc, lr ENDP ; |EI| ; ; Cache ops. ; EXPORT |InvalidateICache| |InvalidateICache| PROC ; c7 (CRn) Cache Control Register ; c5, 0 (CRm, opcode_2) Flush I ; r0 (Rd) ignored mcr p15, 0, r0, c7, c5, 0 mov pc, lr ENDP ; |InvalidateICache| EXPORT |WritebackDCache| |WritebackDCache| PROC ldr r0, [pc, #24] ; dcachebuf ldr r1, [pc, #24] ldr r1, [r1] ; dcache-size add r1, r1, r0 |wbdc1| ldr r2, [r0], #32 ; line-size is 32byte. teq r1, r0 bne |wbdc1| mov pc, lr DCD |dcachebuf| DCD |dcachesize| ENDP ; |WritebackDCache| EXPORT |InvalidateDCache| |InvalidateDCache| PROC ; c7 (CRn) Cache Control Register ; c6, 0 (CRm, opcode_2) Flush D ; r0 (Rd) ignored mcr p15, 0, r0, c7, c6, 0 mov pc, lr ENDP ; |InvalidateDCache| EXPORT |WritebackInvalidateDCache| |WritebackInvalidateDCache| PROC ldr r0, [pc, #28] ; dcachebuf ldr r1, [pc, #28] ldr r1, [r1] ; dcache-size add r1, r1, r0 |wbidc1| ldr r2, [r0], #32 teq r1, r0 bne |wbidc1| mcr p15, 0, r0, c7, c6, 0 mov pc, lr DCD |dcachebuf| DCD |dcachesize| ENDP ; |WritebackInvalidateDCache| ; ; WriteBuffer ops ; EXPORT |WritebufferFlush| |WritebufferFlush| PROC ; c7 (CRn) Cache Control Register ; c10, 4(CRm, opcode_2) Flush D ; r0 (Rd) ignored mcr p15, 0, r0, c7, c10, 4 mov pc, lr ENDP ; |WritebufferFlush| ; ; TLB ops. ; EXPORT |FlushIDTLB| |FlushIDTLB| PROC mcr p15, 0, r0, c8, c7, 0 mov pc, lr ENDP ; |FlushIDTLB| EXPORT |FlushITLB| |FlushITLB| PROC mcr p15, 0, r0, c8, c5, 0 mov pc, lr ENDP ; |FlushITLB| EXPORT |FlushDTLB| |FlushDTLB| PROC mcr p15, 0, r0, c8, c6, 0 mov pc, lr ENDP ; |FlushITLB| EXPORT |FlushDTLBS| |FlushDTLBS| PROC mcr p15, 0, r0, c8, c6, 1 mov pc, lr ENDP ; |FlushITLBS| ; ; CurrentProgramStatusRegister access. ; EXPORT |GetCPSR| |GetCPSR| PROC mrs r0, cpsr mov pc, lr ENDP ; |GetCPSR| EXPORT |SetCPSR| |SetCPSR| PROC msr cpsr, r0 mov pc, lr ENDP ; |SetCPSR| ; ; SA-1100 Coprocessor15 access. ; ; Reg0 ID (R) EXPORT |GetCop15Reg0| |GetCop15Reg0| PROC mrc p15, 0, r0, c0, c0, 0 ; 0x4401a119 (44|01 = version 4|A11 = SA1100|9 = E stepping) mov pc, lr ENDP ; |GetCop15Reg0| ; Reg1 Control (R/W) EXPORT |GetCop15Reg1| |GetCop15Reg1| PROC mrc p15, 0, r0, c1, c0, 0 ; 0xc007327f (||...........|||..||..|..|||||||) ; 0 (1)MMU enabled ; 1 (1)Address fault enabled ; 2 (1)D-cache enabled ; 3 (1)Write-buffer enabled ; 7 (0)little-endian ; 8 (0)MMU protection (System) ; 9 (1)MMU protection (ROM) ; 12 (1)I-cache enabled ; 13 (1)Base address of interrupt vector is 0xffff0000 mov pc, lr ENDP ; |GetCop15Reg1| EXPORT |SetCop15Reg1| |SetCop15Reg1| PROC mcr p15, 0, r0, c1, c0, 0 nop nop nop mov pc, lr ENDP ; |SetCop15Reg1| ; Reg2 Translation table base (R/W) EXPORT |GetCop15Reg2| |GetCop15Reg2| PROC mrc p15, 0, r0, c2, c0, 0 mov pc, lr ENDP ; |GetCop15Reg2| EXPORT |SetCop15Reg2| |SetCop15Reg2| PROC mcr p15, 0, r0, c2, c0, 0 mov pc, lr ENDP ; |SetCop15Reg2| ; Reg3 Domain access control (R/W) EXPORT |GetCop15Reg3| |GetCop15Reg3| PROC mrc p15, 0, r0, c3, c0, 0 mov pc, lr ENDP ; |GetCop15Reg3| EXPORT |SetCop15Reg3| |SetCop15Reg3| PROC mcr p15, 0, r0, c3, c0, 0 mov pc, lr ENDP ; |SetCop15Reg3| ; Reg5 Fault status (R/W) EXPORT |GetCop15Reg5| |GetCop15Reg5| PROC mrc p15, 0, r0, c5, c0, 0 mov pc, lr ENDP ; |GetCop15Reg5| ; Reg6 Fault address (R/W) EXPORT |GetCop15Reg6| |GetCop15Reg6| PROC mrc p15, 0, r0, c6, c0, 0 mov pc, lr ENDP ; |GetCop15Reg6| ; Reg7 Cache operations (W) ; -> Cache ops ; Reg8 TLB operations (Flush) (W) ; -> TLB ops ; Reg9 Read buffer operations (W) ; Reg13 Process ID (R/W) EXPORT |GetCop15Reg13| |GetCop15Reg13| PROC mrc p15, 0, r0, c13, c0, 0 mov pc, lr ENDP ; |GetCop15Reg13| EXPORT |SetCop15Reg13| |SetCop15Reg13| PROC mcr p15, 0, r0, c13, c0, 0 mov pc, lr ENDP ; |SetCop15Reg13| ; Reg14 Breakpoint (R/W) EXPORT |GetCop15Reg14| |GetCop15Reg14| PROC mrc p15, 0, r0, c14, c0, 0 mov pc, lr ENDP ; |GetCop15Reg14| ; Reg15 Test, clock, and idle (W) END