⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysalib.s

📁 VxWorks BSP for S3C44B0X
💻 S
字号:
/* sysALib.s - Samsung s3c44b0x ARM7 system-dependent routines *//* Copyright 1984-2001 Wind River Systems, Inc. *//*modification history--------------------01a,12apr01,m_h  created from snds100 template.*//*DESCRIPTION*/#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(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 */    .text    .balign 4/********************************************************************************* sysInit - start after boot** This routine is the system start-up entry point for VxWorks in RAM, the* first code executed after booting.  It disables interrupts, sets up* the stack, and jumps to the C routine usrInit() in usrConfig.c.** The initial stack is set to grow down from the address of sysInit().  This* stack is used only by usrInit() and is never used again.  Memory for the* stack must be accounted for when determining the system load address.** NOTE: This routine should not be called by the user.** RETURNS: N/A* sysInit ()              /@ THIS IS NOT A CALLABLE ROUTINE @/*/_ARM_FUNCTION(sysInit)    /* disable interrupts and force SVC32 mode, just like reset */    MRS    r1,   cpsr    BIC    r1,   r1,  #MASK_32MODE    ORR    r1,   r1,  #MODE_SVC32 | I_BIT | F_BIT    MSR    cpsr, r1    /*     * CPU INTERRUPTS DISABLED     *     * disable individual interrupts in the interrupt controller     */    LDR    r2, L_$s3c44b0x_INTMSK   /* R2->interrupt controller */    MVN    r1, #0                   /* &FFFFFFFF */    STR    r1, [r2]                 /* disable all interrupt sources */    /* set initial stack pointer so stack grows down from start of code */    LDR    sp, L_$STACK_ADDR    MOV    fp, #0            /* zero frame pointer */   /* Call C_Entry application routine with a pointer to the first */   /* available memory address after ther compiler's global data */   /* This memory may be used by the application. */    /* now call usrInit */    MOV    fp, #0            /* initialize frame pointer */    MOV    r0, #BOOT_WARM_AUTOBOOT    /* pass startType */#if    (CPU == ARMARCH4_T)    LDR    r12, L_$usrInit    BX     r12#else    B     FUNC(usrInit)#endif    /* (CPU == ARMARCH4_T) *//********************************************************************************* 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_32MODE    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) *//******************************************************************************//* * PC-relative-addressable pointers - LDR Rn,=sym is broken * note "_" after "$" to stop preprocessor preforming substitution */    .balign    4L_$vxSvcIntStackBase:    .long    FUNC(vxSvcIntStackBase)L_$vxSvcIntStackEnd:    .long    FUNC(vxSvcIntStackEnd)L_$vxIrqIntStackBase:    .long    FUNC(vxIrqIntStackBase)L_$vxIrqIntStackEnd:    .long    FUNC(vxIrqIntStackEnd)#if    (CPU == ARMARCH4_T)L_$usrInit:    .long    FUNC(usrInit)#endif    /* (CPU == ARMARCH4_T) */L_$STACK_ADDR:    .long    FUNC(sysInit)L_$s3c44b0x_INTMSK:    .long    S3C44B0X_INTMSK

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -