Beispiel #1
0
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 (&currentContext->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 (&currentContext->sem);

    return (retVal);
    }
Beispiel #2
0
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;
}