📄 vxsg.c
字号:
/*
FILE vxsg.c
HISTORY
951030 Tilakraj Roy Created
961211 TR Changed interfaces for calling from tmbuffer.
Contains routines for page locking non contigious buffers for peripheral bus
master DMA transfers. Contains Windows specific code. Does not contain i960 or
TriMedia code.
*/
#define WANTVXDWRAPS
#include "basedef.h"
#include "vmm.h"
#include "vmmreg.h"
#include "vxdwraps.h"
#include "vxstd.h"
#include "vxwin.h"
#include "vxdbg.h"
#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG
// tbd
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES( LinearAddress, Size )
BOOL sgBufferLock ( PVOID pBuffer, DWORD dwSize, PVOID *ppEDDS )
{
PEDDS pEDDS;
WORD wMaxNumPTE;
WORD wSizeOfEDDS;
WORD wIdx;
// number of entries needed to lock the pages.
wMaxNumPTE = (WORD) ( dwSize >> 12 ) + 2;
// calculate the size of edds for page locking
wSizeOfEDDS = ( wMaxNumPTE * sizeof ( PTE ) ) + sizeof ( EDDS );
// allocate entries for the page frame table and the Extended DMA Desc
if ( ( pEDDS = (PEDDS) winHeapAllocate ( wSizeOfEDDS ) ) == NULL )
{
DP(0,"sgBufferLock:HeapAllocate:FAIL\n");
return FALSE;
}
pEDDS->dwSize = dwSize;
pEDDS->dwLinear = (DWORD)pBuffer;
pEDDS->wSegment = 0;
pEDDS->wAvailable = wMaxNumPTE;
//lock the applications buffer
if ( winVDMAD_Scatter_Lock ( winGet_Sys_VM_Handle(), 0, pEDDS ) !=
STATUS_SUCCESS )
{
DP(0,"sgBufferLock:VDMAD_Scatter_Lock:Buffer:FAIL\n");
return FALSE;
}
DP(5,"sgBufferLock:Buffer[%x]:Size[%x]:PTE#[%x]\n",
pBuffer, dwSize, pEDDS->wUsed);
/*
DP(5,"sgBufferLock:PTE[0]:Phys[%x]:Size[%x]\n",
pEDDS->PageTable[0].dwPhysAddr, pEDDS->PageTable[0].dwSize);
DP(5,"sgBufferLock:PTE[%x]:Phys[%x]:Size[%x]\n",
( pEDDS->wUsed - 1 ),pEDDS->PageTable[( pEDDS->wUsed - 1 )].dwPhysAddr,
pEDDS->PageTable[( pEDDS->wUsed - 1 )].dwSize);
*/
for ( wIdx = 0 ; wIdx < pEDDS->wUsed ; wIdx++ )
{
DP(5,"PTE[%x]:Phys[%x]:Size[%x]\n",wIdx,pEDDS->PageTable[wIdx].dwPhysAddr, pEDDS->PageTable[wIdx].dwSize);
}
*ppEDDS = pEDDS;
return TRUE;
}
BOOL sgBufferUnlock( PVOID pvEDDS )
{
PEDDS pEDDS = (PEDDS)pvEDDS;
DP(5,"sgBufferUnlock:EDDS[%x]:Buffer[%x]:Size[%x]:PTE#[%x]\n",
pEDDS, pEDDS->dwLinear, pEDDS->dwSize, pEDDS->wUsed);
if ( winVDMAD_Scatter_Unlock ( winGet_Sys_VM_Handle(), 0, pEDDS ) !=
STATUS_SUCCESS )
{
DP(0,"sgBufferUnlock:VDMAD_Scatter_Unlock:Buffer:FAIL\n");
return FALSE;
}
winHeapFree ( (DWORD)pEDDS );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -