diff -r a179b74831c9 -r c1f20ce4abcf kerneltest/e32test/system/t_reason2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/system/t_reason2.cpp Tue Aug 31 16:34:26 2010 +0300 @@ -0,0 +1,141 @@ +// Copyright (c) 2010 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\system\t_reason2.cpp +// Overview: +// Tests system startup reason HAL functions and exception info functions: +// API Information: +// UserHal::StartupReason() (deprecated), HAL:.Get(ESystemStartupReason,..), +// UserHal::FaultReason, UserHal::ExceptionId and UserHal::ExceptionInfo +// Details: +// - Asks system startup reason from user hal +// - Asks system startup reason with replacing hal::get method +// - Asks Exception info +// Platforms/Drives/Compatibility: +// All. +// Assumptions/Requirement/Pre-requisites: +// Failures and causes: +// Base Port information: +// +// +#define __E32TEST_EXTENSION__ + +#include +#include +#include +#include +#include + +LOCAL_D RTest test(_L("T_REASON2")); + +TInt gSysReason=KErrNotSupported; + +void GetSysStartupReason() + { + test.Next(_L("Get startup reason using (deprecated) UserHal::StartupReason API")); + + TMachineStartupType reason; + + test_KErrNone(UserHal::StartupReason(reason)); + switch (reason) + { + case EStartupCold: RDebug::Print(_L("Cold Start ")); break; + case EStartupColdReset: RDebug::Print(_L("Cold Reset ")); break; + case EStartupNewOs: RDebug::Print(_L("New OS ")); break; + case EStartupPowerFail: RDebug::Print(_L("Power failed ")); break; + case EStartupWarmReset: RDebug::Print(_L("Warm Reset ")); break; + case EStartupKernelFault: RDebug::Print(_L("Kernel fault ")); break; + case EStartupSafeReset: RDebug::Print(_L("Safe Reset ")); break; + default: + RDebug::Print(_L(" "), reason); + test(EFalse); // fail, unknown reason returned + break; + } + + // test the replacing API + TInt r=KErrNone; + test.Next(_L("Get system startup reason using HAL::Get()")); + r=HAL::Get(HAL::ESystemStartupReason,gSysReason); +#if defined(__WINS__) + test(r=KErrNotSupported); +#else + test_KErrNone(r); + switch (gSysReason) + { + case HAL::ESystemStartupReason_Cold: RDebug::Print(_L("reason:Cold ")); break; + case HAL::ESystemStartupReason_Warm: RDebug::Print(_L("reason:Warm ")); break; + case HAL::ESystemStartupReason_Fault: RDebug::Print(_L("reason:Fault")); break; + default: + RDebug::Print(_L(" "), gSysReason); + test(EFalse); // fail, unknown reason returned + break; + } +#endif + } + +void GetExceptionInfo() + { + test.Next(_L("Get exception ID")); + TInt exceptno; + TInt faultno; + + TExcInfo exceptInfo; + test_KErrNone(UserHal::ExceptionId(exceptno)); + + test.Next(_L("Get exception info")); + test_KErrNone(UserHal::ExceptionInfo(exceptInfo)); + + test.Next(_L("Get fault reason")); + test_KErrNone(UserHal::FaultReason(faultno)); + + if (gSysReason==HAL::ESystemStartupReason_Warm || gSysReason==HAL::ESystemStartupReason_Fault) + { + RDebug::Print(_L("(last exception %d: code %08x data %08x) "), exceptno, exceptInfo.iCodeAddress,exceptInfo.iDataAddress); + } + + if (gSysReason==HAL::ESystemStartupReason_Fault) + { + if (faultno == 0x10000000) + { + RDebug::Print(_L("Kernel Exception ")); + } + else + { + if (faultno >= 0x10000) + { + RDebug::Print(_L("Kernel PANIC: %d "), faultno-0x10000); + } + else + { + RDebug::Print(_L("Kernel FAULT: %d "), faultno); + } + } + } + } + +TInt E32Main() + { + test.Title(); + + test.Start(_L("Test startup reasons from Hal")); + + // test startup reason + GetSysStartupReason(); + + // test exception and fault info UserHal functions + GetExceptionInfo(); + + test.End(); + + return KErrNone; + }