www.pudn.com > nxplpc2204bsp.rar > sysALib.s


/* Copyright 1984-2001 Wind River Systems, Inc. */ 
 
#define _ASMLANGUAGE 
#include "vxWorks.h" 
#include "arch/arm/arm.h" 
#include "regs.h" 
#include "sysLib.h" 
#include "config.h" 
#include "wrSbcArm7.h" 
 
    .data 
    .globl  FUNC(copyright_wind_river) 
    .long   FUNC(copyright_wind_river) 
/* internals */ 
 
    .globl    FUNC(sysInit)        /* start of system code */ 
    .globl    FUNC(lpc2210ExcVecInit)        /* lpc2210ExcVecInit, this is to replace vxworks's excVecInit */ 
    .globl    FUNC(sysIntStackSplit)    /* routine to split interrupt stack */ 
 
/* externals */ 
 
    .extern    FUNC(usrInit)        /* system initialization routine */ 
 
    .extern    FUNC(vxSvcIntStackBase)    /* base of SVC-mode interrupt stack */ 
    .extern    FUNC(vxSvcIntStackEnd)    /* end of SVC-mode interrupt stack */ 
    .extern    FUNC(vxIrqIntStackBase)    /* base of IRQ-mode interrupt stack */ 
    .extern    FUNC(vxIrqIntStackEnd)    /* end of IRQ-mode interrupt stack */ 
 
    .extern FUNC(armInitExceptionModes) 
    .extern FUNC(_func_armIrqHandler) 
    .extern FUNC(excIntHandle) 
 
    .text 
    .balign 4 
 
_ARM_FUNCTION(lpc2210ExcVecInit) 
    stmfd sp!, {r0-r10,lr} 
    bl FUNC(armInitExceptionModes) 
 
    ldr r0, L$__func_armIrqHandler 
    ldr r1, L$_excIntHandle 
    str r1, [r0] 
 
    nop 
    ldmfd sp!, {r0-r10,pc} 
     
L$_excIntHandle: 
    .long excIntHandle 
L$__func_armIrqHandler: 
    .long _func_armIrqHandler 
     
/******************************************************************************* 
* 
* sysIntStackSplit - split interrupt stack and set interrupt stack pointers 
* 
* This routine is called, via a function pointer, during kernel 
* initialisation.  It splits the allocated interrupt stack into IRQ and 
* SVC-mode stacks and sets the processor's IRQ stack pointer. Note that 
* the pointer passed points to the bottom of the stack allocated i.e. 
* highest address+1. 
* 
* IRQ stack needs 6 words per nested interrupt; 
* SVC-mode will need a good deal more for the C interrupt handlers. 
* For now, use ratio 1:7 with any excess allocated to the SVC-mode stack 
* at the lowest address. 
* 
* Note that FIQ is not handled by VxWorks so no stack is allocated for it. 
* 
* The stacks and the variables that describe them look like this. 
* .CS 
* 
*         - HIGH MEMORY - 
*     ------------------------ <--- vxIrqIntStackBase (r0 on entry) 
*     |                      | 
*     |       IRQ-mode       | 
*     |    interrupt stack   | 
*     |                      | 
*     ------------------------ <--{ vxIrqIntStackEnd 
*     |                      |    { vxSvcIntStackBase 
*     |       SVC-mode       | 
*     |    interrupt stack   | 
*     |                      | 
*     ------------------------ <--- vxSvcIntStackEnd 
*         - LOW  MEMORY - 
* .CE 
* 
* NOTE: This routine should not be called by the user. 
 
* void sysIntStackSplit 
*     ( 
*     char *pBotStack   /@ pointer to bottom of interrupt stack @/ 
*     long size        /@ size of stack @/ 
*     ) 
 
*/ 
 
 
_ARM_FUNCTION_CALLED_FROM_C(sysIntStackSplit) 
 
    /* 
     * r0 = base of space allocated for stacks (i.e. highest address) 
     * r1 = size of space 
     */ 
 
    SUB    r2, r0, r1            /* r2->lowest usable address */ 
    LDR    r3, L$_vxSvcIntStackEnd 
    STR    r2, [r3]            /*  == end of SVC-mode stack */ 
    SUB    r2, r0, r1, ASR #3        /* leave 1/8 for IRQ */ 
    LDR    r3, L$_vxSvcIntStackBase 
    STR    r2, [r3] 
 
    /* now allocate IRQ stack, setting irq_sp */ 
 
    LDR    r3, L$_vxIrqIntStackEnd 
    STR    r2, [r3] 
    LDR    r3, L$_vxIrqIntStackBase 
    STR    r0, [r3] 
 
    MRS    r2, cpsr 
    BIC    r3, r2, #MASK_MODE 
    ORR    r3, r3, #MODE_IRQ32 | I_BIT    /* set irq_sp */ 
    MSR    cpsr, r3 
    MOV    sp, r0 
 
    /* switch back to original mode and return */ 
 
    MSR    cpsr, r2 
 
#if    (CPU == ARMARCH4_T) 
    BX     lr 
#else 
    MOV    pc, lr 
#endif    /* (CPU == ARMARCH4_T) */ 
 
#ifdef INCLUDE_VWARE_LAUNCH 
#include "sysAVware.s" 
#endif /* INCLUDE_VWARE_LAUNCH */ 
 
/******************************************************************************/ 
 
/* 
 * PC-relative-addressable pointers - LDR Rn,=sym is broken 
 * note "_" after "$" to stop preprocessor preforming substitution 
 */ 
 
    .balign    4 
 
L$_vxSvcIntStackBase: 
    .long    FUNC(vxSvcIntStackBase) 
 
L$_vxSvcIntStackEnd: 
    .long    FUNC(vxSvcIntStackEnd) 
 
L$_vxIrqIntStackBase: 
    .long    FUNC(vxIrqIntStackBase) 
 
L$_vxIrqIntStackEnd: 
    .long    FUNC(vxIrqIntStackEnd)