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; }