📄 sysalib.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 + -