Rev 946 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#define ASM_FILE#include "global.h"#ifndef SOC_S5L8701#ifndef PAGETABLE_BASEADDR#define PAGETABLE_BASEADDR DEFAULT_PAGETABLE_BASEADDR#endif#endif.syntax unified.extern _text_size.extern _bss.extern _bss_offset.extern _dmabss.extern _dmabss_offset.extern _undef_instr_handler.extern _syscall_handler.extern _prefetch_abort_handler.extern _data_abort_handler.extern _reserved_handler.extern _irq_handler.extern _fiq_handler.global _vectors.section .vectors,"ax",%progbits_vectors:b _reset_handlerb _undef_instr_handlerb _syscall_handlerb _prefetch_abort_handlerb _data_abort_handlerb _reserved_handlerb _irq_handlerb _fiq_handler_reset_handler:@ Check if we need to relocate ourselvesadr r0, _vectorsldr r1, =_vectorscmp r0, r1beq _relocated@ Move around as necessaryldr r2, =(_text_size + 31)mov r2, r2,lsr#5_copy:ldmia r0!, {r4-r11}stmia r1!, {r4-r11}subs r2, r2, #1bne _copy_relocated:#ifdef SOC_S5L8701@ Detect execution base address and remap memory at 0x0 accordingly (for IRQ vectors)tst r1, #0x20000000ldr r1, =0x38200000ldr r0, [r1]orr r0, r0, #1bicne r0, r0, #0x10000orreq r0, r0, #0x10000str r0, [r1]#endif@ Flush cachesmov r0, #0#if CPU_ARM_ARCH < 6_cleancache:#if CPU_ARM_ARCH < 5mcr p15, 0, r0,c7,c10,2add r1, r0, #0x10mcr p15, 0, r1,c7,c10,2add r1, r1, #0x10mcr p15, 0, r1,c7,c10,2add r1, r1, #0x10mcr p15, 0, r1,c7,c10,2adds r0, r0, #0x04000000#elsemrc p15, 0, r15,c7,c10,3#endifbne _cleancache#elsemcr p15, 0, r0,c7,c14,0#endifmcr p15, 0, r0,c7,c10,4mcr p15, 0, r0,c7,c5,0#if CPU_ARM_ARCH >= 6mcr p15, 0, r0,c7,c5,4#endif#ifdef SOC_S5L8701@ Enable cachesmrc p15, 0, r1,c1,c0orr r1, r1, #0x00001000orr r1, r1, #0x00000005mcr p15, 0, r1,c1,c0#else#ifdef ENABLE_MMU@ Disable cachesmrc p15, 0, r3,c1,c0bic r1, r3, #0x00001000orr r3, r3, #0x00001000bic r1, r1, #0x00000005orr r3, r3, #0x00000005mcr p15, 0, r1,c1,c0@ Flush TLBmcr p15, 0, r0,c8,c7@ Disable remapping of the first 32MB (will be done by the MMU)mcr p15, 0, r0,c13,c0@ Configure MMUldr r0, =PAGETABLE_BASEADDRldr r1, =0xc1eldr r2, =_vectorsadd r2, r2, r1mcr p15, 0, r0,c2,c0str r2, [r0], #4_mmuloop:add r1, r1, #0x00100000cmp r1, #0x38000000biccs r1, r1, #0xctst r1, #0x40000000str r1, [r0], #4beq _mmuloopmov r0, #-1mcr p15, 0, r0,c3,c0@ Enable cachesmcr p15, 0, r3,c1,c0#endif#endif@ Jump to final execution address (after relocation)ldr pc, =_enable_irqs_enable_irqs:@ Mask and clear all IRQs#ifdef SOC_S5L8701mov r1, #0x39c00000str r0, [r1,#4]str r0, [r1,#8]str r0, [r1,#0x38]str r0, [r1,#0x20]sub r0, r0, #1str r0, [r1]str r0, [r1,#0x10]str r0, [r1,#0x1c]#elseldr r1, =0x38e00000add r2, r1, #0x00001000add r3, r1, #0x00002000mov r0, #-1str r0, [r1,#0x14]str r0, [r2,#0x14]str r0, [r1,#0xf00]str r0, [r2,#0xf00]str r0, [r3,#0x08]str r0, [r3,#0x0c]#endif@ Set up stacks and enable IRQsmsr cpsr_c, #0xd2ldr sp, =_irq_stack_topmsr cpsr_c, #0xd7ldr sp, =_abort_stack_topmsr cpsr_c, #0xdbldr sp, =_abort_stack_topmsr cpsr_c, #0x13ldr sp, =_stack_top@ Zero .bss sectionldr r0, =_bssmov r1, #0ldr r2, =_bss_sizebl memset@ Zero .dmabss sectionldr r0, =_dmabssmov r1, #0ldr r2, =_dmabss_sizebl memset@ Run C init codebl init@fallthrough_idleloop:mcr p15, 0, r0,c7,c0,4b _idleloop.ltorg.global idle.type idle, %functionidle:mcr p15, 0, r0,c7,c0,4bx lr.size idle, .-idle.global reset.global hang.type reset, %function.type hang, %functionreset:#ifdef SOC_S5L8701msr cpsr_c, #0xd3mov r0, #0x110000add r0, r0, #0xffadd r1, r0, #0xa00mov r2, #0x3c800000str r1, [r2]mov r1, #0xff0str r1, [r2,#4]str r0, [r2]#elsemsr cpsr_c, #0xd3mov r0, #0x100000mov r1, #0x3c800000str r0, [r1]#endifhang:msr cpsr_c, #0xd3mcr p15, 0, r0,c7,c0,4b hang.size reset, .-reset.size hang, .-hang