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