--- /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 <e32test.h>
+#include <e32svr.h>
+#include <e32hal.h>
+#include "u32std.h"
+#include <f32file.h>
+
+_LIT(KProgressFileName,"C:\\Progress");
+
+#define BUF_SIZE 4096
+
+LOCAL_D RTest test(_L("T_WARM"));
+GLDEF_D RFs Session;
+GLDEF_D RFile File;
+TBuf8<BUF_SIZE> 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<BUF_SIZE/4; i++)
+ {
+ *p++ = Random(Seed);
+ }
+ Buffer.SetLength(BUF_SIZE);
+ }
+
+LOCAL_C TInt VerifyBuffer()
+ {
+ TInt i;
+ TUint *p = (TUint*)Buffer.Ptr();
+ for (i=0; i<Buffer.Length()/4; i++)
+ {
+ if (*p++ != Random(Seed))
+ {
+ return(i*4);
+ }
+ }
+ return -1;
+ }
+
+LOCAL_C void GenerateFile()
+ {
+ TInt size=0;
+ TInt err = KErrNone;
+ test.Next(_L("Creating large file containing pseudo-random sequence"));
+ test( Session.Connect()==KErrNone );
+ Seed[0] = 0xB504F334;
+ Seed[1] = 0;
+
+ // write PRBS sequence to file
+ CreateFile();
+ while(err==KErrNone)
+ {
+ GenerateBuffer();
+ err=Output();
+ if (err==KErrNone)
+ size+=BUF_SIZE;
+ }
+/*
+// Fill RAM Drive to last byte
+ err=KErrNone;
+ TInt i=0;
+ while(err==KErrNone)
+ {
+ err=OutputByte(i++);
+ if (err==KErrNone)
+ size++;
+ }
+*/
+ File.Close();
+ Session.Close();
+ test.Printf(_L("Total bytes written %d\n"), size);
+ User::After(2000000);
+ }
+
+LOCAL_C void VerifyFile()
+ {
+ TInt err = KErrNone;
+ TInt i,j;
+ test.Next(_L("Verifying file containing pseudo-random sequence"));
+ test( Session.Connect()==KErrNone );
+ Seed[0] = 0xB504F334;
+ Seed[1] = 0;
+
+ // read and verify contents of file
+ OpenFile();
+ i=0;
+ FOREVER
+ {
+ err=Input();
+ if (err==KErrNone && Buffer.Length()!=0)
+ {
+ j = VerifyBuffer();
+ if (j>=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