OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rtems-20020807/] [c/] [src/] [lib/] [libbsp/] [arm/] [arm_bare_bsp/] [start/] [start.S] - Rev 1765

Compare with Previous | Blame | View Log

/*
 *  start.S :     RTEMS entry point
 *
 *  Copyright (C) 2000 Canon Research Centre France SA.
 *  Emmanuel Raguet, mailto:raguet@crf.canon.fr
 *
 *  The license and distribution terms for this file may be
 *  found in found in the file LICENSE in this distribution or at
 *  http://www.OARcorp.com/rtems/license.html.
 *
 */

.equ ABORT_Stack, 0
.equ IRQ_Stack, 0x100
.equ FIQ_Stack, 0x200
.equ SVC_Stack, 0x300
        
/* Some standard definitions...*/

.equ Mode_USR,               0x10
.equ Mode_FIQ,               0x11
.equ Mode_IRQ,               0x12
.equ Mode_SVC,               0x13
.equ Mode_ABT,               0x17
.equ Mode_ABORT,             0x17
.equ Mode_UNDEF,             0x1B
.equ Mode_SYS,               0x1F /*only available on ARM Arch. v4*/

.equ I_Bit,                  0x80
.equ F_Bit,                  0x40


        .text
        .globl  _start

         
_start:

/*
 * Here is the code to initialize the low-level BSP environment
 * (Chip Select, PLL, ....?)

        
/* Copy data from FLASH to RAM */
        LDR     r0, =_initdata        /* load address of region */
        LDR     r1, =0x400000         /* execution address of region */
        LDR     r2, =_edata           /* copy execution address into r2 */

copy:   
        CMP     r1, r2                /* loop whilst r1 < r2 */
        LDRLO   r3, [r0], #4
        STRLO   r3, [r1], #4
        BLO     copy

/* zero the bss */
        LDR     r1, =__bss_end__       /* get end of ZI region */
        LDR     r0, =__bss_start__     /* load base address of ZI region */
zi_init:        
        MOV     r2, #0
        CMP     r0, r1                 /* loop whilst r0 < r1 */
        STRLOT   r2, [r0], #4
        BLO     zi_init 

        
/* Load basic ARM7 interrupt table */
VectorInit:     
        MOV     R8, #0
        ADR     R9, Vector_Init_Block
        LDMIA   R9!, {R0-R7}    /* Copy the Vectors (8 words) */
        STMIA   R8!, {R0-R7}
        LDMIA   R9!, {R0-R7}    /* Copy the .long'ed addresses (8 words) */
        STMIA   R8!, {R0-R7}

        B       init2

/*******************************************************
 standard exception vectors table
 *** Must be located at address 0 
********************************************************/        

Vector_Init_Block:      
        LDR     PC, Reset_Addr
        LDR     PC, Undefined_Addr
        LDR     PC, SWI_Addr
        LDR     PC, Prefetch_Addr
        LDR     PC, Abort_Addr
        NOP
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

        .globl Reset_Addr
Reset_Addr:     .long   _start 
Undefined_Addr: .long   Undefined_Handler
SWI_Addr:       .long   SWI_Handler
Prefetch_Addr:  .long   Prefetch_Handler
Abort_Addr:     .long   Abort_Handler
                .long   0        
IRQ_Addr:       .long   IRQ_Handler
FIQ_Addr:       .long   FIQ_Handler
        
/* The following handlers do not do anything useful */
        .globl Undefined_Handler
Undefined_Handler:      
        B       Undefined_Handler
        .globl SWI_Handler
SWI_Handler:    
        B       SWI_Handler 
        .globl Prefetch_Handler
Prefetch_Handler:       
        B       Prefetch_Handler
        .globl Abort_Handler
Abort_Handler:  
        B       Abort_Handler
        .globl IRQ_Handler
IRQ_Handler:    
        B       IRQ_Handler
        .globl FIQ_Handler
FIQ_Handler:    
        B       FIQ_Handler

init2 : 
/* --- Initialise stack pointer registers
   Set up the ABORT stack pointer last and stay in SVC mode */
    MOV     r0, #(Mode_ABORT | I_Bit | F_Bit)   /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =ABORT_Stack

/* Enter IRQ mode and set up the IRQ stack pointer */
    MOV     r0, #Mode_IRQ | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =IRQ_Stack

/* Enter FIQ mode and set up the FIQ stack pointer */
    MOV     r0, #Mode_FIQ | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =FIQ_Stack

/* Set up the SVC stack pointer last and stay in SVC mode */
    MOV     r0, #Mode_SVC | I_Bit | F_Bit     /* No interrupts */
    MSR     cpsr, r0
    LDR     sp, =SVC_Stack

/* --- Now we enter the C code */

    B   boot_card












Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.