📄 com_sgd.c
字号:
#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 + -