/* * Copyright Codito Technologies (www.codito.com) * * cpu/arc/start.S * * Copyright (C) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Authors : Sandeep Patil (sandeep.patil@codito.com) * Pradeep Sawlani (pradeep.sawlani@codito.com) */ #include /* required for STATUS_H_SET */ #include /* .text section loaded at TEXT_BASE defined in board/aa3/config.mk */ .section .text , "ax" , @progbits .type _start, @function .align 4 .globl _start .globl _TEXT_BASE _TEXT_BASE: .word TEXT_BASE .globl _bss_start _bss_start: .word __bss_start .globl _bss_end _bss_end: .word __bss_end .globl _arcboot_start _arcboot_start: .word _start _start: /* Disable interrupts */ /* lr r2,[ARC_REG_STATUS32] and r2,r2,STATUS_DISABLE_INTERRUPTS sr r2,[ARC_REG_STATUS32] */ #if CONFIG_SYS_UBOOT_ON_FLASH /* For relocation following registers are used : * r1 : destination * r2 : source * r3 : till * r4 : jump to next loop * r5 : temporary storage * r6 : jump to same loop */ /* Relocate vector table if necessary */ #if CONFIG_SYS_FLASH_BASE mov r1,0x0 mov r2,CONFIG_SYS_FLASH_BASE /* vector table start address in flash is (__vector_start + flash base - text base) since vector start and text base are same we move only CONFIG_SYS_FLASH_BASE */ mov r3,__vector_end /* vector end table address in flash is (__vector_end + flash base - text base) */ add r3,r3,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r4,relocate_text /* address of relocate text in flash = relocate text + flash base - text base */ add r4,r4,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r6,copy_vector_table add r6,r6,CONFIG_SYS_FLASH_BASE-TEXT_BASE copy_vector_table : cmp r2,r3 JEQ [r4] /* copy from r2 to dest i.e in r1 register which point to 0x0 */ ld.ab r5,[r2,4] st.ab r5,[r1,4] j [r6] #endif /* CONFIG_SYS_FLASH_BASE */ /* Relocate text section */ relocate_text: mov r1,__text_start mov r2,__text_start add r2,r2,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r3,__text_end add r3,r3,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r4,relocate_data add r4,r4,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r6,copy_text_section add r6,r6,CONFIG_SYS_FLASH_BASE-TEXT_BASE copy_text_section : cmp r2,r3 JEQ [r4] /* copy from r2 to dest i.e in r1 register */ ld.ab r5,[r2,4] st.ab r5,[r1,4] j [r6] /* Relocate data section */ relocate_data: mov r1,__data_start mov r2,__data_start add r2,r2,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r3,__data_end add r3,r3,CONFIG_SYS_FLASH_BASE-TEXT_BASE mov r4,fill_bss mov r6,copy_data_section add r6,r6,CONFIG_SYS_FLASH_BASE-TEXT_BASE copy_data_section : cmp r2,r3 JEQ [r4] /* copy from r2 to dest i.e in r1 register */ ld.ab r5,[r2,4] st.ab r5,[r1,4] j [r6] #endif /* FLASH */ /* This code will be executed from ram */ .globl fill_bass fill_bss: /* Clear bss */ mov_s r2, __bss_start mov_s r3, __bss_end _clear_bss: st.ab 0,[r2,4] brlt r2,r3,_clear_bss /* setup stack pointer */ mov sp,TEXT_BASE - CONFIG_SYS_MALLOC_LEN - 4 mov fp,sp jal start_arcboot /* Interrupt service routines */ res_service : mem_service : instr_service : handle_interrupt: EV_MachineCheck : EV_TLBMissI : EV_TLBMissD : EV_TLBProtV : EV_PrivilegeV : EV_Trap : EV_Extension : reserved : FLAG STATUS_H_SET NOP NOP NOP