diff -r 000000000000 -r a41df078684a kerneltest/f32test/manager/t_warm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/manager/t_warm.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,407 @@ +// Copyright (c) 1997-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: +// f32test\manager\t_warm.cpp +// +// + +#include +#include +#include +#include "u32std.h" +#include + +_LIT(KProgressFileName,"C:\\Progress"); + +#define BUF_SIZE 4096 + +LOCAL_D RTest test(_L("T_WARM")); +GLDEF_D RFs Session; +GLDEF_D RFile File; +TBuf8 Buffer; +TUint Seed[2]; + +#if !defined(__WINS__) +LOCAL_C TInt Output() + { + TInt err = File.Write(Buffer); + if (err!=KErrNone && err!=KErrDiskFull) + { + File.Close(); + Session.Close(); + test.Printf(_L("Error writing to file\n")); + test(1==0); + } + return err; + } +/* + +LOCAL_C TInt OutputByte(TInt i) + { + TPtrC8 bytePtr( Buffer.Ptr()+i, 1 ); + TInt err = File.Write(bytePtr); + if (err!=KErrNone && err!=KErrDiskFull) + { + File.Close(); + Session.Close(); + test.Printf(_L("Error writing to file\n")); + test(1==0); + } + return err; + } + + */ + +LOCAL_C TInt Input() + { + TInt err = File.Read(Buffer); + if (err!=KErrNone && err!=KErrEof) + { + File.Close(); + Session.Close(); + test.Printf(_L("Error reading from file\n")); + test(1==0); + } + return err; + } + +LOCAL_C void CreateFile() + { + if ( File.Create(Session, _L("C:\\TESTFILE.BIN"), EFileWrite) == KErrNone ) + { + test.Printf(_L("C:\\TESTFILE.BIN created\n")); + } + else + { + File.Close(); + Session.Close(); + test.Printf(_L("Error opening file\n")); + test(1==0); + } + } + +LOCAL_C void OpenFile() + { + if ( File.Open(Session, _L("C:\\TESTFILE.BIN"), EFileRead) != KErrNone ) + { + File.Close(); + Session.Close(); + test.Printf(_L("Error reading input file\n")); + test(1==0); + } + else + { + test.Printf(_L("C:\\TESTFILE.BIN opened\n")); + } + } + +__NAKED__ TUint Random( TUint * /*aSeed*/ ) + { +#ifdef __MARM__ + // Random number generator + // + // This uses a 33-bit feedback shift register to generate a pseudo-randomly + // ordered sequence of numbers which repeats in a cycle of length 2^33 - 1 + // + __SWITCH_TO_ARM; + asm("LDMIA r0, {r1, r2} "); // get seed value + asm("MOV r3, r1, LSR#1 "); // 33-bit rotate right + asm("ORR r3, r3, r2, LSL#31 "); // LSB of r2 into MSB of r3 + asm("AND r2, r1, #1 "); // LSB of r1 into LSB of r2 + asm("EOR r3, r3, r1, LSL#12 "); // (involved!) + asm("EOR r1, r3, r3, LSR#20 "); // (similarly involved!) + asm("STMIA r0, {r1, r2} "); // store new seed + asm("MOV r0, r1 "); // return low word of new seed + __JUMP(,lr); + __END_ARM; +#endif +#if defined(__WINS__) || defined(__X86__) + _asm push ebx + _asm mov ecx, [esp+8] // get seed pointer + _asm mov eax, [ecx] // get seed value into edx:eax + _asm mov edx, [ecx+4] + _asm mov ebx, eax // original eax into ebx + _asm shr edx, 1 // edx lsb into CF + _asm rcr eax, 1 // rotate into eax + _asm adc edx, edx // LSB into edx lsb + _asm shl ebx, 12 + _asm xor eax, ebx // first involved step + _asm mov ebx, eax + _asm shr ebx, 20 + _asm xor eax, ebx // second involved step + _asm mov [ecx+4], edx // store top bit of result + _asm mov [ecx], eax // store bottom 32 bits of result + _asm pop ebx + _asm ret // return with low word of result in eax +#endif + } + +LOCAL_C void GenerateBuffer() + { + TInt i; + TUint *p = (TUint*)Buffer.Ptr(); + for (i=0; i=0) + { + File.Close(); + Session.Close(); + test.Printf(_L("Verify error at 0x%08X\n"), j+i ); + test(1==0); + } + i+=Buffer.Length(); + } + else + break; + } + test.Printf(_L("File verified OK\n")); + test.Printf(_L("Total bytes read %d\n"), i); + File.Close(); + Session.Close(); + } + +void CauseKernelException() + { + RThread().SetSystem(ETrue); + *((TUint*)0x58000900)=0xDEADDEAD; + } +#endif + +#if defined(__WINS__) + +TInt E32Main() +// +// This test doesn't make sense under WINS +// + { + test.Start(_L("No tests under WINS")); + test.End(); + return KErrNone; + } + +#else + +GLDEF_C TInt E32Main() +// +// T_WARM should be run by +// copying to RAM as C:\System\libs\eshell.exe and pressing the User Reset button +// + { + + test.Title(); + if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin)) + test.Start(_L("Test T_WARM is running from RAM as C:\\Sys\\Bin\\ESHELL.EXE")); + else + test.Start(_L("Test T_WARM is running from RAM as C:\\System\\Bin\\ESHELL.EXE")); + RProcess p; + if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin)) + test(p.FileName().CompareF(_L("C:\\Sys\\Bin\\ESHELL.EXE"))==0); + else + test(p.FileName().CompareF(_L("C:\\System\\Bin\\ESHELL.EXE"))==0); + TBuf8<0x100> peaches=_L8(""); + TInt i; + for (i=0; i<16; i++) + peaches.Append(_L8("PeachesAndCream_")); + + test.Next(_L("Check test progress")); + RFs fs; + TInt r=fs.Connect(); + test(r==KErrNone); + RFile progress; + TBuf8<0x80> buf; + r=progress.Open(fs,KProgressFileName(),EFileRead|EFileWrite); + if (r==KErrNotFound) + { + test.Next(_L("Setting progress to first test")); + r=progress.Create(fs,KProgressFileName(),EFileRead|EFileWrite); + test(r==KErrNone); + buf=_L8("Warm Reset"); + r=progress.Write(buf); + test(r==KErrNone); + } + else + { + r=progress.Read(buf); + test(r==KErrNone); + } + + + TBuf<0x10> bufU; + bufU.Copy(buf); + test.Printf(_L("Performing %S test\n"), &bufU); + + test.Next(_L("Get startup reason")); + TMachineStartupType reason; + UserHal::StartupReason(reason); + + if (buf==_L8("Warm Reset")) + { + test.Next(_L("Test reason")); + test(reason==EStartupWarmReset); + TInt fault; + test(UserHal::FaultReason(fault)==KErrGeneral); + GenerateFile(); + } + else if (buf==_L8("Kernel Fault")) + { + test.Next(_L("Test reason")); + test(reason==EStartupKernelFault); + TInt fault; + test(UserHal::FaultReason(fault)==KErrNone); + test(fault==0x1234); + VerifyFile(); + } + else if (buf==_L8("Kernel Exception")) + { + test.Next(_L("Test reason")); + test(reason==EStartupKernelFault); +#if defined(__MARM__) + TExcInfo excInfo; + test(UserHal::ExceptionInfo(excInfo)==KErrNone); + test(((TUint) excInfo.iCodeAddress & 0xf0000000)==0x20000000); + test((TUint)excInfo.iDataAddress==0x58000900); + TInt id; + test(UserHal::ExceptionId(id)==KErrNone); + test(id==EExcAccessViolation); +#endif + VerifyFile(); + } + else if (buf==_L8("Finalise")) + { + test.Next(_L("Test reason")); + test(reason==EStartupWarmReset); + TInt fault; + test(UserHal::FaultReason(fault)==KErrGeneral); + VerifyFile(); + } + else + { + test.Next(_L("It's all gone horribly wrong")); + test(EFalse); + } + + + // + test.Next(_L("Move on to the next test")); + if (buf==_L8("Warm Reset")) + { + test(progress.Write(0,_L8("Kernel Fault"))==KErrNone); + test.Next(_L("Cause Kernel fault")); + RDebug::Fault(0x1234); + test(EFalse); + } + else if (buf==_L8("Kernel Fault")) + { + test(progress.Write(0,_L8("Kernel Exception"))==KErrNone); + test.Next(_L("Cause Kernel exception")); + CauseKernelException(); + test(EFalse); + } + else if (buf==_L8("Kernel Exception")) + { + test(progress.Write(0,_L8("Finalise"))==KErrNone); + test.Next(_L("Press the user reset button...")); + FOREVER ; + } + else if (buf==_L8("Finalise")) + { + test.Next(_L("Removing progress file")); + progress.Close(); + r=fs.Delete(KProgressFileName()); + test(r==KErrNone); + } + else + { + test.Next(_L("It's all gone horribly wrong")); + test(EFalse); + } + + test.Printf(_L("\n\nTest completed O.K.\nPress LEFT SHIFT, RIGHT SHIFT and USER RESET to test hard reset\n")); + test.Getch(); + test.End(); + return(KErrNone); + } + +#endif