📄 vmcisrst.s
字号:
****************************************************************************
*
* Copyright (c) 1997 MICROTEC RESEARCH INCORPORATED.
*
* All rights reserved. MICROTEC RESEARCH's source code is an unpublished
* work and the use of a copyright notice does not imply otherwise.
* This source code contains confidential, trade secret material of
* MICROTEC RESEARCH. Any attempt or participation in deciphering,
* decoding, reverse engineering or in any way altering the source code
* is strictly prohibited, unless the prior written consent of
* MICROTEC RESEARCH is obtained.
*
****************************************************************************
; Revisions of VMCISRST.S:
; 1.0 P.Cumming 14/07/96 Initial version for PID7T demon
;
; Generate Stubs for armsd development environment.
;
IF :DEF:THUMB
AREA |C$$code|, CODE, INTERWORK, READONLY
ELSE
AREA |C$$code|, CODE, READONLY
ENDIF
EVN_0 EQU 0
EVN_1 EQU 0
EVN_2 EQU 0
EVN_3 EQU 4
EVN_4 EQU 8
EVN_5 EQU 0
EVN_6 EQU 4
EVN_7 EQU 4
; use ui_enter_i & ui_exit_i for IRQ interrupts with sw stack check on
IF :DEF:swst:LAND::DEF:IRQ = {TRUE} ;swst & IRQ only
IMPORT ui_enter_i
IMPORT ui_exit_i
ELSE
IMPORT ui_enter
IMPORT ui_exit
ENDIF
IMPORT vmc_stack
IF :DEF:swst = {TRUE} ;only required if sw stack checking enabled
IMPORT StackSlop
vmc_interrupt_stack_limit DCD vmc_stack + StackSlop
ENDIF
vmc_interrupt_stack_addr DCD vmc_stack
vmc_interrupt_stacksize DCD vmc_istksize
;
; Stub for VRTXmc timer interrupt
;
EXPORT vmc_interrupt_stub
vmc_interrupt_stub
sub lr, lr, #EVN_7 ;adjusted return addr
IF :DEF:swst:LAND::DEF:IRQ = {TRUE} ;swst & IRQ only
stmfd sp!, {r0-r3, sl, ip, lr} ;save scratch registers
ldr sl,vmc_interrupt_stack_limit ;get stack limit
ELSE ;no need to reload sl
stmfd sp!, {r0-r3, ip, lr};save scratch registers
ENDIF
mrs lr, spsr ;get interrupted task status
stmfd sp!, {lr} ;save interrupted task status
IF :DEF:swst:LAND::DEF:IRQ = {TRUE}
bl ui_enter_i ;call interrupt enter for swst IRQ
ELSE
bl ui_enter ;call interrupt enter
ENDIF
adr r1, vmc_interrupt_addr
ldr r0, [r1, #4] ;set interrupt handler argument
ldr lr, ui_exit_addr ;return address = ui_exit routine
IF :DEF:THUMB
ldr r1,[r1] ;get address of intrpt service routine
bx r1 ;call interrupt service routine
ELSE
ldr pc, [r1] ;call interrupt service routine
ENDIF
IMPORT InterruptHandler
vmc_interrupt_addr DCD InterruptHandler;timer interrupt handler
DCD 0 ;handler parameter
IF :DEF:swst:LAND::DEF:IRQ = {TRUE}
ui_exit_addr DCD ui_exit_i ;ui_exit routine address save buffer
ELSE
ui_exit_addr DCD ui_exit ;ui_exit routine address save buffer
ENDIF
;
; extern void InstallExceptionHandler(int vector,
; void (*handler)(void),
; char *stack);
;
InstallExceptionHandler
; Exception Handler Stack Initialization
bics a3, a3, #3 ;stack word alignment
moveq pc, lr ;if stack size == 0, return
adr a4, ModeCPSRValue ;get CPSR value table base address
ldr a4, [a4, a1, LSL #2] ;get CPSR value of the mode
mrs a2, cpsr ;save CPSR
msr cpsr, a4 ;change the mode
mov sp, a3 ;change the stack
IF :DEF:swst:LAND::DEF:FIQ = {TRUE}
ldr sl, vmc_interrupt_stack_limit ;load stack limit in r10 (FIQ only)
ENDIF
msr cpsr, a2 ;change original mode
mov pc, lr
UserMode EQU &10 ;User32 mode
FIQMode EQU &11 ;FIQ32 mode
IRQMode EQU &12 ;IRQ32 mode
SVCMode EQU &13 ;Supervisor32 mode
AbortMode EQU &17 ;Abort32 mode
UndefMode EQU &1b ;Undefined32 mode
NoInt EQU &c0 ;IRQ & FIQ interrupt disbale
ModeCPSRValue DCD SVCMode+NoInt ;Reset
DCD UndefMode+NoInt ;Undefined Instruction
DCD SVCMode+NoInt ;Software Interrupt
DCD AbortMode+NoInt ;Abort - Prefetch
DCD AbortMode+NoInt ;Abort - Data
DCD SVCMode+NoInt ;Reserved
DCD IRQMode+NoInt ;IRQ interrupt
DCD FIQMode+NoInt ;FIQ interrupt
;
; extern void vmc_InitializeExceptionHandlers(void);
;
EXPORT vmc_InitializeExceptionHandlers
IMPORT vmc_istksize
vmc_InitializeExceptionHandlers
stmfd sp!, {lr} ;save return address
;
; Initialize interrupt
;
IF :DEF:FIQ = {TRUE}
mov a1, #7 ;set interrupt vector number FIQ
ELSE ;default to IRQ
mov a1, #6 ;set interrupt vector number IRQ
ENDIF
adr a2, vmc_interrupt_stub ;set interrupt handler address
ldr a3, vmc_interrupt_stack_addr ;set interrupt stack address
ldr a4, vmc_interrupt_stacksize ;load stack size address
ldr a4,[a4] ;get stacksize
add a3,a4,a3 ;calculate interrupt stackpointer
bl InstallExceptionHandler ;call install handler
IF :DEF:THUMB
ldmfd sp!, {lr} ;
bx lr ;return
ELSE
ldmfd sp!, {pc} ;return
ENDIF
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -