176 lines
3.5 KiB
ArmAsm
176 lines
3.5 KiB
ArmAsm
/*
|
|
* 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 <asm/arcregs.h> /* required for STATUS_H_SET */
|
|
#include <config.h>
|
|
|
|
/* .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
|