STATUS vmBaseArch36Map ( void * virtAddr, /* 32bit virtual address */ LL_INT physAddr, /* 36bit physical address */ UINT32 stateMask, /* state mask */ UINT32 state, /* state */ UINT32 len /* length */ ) { INT32 pageSize = vmBasePageSizeGet (); INT8 * thisVirtPage = (INT8 *) virtAddr; LL_INT thisPhysPage = physAddr; FAST UINT32 numBytesProcessed = 0; STATUS retVal = OK; if (!vmLibInfo.vmBaseLibInstalled) return (ERROR); if ((NOT_PAGE_ALIGNED (thisVirtPage)) || (NOT_PAGE_ALIGNED (thisPhysPage)) || (NOT_PAGE_ALIGNED (len))) { errno = S_vmLib_NOT_PAGE_ALIGNED; return (ERROR); } semTake (¤tContext->sem, WAIT_FOREVER); while (numBytesProcessed < len) { if (MMU_PAGE_MAP (currentContext->mmuTransTbl, thisVirtPage, thisPhysPage) != OK) { retVal = ERROR; break; } if (vmBaseStateSet (currentContext, thisVirtPage, pageSize, stateMask, state) != OK) { retVal = ERROR; break; } thisVirtPage += pageSize; thisPhysPage += pageSize; numBytesProcessed += pageSize; } semGive (¤tContext->sem); return (retVal); }
STATUS vmMap( VM_CONTEXT_ID context, void *vAddr, void *pAddr, unsigned len ) { STATUS status; int pageSize = vmPageSize; char *thisVirtPage = (char *) vAddr; char *thisPhysPage = (char *) pAddr; int numBytesDone = 0; /* Check if context should be current */ if (context == NULL) { context = vmCurrContext; } /* Verify object class */ if (OBJ_VERIFY(context, vmContextClassId) != OK) { status = ERROR; } else if (NOT_PAGE_ALIGNED(thisVirtPage)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else if (NOT_PAGE_ALIGNED(len)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else { status = OK; semTake(&context->sem, WAIT_FOREVER); while (numBytesDone < len) { if (IS_IN_GLOBAL_SPACE(thisVirtPage)) { errnoSet(S_vmLib_ADDR_IN_GLOBAL_SPACE); status = ERROR; break; } /* Setup page */ if (MMU_PAGE_MAP( context->mmuTransTable, thisVirtPage, thisPhysPage ) != OK) { status = ERROR; break; } /* Set page state */ if (vmStateSet( context, thisVirtPage, pageSize, VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE ) != OK) { status = ERROR; break; } /* Advance */ thisVirtPage += pageSize; thisPhysPage += pageSize; numBytesDone += pageSize; } semGive(&context->sem); } return status; }
STATUS vmGlobalMap( void *vAddr, void *pAddr, unsigned len ) { STATUS status; int pageSize = vmPageSize; char *thisVirtPage = (char *) vAddr; char *thisPhysPage = (char *) pAddr; int numBytesDone = 0; if (vmLibInstalled != TRUE) { errnoSet(S_vmLib_NOT_INSTALLED); status = ERROR; } else { if (NOT_PAGE_ALIGNED(thisVirtPage)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else if (NOT_PAGE_ALIGNED(len)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else { status = OK; semTake(&globalMemMutex, WAIT_FOREVER); while (numBytesDone < len) { /* Setup page */ if (MMU_GLOBAL_PAGE_MAP(thisVirtPage, thisPhysPage) != OK) { status = ERROR; break; } /* Mark page as used */ globalPageBlockTable[ (unsigned) thisVirtPage / mmuPageBlockSize ] = TRUE; /* Advance */ thisVirtPage += pageSize; thisPhysPage += pageSize; numBytesDone += pageSize; } semGive(&globalMemMutex); } } return status; }
STATUS vmStateSet( VM_CONTEXT_ID context, void *vAddr, int len, unsigned mask, unsigned state ) { STATUS status; unsigned mmuState; unsigned mmuMask; char *thisPage = vAddr; int pageSize = vmPageSize; unsigned numBytesDone = 0; if (vmLibInstalled != TRUE) { errnoSet(S_vmLib_NOT_INSTALLED); status = ERROR; } else { /* Check if context should be current */ if (context == NULL) { context = vmCurrContext; } /* Verify object class */ if (OBJ_VERIFY(context, vmContextClassId) != OK) { status = ERROR; } else { if (NOT_PAGE_ALIGNED(thisPage)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else if (NOT_PAGE_ALIGNED(len)) { errnoSet(S_vmLib_NOT_PAGE_ALIGNED); status = ERROR; } else if (state > NUM_PAGE_STATES) { errnoSet(S_vmLib_INVALID_STATE); status = ERROR; } else if (mask > NUM_PAGE_STATES) { errnoSet(S_vmLib_INVALID_STATE_MASK); status = ERROR; } else { status = OK; /* Get mmu state */ mmuState = vmStateTransTable[state]; mmuMask = vmMaskTransTable[mask]; /* Setup states */ while (numBytesDone < len) { if (MMU_STATE_SET( context->mmuTransTable, thisPage, mmuMask, mmuState ) != OK) { status = ERROR; break; } /* Move to next page */ thisPage += pageSize; numBytesDone += pageSize; } } } } return status; }