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

📄 cachesh7622alib.s

📁 vxworks source code, used for develop vxworks system.
💻 S
字号:
/* cacheSh7622ALib.s - HITACHI SH7622 cache management assembly function *//* Copyright 1998-2001 Wind River Systems, Inc. */	.data	.global	_copyright_wind_river	.long	_copyright_wind_river/*modification history--------------------01b,11apr01,frf  modified invalidation functions, added clear function.01a,26mar01,frf  written on base of cacheSh7604ALib.s.*/#define	_ASMLANGUAGE#include "vxWorks.h"#include "asm.h"#define _ALIGN_UNCACHED_TEXT	2#define CCR		0xec		/* 0xffffffec *//* SH7622 Cache Control Register bit define */#define C_ENABLE    	0x00000001	/* enable cache */#define C_WRITE_THROUGH	0x00000002	/* operating mode for area P0					   U0 and P3					   1:write-through					   0:write-back */#define C_WRITE_BACK   	0x00000004	/* operating mode for area P1					   1:write-back					   0:write-through */#define C_FLUSH	   	0x00000008	/* flushes all cache entries					   (clears V,U and LRU bits) */#define CAC_V		0x1#define CAC_U		0x2	#define CAC_A		0x8	#define CAC_LINE_SIZE	16		.text	.global	_cacheSh7622CCRSetOp	.global	_cacheSh7622CCRGet	.global	_cacheSh7622CacheOnOp	.global	_cacheSh7622CFlushOp	.global	_cacheSh7622AFlushOp	.global	_cacheSh7622MFlushOp/******************************************************************************** cacheSh7622CCRSetOp - set cache control register to a specified value*	* This routine modifies CCR, thus it must be executed on P2 region.** This routine modifies CCR, thus it must be executed on P2 region.** UINT32 cacheSh7622CCRSetOp (UINT32 ccr)*       {*       *CCR = ccr;**       return *CCR;*       }** NOMANUAL*/        .type   _cacheSh7622CCRSetOp,@function        .align  _ALIGN_UNCACHED_TEXT _cacheSh7622CCRSetOp:        mov	#CCR,r1        mov.l   r4,@r1                  /* set CCR */         rts;        mov.l   @r1,r0                  /* return CCR */ /******************************************************************************** cacheSh7622CCRGet - get cache control register value** This routine may be executed on any region.** UINT32 cacheSh7622CCRGetOp (void)*       {*       return *CCR;*       }** NOMANUAL*/	.type	_cacheSh7622CCRGet,@function	.align	_ALIGN_UNCACHED_TEXT_cacheSh7622CCRGet:	mov	#CCR,r1	rts;	mov.l	@r1,r0/******************************************************************************** cacheSh7622CacheOnOp - turn on/off cache controller** This routine modifies CCR, thus it must be executed on P2 region.** STATUS cacheSh7622CacheOnOp (BOOL on)*	{*	UINT32 ccr = *CCR;*	BOOL enabled = ccr & C_ENABLE;**	if (enabled == on)*	    return ERROR;**	SR |= IMASK;				/@ BLOCK INTERRUPTS @/**	if (on == FALSE)*	    {*	    int ix;**	    for (ix = 0; ix <= 0x07f0; ix += 0x10)*		{*		*(UINT32 *)(0xf0000000 | ix) &= 0xfffffffc;	/@ clear U&V @/*		}*	    }**	*CCR = ccr & ~C_ENABLE;		/@ disable caching @/**	*CCR = ccr | C_FLUSH;		/@ invalidate entire cache @/**	if (on == TRUE)*	    *CCR = ccr | C_ENABLE;	/@ enable caching @/**	SR &= ~IMASK;				/@ UNBLOCK INTERRUPTS @/**	return OK;*	}** NOMANUAL*/	.type	_cacheSh7622CacheOnOp,@function	.align	_ALIGN_UNCACHED_TEXT_cacheSh7622CacheOnOp:	mov	#CCR,r6	mov.l	@r6,r5			/* r5: original CCR */	mov	r5,r0	tst	#C_ENABLE,r0	movt	r0			/* 1: disabled, 0: enabled */	tst	r4,r4	movt	r1			/* 1: disable,  0: enable */	cmp/eq	r0,r1	bt.s	ON_Exit;		/* keep current CCR.CE */	mov	#-1,r3			/* r3: ERROR */	mov.l	ON_X000000F0,r0;	stc	sr,r7			/* r7: original SR */	or	r7,r0	ldc	r0,sr			/* BLOCK INTERRUPTS */	mov	r5,r0	tst	#C_ENABLE,r0	bt	ON_FlushDone		/* CE: 0 (cache is disabled) */	and	#0x6,r0	cmp/eq	#C_WRITE_THROUGH,r0	bt	ON_FlushDone		/* CB: 0,  WT: 1 (no copyback region) */	mov.l	ON_XF0000000,r3		/* r3: 0xf0000000 */	mov	#0xfc,r2		/* r2: 0xfffffffc */		mov.w	ON_X07F0,r1		/* r1: 0x07f0 */ON_FlushLoop:	mov.l	@r3,r0; and r2,r0; mov.l r0,@r3; add #0x10,r3	mov.l	@r3,r0; and r2,r0; mov.l r0,@r3; add #0x10,r3	mov.l	@r3,r0; and r2,r0; mov.l r0,@r3; add #0x10,r3	mov.l	@r3,r0; and r2,r0; mov.l r0,@r3; add #0x10,r3	dt	r1	bf	ON_FlushLoop		/* flush whole cache */	mov.l	ON_XA0000000,r1	mov.l	@r1,r1			/* flush write-back buffer by P2-read */ON_FlushDone:	mov	#(~C_ENABLE),r0	and	r5,r0	mov.l	r0,@r6			/* DISABLE CACHE */	or	#C_FLUSH,r0	mov.l	r0,@r6			/* invalidate entire cache tags */	tst	r4,r4	bt.s	ON_Unblock;	mov	#0,r3			/* r3: OK */	mov	r5,r0	or	#C_ENABLE,r0	mov.l	r0,@r6			/* ENABLE CACHE */ON_Unblock:	ldc	r7,sr			/* UNBLOCK INTERRUPTS */ON_Exit:	rts;	mov	r3,r0			/* return status */		.align	2ON_X000000F0:	.long	0x000000f0	/* SR.IMASK */ON_XF0000000:	.long	0xf0000000	/* cache address array */ON_XA0000000:	.long	0xa0000000	/* P2 base address for dummy read */ON_X07F0:	.word	0x07f0	/******************************************************************************** cacheSh7622CFlushOp - invalidate entire cache tags by setting CCR.CF bit** This routine modifies CCR, thus it must be executed on P2 region.** void cacheSh7622CFlushOp (void)*	{*	*CCR |= C_FLUSH;*	}** NOMANUAL*/	.type	_cacheSh7622CFlushOp,@function	.align	_ALIGN_UNCACHED_TEXT_cacheSh7622CFlushOp:	mov	#CCR,r1	mov.l	@r1,r0	or	#C_FLUSH,r0	rts;	mov.l	r0,@r1			/* invalidate entire cache tags *//******************************************************************************** cacheSh7622AFlushOp - flush cache entries ** This routine invalidates all the entries in the cache and perform * writeback whenever there's incoherence between cacache and external * memory.** void cacheSh7622AFlushOp*     (*     UINT32 ca_begin,*     UINT32 ca_end*     )*     {*     UINT32 ca;*  *     for (ca = ca_begin; ca <= ca_end; ca += CAC_LINE_SIZE)*         *(UINT32 *)(0xf0000008 | (ca & 0x7f0)) = ca & 0x1ffffc00;*     }** NOMANUAL*/		.type	_cacheSh7622AFlushOp,@function	.align	2			/* run on cache thru region */_cacheSh7622AFlushOp:	cmp/hi	r5,r4			/* if (ca_end < ca_begin) */	bt	AI_Exit;		/*     return;            */	mov.l	AI_XF0000008,r2	mov.l	AI_X1FFFFC00,r3	mov.w	AI_X07F0,r6	AI_Loop:	mov	r3,r0			/* r0: 0x1ffffc00 */	mov	r6,r1			/* r1: 0x000007f0 */	and	r4,r0			/* r0: ca & 0x1ffffc00 */	and	r4,r1			/* r1: ca & 0x000007f0 */	or	r2,r1			/* r1: 0xf0000008 | (ca & 0x7f0) */	add	#CAC_LINE_SIZE,r4	cmp/hi	r5,r4	bf.s	AI_Loop	mov.l	r0,@r1			/* purge cache entry associatively */AI_Exit:			mov.l	AI_XA0000000,r1	rts;	mov.l	@r1,r1			/* flush write-buffer by P2-read */		.align	2AI_XF0000008:	.long	0xf0000008	/* associative purge region */AI_X1FFFFC00:	.long	0x1ffffc00AI_XA0000000:	.long	0xa0000000	/* P2 base address (reset vector) */AI_X07F0:	.word	0x07f0/******************************************************************************** cacheSh7622MFlushOp - flush a cache entry by read-modify-writing tag** void cacheSh7622MFlushOp*     (*     UINT32 *pt,*     int     ix,*     UINT32  ca_begin,*     UINT32  ca_end*     )*     {*     int key = intLock ();*     UINT32 tag = *pt;*  *     if (tag & TAG_VALID)*         {*	  if (ix < 0) /@ force invalidating cache tag @/*             {*	      *pt = tag & ~(TAG_USED | TAG_VALID); /@ modify cache tag @/*	      }*	  else /@ check cached address @/*             {  *	      UINT32 ca = (tag & 0x1ffffc00) | ix;*  *             if ((ca >= ca_begin) && (ca <= ca_end))*                {*                *(UINT32 *)(CAC_ADRS_ARRAY | ca) = 0;*                }*	      }*         }*     intUnlock (key);*     }** NOMANUAL*/	.type	_cacheSh7622MFlushOp,@function	.align	2			/* run on cache thru region */_cacheSh7622MFlushOp:	stc	sr,r3			/* r3: key */	mov	r3,r0	or	#0xf0,r0	ldc	r0,sr			/* LOCK INTERRUPTS */	mov.l	@r4,r0			/* r0: tag */	tst	#CAC_V,r0	bt	MI_Exit	cmp/pz	r5			/* ix >= 0 ? */	bf	MI_Purge	mov.l	MI_X1FFFFC00,r2	and	r0,r2	or	r5,r2			/* r2: ca = (tag & 0x1ffffc00) | ix */	cmp/hs	r6,r2			/* if (ca < ca_begin) */	bf	MI_Exit			/*     goto MI_Exit;  */	cmp/hi	r7,r2			/* if (ca > ca_end)   */	bt	MI_Exit			/*     goto MI_Exit;  */MI_Purge:	mov	#0xfc,r1		/* r1: 0xfffffffc */	and	r1,r0			/* clear U and V */	mov.l	MI_XF0000008,r1	or	r1,r4	mov.l	r0,@r4			/* purge cache entry */	MI_Exit:	rts;	ldc	r3,sr			/* UNLOCK INTERRUPTS */		.align 2MI_X1FFFFC00:	.long	0x1ffffC00MI_XF0000008:	.long	0xf0000008

⌨️ 快捷键说明

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