예제 #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);
    }
예제 #2
0
파일: vmLib.c 프로젝트: phoboz/vmx
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;
}
예제 #3
0
파일: vmLib.c 프로젝트: phoboz/vmx
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;
}
예제 #4
0
파일: vmLib.c 프로젝트: phoboz/vmx
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;
}