diff -r 000000000000 -r 044383f39525 imgtools/romtools/rombuild/r_header.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/romtools/rombuild/r_header.cpp Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,334 @@ +/* +* Copyright (c) 1995-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: +* +*/ + + +#define __REFERENCE_CAPABILITY_NAMES__ + +#include "e32image.h" +#include +#include +#include +#include +#include +#include + +#include "r_rom.h" +#include "r_global.h" +#include "r_obey.h" +#include "h_utl.h" + +inline char* RomToActualAddress(TLinAddr aRomAddr) + { return (char*)(aRomAddr+TheRomMem-TheRomLinearAddress); } + +// +void TRomLoaderHeader::SetUp(CObeyFile *aObey) +// +// Fill in the TRomLoaderHeader - this is used by the ROM loader / programmer. +// + { + + if (CPU==ECpuX86) + _snprintf((char *)r.name,24,"%-16.16s%2x%2x%4x","EPOC486 ROM",aObey->iVersion.iMajor,aObey->iVersion.iMinor,aObey->iVersion.iBuild); + else if (CPU==ECpuArmV4) + _snprintf((char *)r.name,24,"%-16.16s%2x%2x%4x","EPOCARM4ROM",aObey->iVersion.iMajor,aObey->iVersion.iMinor,aObey->iVersion.iBuild); + else if (CPU==ECpuArmV5) + _snprintf((char *)r.name,24,"%-16.16s%2x%2x%4x","EPOCARM5ROM",aObey->iVersion.iMajor,aObey->iVersion.iMinor,aObey->iVersion.iBuild); + else if (CPU==ECpuMCore) + _snprintf((char *)r.name,24,"%-16.16s%2x%2x%4x","EPOCMCORROM",aObey->iVersion.iMajor,aObey->iVersion.iMinor,aObey->iVersion.iBuild); + else + _snprintf((char *)r.name,24,"%-16.16s%2x%2x%4x","EPOCUNKNOWN",aObey->iVersion.iMajor,aObey->iVersion.iMinor,aObey->iVersion.iBuild); + r.romSize = aObey->iRomSize; + r.wrapSize = KRomWrapperSize; + for (TUint i=0; iiVersion; + iTime = aObey->iTime; + iTimeHi = (TUint32)(aObey->iTime>>32); + iRomBase = aObey->iRomLinearBase; + iRomSize = aObey->iRomSize; + + iKernDataAddress = aObey->iKernDataRunAddress; + iKernelLimit = aObey->iKernelLimit; + iPrimaryFile = TheRomHeader->iPrimaryFile; + iSecondaryFile = TheRomHeader->iSecondaryFile; + iLanguage=aObey->iLanguage; + iHardware=aObey->iHardware; + iRomHeaderSize=KRomHeaderSize; + iRomSectionHeader=aObey->iSectionStart; + TUint j; + for (j=0; j<(TUint)KNumTraceMaskWords; j++) + iTraceMask[j]=aObey->iTraceMask[j]; + for (j=0; jiInitialBTraceFilter[j]; + iInitialBTraceMode = aObey->iInitialBTraceMode; + iInitialBTraceBuffer = aObey->iInitialBTraceBuffer; + iDebugPort=aObey->iDebugPort; + iKernelConfigFlags=aObey->iKernelConfigFlags; + for(TInt i=0; iiPlatSecDisabledCaps[i]; + } + +void ImpTRomHeader::CheckSum(TUint32 aTargetValue) + { + iCheckSum=0; + iCheckSum=aTargetValue-(HMem::CheckSum((TUint *)(TRomHeader *)this, iRomSize)); + } + + +void DisplayExceptionTable(TLinAddr aRomExcTab) + { + Print(ELog,"Rom Exception Search Table Address: %08x\n",aRomExcTab); + TRomExceptionSearchTable* pT=(TRomExceptionSearchTable*)RomToActualAddress(aRomExcTab); + Print(ELog,"Rom Exception Search Table contains %d entries:\n",pT->iNumEntries); + + Print(ELog,"CodeAddr\tCd + Data\tidx size\tNum Ents\t Shorts \n"); + Print(ELog,"========\t=========\t========\t========\t========\n"); + TInt i; + for (i=0; iiNumEntries; i++) + { + TRomImageHeader* pE = (TRomImageHeader *)RomToActualAddress(pT->iEntries[i]); + TRomImageHeader* pH = pE - 1; + const TExceptionDescriptor* pX = (const TExceptionDescriptor*)RomToActualAddress(pH->iExceptionDescriptor); + if (!pX) + continue; + TUint32 indexTableSize = (char *)pX->iExIdxLimit - (char *)pX->iExIdxBase; + struct IndexTableEntry { TUint32 aPc; TInt aVal; }; + struct IndexTableEntry* aExIdxBase = (struct IndexTableEntry *)RomToActualAddress(pX->iExIdxBase); + struct IndexTableEntry* aExIdxLimit = (struct IndexTableEntry *)RomToActualAddress(pX->iExIdxLimit); + TUint32 numIndexTableEntries = aExIdxLimit - aExIdxBase; + TUint32 numShortEntries = 0; + // Short entries have top bit set. + for(; aExIdxBase < aExIdxLimit; aExIdxBase++) + if (aExIdxBase->aVal == 1 || aExIdxBase->aVal < 0) + numShortEntries++; + + Print(ELog,"%08x\t%08d\t%08d\t%08d\t%08d\n", + pT->iEntries[i], + pH->iCodeSize+pH->iDataSize, + indexTableSize, + numIndexTableEntries, + numShortEntries); + } + Print(ELog,"\nROM EST fencepost = %08x\n", pT->iEntries[pT->iNumEntries]); + } + + +// +void ImpTRomHeader::Display() +// +// Display info from ROM header +// + { + TInt i; + + Print(ELog,"\n\nDevelopment configuration settings:\n"); + TUint j; + for (j=0; j<(TUint)KNumTraceMaskWords; j++) + Print(ELog,"TraceMask[%d]: %08x\n",j, iTraceMask[j]); + for (j=0; j>5] & (1<<(i&31))) + none = EFalse; + else + all = EFalse; + } + if(none) + Print(ELog,"NONE"); + else if(all) + Print(ELog,"ALL"); + else + for(i=0; i>5] & (1<<(i&31))) + Print(ELog,"%s ",CapabilityNames[i]); + Print(ELog,"\n"); + + Print(ELog,"\n\nRom details:\n"); + Print(ELog,"Version %d.%02d(%03d)\n", iVersion.iMajor, iVersion.iMinor, iVersion.iBuild); + Print(ELog,"Hardware version: %08x\n",iHardware); + Print(ELog,"Language Support: %08x%08x\n",TUint32(iLanguage>>32),TUint32(iLanguage)); + Print(ELog,"Linear base address: %08x\n",iRomBase); + Print(ELog,"Size: %08x\n",iRomSize); + Print(ELog,"Root directory list: %08x\n",iRomRootDirectoryList); + Print(ELog,"Kernel data address: %08x\n",iKernDataAddress); + Print(ELog,"Kernel limit: %08x\n",iKernelLimit); + Print(ELog,"Primary file address: %08x\n",iPrimaryFile); + Print(ELog,"Secondary file address: %08x\n",iSecondaryFile); + Print(ELog,"First variant address: %08x\n",iVariantFile); + Print(ELog,"First extension address: %08x\n",iExtensionFile); + Print(ELog,"Pageable ROM offset: %08x\n",iPageableRomStart); + Print(ELog,"Pageable ROM size: %08x\n",iPageableRomSize); + Print(ELog,"ROM page index offset: %08x\n",iRomPageIndex); + Print(ELog,"Demand Paging Config: minPages=%d maxPages=%d ageRatio=%d spare[0..2]=%d,%d,%d \n",iDemandPagingConfig.iMinPages,iDemandPagingConfig.iMaxPages,iDemandPagingConfig.iYoungOldRatio,iDemandPagingConfig.iSpare[0],iDemandPagingConfig.iSpare[1],iDemandPagingConfig.iSpare[2]); + Print(ELog,"Checksum word: %08x\n",iCheckSum); + Print(ELog,"TotalSvDataSize: %08x\n",iTotalSvDataSize); + Print(ELog,"User data address: %08x\n",iUserDataAddress); + Print(ELog,"TotalUserDataSize: %08x\n",iTotalUserDataSize); + Print(ELog,"Relocation Info Address: %08x\n",iRelocInfo); + if(iRelocInfo) + { + TReloc* reloc=(TReloc*)RomToActualAddress(iRelocInfo); + while(reloc->iLength) + { + Print(ELog," Src %08x Dest %08x Length %08x\n", + reloc->iSrc, reloc->iDest, reloc->iLength); + reloc++; + } + } + + TRomRootDirectoryList* pR=(TRomRootDirectoryList*)RomToActualAddress(iRomRootDirectoryList); + Print(ELog,"\nRoot directories:\n"); + for (i=0; iiNumRootDirs; i++) + { + Print(ELog,"Directory %2d %08x %08x\n",i,pR->iRootDir[i].iHardwareVariant,pR->iRootDir[i].iAddressLin); + } + if (iRomExceptionSearchTable) + { + if(!iPageableRomSize) // Don't do this for Paged ROMs because of page compression + DisplayExceptionTable(iRomExceptionSearchTable); + } + } +// + +void E32Rom::FinaliseSectionHeader() +// +// Fill in the section header +// + { + + if (iHeader->iRomSectionHeader) + { + // Set up the section header + TRomSectionHeader *header=(TRomSectionHeader *)RomToActualAddress(iHeader->iRomSectionHeader); + header->iVersion=iHeader->iVersion; + header->iTime=iHeader->iTime; + header->iLanguage=iHeader->iLanguage; + header->iCheckSum=0; + header->iCheckSum=0-HMem::CheckSum((TUint *)header, iHeader->iRomSize-(iHeader->iRomSectionHeader-iHeader->iRomBase)); + } + } + +// +void E32Rom::FinaliseExtensionHeader(MRomImage* aKernelRom) + { + TExtensionRomHeader* header = (TExtensionRomHeader*)iHeader; + + header->iVersion = iObey->iVersion; + header->iTime = iObey->iTime; + header->iRomBase = iObey->iRomLinearBase; + header->iRomSize = iObey->iRomSize; + + header->iKernelVersion = aKernelRom->Version(); + header->iKernelTime = aKernelRom->Time(); + header->iKernelCheckSum = aKernelRom->CheckSum(); + + header->iCheckSum=0; + header->iCheckSum=0-HMem::CheckSum((TUint *)header, iObey->iRomSize); + } + +void E32Rom::DisplayExtensionHeader() +// +// Display info from extension ROM header +// + { + + TExtensionRomHeader* header = (TExtensionRomHeader*)iHeader; + + TVersion version = header->iVersion; + Print(ELog,"\n\nExtension Rom details:\n"); + Print(ELog,"Version %d.%02d(%03d) ", version.iMajor, version.iMinor, version.iBuild); + version = header->iKernelVersion; + Print(ELog,"(Kernel %d.%02d(%03d))\n", version.iMajor, version.iMinor, version.iBuild); + Print(ELog,"Linear base address: %08x\n",header->iRomBase); + Print(ELog,"Size: %08x\n",header->iRomSize); + Print(ELog,"Root directory list: %08x\n",header->iRomRootDirectoryList); + Print(ELog,"Checksum word: %08x (Kernel %08x)\n",header->iCheckSum, header->iKernelCheckSum); + Print(ELog,"Exception Search Table: %08x\n", header->iRomExceptionSearchTable); + + if (header->iRomExceptionSearchTable) + { + DisplayExceptionTable(header->iRomExceptionSearchTable); + } + + TRomRootDirectoryList* pR=(TRomRootDirectoryList*)RomToActualAddress(header->iRomRootDirectoryList); + Print(ELog,"\nRoot directories:\n"); + TInt i; + for (i=0; iiNumRootDirs; i++) + { + Print(ELog,"Directory %2d %08x %08x\n",i,pR->iRootDir[i].iHardwareVariant,pR->iRootDir[i].iAddressLin); + } + Print(ELog, "\n"); + } + + + + +