📄 com_sgd.h
字号:
#ifndef __MV_COM_SGD_H__#define __MV_COM_SGD_H__struct _sgd_tbl_t;struct _sgd_t;#define SGD_DOMAIN_MASK 0xF0000000L#define SGD_EOT (1L<<27) /* End of table */#define SGD_COMPACT (1L<<26) /* Compact (12 bytes) SG format, not verified yet */#define SGD_WIDE (1L<<25) /* 32 byte SG format */#define SGD_X64 (1L<<24) /* the 2nd part of SGD_WIDE */#define SGD_NEXT_TBL (1L<<23) /* Next SG table format */#define SGD_VIRTUAL (1L<<22) /* Virtual SG format, either 32 or 64 bit is determined during compile time. */#define SGD_REFTBL (1L<<21) /* sg table reference format, either 32 or 64 bit is determined during compile time. */#define SGD_REFSGD (1L<<20) /* sg item reference format */#define SGD_VP (1L<<19) /* virtual and physical, not verified yet */#define SGD_VWOXCTX (1L<<18) /* virtual without translation context */#define SGD_PCTX (1L<<17) /* sgd_pctx_t, 64 bit only */typedef struct _sg_common_t{ MV_U32 dword1; MV_U32 dword2; MV_U32 flags; /* SGD_xxx */ MV_U32 dword3;} sg_common_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_t{ MV_U64 baseAddr; MV_U32 flags; MV_U32 size;} sgd_t;/*---------------------------------------------------------------------------*/#define GET_COMPACT_SGD_SIZE(sgd) \ ((((sgd_compact_t*)(sgd))->flags) & 0x3FFFFFL)#define SET_COMPACT_SGD_SIZE(sgd,sz) do { \ (((sgd_compact_t*)(sgd))->flags) &= ~0x3FFFFFL; \ (((sgd_compact_t*)(sgd))->flags) |= (sz); \} while(0)#define SIZEOF_COMPACT_SGD 12typedef struct _sgd_compact_t{ MV_U64 baseAddr; MV_U32 flags;} sgd_compact_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_v32_t{ MV_PVOID vaddr; MV_PVOID xctx; MV_U32 flags; MV_U32 size;} sgd_v32_t;/* sgd_v_t defines 32/64 bit virtual sgd without translation context */typedef struct _sgd_v_t{ union { MV_PVOID vaddr; MV_U64 dummy; } u; MV_U32 flags; MV_U32 size;} sgd_v_t;typedef struct _sgd_v64_t{ union { MV_PVOID vaddr; MV_U64 dummy; } u1; MV_U32 flags; MV_U32 size; union { MV_PVOID xctx; MV_U64 dummy; } u2; MV_U32 flagsEx; MV_U32 rsvd;} sgd_v64_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_ref32_t{ MV_PVOID ref; MV_U32 offset; MV_U32 flags; MV_U32 size;} sgd_ref32_t;typedef struct _sgd_ref64_t{ union { MV_PVOID ref; MV_U64 dummy; } u; MV_U32 flags; MV_U32 size; MV_U32 offset; MV_U32 rsvd1; MV_U32 flagsEx; MV_U32 rsvd2;} sgd_ref64_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_nt_t{ union { struct _sgd_tbl_t* next; MV_U64 dummy; } u; MV_U32 flags; MV_U32 rsvd;} sgd_nt_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_vp_t{ MV_U64 baseAddr; MV_U32 flags; // SGD_VP | SGD_WIDE MV_U32 size; union { MV_PVOID vaddr; MV_U64 dummy; } u; MV_U32 flagsEx; // SGD_X64 MV_U32 rsvd;} sgd_vp_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_pctx_t{ MV_U64 baseAddr; MV_U32 flags; // SGD_PCTX | SGD_WIDE MV_U32 size; union { MV_PVOID xctx; MV_U64 dummy; } u; MV_U32 flagsEx; // SGD_X64 MV_U32 rsvd;} sgd_pctx_t;/*---------------------------------------------------------------------------*/typedef struct _sgd_tbl_t{ MV_U8 Max_Entry_Count; MV_U8 Valid_Entry_Count; MV_U8 Flag; MV_U8 Reserved0; MV_U32 Byte_Count; sgd_t* Entry_Ptr;} sgd_tbl_t;#define sgd_table_init(sgdt,maxCnt,entries) do { \ MV_ZeroMemory(sgdt,sizeof(sgd_tbl_t)); \ (sgdt)->Max_Entry_Count = (maxCnt); \ (sgdt)->Entry_Ptr = (sgd_t*)(entries); \} while(0)/*---------------------------------------------------------------------------*/#define sgd_inc(sgd) do { \ if( (sgd)->flags & SGD_COMPACT ) \ sgd = (sgd_t*)(((unsigned char*) (sgd)) + 12); \ else if( (sgd)->flags & SGD_WIDE ) \ sgd = (sgd_t*)(((unsigned char*) (sgd)) + 32); \ else sgd = (sgd_t*)(((unsigned char*) (sgd)) + 16); \} while(0)#define sgd_get_vaddr(sgd,v) do { \ if( (sgd)->flags & SGD_VIRTUAL ) { \ if( (sgd)->flags & SGD_WIDE ) \ (v) = ((sgd_v64_t*)(sgd))->u1.vaddr;\ else (v) = ((sgd_v32_t*)(sgd))->vaddr; \ } \ else if( (sgd)->flags & SGD_VWOXCTX ) \ (v) = ((sgd_v_t*)sgd)->u.vaddr; \ else if( (sgd)->flags & SGD_VP ) \ (v) = ((sgd_vp_t*)(sgd))->u.vaddr; \ else \ MV_ASSERT(MV_FALSE); \} while(0)#define sgd_get_xctx(sgd,v) do { \ if( (sgd)->flags & SGD_WIDE ) (v) = ((sgd_v64_t*)(sgd))->u2.xctx; \ else (v) = ((sgd_v32_t*)(sgd))->xctx; \} while(0)#define sgd_get_ref(sgd,_ref) do { \ if( (sgd)->flags & SGD_WIDE ) (_ref) = ((sgd_ref64_t*)(sgd))->u.ref; \ else (_ref) = ((sgd_ref32_t*)(sgd))->ref; \} while(0)#define sgd_set_ref(sgd,_ref) do { \ if( (sgd)->flags & SGD_WIDE ) ((sgd_ref64_t*)(sgd))->u.ref = (_ref); \ else ((sgd_ref32_t*)(sgd))->ref = (_ref); \} while(0)#define sgd_get_reftbl(sgd,reft) do { \ if( (sgd)->flags & SGD_WIDE ) \ (reft) = (sgd_tbl_t*) (((sgd_ref64_t*)(sgd))->u.ref); \ else (reft) = (sgd_tbl_t*)(((sgd_ref32_t*)(sgd))->ref); \} while(0)#define sgd_get_refsgd(sgd,reft) do { \ if( (sgd)->flags & SGD_WIDE ) \ (reft) = (sgd_t*) (((sgd_ref64_t*)(sgd))->u.ref); \ else (reft) = (sgd_t*)(((sgd_ref32_t*)(sgd))->ref); \} while(0)#define sgd_get_refoff(sgd,off) do { \ if( (sgd)->flags & SGD_WIDE ) (off) = ((sgd_ref64_t*)(sgd))->offset; \ else (off) = ((sgd_ref32_t*)(sgd))->offset; \} while(0)#define sgd_set_refoff(sgd,off) do { \ if( (sgd)->flags & SGD_WIDE ) ((sgd_ref64_t*)(sgd))->offset = (off); \ else ((sgd_ref32_t*)(sgd))->offset = (off); \} while(0)#define sgd_get_nexttbl(sgd,n) do { \ n = ((sgd_nt_t*)(sgd))->u.next; \} while(0)#define sgd_mark_eot(sgd) \ ((sgd)->flags |= SGD_EOT)#define sgd_clear_eot(sgd) \ ((sgd)->flags &= ~SGD_EOT)#define sgd_eot(sgd) \ ((sgd)->flags & SGD_EOT)#define sgd_copy(sgdDst,sgdSrc) do { \ *(sgdDst) = *(sgdSrc); \ if( (sgdSrc)->flags & SGD_WIDE ) \ (sgdDst)[1] = (sgdSrc)[1]; \} while(0)#define sgd_getsz(sgd,sz) do { \ if( (sgd)->flags & SGD_COMPACT ) \ (sz) = GET_COMPACT_SGD_SIZE(sgd); \ else (sz) = (sgd)->size; \} while(0)#define sgd_setsz(sgd,sz) do { \ if( (sgd)->flags & SGD_COMPACT ) \ SET_COMPACT_SGD_SIZE(sgd,sz); \ else (sgd)->size = (sz); \} while(0)#define sgdt_get_lastsgd(sgdt,sgd) do { \ (sgd) = &(sgdt)->Entry_Ptr[(sgdt)->Valid_Entry_Count]; \ (sgd)--; \ if( (sgd)->flags & SGD_X64 ) (sgd)--; \} while(0)/*---------------------------------------------------------------------------*/typedef int (*sgd_visitor_t)(sgd_t* sgd, MV_PVOID pContext);int sgd_table_walk( sgd_tbl_t* sgdt, sgd_visitor_t visitor, MV_PVOID ctx );/*---------------------------------------------------------------------------*/typedef struct _sgd_iter_t{ sgd_t* sgd; /* current SG */ MV_U32 offset; /* offset in the SG */ MV_U32 remainCnt;} sgd_iter_t;void sgd_iter_init( sgd_iter_t* iter, sgd_t* sgd, MV_U32 offset, MV_U32 count );int sgd_iter_get_next( sgd_iter_t* iter, sgd_t* sgd );/*---------------------------------------------------------------------------*/void sgd_dump(sgd_t* sg, char* prefix);void sgdt_dump(sgd_tbl_t *SgTbl, char* prefix);/*---------------------------------------------------------------------------*/void sgdt_append( sgd_tbl_t* sgdt, MV_U32 address, MV_U32 addressHigh, MV_U32 size );void sgdt_append_pctx( sgd_tbl_t* sgdt, MV_U32 address, MV_U32 addressHigh, MV_U32 size, MV_PVOID xctx );int sgdt_append_virtual( sgd_tbl_t* sgdt, MV_PVOID virtual_address, MV_PVOID translation_ctx, MV_U32 size );int sgdt_append_ref( sgd_tbl_t* sgdt, MV_PVOID ref, MV_U32 offset, MV_U32 size, MV_BOOLEAN refTbl );int sgdt_append_vp( sgd_tbl_t* sgdt, MV_PVOID virtual_address, MV_U32 size, MV_U32 address, MV_U32 addressHigh );voidsgdt_copy_partial( sgd_tbl_t* sgdt, sgd_t** ppsgd, MV_PU32 poff, MV_U32 size );void sgdt_append_sgd( sgd_tbl_t* sgdt, sgd_t* sgd );#define sgdt_append_reftbl(sgdt,refSgdt,offset,size) \ sgdt_append_ref(sgdt,refSgdt,offset,size,MV_TRUE)#define sgdt_append_refsgd(sgdt,refSgd,offset,size) \ sgdt_append_ref(sgdt,refSgd,offset,size,MV_FALSE)/*---------------------------------------------------------------------------*/int sgdt_prepare_hwprd( MV_PVOID pCore, sgd_tbl_t* pSource, sgd_t* pSg, int availSgEntry );#endif /*__MV_COM_SGD_H__*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -