⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idtmem.s

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 S
📖 第 1 页 / 共 2 页
字号:
/*Based upon IDT provided code with the following release:This source code has been made available to you by IDT on an AS-ISbasis. Anyone receiving this source is licensed under IDT copyrightsto use it in any way he or she deems fit, including copying it,modifying it, compiling it, and redistributing it either with orwithout modifications.  No license under IDT patents or patentapplications is to be implied by the copyright license.Any user of this software should understand that IDT cannot providetechnical support for this software and will not be responsible forany consequences resulting from the use of this software.Any person who transfers this source code or any derivative work mustinclude the IDT copyright notice, this paragraph, and the preceedingtwo paragraphs in the transferred software.COPYRIGHT IDT CORPORATION 1996LICENSED MATERIAL - PROGRAM PROPERTY OF IDT  $Id: idtmem.S,v 1.5 2000/10/24 21:50:37 joel Exp $*//****************************************************************************	idtmem.s - memory and cache functions****	Copyright 1991 Integrated Device Technology, Inc.**	All Rights Reserved****************************************************************************//* * 950313: Ketan fixed bugs in mfc0/mtc0 hazards, and removed hack  * to set mem_size.  */#include <iregdef.h>#include <idtcpu.h>#include <asm.h>	.datamem_size:	.word	0	dcache_size:	.word 	0		icache_size:#if __mips == 1	.word	MINCACHE	#endif#if __mips == 3	.word	0#endif#if __mips == 3	.datascache_size:	.word 	0icache_linesize:	.word	0dcache_linesize:	.word	0scache_linesize:	.word	0#endif		.text#if __mips == 1#define CONFIGFRM ((2*4)+4)	/***************************************************************************** Config_Dcache() -- determine size of Data cache ****************************************************************************/FRAME(config_Dcache,sp, CONFIGFRM, ra)	.set	noreorder	subu	sp,CONFIGFRM	sw	ra,CONFIGFRM-4(sp)	/* save return address */	sw	s0,4*4(sp)		/* save s0 in first regsave slot */	mfc0	s0,C0_SR		/* save SR */	nop	mtc0	zero,C0_SR		/* disable interrupts */	.set	reorder	jal	_size_cache		/* returns Data cache size in v0 */	sw	v0, dcache_size		/* save it */	and 	s0, ~SR_PE		/* do not clear PE */	.set	noreorder	mtc0	s0,C0_SR		/* restore SR */	nop	.set	reorder	lw	s0, 4*4(sp)		/* restore s0 */	lw	ra,CONFIGFRM-4(sp)	/* restore ra */	addu	sp,CONFIGFRM		/* pop stack */	j	raENDFRAME(config_Dcache) /***************************************************************************** Config_Icache() -- determine size of Instruction cache**		      MUST be run in uncached mode/handled in idt_csu.s****************************************************************************/FRAME(config_Icache,sp, CONFIGFRM, ra)	.set	noreorder	subu	sp,CONFIGFRM	sw	ra,CONFIGFRM-4(sp)	/* save return address */	sw	s0,4*4(sp)		/* save s0 in first regsave slot */	mfc0	s0,C0_SR		/* save SR */	nop 	mtc0	zero, C0_SR		/* disable interrupts */	li	v0,SR_SWC		/* swap caches/disable ints  */	mtc0	v0,C0_SR	nop	.set	reorder	jal	_size_cache		/* returns instruction cache size */	.set	noreorder	mtc0	zero,C0_SR		/* swap back caches */  	nop	and	s0,~SR_PE		/* do not inadvertantly clear PE */	mtc0	s0,C0_SR		/* restore SR */	nop	.set	reorder	sw	v0, icache_size		/* save it AFTER caches back */	lw	s0,4*4(sp)		/* restore s0 */	lw	ra,CONFIGFRM-4(sp)	/* restore ra */	addu	sp,CONFIGFRM		/* pop stack */	j	raENDFRAME(config_Icache)/**************************************************************************** _size_cache()** returns cache size in v0**************************************************************************/FRAME(_size_cache,sp,0,ra)	.set	noreorder	mfc0	t0,C0_SR		/* save current sr */	nop	and	t0,~SR_PE		/* do not inadvertently clear PE */	or	v0,t0,SR_ISC		/* isolate cache */	mtc0	v0,C0_SR	/*	 * First check if there is a cache there at all	 */	move	v0,zero	li	v1,0xa5a5a5a5		/* distinctive pattern */	sw	v1,K0BASE		/* try to write into cache */	lw	t1,K0BASE		/* try to read from cache */	nop	mfc0	t2,C0_SR	nop	.set	reorder	and	t2,SR_CM	bne	t2,zero,3f		/* cache miss, must be no cache */	bne	v1,t1,3f		/* data not equal -> no cache */	/*	 * Clear cache size boundries to known state.	 */	li	v0,MINCACHE1:	sw	zero,K0BASE(v0)	sll	v0,1	ble	v0,MAXCACHE,1b	li	v0,-1	sw	v0,K0BASE(zero)		/* store marker in cache */	li	v0,MINCACHE		/* MIN cache size */2:	lw	v1,K0BASE(v0)		/* Look for marker */	bne	v1,zero,3f		/* found marker */	sll	v0,1			/* cache size * 2 */	ble	v0,MAXCACHE,2b		/* keep looking */	move	v0,zero			/* must be no cache */	.set	noreorder3:	mtc0	t0,C0_SR		/* restore sr */	j	ra	nopENDFRAME(_size_cache)	.set	reorder#define FLUSHFRM (2*4)/******************************************************************************* flush_Dcache() -  flush entire Data cache******************************************************************************/FRAME(flush_Dcache,sp,FLUSHFRM,ra)	lw      t2, dcache_size			.set	noreorder	mfc0	t3,C0_SR		/* save SR */	nop	and	t3,~SR_PE		/* dont inadvertently clear PE */	beq	t2,zero,_Dflush_done	/* no D cache, get out! */	nop	li	v0, SR_ISC		/* isolate cache */	mtc0	v0, C0_SR	nop	.set	reorder	li	t0,K0BASE		/* set loop registers  */	or	t1,t0,t22:	sb	zero,0(t0)	sb	zero,4(t0)	sb	zero,8(t0)	sb	zero,12(t0)	sb	zero,16(t0)	sb	zero,20(t0)	sb	zero,24(t0)	addu	t0,32	sb	zero,-4(t0)	bne	t0,t1,2b	.set	noreorder_Dflush_done:	mtc0	t3,C0_SR		/* restore Status Register */	.set	reorder	j	raENDFRAME(flush_Dcache)/******************************************************************************* flush_Icache() -  flush entire Instruction cache****	NOTE: Icache can only be flushed/cleared when uncached**	      Code forces into uncached memory regardless of calling mode******************************************************************************/FRAME(flush_Icache,sp,FLUSHFRM,ra)	lw	t1,icache_size 	.set	noreorder	mfc0	t3,C0_SR		/* save SR */	nop	la	v0,1f	li	v1,K1BASE	or	v0,v1	j	v0			/* force into non-cached space */	nop1:	and	t3,~SR_PE		/* dont inadvertently clear PE */	beq	t1,zero,_Iflush_done	/* no i-cache get out */	nop	li	v0,SR_ISC|SR_SWC	/* disable intr, isolate and swap */	mtc0	v0,C0_SR	li	t0,K0BASE	.set	reorder	or	t1,t0,t11:	sb	zero,0(t0)	sb	zero,4(t0)	sb	zero,8(t0)	sb	zero,12(t0)	sb	zero,16(t0)	sb	zero,20(t0)	sb	zero,24(t0)	addu	t0,32	sb	zero,-4(t0)	bne	t0,t1,1b	.set	noreorder_Iflush_done:	mtc0	t3,C0_SR		/* un-isolate, enable interrupts */	.set	reorder	j	raENDFRAME(flush_Icache)/****************************************************************************** clear_Dcache(base_addr, byte_count) - flush portion of Data cache****      a0 = base address of portion to be cleared**      a1 = byte count of length*****************************************************************************/FRAME(clear_Dcache,sp,0,ra)	lw  	t2, dcache_size		/* Data cache size */	.set	noreorder	mfc0	t3,C0_SR		/* save SR */	nop	and	t3,~SR_PE		/* dont inadvertently clear PE */	nop	nop	.set	reorder	/*	 * flush data cache	 */	.set	noreorder	nop	li	v0,SR_ISC		/* isolate data cache */	mtc0	v0,C0_SR	.set	reorder	bltu	t2,a1,1f		/* cache is smaller than region */	move	t2,a11:	addu	t2,a0			/* ending address + 1 */	move	t0,a01:	sb	zero,0(t0)	sb	zero,4(t0)	sb	zero,8(t0)	sb	zero,12(t0)	sb	zero,16(t0)	sb	zero,20(t0)	sb	zero,24(t0)	addu	t0,32	sb	zero,-4(t0)	bltu	t0,t2,1b	.set	noreorder	mtc0	t3,C0_SR		/* un-isolate, enable interrupts */	nop	.set	reorder	j	raENDFRAME(clear_Dcache)/****************************************************************************** clear_Icache(base_addr, byte_count) - flush portion of Instruction cache****      a0 = base address of portion to be cleared**      a1 = byte count of length****	NOTE: Icache can only be flushed/cleared when uncached**	      Code forces into uncached memory regardless of calling mode*****************************************************************************/FRAME(clear_Icache,sp,0,ra)	lw      t1, icache_size		/* Instruction cache size */	/*	 * flush text cache	 */	.set	noreorder	mfc0	t3,C0_SR		/* save SR */	nop 	la	v0,1f	li	v1,K1BASE	or	v0,v1	j	v0			/* force into non-cached space */	nop1:	and	t3,~SR_PE		/* dont inadvertently clear PE */	nop	nop	li	v0,SR_ISC|SR_SWC	/* disable intr, isolate and swap */	mtc0	v0,C0_SR	.set	reorder	bltu	t1,a1,1f		/* cache is smaller than region */	move	t1,a11:	addu	t1,a0			/* ending address + 1 */	move	t0,a0	sb	zero,0(t0)	sb	zero,4(t0)	sb	zero,8(t0)	sb	zero,12(t0)	sb	zero,16(t0)	sb	zero,20(t0)	sb	zero,24(t0)	addu	t0,32	sb	zero,-4(t0)	bltu	t0,t1,1b	.set	noreorder	mtc0	t3,C0_SR		/* un-isolate, enable interrupts */	nop	nop	nop				/* allow time for caches to swap */	.set	reorder	j	raENDFRAME(clear_Icache)/******************************************************************************  get_mem_conf - get memory configuration *****************************************************************************/FRAME(get_mem_conf,sp,0,ra)	lw	t6, mem_size	sw	t6, 0(a0)	lw	t7, icache_size	sw	t7, 4(a0)	lw	t8, dcache_size	sw	t8, 8(a0) 	j	raENDFRAME(get_mem_conf)#endif /* __mips == 1 */#if __mips == 3#define LEAF(label)	FRAME(label,sp,0,ra)#define XLEAF(label) \	.globl label ; \label:#define END(label)	ENDFRAME(label)/* * cacheop macro to automate cache operations * first some helpers... */#define _mincache(size, maxsize) \	bltu	size,maxsize,8f ;	\	move	size,maxsize ;		\8:#define _align(tmp, minaddr, maxaddr, linesize) \	subu	tmp,linesize,1 ;	\	not	tmp ;			\	and	minaddr,tmp ;		\	addu	maxaddr,-1 ;		\	and	maxaddr,tmp/* This is a bit of a hack really because it relies on minaddr=a0 */#define _doop1(op1) \	cache	op1,0(a0) #define _doop2(op1, op2) \	cache	op1,0(a0) ;		\	cache	op2,0(a0) /* specials for cache initialisation */#define _doop1lw1(op1) \	cache	op1,0(a0) ;		\	lw	zero,0(a0) ;		\	cache	op1,0(a0) #define _doop121(op1,op2) \	cache	op1,0(a0) ;		\	nop;				\	cache	op2,0(a0) ;		\	nop;				\	cache	op1,0(a0) #define _oploopn(minaddr, maxaddr, linesize, tag, ops) \	.set	noreorder ;		\7: 	_doop##tag##ops ;	 	\	bne     minaddr,maxaddr,7b ;	\	addu   	minaddr,linesize ;	\	.set	reorder/* finally the cache operation macros */#define icacheopn(kva, n, cache_size, cache_linesize, tag, ops) \	_mincache(n, cache_size);	\ 	blez	n,9f ;			\	addu	n,kva ;			\	_align(t1, kva, n, cache_linesize) ; \	_oploopn(kva, n, cache_linesize, tag, ops) ; \9:#define vcacheopn(kva, n, cache_size, cache_linesize, tag, ops) \ 	blez	n,9f ;			\	addu	n,kva ;			\	_align(t1, kva, n, cache_linesize) ; \

⌨️ 快捷键说明

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