kernel/eka/include/memmodel/epoc/direct/memmodel.h
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/memmodel/epoc/direct/memmodel.h	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,175 @@
+// Copyright (c) 1998-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\include\memmodel\epoc\direct\memmodel.h
+// 
+// WARNING: This file contains some APIs which are internal and are subject
+//          to change without notice. Such APIs should therefore not be used
+//          outside the Kernel and Hardware Services package.
+//
+
+#ifndef __MEMMODEL_H__
+#define __MEMMODEL_H__
+#include <plat_priv.h>
+
+/********************************************
+ * Process Control Block
+ ********************************************/
+
+class DMemModelChunk;
+
+/**
+@internalComponent
+*/
+class DMemModelProcess : public DEpocProcess
+	{
+public:
+	void Destruct();
+public:
+	virtual TInt DoCreate(TBool aKernelProcess, TProcessCreateInfo& aInfo);
+	virtual TInt NewChunk(DChunk*& aChunk, SChunkCreateInfo& anInfo, TLinAddr& aRunAddr);
+	virtual TInt AddChunk(DChunk* aChunk,TBool isReadOnly);
+	virtual TInt NewShPool(DShPool*& aPool, TShPoolCreateInfo& aInfo);
+	virtual TInt CreateDataBssStackArea(TProcessCreateInfo& aInfo);
+	virtual TInt MapCodeSeg(DCodeSeg* aCodeSeg);
+	virtual void UnmapCodeSeg(DCodeSeg* aCodeSeg);
+	virtual void RemoveDllData();
+	virtual void FinalRelease();
+public:
+	friend class Monitor;
+	};
+
+/********************************************
+ * Chunk Control Block
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class DMemModelChunk : public DChunk
+	{
+public:
+	enum TMemModelChunkAttributes
+		{
+		EPrivate=0x10000000,
+	
+		EMMChunkAttributesMask = EPrivate,
+		};
+
+public:
+	~DMemModelChunk();
+public:
+//	virtual TInt Close(TAny* aPtr);
+	virtual TInt DoCreate(SChunkCreateInfo& anInfo);
+	virtual TInt Adjust(TInt aNewSize);
+	virtual TInt AdjustDoubleEnded(TInt aBottom, TInt aTop);
+	virtual TInt CheckAccess();
+	virtual TInt Commit(TInt anOffset, TInt aSize, TCommitType aCommitType=DChunk::ECommitDiscontiguous, TUint32* aExtraArg=0);
+	virtual TInt Allocate(TInt aSize, TInt aGuard=0, TInt aAlign=0);
+	virtual TInt Decommit(TInt anOffset, TInt aSize);
+	virtual TInt Lock(TInt anOffset, TInt aSize);
+	virtual TInt Unlock(TInt anOffset, TInt aSize);
+	virtual TInt Address(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress);
+	virtual TInt PhysicalAddress(TInt aOffset, TInt aSize, TLinAddr& aKernelAddress, TUint32& aPhysicalAddress, TUint32* aPhysicalPageList=NULL);
+	virtual void BTracePrime(TInt aCategory);
+	virtual void Substitute(TInt aOffset, TPhysAddr aOldAddr, TPhysAddr aNewAddr);
+	virtual TUint8* Base(DProcess* aProcess);
+	inline TUint8* Base() const { return DChunk::Base(); }
+public:
+	void SetFixedAddress(TLinAddr anAddr, TInt aSize);
+public:
+	TLinAddr iRegionBase;
+	TInt iRegionSize;
+public:
+	friend class Monitor;
+	};
+
+/********************************************
+ * Code segment
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class DMemModelCodeSegMemory : public DEpocCodeSegMemory
+	{
+public:
+	DMemModelCodeSegMemory(DEpocCodeSeg* aCodeSeg);
+	};
+
+/**
+@internalComponent
+*/
+class DMemModelCodeSeg: public DEpocCodeSeg
+	{
+public:
+	DMemModelCodeSeg();
+	virtual ~DMemModelCodeSeg();
+	virtual TInt DoCreateRam(TCodeSegCreateInfo& aInfo, DProcess* aProcess);
+	virtual TInt DoCreateXIP(DProcess* aProcess);
+	virtual TInt Loaded(TCodeSegCreateInfo& aInfo);
+	virtual void ReadExportDir(TUint32* aDest);
+	virtual TBool FindCheck(DProcess* aProcess);
+	virtual TBool OpenCheck(DProcess* aProcess);
+public:
+	TLinAddr iDataAlloc;
+	TAny* iKernelData;			// only for kernel modules
+	};
+
+/********************************************
+ * Functions/Data defined in memory model
+ ********************************************/
+
+/**
+@internalComponent
+*/
+class MM
+	{
+public:
+	enum TMemModelPanic
+		{
+		ERamAllocCreateFailed=0,
+		ERamAllocMutexCreateFailed=1,
+		EFreeInvalidRegion=2,
+		ECodeSegCheckInconsistent=3,
+		ESecAllocCreateFailed=4,
+		EUnsupportedOperation=5,
+		};
+
+	static void Panic(TMemModelPanic aPanic);
+public:
+	static void Init1();
+	static void StartCrashDebugger();
+	static void WaitRamAlloc();
+	static void SignalRamAlloc();
+	static TUint32 RoundToBlockSize(TUint32 aSize);
+	static void FreeRegion(TLinAddr aBase, TInt aSize);
+	static TInt AllocRegion(TLinAddr& aBase, TInt aSize, TInt aAlign=0);
+	static TInt ClaimRegion(TLinAddr aBase, TInt aSize);
+	static TInt AllocContiguousRegion(TLinAddr& aBase, TInt aSize, TInt aAlign=0);
+	static TInt BlockNumber(TPhysAddr aAddr);
+public:
+	static TLinAddr UserDataSectionBase;
+	static TLinAddr UserRomDataSectionEnd;
+	static TLinAddr UserDataSectionEnd;
+	static TLinAddr RomLinearBase;
+	static DMutex* RamAllocatorMutex;
+	static TBitMapAllocator* RamAllocator;
+	static TBitMapAllocator* SecondaryAllocator;
+	static TInt RamBlockSize;
+	static TInt RamBlockShift;
+	static TInt InitialFreeMemory;
+	static TBool AllocFailed;
+	};
+
+#endif