kernel/eka/memmodel/emul/win32/minit.cpp
changeset 0 a41df078684a
child 62 4a8fed1c0ef6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/memmodel/emul/win32/minit.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,145 @@
+// Copyright (c) 1996-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:
+// e32\memmodel\emul\win32\minit.cpp
+// 
+//
+
+#include "memmodel.h"
+#include <emulator.h>
+#include <property.h>
+
+_LIT8(KKernelFullPathName,"EKern.exe");
+_LIT8(KLitRamAlloc,"RamAlloc");
+
+void M::Init1()
+	{
+	__KTRACE_OPT2(KBOOT,KMMU,Kern::Printf("M::Init1"));
+	
+	SAddressInfo ainfo;
+	Emul::TheAsic->AddressInfo(ainfo);
+
+	MM::RamChunkSize = KRamChunkSize;
+	MM::RamChunkShift = KRamChunkShift;
+	MM::RamPageSize = KRamPageSize;
+	MM::RamPageShift = KRamPageShift;
+	MM::FreeMemory = ainfo.iTotalRamSize;
+	TheSuperPage().iTotalRamSize = ainfo.iTotalRamSize;
+	K::MaxFreeRam = ainfo.iTotalRamSize;
+	PP::RamDriveMaxSize = ainfo.iRamDriveMaxSize;
+
+	K::SupervisorThreadStackSize=0x1000;	// 4K
+
+	K::MachineConfig=(TMachineConfig*)A::MachineConfiguration().Ptr();
+
+	K::MaxMemCopyInOneGo=KDefaultMaxMemCopyInOneGo;
+	__KTRACE_OPT(KBOOT,Kern::Printf("K::MaxMemCopyInOneGo=0x%x",K::MaxMemCopyInOneGo));
+
+	LPVOID kheap = VirtualAlloc(NULL, KKernelHeapSizeMax, MEM_RESERVE, PAGE_READWRITE);
+	__ASSERT_ALWAYS(kheap, MM::Panic(MM::EKernelHeapReserveFailed));
+	kheap = VirtualAlloc(kheap, KKernelHeapSizeMin, MEM_COMMIT, PAGE_READWRITE);
+	__ASSERT_ALWAYS(kheap, MM::Panic(MM::EKernelHeapCommitFailed));
+	MM::KernelHeapAddress = kheap;
+	K::MemModelAttributes = (TUint32)(EMemModelTypeEmul|EMemModelAttrNonExProt|EMemModelAttrWriteProt|EMemModelAttrVA);
+	
+	MM::Init1();
+	}
+
+void M::Init2()
+	{
+	__KTRACE_OPT2(KBOOT,KMMU,Kern::Printf("M::Init2"));
+	TInt r=K::MutexCreate((DMutex*&)MM::RamAllocatorMutex, KLitRamAlloc, NULL, EFalse, KMutexOrdRamAlloc);
+	__ASSERT_ALWAYS(r==KErrNone, MM::Panic(MM::ERamAllocMutexCreateFailed));
+	}
+
+void M::Init3()
+	{
+	__KTRACE_OPT2(KBOOT,KMMU,Kern::Printf("M::Init3"));
+	}
+
+// kernel heap construction
+
+void P::KernelInfo(TProcessCreateInfo& aInfo, TAny*& aStack, TAny*& aHeap)
+	{
+	memclr(&aInfo.iUids, sizeof(TProcessCreateInfo)-sizeof(aInfo.iFileName));
+	aInfo.iFileName=KKernelFullPathName;
+	aInfo.iRootNameOffset=0;
+	aInfo.iRootNameLength=9;
+	aInfo.iExtOffset=5;
+	aInfo.iAttr=ECodeSegAttKernel|ECodeSegAttFixed;
+
+	aStack=NULL;
+	aHeap=(TAny*)MM::KernelHeapAddress;
+
+#ifdef _UNICODE
+	TUint16 nameW[KMaxFileName+1];
+	int index;
+	for(index=0;index<aInfo.iFileName.Length();index++)
+		nameW[index] = (TUint16)aInfo.iFileName[index];
+	nameW[index] = 0;
+	Emulator::RImageFile pefile;
+	TInt r = pefile.Open((LPCTSTR)nameW);
+#else
+	TFileName name=aInfo.iFileName;
+	name.Append('\0');
+	Emulator::RImageFile pefile;
+	TInt r = pefile.Open((LPCTSTR)name.Ptr());
+#endif
+	if (r == KErrNone)
+		{
+		pefile.GetInfo(aInfo);
+		pefile.Close();
+		}
+	__ASSERT_ALWAYS(r==KErrNone, FAULT());
+	aInfo.iHeapSizeMin = KKernelHeapSizeMin;
+	aInfo.iHeapSizeMax = KKernelHeapSizeMax;
+	aInfo.iDataRunAddress = (TLinAddr)MM::KernelHeapAddress;
+	aInfo.iStackSize = 0;
+	}
+
+TInt M::InitSvHeapChunk(DChunk* aChunk, TInt aSize)
+	{
+	DWin32Chunk* pC=(DWin32Chunk*)aChunk;
+	aSize = MM::RoundToPageSize(aSize);
+	pC->iSize = aSize;
+	pC->iBase = (TUint8*)K::Allocator;
+// mark the kernel heap pages as allocated
+	MM::FreeMemory -= aSize;
+	__KTRACE_OPT(KBOOT,Kern::Printf("Created SvHeap chunk, addr %08X, init size %08X max size %08X",pC->Base(),aSize,pC->MaxSize()));
+	K::HeapInfo.iChunk = aChunk;
+	K::HeapInfo.iBase = pC->iBase;
+	K::HeapInfo.iMaxSize = pC->MaxSize();
+	return KErrNone;
+	}
+
+void RHeapK::Mutate(TInt aOffset, TInt aMaxLength)
+//
+// Used by the kernel to mutate a fixed heap into a chunk heap.
+//
+	{
+	iMinLength += aOffset;
+	iMaxLength = aMaxLength + aOffset;
+	iOffset = aOffset;
+	iChunkHandle = (TInt)K::HeapInfo.iChunk;
+	iPageSize = M::PageSizeInBytes();
+	iGrowBy = iPageSize;
+	iFlags &= ~(RAllocator::ESingleThreaded|RAllocator::EFixedSize);
+	}
+
+//
+
+TInt M::InitSvStackChunk()
+	{
+	return KErrNone;
+	}
+