variant.s

来自「eCos操作系统源码」· S 代码 · 共 168 行

S
168
字号
##=============================================================================####	variant.S####	MN10300 AM33 variant code####=============================================================================#####ECOSGPLCOPYRIGHTBEGIN###### -------------------------------------------## This file is part of eCos, the Embedded Configurable Operating System.## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.#### eCos is free software; you can redistribute it and/or modify it under## the terms of the GNU General Public License as published by the Free## Software Foundation; either version 2 or (at your option) any later version.#### eCos is distributed in the hope that it will be useful, but WITHOUT ANY## WARRANTY; without even the implied warranty of MERCHANTABILITY or## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License## for more details.#### You should have received a copy of the GNU General Public License along## with eCos; if not, write to the Free Software Foundation, Inc.,## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.#### As a special exception, if other files instantiate templates or use macros## or inline functions from this file, or you compile this file and link it## with other works to produce a work based on this file, this file does not## by itself cause the resulting work to be covered by the GNU General Public## License. However the source code for this file must still be made available## in accordance with section (3) of the GNU General Public License.#### This exception does not invalidate any other reasons why a work based on## this file might be covered by the GNU General Public License.#### Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.## at http://sources.redhat.com/ecos/ecos-license/## -------------------------------------------#####ECOSGPLCOPYRIGHTEND######=============================================================================#######DESCRIPTIONBEGIN######## Author(s): 	nickg## Contributors:	nickg## Date:	1997-10-16## Purpose:	MN10300 AM33 variant code## Description:	This file contains variant specific assembly code for the AM33.########DESCRIPTIONEND########=============================================================================#include <pkgconf/hal.h>#include <cyg/hal/arch.inc>	##-----------------------------------------------------------------------------## NMI trampoline VSRs. All NMI interrupts are routed here initially, where we## decode the NMICR and ISR register contents and vector to the## correct VSR later in the table.	.text	.extern hal_lsbit_table				.globl nmi_vsr_trampolinenmi_vsr_trampoline:	movhu	(NMICR),d0		# D0 = NMI control register	and	0x7,d0			# LS 3 bits only	mov	3,d1			# search from bit 3	bsch	d0,d1			# get ms bit in d1	bcs	2f			# jump if no bits there	add	9,d1			# D1 = offset into VSR table	jmp	3f			# go to rest of code	.globl nmi_sysef_trampolinenmi_sysef_trampoline:			movhu	(ISR),d0		# D0 = Interrupt Status Register	mov	d0,d1			# D1 = copy of D0	add	-1,d1			# D1 = D0-1	not	d1			# D1 = ~(D0-1) = -D0	and	d1,d0			# D0 = D0 & -D0 = ls bit only	mov	16,d1			# D1 = start of search bit	bsch	d0,d1			# search for 1 bit in d0	bcs	2f			# jump if failed	add	12,d1			# d1 = offset in VSR table3:		asl	2,d1			# D1 = word offset in vsr table	mov	_hal_vsr_table,a0	# A0 = VSR table base	add	d1,a0			# A0 = address of table entry we want	mov	(a0),a0			# A0 = VSR to call	jmp	(a0)			# Call it	2:		# no bits set in ISR or NMICR when we expected them.	# This should never happen, but if it does, use an otherwise	# unused VSR table entry to indicate this.		mov	27,d1			# use last VSR table entry.	jmp	3b		##-----------------------------------------------------------------------------#define HAL_CHCTR               0xC0000070#define HAL_DCACHE_PURGE_WAY0   0xC8400000#define HAL_CHCTR_DCEN          0x0002#define HAL_CHCTR_DCBUSY        0x0008	.text		.globl	_cyg_hal_dcache_store_cyg_hal_dcache_store:		movm	[d2,d3],(sp)	mov	HAL_CHCTR,a0			# A0 = control reg	mov	HAL_DCACHE_PURGE_WAY0,a1	# A1 = purge base address		# Disable DCACHE if it is enabled	movhu	(a0),d2				# D2 = old value of control reg	btst	HAL_CHCTR_DCEN,d2		# check for cache enabled	beq	1f				# if not, skip disable		mov	d2,d3				# make a copy of CHCTR	and	~HAL_CHCTR_DCEN,d3		# clear DCEN bit	movhu	d3,(a0)				# store in reg2:	movhu	(a0),d3				# get CHCTR	btst	HAL_CHCTR_DCBUSY,d3		# test DCBUSY bit	bne	2b				# loop while set1:	# The cache is now disabled		and	0x000003f0,d0			# isolate index bits of base addr	add	d0,a1				# offset a1 to base address	add	63,d1				# adjust size to whole multiple of	and	0xFFFFFFC0,d1			# set size.3:		mov	(0x0000,a1),d0			# purge way 0	mov	(0x1000,a1),d0			# purge way 1	mov	(0x2000,a1),d0			# purge way 2	mov	(0x3000,a1),d0			# purge way 3	add	16,a1				# advance to next set	sub	64,d1				# decrement count	bne	3b				# loop while non zero		# Restore original cache state from saved CHCTR in D2	movhu	d2,(a0)							movm	(sp),[d2,d3]			# restore work regs			rets		##-----------------------------------------------------------------------------## end of variant.S		

⌨️ 快捷键说明

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