⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heapman.h

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 H
字号:
/*****************************************************************************
 Name			: HEAPMAN.H
 
 Title			: Shared memory heap manager. 
 
 C Author 		: Dave Roberts
 
 Created  		: 24 / 10 /03
 
 Copyright    : 2002-2003 by Imagination Technologies Limited.
                All rights reserved.  No part of this software, either
                material or conceptual may be copied or distributed,
                transmitted, transcribed, stored in a retrieval system
                or translated into any human or computer language in any
                form by any means, electronic, mechanical, manual or
                other-wise, or disclosed to third parties without the
                express written permission of Imagination Technologies
                Limited, Unit 8, HomePark Industrial Estate,
                King's Langley, Hertfordshire, WD4 8LZ, U.K.

 Description 	: heap manager stuff for shared memory
   
 Program Type	: 32-bit DLL

  Modifications	:
 Initial revision
*****************************************************************************/
#ifndef _HEAPMAN_
#define _HEAPMAN_

extern IMG_UINT32 ui32HeapCheckLevel;

/*****************************************************************************
 Host heap structure definitions
*****************************************************************************/
typedef struct _GLOB_HEAP_ GLOB_HEAP;
typedef struct _HOST_HEAP_ *PHOST_HEAP;

typedef IMG_PVOID (HOST_PAGE_ALLOC_FN)(IMG_UINT32 ui32NumPages, IMG_PVOID pvHeapContext, IMG_PVOID *ppvAllocContext, IMG_PVOID pvLinAddr);
typedef IMG_VOID (HOST_PAGE_FREE_FN)(IMG_PVOID pvLinAddr, IMG_UINT32 ui32NumPages, IMG_PVOID pvHeapContext, IMG_PVOID pvAllocContext);
typedef IMG_VOID (HOST_HEAP_CHECK_FN)(PHOST_HEAP psHeap);
typedef IMG_VOID (*PFN_HEAPBLOCK_CALLBACK)(IMG_BOOL bAlloc, IMG_PVOID pvAddr, IMG_UINT32 ui32Size);

typedef struct _PAGE_STATE
{
	IMG_BOOL		bPageCommitted;
	IMG_PVOID		pvLinearAddr;
}PAGE_STATE, *PPAGE_STATE;


typedef struct _HOST_HEAP_
{
	IMG_UINT32				ui32AllocsInHeap;
	GLOB_HEAP				*psHeapStart;
	GLOB_HEAP				*psFreeHeapStart;
	/*If zero, then heap size is unlimited*/
	IMG_UINT32				ui32MaxHeapSizeInPages;
	IMG_UINT32				ui32CurHeapSizeInPages;
	IMG_UINT32				ui32ExpandSizeInPages;
	IMG_UINT32				ui32MaxSingleHeapAllocInBytes;
	/* If TRUE, requests for more than 'ui32MaxSingleHeapAllocInBytes'
	will be fulfilled by a single call to the appropriate host page
	alloc routine*/
	IMG_BOOL				bAllowLargeSingleAllocs;
	HOST_PAGE_ALLOC_FN		*pfnHostAllocPage;
	HOST_PAGE_FREE_FN		*pfnHostFreePage;
	HOST_HEAP_CHECK_FN		*pfnDedicatedHeapCheck;
	IMG_PVOID				pvCheckContext;
	IMG_UINT32				ui32Flags;
	IMG_PVOID				pvLinearBase;
	PPAGE_STATE				psPageState;
} HOST_HEAP;

#define HEAP_ALLOC_CANT_SPLIT_PAGE	0x00000001

typedef IMG_VOID (*POWNER_FN) (IMG_VOID);

typedef struct _GLOB_HEAP_
{
	IMG_UINT32				ui32Signiture;		
	IMG_UINT32				ui32BlockSize;	/*Size of block including block header, alignment buffer and back pointer*/
	IMG_UINT32				ui32Flags;
	struct _GLOB_HEAP_		*psPrev;
	struct _GLOB_HEAP_		*psNext;
	struct _GLOB_HEAP_		*psPrevFree;
	struct _GLOB_HEAP_		*psNextFree;
	HOST_HEAP				*psHeap;
	PPAGE_STATE				psPageState;
	#if defined(DEBUG) && !defined(NO_ALLOC_TRACKING)
	POWNER_FN				pfnOwner;
	#endif /* #if defined(DEBUG) && !defined(NO_ALLOC_TRACKING) */
}*PGLOB_HEAP;


typedef struct
{
	GLOB_HEAP		sGlobHeap;
	IMG_PVOID		pvBlkAllocContext;
}GLOB_HEAP_HEAD, *PGLOB_HEAP_HEAD;		/* Used for first allocation as we have to store a allocation context */


typedef union _PTE
{
	struct
	{
		IMG_UINT32	Present : 1;
		IMG_UINT32	Write : 1;
		IMG_UINT32	UserAccess : 1;
		IMG_UINT32	WriteThrough : 1;
		IMG_UINT32	CacheDisabled : 1;
		IMG_UINT32	Accessed : 1;
		IMG_UINT32	Dirty : 1;
		IMG_UINT32	Reserved : 1;
		IMG_UINT32	GlobalPage : 1;
		IMG_UINT32	AvailForSoftware : 3;
		IMG_UINT32	PageBase : 20;
	}sBitsFields;
	IMG_UINT32	ui32Value;
}PTE, *PPTE;

typedef union _PDE
{
	struct
	{
		IMG_UINT32	Present : 1;
		IMG_UINT32	Write : 1;
		IMG_UINT32	UserAccess : 1;
		IMG_UINT32	WriteThrough : 1;
		IMG_UINT32	CacheDisabled : 1;
		IMG_UINT32	Accessed : 1;
		IMG_UINT32	Reserved : 1;
		IMG_UINT32	BigPages : 1;
		IMG_UINT32	Ignored : 1;
		IMG_UINT32	AvailForSoftware : 3;
		IMG_UINT32	PageTableBase : 20;
	}sBitsFields;
	IMG_UINT32	ui32Value;
}PDE, *PPDE;


typedef union _LINEAR_ADDR
{
	struct
	{
		IMG_UINT32	Offset : 12;
		IMG_UINT32	PTEIndex : 10;
		IMG_UINT32	PDEIndex : 10;
	}sBitsFields;
	IMG_UINT32	ui32Value;
}LINEAR_ADDR, *PLINEAR_ADDR;


typedef union _CR3
{
	struct
	{
		IMG_UINT32	Reserved1: 3;
		IMG_UINT32	WriteThrough : 1;
		IMG_UINT32	CacheDisabled : 1;
		IMG_UINT32	Reserved2 : 7;
		IMG_UINT32	PageDirBase : 20;
	}sBitsFields;
	IMG_UINT32	ui32Value;
}CR3, *PCR3;


/* 
	env data, local to WinCE 
	- convenient place to put this
	- scope needs to be across WinCE hostfunc files
*/
typedef struct _ENV_DATA
{
	/* This needs to be at the top of the structure for dodgy XSCALE power management hack */
    volatile HANDLE	hISRThreadEventHandle;
	HOST_HEAP		*psHeap;
    HANDLE          hISRHandle;
    HANDLE          hISTThread;
    IMG_UINT32      ui32TransIRQ;
}ENV_DATA;


#define HOST_HEAP_SIGNITURE			'pHMK'
#define GHEAP_BLOCK_ALLOCATED		0x000001
#define GHEAP_BLOCK_HEAD			0x000002
#define GHEAP_SINGLE				0x000004
#define MAX_ALLOC_CALLBACKS	5


#define HOST_HEAP_DBGCHK_NONE		0
#define HOST_HEAP_DBGCHK_STRUCT		1
#define HOST_HEAP_DBGCHK_FREEHEAP	2
#define HOST_HEAP_DBGCHK_CORRUPTION 3

#define DBG_MEMORY_INITIALIZER			0xe2
#define DBG_MEMORY_DEALLOC_INITIALIZER	0xd2

IMG_UINT32 AddHostHeapBlockAllocCallback(PFN_HEAPBLOCK_CALLBACK pfnFunc);
IMG_UINT32 RemoveHostHeapBlockAllocCallback(PFN_HEAPBLOCK_CALLBACK pfnFunc);
IMG_VOID CheckSingleHeap(HOST_HEAP *psHeap, IMG_BOOL bPrintHeap);
IMG_PVOID MemHeapAlloc(HOST_HEAP *psHostHeap, IMG_UINT32 ui32Size, IMG_UINT32 ui32Alignment, IMG_PVOID pvContext, IMG_UINT32 ui32OwnerAddr);
IMG_BOOL MemHeapFree(IMG_PVOID pvMemPtr, IMG_PVOID pvContext);
PVRSRV_ERROR InitHeapman(HOST_HEAP **ppsHeap);
PVRSRV_ERROR DeInitHeapman(HOST_HEAP *psHeap);
IMG_UINT32 FindBlockAllocSize(PGLOB_HEAP psBlock);

#endif /* _HEAPMAN_ */
/*****************************************************************************
 End of file (heapman.h)
*****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -