kerneltest/e32test/mmu/d_cache.cia
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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);
	}