blob: a4ed4894db2d18bd1fadd0c8379a7aa3ec54e216 [file] [log] [blame]
/** @file
EBC VM Test protocol for test purposes.
Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _EBC_VM_TEST_PROTOCOL_H_
#define _EBC_VM_TEST_PROTOCOL_H_
//
// Define a protocol for an EBC VM test interface.
//
#define EFI_EBC_VM_TEST_PROTOCOL_GUID \
{ \
0xAAEACCFD, 0xF27B, 0x4C17, { 0xB6, 0x10, 0x75, 0xCA, 0x1F, 0x2D, 0xFB, 0x52 } \
}
//
// Define for forward reference.
//
typedef struct _EFI_EBC_VM_TEST_PROTOCOL EFI_EBC_VM_TEST_PROTOCOL;
//
// VM major/minor version
//
#define VM_MAJOR_VERSION 1
#define VM_MINOR_VERSION 0
//
// Bits in the VM->StopFlags field
//
#define STOPFLAG_APP_DONE 0x0001
#define STOPFLAG_BREAKPOINT 0x0002
#define STOPFLAG_INVALID_BREAK 0x0004
#define STOPFLAG_BREAK_ON_CALLEX 0x0008
//
// Masks for working with the VM flags register
//
#define VMFLAGS_CC 0x0001 // condition flag
#define VMFLAGS_STEP 0x0002 // step instruction mode
#define VMFLAGS_ALL_VALID (VMFLAGS_CC | VMFLAGS_STEP)
//
// Macros for operating on the VM flags register
//
#define VMFLAG_SET(pVM, Flag) (pVM->Flags |= (Flag))
#define VMFLAG_ISSET(pVM, Flag) ((pVM->Flags & (Flag)) ? 1 : 0)
#define VMFLAG_CLEAR(pVM, Flag) (pVM->Flags &= ~(Flag))
//
// Define a macro to get the operand. Then we can change it to be either a
// direct read or have it call a function to read memory.
//
#define GETOPERANDS(pVM) (UINT8) (*(UINT8 *) (pVM->Ip + 1))
#define GETOPCODE(pVM) (UINT8) (*(UINT8 *) pVM->Ip)
//
// Macros for operating on the VM GP registers
//
#define OPERAND1_REGDATA(pVM, Op) pVM->Gpr[OPERAND1_REGNUM (Op)]
#define OPERAND2_REGDATA(pVM, Op) pVM->Gpr[OPERAND2_REGNUM (Op)]
//
// Bits of exception flags field of VM context
//
#define EXCEPTION_FLAG_FATAL 0x80000000 // can't continue
#define EXCEPTION_FLAG_ERROR 0x40000000 // bad, but try to continue
#define EXCEPTION_FLAG_WARNING 0x20000000 // harmless problem
#define EXCEPTION_FLAG_NONE 0x00000000 // for normal return
///
/// instruction pointer for the VM
///
typedef UINT8 *VMIP;
typedef INT64 VM_REGISTER;
typedef UINT32 EXCEPTION_FLAGS;
typedef struct {
VM_REGISTER Gpr[8]; ///< General purpose registers.
///< Flags register:
///< 0 Set to 1 if the result of the last compare was true
///< 1 Set to 1 if stepping
UINT64 Flags; ///< 2..63 Reserved.
VMIP Ip; ///< Instruction pointer.
UINTN LastException;
EXCEPTION_FLAGS ExceptionFlags; ///< to keep track of exceptions
UINT32 StopFlags;
UINT32 CompilerVersion; ///< via break(6)
UINTN HighStackBottom; ///< bottom of the upper stack
UINTN LowStackTop; ///< top of the lower stack
UINT64 StackRetAddr; ///< location of final return address on stack
UINTN *StackMagicPtr; ///< pointer to magic value on stack to detect corruption
EFI_HANDLE ImageHandle; ///< for this EBC driver
EFI_SYSTEM_TABLE *SystemTable; ///< for debugging only
UINTN LastAddrConverted; ///< for debug
UINTN LastAddrConvertedValue; ///< for debug
VOID *FramePtr;
VOID *EntryPoint; ///< entry point of EBC image
UINTN ImageBase;
VOID *StackPool;
VOID *StackTop;
} VM_CONTEXT;
/**
Given a pointer to a new VM context, execute one or more instructions. This
function is only used for test purposes.
@param[in] This A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
@param[in] VmPtr A pointer to a VM context.
@param[in, out] InstructionCount A pointer to a UINTN value holding the number of
instructions to execute. If it holds value of 0,
then the instruction to be executed is 1.
@retval EFI_UNSUPPORTED At least one of the opcodes is not supported.
@retval EFI_SUCCESS All of the instructions are executed successfully.
**/
typedef
EFI_STATUS
(EFIAPI *EBC_VM_TEST_EXECUTE)(
IN EFI_EBC_VM_TEST_PROTOCOL *This,
IN VM_CONTEXT *VmPtr,
IN OUT UINTN *InstructionCount
);
/**
Convert AsmText to the instruction. This function is only used for test purposes.
@param[in] This A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
@param[in] AsmText A pointer to EBC ASM text code.
@param[out] Buffer Buffer to store the instruction.
@param[out] BufferLen Size of buffer that is required to store data.
@retval EFI_UNSUPPORTED This functionality is unsupported.
@retval EFI_SUCCESS Successfully convert AsmText to the instruction.
**/
typedef
EFI_STATUS
(EFIAPI *EBC_VM_TEST_ASM)(
IN EFI_EBC_VM_TEST_PROTOCOL *This,
IN CHAR16 *AsmText,
IN OUT INT8 *Buffer,
IN OUT UINTN *BufferLen
);
/**
Dump the executed instruction. This function is only used for test purposes.
@param[in] This A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
@param[out] AsmText Contain the disasm text.
@param[out] Buffer Buffer to store the instruction.
@param[out] BufferLen Size of buffer that is required to store data.
@retval EFI_UNSUPPORTED This functionality is unsupported.
@retval EFI_SUCCESS Successfully dump the executed instruction.
**/
typedef
EFI_STATUS
(EFIAPI *EBC_VM_TEST_DASM)(
IN EFI_EBC_VM_TEST_PROTOCOL *This,
IN OUT CHAR16 *AsmText,
IN OUT INT8 *Buffer,
IN OUT UINTN *Len
);
//
// Prototype for the actual EBC test protocol interface
//
struct _EFI_EBC_VM_TEST_PROTOCOL {
EBC_VM_TEST_EXECUTE Execute;
EBC_VM_TEST_ASM Assemble;
EBC_VM_TEST_DASM Disassemble;
};
extern EFI_GUID gEfiEbcVmTestProtocolGuid;
#endif