Rev 759 | Blame | Compare with Previous | Last modification | View Log | RSS feed
@@@ Copyright 2010 TheSeven@@@ This file is part of emCORE.@@ emCORE is free software: you can redistribute it and/or@ modify it under the terms of the GNU General Public License as@ published by the Free Software Foundation, either version 2 of the@ License, or (at your option) any later version.@@ emCORE is distributed in the hope that it will be useful,@ but WITHOUT ANY WARRANTY; without even the implied warranty of@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.@ See the GNU General Public License for more details.@@ You should have received a copy of the GNU General Public License@ along with emCORE. If not, see <http://www.gnu.org/licenses/>.@@.section .intvect,"ax",%progbitsldr pc, =reset_handlerldr pc, =undef_instr_handlerldr pc, =syscall_handlerldr pc, =prefetch_abort_handlerldr pc, =data_abort_handlerldr pc, =reserved_handlerldr pc, =irq_handlerldr pc, =fiq_handler.ltorg.section .inithead,"ax",%progbits.global __start__start:b _start.section .initcode,"ax",%progbits.global _start_start:mrc p15, 0, r0,c1,c0bic r0, r0, #0x200orr r0, r0, #0x100mcr p15, 0, r0,c1,c0mov r0, #0x7fffffffmcr p15, 0, r0,c3,c0mov r0, #0x22000000orr r1, r0, #0x00000100orr r0, r0, #0x0003c000orr r1, r1, #0x000000feadd r2, r0, #0x200mov r3, #0str r1, [r0], #4.mmuloop1:str r3, [r0], #4cmp r0, r2bne .mmuloop1add r0, r0, #0x080add r2, r0, #0x580.mmuloop2:str r3, [r0], #4cmp r0, r2bne .mmuloop2add r0, r0, #0x4add r2, r0, #0x7c.mmuloop3:str r3, [r0], #4cmp r0, r2bne .mmuloop3add r0, r0, #0x4add r2, r0, #0x500add r2, r2, #0x7c.mmuloop4:str r3, [r0], #4cmp r0, r2bne .mmuloop4add r0, r0, #0x200add r2, r0, #0x3000.mmuloop5:str r3, [r0], #4cmp r0, r2bne .mmuloop5mrc p15, 0, r0,c1,c0orr r0, r0, #5orr r0, r0, #0x400000mcr p15, 0, r0,c1,c0ldr r0, =_sramsourceldr r1, =_sramstartldr r2, =_sramend.copysram:cmp r2, r1ldrhi r3, [r0], #4strhi r3, [r1], #4bhi .copysramldr r0, =_sdramsourceldr r1, =_sdramstartldr r2, =_sdramend.copysdram:cmp r2, r1ldrhi r3, [r0], #4strhi r3, [r1], #4bhi .copysdramldr r0, =_ibssstartldr r1, =_ibssendmov r2, #0.clearibss:cmp r1, r0strhi r2, [r0], #4bhi .clearibssldr r0, =_bssstartldr r1, =_bssend.clearbss:cmp r1, r0strhi r2, [r0], #4bhi .clearbssmov r0, #0mcr p15, 0, r0,c7,c10,0 @ clean data cachemcr p15, 0, r0,c7,c10,4 @ drain write buffermcr p15, 0, r0,c7,c5,0 @ invalidate instruction cachemcr p15, 0, r0,c7,c5,4 @ flush prefetch bufferldr r1, =0x38e00000add r2, r1, #0x00001000add r3, r1, #0x00002000mov r4, #-1str r4, [r1,#0x14]str r4, [r2,#0x14]str r4, [r1,#0xf00]str r4, [r2,#0xf00]str r4, [r3,#0x08]str r4, [r3,#0x0c]msr cpsr_c, #0xd2ldr sp, =_irqstackendmsr cpsr_c, #0xd7ldr sp, =_abortstackendmsr cpsr_c, #0xdbldr sp, =_abortstackendmsr cpsr_c, #0x1fldr sp, =_abortstackendbl initbl yieldmov r0, #0ldr pc, =idleloop.ltorg.section .icode, "ax", %progbits.align 2idleloop:mcr p15, 0, r0,c7,c0,4b idleloop.global reset.global hang.type reset, %function.type hang, %functionreset:msr cpsr_c, #0xd3mov r0, #0x100000mov r1, #0x3c800000str r0, [r1]hang:msr cpsr_c, #0xd3mov r0, #0mcr p15, 0, r0,c7,c0,4b hang.size reset, .-reset.size hang, .-hang.type reset_handler, %functionreset_handler:stmfd sp, {r10-r12}mov r10, spmov r11, lrmrs r12, cpsrmsr cpsr_c, #0xd7sub sp, sp, #0x44stmia sp!, {r0-r9}sub r0, r10, #0xcldmia r0, {r0-r2}mov r3, r10mov r4, r11mov r5, r11mov r6, r12stmia sp!, {r0-r6}sub sp, sp, #0x44mov r0, #0adr r1, reset_textmov r2, r11b panicf.size reset_handler, .-reset_handler.global undef_instr_handler.type undef_instr_handler, %functionundef_instr_handler:sub sp, sp, #0x44stmia sp!, {r0-r12}sub r2, lr, #4mrs r3, spsrmrs r4, cpsrorr r0, r3, #0xc0msr cpsr_c, r0mov r0, spmov r1, lrmsr cpsr_c, r4stmia sp!, {r0-r3}sub sp, sp, #0x44mov r0, #0adr r1, undef_instr_textldr r3, [r2]b panicf.size undef_instr_handler, .-undef_instr_handler.type prefetch_abort_handler, %functionprefetch_abort_handler:sub sp, sp, #0x44stmia sp!, {r0-r12}sub r2, lr, #4mrs r3, spsrmrs r4, cpsrorr r0, r3, #0xc0msr cpsr_c, r0mov r0, spmov r1, lrmsr cpsr_c, r4stmia sp!, {r0-r3}sub sp, sp, #0x44mov r0, #0adr r1, prefetch_abort_textmrc p15, 0, r3,c5,c0mov r4, r3,lsr#4and r4, r4, #0xfand r5, r3, #0xfstmfd sp!, {r4-r5}b panicf.size prefetch_abort_handler, .-prefetch_abort_handler.type data_abort_handler, %functiondata_abort_handler:sub sp, sp, #0x44stmia sp!, {r0-r12}sub r2, lr, #8mrs r3, spsrmrs r4, cpsrorr r0, r3, #0xc0msr cpsr_c, r0mov r0, spmov r1, lrmsr cpsr_c, r4stmia sp!, {r0-r3}sub sp, sp, #0x44mov r0, #0adr r1, data_abort_textmrc p15, 0, r3,c5,c0mov r4, r3,lsr#4and r4, r4, #0xfand r5, r3, #0xfmrc p15, 0, r6,c6,c0stmfd sp!, {r4-r6}b panicf.size data_abort_handler, .-data_abort_handler.type reserved_handler, %functionreserved_handler:stmfd sp, {r10-r12}mov r10, spmov r11, lrmrs r12, cpsrmsr cpsr_c, #0xd7sub sp, sp, #0x44stmia sp!, {r0-r9}sub r0, r10, #0xcldmia r0, {r0-r2}mov r3, r10mov r4, r11mov r5, r11mov r6, r12stmia sp!, {r0-r6}sub sp, sp, #0x44mov r0, #0adr r1, reserved_textmov r2, r11b panicf.size reserved_handler, .-reserved_handler.type fiq_handler, %functionfiq_handler:mov r0, #2adr r1, fiq_textb panic.size fiq_handler, .-fiq_handlerprefetch_abort_text:.ascii "Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0"reset_text:.ascii "Hit reset vector!\n(Last known PC: %08X)\0"undef_instr_text:.ascii "Undefined instruction at %08X!\n(Opcode: %08X)\0"data_abort_text:.ascii "Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0"fiq_text:.ascii "Unhandled FIQ!\0"reserved_text:.ascii "Hit reserved exception handler!\n(Last known PC: %08X)\0"syscall_text:.ascii "Unhandled syscall!\0".section .icode.usec_timer, "ax", %progbits.align 2.global read_native_timer.type read_native_timer, %functionread_native_timer:ldr r0, val_3c700000ldr r1, [r0,#0x80]ldr r0, [r0,#0x84]bx lr.size read_native_timer, .-read_native_timer.global read_usec_timer.type read_usec_timer, %functionread_usec_timer:ldr r0, val_3c700000ldr r0, [r0,#0xb4]bx lr.size read_usec_timer, .-read_usec_timerval_3c700000:.word 0x3c700000