diff options
Diffstat (limited to 'c/src/lib/libbsp/or1k/or1ksim/start/start.S')
-rw-r--r-- | c/src/lib/libbsp/or1k/or1ksim/start/start.S | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/or1k/or1ksim/start/start.S b/c/src/lib/libbsp/or1k/or1ksim/start/start.S new file mode 100644 index 0000000000..6942b5217f --- /dev/null +++ b/c/src/lib/libbsp/or1k/or1ksim/start/start.S @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2014 Hesham ALMatary <heshamelmatary@gmail.com> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE + */ +#include <bsp/linker-symbols.h> + +/* The following macro defines the first instructions every exception + * should execute before jumping to its handler function from the + * exception vector table. r3 is saved into the stack and loaded with + * vector number before jumping to _ISR_Handler. r3 value is restored + * back from _ISR_Handler after handling the exception and before + * returning from interrupt. + */ +#define EXCEPTION_SETUP(vector) \ + l.nop ;\ + l.addi r1, r1, -4 ;\ + l.sw 0(r1), r3; \ + l.addi r3, r0, vector; \ + l.j _ISR_Handler; \ + l.nop + + .extern bsp_start + .extern boot_card + .extern bsp_section_bss_begin + .extern bsp_section_bss_end + + .extern bsp_start_vector_table_end + .extern bsp_start_vector_table_size + .extern bsp_vector_table_size + .extern bsp_section_stack_begin + + .extern exception_frame_save + .extern _OR1K_Exception_Process + .extern _OR1K_Exception_default + .extern rtems_clock_tick + .extern _exit + .extern printk + .extern bsp_interrupt_handler_default + + /* Global symbols */ + .global _start + .global bsp_start_vector_table_begin + +/* Popualte HW vector table */ + +.section .vector, "ax" + +.org 0x100 +_reset: + l.j _start + l.nop + +.org 0x200 +_buserr: + EXCEPTION_SETUP(2) + +.org 0x300 +_dPageFault: + EXCEPTION_SETUP(3) + +.org 0x400 +_iPageFaule: + EXCEPTION_SETUP(4) + +.org 0x500 +_timer: + EXCEPTION_SETUP(5) + +.org 0x600 +_unalign: + EXCEPTION_SETUP(6) + +.org 0x700 +_undefIns: + EXCEPTION_SETUP(7) + +.org 0x800 +_exInt: + EXCEPTION_SETUP(8) + +.org 0x900 +_dTLB: + EXCEPTION_SETUP(9) + +.org 0xA00 +_iTLB: + EXCEPTION_SETUP(10) + +.org 0xB00 +_range: + EXCEPTION_SETUP(11) + +.org 0xC00 +_syscall: + EXCEPTION_SETUP(12) + +.org 0xD00 +_fp: + EXCEPTION_SETUP(13) + +.org 0xE00 +_trap: + EXCEPTION_SETUP(14) + +.org 0xF00 +_undef1: + EXCEPTION_SETUP(15) + +.org 0x1500 +_undef2: + EXCEPTION_SETUP(16) + +.org 0x1900 +_undef3: + EXCEPTION_SETUP(17) + +.org 0x1F00 + +bsp_start_vector_table_begin: + + .word 0 + .word _start /* Reset */ + .word _OR1K_Exception_default /* Bus Error */ + .word _OR1K_Exception_default /* Data Page Fault */ + .word _OR1K_Exception_default /* Instruction Page Fault */ + .word _OR1K_Exception_default /* Tick timer */ + .word _OR1K_Exception_default /* Alignment */ + .word _OR1K_Exception_default /* Undefiend Instruction */ + .word _OR1K_Exception_default /* External Interrupt */ + .word _OR1K_Exception_default /* Data TLB Miss */ + .word _OR1K_Exception_default /* Instruction TLB Miss */ + .word _OR1K_Exception_default /* Range Exception */ + .word _OR1K_Exception_default /* System Call */ + .word _OR1K_Exception_default /* Floating Point Exception */ + .word _OR1K_Exception_default /* Trap */ + .word _OR1K_Exception_default /* Reserver for future use */ + .word _OR1K_Exception_default /* Reserved for implementation-specific */ + .word _OR1K_Exception_default /* Reserved for custom exceptions. */ + +bsp_start_vector_table_end: + + .section ".bsp_start_text", "ax" + .type _start,@function + +_start: + /* Set SR register to Supervision mode */ + l.ori r1, r0, 0x1 + l.mtspr r0, r1, 17 + + /* load stack and frame pointers */ + l.movhi r1, hi(bsp_section_stack_begin) + l.ori r1, r1, lo(bsp_section_stack_begin) + l.add r2, r0, r1 + +/* Clearing .bss */ + l.movhi r13, hi(bsp_section_bss_begin) + l.ori r13, r13, lo(bsp_section_bss_begin) + l.movhi r15, hi(bsp_section_bss_end) + l.ori r15, r15, lo(bsp_section_bss_end) + +_loop_clear_bss: + l.sfgeu r13, r15 + l.bf _end_clear_bss + l.addi r13, r13, 4 + l.sw 0(r13), r0 + l.j _loop_clear_bss + l.nop +_end_clear_bss: + + l.j boot_card + l.nop + +/* Temporary code for unhandled exceptions */ +.section .text +.align +.global _unhandled_exception + +unhandled_exception: + l.nop |