summaryrefslogblamecommitdiffstats
path: root/private/ntos/nthals/x86new/miscops.c
blob: 5cfd3cf2c68f514f6a0e8c2048a96a86a3fd59f3 (plain) (tree)


















































































































































































                                                                                    
/*++

Copyright (c) 1994  Microsoft Corporation

Module Name:

    miscops.c

Abstract:

    This module implements the code to emulate miscellaneous opcodes.

Author:

    David N. Cutler (davec) 22-Sep-1994

Environment:

    Kernel mode only.

Revision History:

--*/

#include "nthal.h"
#include "emulate.h"

VOID
XmBoundOp (
    PRXM_CONTEXT P
    )

/*++

Routine Description:

    This function emulates a bound opcode.

Arguments:

    P - Supplies a pointer to an emulator context structure.

Return Value:

    None.

--*/

{

    union {
        LONG Long;
        SHORT Word;
    } LowerBound;

    union {
        LONG Long;
        SHORT Word;
    } UpperBound;

    ULONG Offset;

    //
    // Get lower and upper bounds and check index against index value.
    //

    Offset = P->SrcValue.Long;
    XmSetSourceValue(P, XmGetOffsetAddress(P, Offset));
    LowerBound.Long = P->SrcValue.Long;
    XmSetSourceValue(P, XmGetOffsetAddress(P, Offset + P->DataType + 1));
    UpperBound.Long = P->SrcValue.Long;
    if (P->DataType == LONG_DATA) {
        if (((LONG)(*P->DstLong) < LowerBound.Long) ||
            ((LONG)(*P->DstLong) > (UpperBound.Long + (LONG)(P->DataType + 1)))) {
            longjmp(&P->JumpBuffer[0], XM_INDEX_OUT_OF_BOUNDS);
        }

    } else {
        if (((SHORT)(*P->DstWord) < LowerBound.Word) ||
            ((SHORT)(*P->DstWord) > (UpperBound.Word + (SHORT)(P->DataType + 1)))) {
            longjmp(&P->JumpBuffer[0], XM_INDEX_OUT_OF_BOUNDS);
        }
    }

    return;
}

VOID
XmBswapOp (
    PRXM_CONTEXT P
    )

/*++

Routine Description:

    This function emulates a bswap opcode.

Arguments:

    P - Supplies a pointer to an emulator context structure.

Return Value:

    None.

--*/

{

    ULONG Result;

    //
    // Swap bytes and set result value.
    //

    Result = (P->SrcValue.Long << 24) | ((P->SrcValue.Long & 0xff00) << 8) |
             (P->SrcValue.Long >> 24) | ((P->SrcValue.Long >> 8) & 0xff00);

    XmStoreResult(P, Result);
    return;
}

VOID
XmIllOp (
    PRXM_CONTEXT P
    )

/*++

Routine Description:

    This function emulates an illegal opcode.

Arguments:

    P - Supplies a pointer to an emulator context structure.

Return Value:

    None.

--*/

{

    //
    // Raise an illegal opcode exception.
    //

    longjmp(&P->JumpBuffer[0], XM_ILLEGAL_INSTRUCTION_OPCODE);
    return;
}

VOID
XmNopOp (
    PRXM_CONTEXT P
    )

/*++

Routine Description:

    This function emulates a nop opcode.

Arguments:

    P - Supplies a pointer to an emulator context structure.

Return Value:

    None.

--*/

{

    return;
}