--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/mmu/d_cache.cia Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,193 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\mmu\d_cache.cia
+// See e32test\mmu\t_cache.cpp for details
+//
+//
+
+
+#ifndef __KERNEL_MODE__
+#include <u32std.h>
+#else
+#include <u32std.h>
+#include "nk_cpu.h"
+
+
+#if defined(__CPU_ARMV7)
+/**Returns Cache Type Register content*/
+__NAKED__ TUint32 CacheTypeRegister()
+ {
+ asm("mrc p15, 0, r0, c0, c0, 1 ");
+ __JUMP(,lr);
+ }
+
+/**Returns Cache Level ID Register content*/
+__NAKED__ TUint32 CacheLevelIDRegister()
+ {
+ asm("mrc p15, 1, r0, c0, c0, 1 ");
+ __JUMP(,lr);
+ }
+
+/**
+Returns Cache Size Id Register content for the given cache level/type
+@param aType Cache type: 0=data/unified, 1=code
+@param aLevel Cache level: 0=Level1 ... 7=Level8
+*/
+__NAKED__ TUint32 CacheSizeIdRegister(TUint32 /*aType*/, TUint32 /*aLevel*/)
+ {
+ asm("orr r0, r1, lsl #1"); // r0 = entry for Cache Size Selection Reg.
+ asm("mcr p15, 2, r0, c0, c0, 0 "); // set Cache Size Selection Register
+ ARM_ISBSY;
+ asm("mrc p15, 1, r0, c0, c0, 0 "); // read Cache Size Id Register
+ __JUMP(,lr);
+ }
+#endif
+
+
+#if defined(__CPU_MEMORY_TYPE_REMAPPING)
+/** Returns Coprocessor Control Register*/
+__NAKED__ TUint32 CtrlRegister()
+ {
+ asm("mrc p15, 0, r0, c1, c0, 0 ");//read CR reg.
+ __JUMP(,lr);
+ }
+
+/** Returns PRRR Register*/
+__NAKED__ TUint32 PRRRRegister()
+ {
+ asm("mrc p15, 0, r0, c10, c2, 0 ");
+ __JUMP(,lr);
+ }
+
+/** Returns NRRR Register*/
+__NAKED__ TUint32 NRRRRegister()
+ {
+ asm("mrc p15, 0, r0, c10, c2, 1 ");
+ __JUMP(,lr);
+ }
+
+/** Sets PRRR Register*/
+__NAKED__ void SetPRRR(TUint32)
+ {
+ asm("mcr p15, 0, r0, c10, c2, 0 ");
+#if defined(__CPU_ARMV7)
+ UTLBIALL;
+ ARM_ISBSY;
+#else
+ FLUSH_DTLB(,r0);
+#endif
+ __JUMP(,lr);
+ }
+
+/** Sets NRRR Register*/
+__NAKED__ void SetNRRR(TUint32)
+ {
+ asm("mcr p15, 0, r0, c10, c2, 1 ");
+ __JUMP(,lr);
+ }
+#endif
+
+
+
+#ifdef __CPU_HAS_CACHE_TYPE_REGISTER
+__NAKED__ TUint32 GetCacheType()
+ {
+ asm("mrc p15, 0, r0, c0, c0, 1 ");
+ __JUMP(,lr);
+ }
+#endif
+
+
+#ifdef __XSCALE_L2_CACHE__
+/** Returns L2 Cache Type Register Content */
+__NAKED__ TUint32 L2CacheTypeReg()
+ {
+ asm("mrc p15, 1, r0, c0, c0, 1 ");
+ __JUMP(,lr);
+ }
+#endif // __XSCALE_L2_CACHE__
+
+#define NOP_8() \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+ asm("nop"); \
+
+#define NOP_64() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+ NOP_8() \
+
+#define NOP_512() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+ NOP_64() \
+
+__NAKED__ void TestCodeFunc()
+ {
+ asm("testcodestart: ");
+ NOP_512(); //512 nops * 4 bytes/nop = 2K (800h) of code
+ __JUMP(,lr); //+ 4 bytes
+ asm("testcodeend: ");
+ }
+
+__NAKED__ TInt TestCodeFuncSize()
+ {
+ asm("ldr r0, = testcodeend - testcodestart"); //This should return 804h
+ __JUMP(,lr);
+ }
+
+#endif //#ifdef __KERNEL_MODE__
+
+// It assumes that aSize and aBase are aligned to 4 bytes. Also, aSize must be > 0.
+__NAKED__ void DataSegmetTestFunct(void* /*aBase*/, TInt /*aSize*/)
+ {
+ asm("add r1,r1,r0"); // r1 = end address (excluding)
+ asm("mov r2, #50"); // Will take 50 cycles
+ asm("mvn r12, #1"); // r12 = -2
+
+ asm("next_cycle:");
+
+ asm("mov r3, r0"); // r3 = aBase
+ asm("write_loop:");
+ asm("str r12, [r3],#4");
+
+ asm("cmp r3, r1");
+ asm("blo write_loop");
+
+ asm("mov r3, r0"); // r3 = aBase
+ asm("read_loop:");
+ asm("ldr r12, [r3],#4");
+ asm("cmp r3, r1");
+ asm("blo read_loop");
+
+ asm("subs r2,r2,#1");
+ asm("bne next_cycle");
+
+ __JUMP(,lr);
+ }