vectors.s

来自「eCos操作系统源码」· S 代码 · 共 843 行 · 第 1/2 页

S
843
字号
	# stack. We will be executing either on the same stack	# or on the interrupt stack, depending on config options.			hal_intc_decode d3,a3,d0	# Here D3 contains the table byte offset of the vector to	# call.#if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR)	# Call cyg_instrument to record that this interrupt is being raised.	.extern _cyg_instrument			add	-16,sp				# make space for return link + args		mov	0x0301,d0			# d0 = type = INTR,RAISE	mov	(0,a2),d1			# d1 = arg1 = vector	mov	d3,(12,sp)			# (12,sp) = arg2 = table offset	calls	_cyg_instrument			# call instrumentation	add	16,sp				# pop space	#endif		#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT        .extern _cyg_hal_gdb_isr        add     -16,sp                          # make space for return link + args        mov     (0,a2),d0                       # d0 = vector        mov     (SAVED_CONTEXT_PC_OFFSET,a2),d1 # d1 = pc        calls   _cyg_hal_gdb_isr                # call GDB isr function        cmp     0x00,d0                         # Call ISR proper?        beq     2f                              # (d0 is 0 when skipping                                                #  to avoid DSR call)        add     16,sp                           # pop space#endif	#ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING	# To allow nested interrupts, we set the IE bit. We do	# not touch the IPL bits, so only higher priority interrupts	# will be nested on top of us. Also, new interrupts will not	# be delivered until the ISR calls 	# Cyg_Interrupt::acknowledge_interrupt(). At some future point	# we may want to do the ack stuff here to allow immediate nesting.		or	0x0800,psw	#endif#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT)	# If we have Ctrl-C support enabled, save a pointer to the	# saved CPU state here so we can plant a breakpoint there if	# this is a ^C.		.extern _hal_saved_interrupt_state	mov	a2,(_hal_saved_interrupt_state)	#endif			mov	_hal_interrupt_handlers,a0	# a0 = isr table	mov	(d3,a0),a0			# a0 = isr		mov	_hal_interrupt_data,a1		# a1 = data table	mov	(d3,a1),d1			# d1 = isr data	mov	(0,a2),d0			# d0 = vector. (d3 is...						# ...adjusted for table reads)	add	-16,sp				# make space for return link	calls	(a0)				# call isr	# on return d0 bit 1 will indicate whether a DSR is	# to be posted. Pass this together with a pointer to	# the interrupt object we have just used to the	# interrupt tidy up routine.		# D3 is defined to be saved across procedure calls, and	# should still contain the vector byte index. Similarly,	# A2 should still point to the saved machine state.#ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT        # If interrupt was caused by GDB, the ISR call above        # is skipped by jumping here.2:#endif#if defined(CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK) && !defined(CYGPKG_CYGMON)	# If we are returning from the last nested interrupt, move back	# to the thread stack. interrupt_end() must be called on the	# thread stack since it potentially causes a context switch.		add	16,sp				# pop call frame from int stack	movm	(sp),[a3]			# pop old sp	mov	a3,sp				# put in SP	add	-16,sp				# make call frame for call#endif		#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT		# We only need to call _interrupt_end() when there is a kernel	# present to do any tidying up.			# Using the vector offset in D3, get the interrupt object pointer	# into D1.	mov	_hal_interrupt_objects,a0	# a0 = object table	mov	(d3,a0),d1			# d1 = object	# Even when this is not the last nested interrupt, we must call	# _interrupt_end() to post the DSR and decrement the scheduler	# lock.			mov	a2,(12,sp)			# arg3 = saved state.		calls	_interrupt_end			# call interrupt end fn		#endif	add	16,sp				# pop return link#	show_interrupts	hal_diag_restore		hal_cpu_load_all#ifdef CYGPKG_CYGMON	hal_cygmon_restore_app_stack#else	add	4,sp#endif	rti					# and return##-----------------------------------------------------------------------------## Execute pending DSRs on the interrupt stack with interrupts enabled.## Note: this can only be called from code running on a thread stack	#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK	.extern _cyg_interrupt_call_pending_DSRs	.global _hal_interrupt_stack_call_pending_DSRs_hal_interrupt_stack_call_pending_DSRs:			movm	[d2,a2],(sp)			# save some work regs	mov	__interrupt_stack,a0		# interrupt stack pointer	mov	sp,a2				# save current SP	mov	a0,sp				# set SP to interrupt stack	hal_cpu_get_psw d2			# save PSW	hal_cpu_int_enable			# enable interrupts	# Call kernel code to invoke DSRs.	calls	_cyg_interrupt_call_pending_DSRs		# On return the old SP in a2 and the old PSW in d2 will 	# have been preserved by the calling conventions.		hal_cpu_int_merge d2			# Restore previous PSW	mov	a2,sp				# restore old SP	movm	(sp),[d2,a2]			# Retrieve old work regs	ret	[],0				# and return		#endif				##-----------------------------------------------------------------------------## Default NMI VSR	.globl	_cyg_hal_exception_handler		.text	.globl	__default_nmi_vsr__default_nmi_vsr:	# We come here with all the registers saved	# on the stack.#ifdef CYG_HAL_DIAG_EXCPT_END	hal_diag_excpt_start#endif		# Decode the cause of the NMI and cancel all the bits in all	# the registers. We need to clear any bits set in the ISR and	# then clear any bits set in the NMICR. Note that we can only 	# access the ISR if the DCR:DE bit is set. 		movhu	(NMICR),d0			# D0 = NMI Control register	movhu	(DCR),d1			# D1 = Debug Control Register	mov	d1,d2				# D2 = copy of DCR	movhu	(ISR),d3			# D3 = Interrupt Status Register	or	DCR_DE,d1			# Set DE bit		movhu	d1,(DCR)				movhu	d3,(ISR)			# clear ISR bits	movhu	d2,(DCR)			# restore DCR to original value	movhu	d0,(NMICR)			# clear NMI bits	and	0x7,d0				# LS 3 bits only	mov	hal_lsbit_table,a0			movbu	(d0,a0),d1			# D1 = NMI code						## 0 = NMI						## 1 = Watchdog						## 2 = System Error	add	9,d1				# offset into exception number space	#if defined(CYGPKG_CYGMON) || defined(CYGSEM_REDBOOT_BSP_SYSCALLS)	# Check to see if this was a syscall.	# If so, set d1 appropriately#define TBR 0xC0000024	mov	(TBR), d0	and	0x00FFFFFF, d0	cmp	0x300, d0	bne	0f	# This was apparently a syscall.	mov     SIGSYSCALL, d10:	#endif	hal_cpu_clear_nmid	mov	d1,(sp)				# save initial vector in spare save slot        	mov	sp,a1				# a1 = saved state	mov	a1,d0				# d0 = arg1 = saved state	add	-16,sp				# return link + args	mov	d3,d1				# d1 = arg2 = ISR value	calls	_cyg_hal_exception_handler	# call C code	add	16,sp				# pop args#ifdef CYG_HAL_DIAG_EXCPT_END	hal_diag_excpt_end#endif	hal_cpu_load_all#ifdef CYGPKG_CYGMON	hal_cygmon_restore_app_stack#else	add	4,sp#endif	rti	.globl hal_lsbit_tablehal_lsbit_table:	.byte	0, 0, 1, 0	.byte	2, 0, 1, 0	.byte	3, 0, 1, 0	.byte	2, 0, 1, 0	#ifdef CYGPKG_CYGMON        .section ".bss"d0_save:	.long	0d1_save:	.long	0d2_save:	.long	0d3_save:	.long	0a0_save:	.long	0a1_save:	.long	0a2_save:	.long	0a3_save:	.long	0sp_save:	.long	0#endif##-----------------------------------------------------------------------------## Default TRAP VSR	.text	.globl	__default_trap_vsr__default_trap_vsr:#ifdef CYG_HAL_DIAG_EXCPT_END	hal_diag_excpt_start#endif	# We come here with all the registers saved	# on the stack.	mov	8,d1	mov	d1,(sp)				# set the VSR vector number	mov	sp,a1				# a1 = saved state	mov	a1,d0				# d0 = arg1 = saved state	add	-16,sp				# return link + arg	mov	3,d1				# d1 = arg2 = ISR value (3 == TRAP trap)	calls	_cyg_hal_exception_handler	# call C code	add	16,sp				# pop args#ifdef CYG_HAL_DIAG_EXCPT_END	hal_diag_excpt_end#endif	hal_cpu_load_all#ifdef CYGPKG_CYGMON	hal_cygmon_restore_app_stack	add	4,sp#else	add	8,sp#endif	rets##-----------------------------------------------------------------------------## VSR table. The VSRs pointed to by this table are called from the stubs## connected to the hardware.#ifndef CYG_HAL_MN10300_VSR_TABLE_DEFINED		.data	.globl	_hal_vsr_table_hal_vsr_table:		.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_interrupt_vsr	.long	__default_nmi_vsr	.long	__default_trap_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr		.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr	.long	__default_nmi_vsr#endif	##-----------------------------------------------------------------------------## Interrupt tables		.data	.extern _hal_default_isr		.globl	_hal_interrupt_handlers_hal_interrupt_handlers:	.rept	CYG_ISR_TABLE_SIZE	.long	_hal_default_isr	.endr		.globl	_hal_interrupt_data_hal_interrupt_data:	.rept	CYG_ISR_TABLE_SIZE	.long	0	.endr		.globl	_hal_interrupt_objects_hal_interrupt_objects:	.rept	CYG_ISR_TABLE_SIZE	.long	0	.endr				##-----------------------------------------------------------------------------## Temporary interrupt stack		.section ".bss"	.balign 16	.global _cyg_interrupt_stack_base_cyg_interrupt_stack_base:__interrupt_stack_base:	.rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE	.byte 0	.endr	.balign 16	.global _cyg_interrupt_stack_cyg_interrupt_stack:__interrupt_stack:	#ifdef CYGPKG_CYGMON	.balign 16	.global __cygmon_interrupt_stack_base__cygmon_interrupt_stack_base:	.rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE	.byte 0	.endr	.balign 16	.global __cygmon_interrupt_stack__cygmon_interrupt_stack:#endif	.long	0,0,0,0,0,0,0,0	##-----------------------------------------------------------------------------	.data	hal_diag_data##-----------------------------------------------------------------------------## end of vectors.S

⌨️ 快捷键说明

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