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

📄 com_sgd.c

📁 6440linuxDriver的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "com_type.h"#include "com_define.h"#ifdef USE_NEW_SGTABLE#include "com_sgd.h"#include "com_u64.h"#include "com_dbg.h"#include "com_util.h"#include "hba_exp.h"#if defined(_64BPLATFORM) || defined(_64_SYS_)#define USES_64B_POINTER#endifint sg_iter_walk( 	IN sgd_t* sgd, 	IN MV_U32 offset, 	IN MV_U32 count, 	IN sgd_visitor_t visitor, 	IN MV_PVOID context 	){	sgd_t	sg[2];	int		sg_cnt = 0;	MV_U32	sz;	sgd_getsz(sgd,sz);	while( sz <= offset )	{		offset -= sz;		MV_ASSERT( !sgd_eot(sgd) );		sg_cnt++;		sgd_inc(sgd);		sgd_getsz(sgd,sz);	}	while(1)	{		if( sgd->flags & (SGD_REFTBL|SGD_REFSGD) )		{			MV_U32 copy_count = sz - offset;			MV_U32 offRef;			sgd_tbl_t* refSgdt;			sgd_t* refSgd;			sgd_get_reftbl(sgd,refSgdt);			if( sgd->flags & SGD_REFTBL )				refSgd = refSgdt->Entry_Ptr;			else				refSgd = (sgd_t*) refSgdt;			sgd_get_refoff(sgd,offRef);			if( copy_count > count )				copy_count = count;			if( !sg_iter_walk(				refSgd,				offRef + offset,				copy_count,				visitor,				context ) )				return 0;			count -= copy_count;		}		else if( sgd->flags & SGD_NEXT_TBL )		{			MV_ASSERT( MV_FALSE );	// TODO		}		else		{			sgd_copy( sg, sgd );			if( offset )			{				sg[0].baseAddr = U64_ADD_U32(sg[0].baseAddr,offset);				if( sgd->flags & SGD_VP )				{					((sgd_vp_t*)sg)->u.vaddr = ((MV_U8*) ((sgd_vp_t*)sg)->u.vaddr) + 						offset;				}				sg[0].size -= offset;			}			if( sg[0].size > count )				sg[0].size = count;			if( !visitor( sg, context ) )				return 0;			count -= sg[0].size;		}		sg_cnt++;		if( sgd_eot(sgd) 			|| count==0 )		{			MV_ASSERT( count == 0 );			break;		}		offset = 0;		sgd_inc(sgd);		sgd_getsz(sgd,sz);	}	return sg_cnt;}int sgd_table_walk(	sgd_tbl_t*		sgdt,	sgd_visitor_t	visitor,	MV_PVOID		ctx 	){	return sg_iter_walk( 		sgdt->Entry_Ptr,		0,		sgdt->Byte_Count,		visitor,		ctx );}void  sgd_iter_init(	sgd_iter_t*	iter,	sgd_t*		sgd,	MV_U32		offset,	MV_U32		count 	){	MV_U32	sz;	sgd_getsz(sgd,sz);	while( sz <= offset )	{		offset -= sz;		MV_ASSERT( !sgd_eot(sgd) );		sgd_inc(sgd);		sgd_getsz(sgd,sz);	}	iter->sgd = sgd;	iter->offset = offset;	iter->remainCnt = count;}int sgd_iter_get_next(	sgd_iter_t*	iter,	sgd_t*		sgd	){	MV_U32	sz;	if( iter->remainCnt == 0 )		return 0;	sgd_getsz(iter->sgd,sz);	while( iter->offset >= sz )	{		if( sgd_eot(iter->sgd) )		{			iter->remainCnt = 0;			return 0;		}		iter->offset -= sz;		sgd_inc(iter->sgd);		sgd_getsz(iter->sgd,sz);	}again:	if( iter->sgd->flags & (SGD_REFTBL|SGD_REFSGD) )	{		sgd_iter_t	sub_iter;		sgd_t*		refSgd;		sgd_tbl_t*	refSgdt;		MV_U32		sub_cnt = sz - iter->offset;		MV_U32		offRef;		if( sub_cnt > iter->remainCnt )			sub_cnt = iter->remainCnt;		sgd_get_reftbl(iter->sgd,refSgdt);		if( iter->sgd->flags & SGD_REFTBL )			refSgd = refSgdt->Entry_Ptr;		else			refSgd = (sgd_t*) refSgdt;		sgd_get_refoff(iter->sgd,offRef);		sgd_iter_init( 			&sub_iter, 			refSgd,			offRef + iter->offset,			sub_cnt );		if( !sgd_iter_get_next( &sub_iter, sgd ) )		{			if( sgd_eot(iter->sgd) )			{				iter->remainCnt = 0;				return 0;			}			sgd_inc(iter->sgd);			iter->offset = 0;			goto again;		}		else if( sgd->flags & SGD_NEXT_TBL )		{			MV_ASSERT( MV_FALSE );	// TODO		}		else		{			sgd_getsz(sgd,sz);			if( sz > iter->remainCnt )				sgd_setsz(sgd,iter->remainCnt);			iter->offset += sz;			iter->remainCnt -= sz;		}		return 1;	}	else	{		sgd_copy( sgd, iter->sgd );		sgd->baseAddr = U64_ADD_U32(sgd->baseAddr,iter->offset);		if( sgd->flags & SGD_VP )		{			((sgd_vp_t*)sgd)->u.vaddr = ((MV_U8*) ((sgd_vp_t*)sgd)->u.vaddr) + 				iter->offset;		}		sz -= iter->offset;		sgd_setsz( sgd, sz );	}	if( sz > iter->remainCnt )	{		sgd_setsz( sgd, iter->remainCnt );		sz = iter->remainCnt;	}	iter->remainCnt -= sz;	if( sgd_eot(iter->sgd) 		|| iter->remainCnt == 0 )	{		iter->remainCnt = 0;		return 1;	}	iter->offset = 0;	sgd_inc(iter->sgd);	return 1;}void sgd_dump(sgd_t* sg, char* prefix){	MV_U32	sz;	sgd_getsz(sg,sz);	if( prefix )	{		MV_PRINT( prefix );	}	if( sg->flags & SGD_VIRTUAL )	{		MV_PVOID vaddr, xctx;		sgd_get_vaddr(sg,vaddr);		sgd_get_xctx(sg,xctx);		MV_PRINT( "\tV %p T %p %08x F %08x\n"			, vaddr			, xctx			, sz			, sg->flags );	}	else if( sg->flags & (SGD_REFTBL|SGD_REFSGD) )	{		MV_PVOID ref;		MV_U32	refOff;		sgd_get_ref(sg,ref);		sgd_get_refoff(sg,refOff);		MV_PRINT( "\tR %p O %08x %08x F %08x\n"			, ref			, refOff			, sz			, sg->flags );	}	else if( sg->flags & SGD_NEXT_TBL )	{		MV_PVOID nexttbl;				sgd_get_nexttbl(sg, nexttbl);		MV_PRINT( "\tN %p F %08x\n"			, nexttbl, sg->flags );	}	else if( sg->flags & SGD_VP )	{		sgd_vp_t* vp = (sgd_vp_t*) sg;		MV_PRINT( "\tX %08x_%08x %p F %08x\n"			, vp->baseAddr.parts.high			, vp->baseAddr.parts.low			, vp->u.vaddr			, sg->flags );	}	else if( sg->flags & SGD_VWOXCTX )	{		sgd_v_t* vp = (sgd_v_t*) sg;		MV_PRINT( "\tV %p T %p %08x F %08x\n"			, vp->u.vaddr			, (MV_PVOID)0			, sz			, sg->flags );	}	else if( sg->flags & SGD_PCTX )	{		sgd_pctx_t* p = (sgd_pctx_t*) sg;		MV_PRINT( "\tP %08x_%08x %08x F %08x X %p\n"			, p->baseAddr.parts.high, p->baseAddr.parts.low, p->size, p->flags			, p->u.xctx );	}	else	{		MV_PRINT( "\tP %08x_%08x %08x F %08x\n"		, sg->baseAddr.parts.high, sg->baseAddr.parts.low, sz, sg->flags );	}}void sgdl_dump(sgd_t* sg, char* prefix ){	while(1)	{		sgd_dump(sg,prefix);		if( sg->flags & SGD_REFTBL )		{			sgd_tbl_t* tbl;			sgd_get_reftbl(sg,tbl);			sgdl_dump( tbl->Entry_Ptr, "R " );		}		else if( sg->flags & SGD_REFSGD )		{			sgd_t* refsgd;			sgd_get_refsgd(sg,refsgd);			sgdl_dump( refsgd, "R " );		}		if( sgd_eot(sg) )			break;		sgd_inc(sg);	}}void sgdt_dump(sgd_tbl_t *SgTbl, char* prefix){	sgd_t* sg = SgTbl->Entry_Ptr;	MV_PRINT( "%s %p %u of %u 0x%x bytes\n"		, prefix ? prefix : " "		, SgTbl		, SgTbl->Valid_Entry_Count		, SgTbl->Max_Entry_Count		, SgTbl->Byte_Count		);	if( !SgTbl->Valid_Entry_Count )		return;#if 0	sgdl_dump(sg, NULL);#else	while(1)	{		sgd_dump(sg,NULL);		if( sgd_eot(sg) )			break;		sgd_inc(sg);	}#endif}void sgdt_clear_eot(	sgd_tbl_t*	sgdt 	){	if( sgdt->Valid_Entry_Count )	{		sgd_t* sgd;		sgdt_get_lastsgd(sgdt,sgd);		sgd_clear_eot(sgd);	}}void sgdt_append(	sgd_tbl_t*	sgdt,	MV_U32		address,	MV_U32		addressHigh,	MV_U32		size	){	sgd_t* pSGEntry = &sgdt->Entry_Ptr[sgdt->Valid_Entry_Count];	MV_ASSERT( sgdt->Valid_Entry_Count+1<=sgdt->Max_Entry_Count );	sgdt_clear_eot(sgdt);	sgdt->Valid_Entry_Count += 1;	sgdt->Byte_Count += size;	pSGEntry->flags = 0;	pSGEntry->baseAddr.parts.low = address;	pSGEntry->baseAddr.parts.high = addressHigh;	pSGEntry->size = size;	sgd_mark_eot(pSGEntry);}void sgdt_append_pctx(	sgd_tbl_t*	sgdt,	MV_U32		address,	MV_U32		addressHigh,	MV_U32		size,	MV_PVOID	xctx	){	sgd_pctx_t* pSGEntry = (sgd_pctx_t*) &sgdt->Entry_Ptr[sgdt->Valid_Entry_Count];		MV_ASSERT( sgdt->Valid_Entry_Count+2<=sgdt->Max_Entry_Count );	sgdt_clear_eot(sgdt);	sgdt->Valid_Entry_Count += 2;	sgdt->Byte_Count += size;	pSGEntry->flags = SGD_PCTX | SGD_WIDE | SGD_EOT;	pSGEntry->baseAddr.parts.low = address;	pSGEntry->baseAddr.parts.high = addressHigh;	pSGEntry->size = size;	pSGEntry->u.xctx = xctx;	pSGEntry->flagsEx = SGD_X64;}

⌨️ 快捷键说明

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