📄 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -