Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   EBC VM Test protocol for test purposes.
      3 
      4 Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions
      8 of the BSD License which accompanies this distribution.  The
      9 full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _EBC_VM_TEST_PROTOCOL_H_
     18 #define _EBC_VM_TEST_PROTOCOL_H_
     19 
     20 //
     21 // Define a protocol for an EBC VM test interface.
     22 //
     23 #define EFI_EBC_VM_TEST_PROTOCOL_GUID \
     24   { \
     25     0xAAEACCFD, 0xF27B, 0x4C17, { 0xB6, 0x10, 0x75, 0xCA, 0x1F, 0x2D, 0xFB, 0x52 } \
     26   }
     27 
     28 //
     29 // Define for forward reference.
     30 //
     31 typedef struct _EFI_EBC_VM_TEST_PROTOCOL EFI_EBC_VM_TEST_PROTOCOL;
     32 
     33 //
     34 // VM major/minor version
     35 //
     36 #define VM_MAJOR_VERSION  1
     37 #define VM_MINOR_VERSION  0
     38 
     39 //
     40 // Bits in the VM->StopFlags field
     41 //
     42 #define STOPFLAG_APP_DONE         0x0001
     43 #define STOPFLAG_BREAKPOINT       0x0002
     44 #define STOPFLAG_INVALID_BREAK    0x0004
     45 #define STOPFLAG_BREAK_ON_CALLEX  0x0008
     46 
     47 //
     48 // Masks for working with the VM flags register
     49 //
     50 #define VMFLAGS_CC        0x0001  // condition flag
     51 #define VMFLAGS_STEP      0x0002  // step instruction mode
     52 #define VMFLAGS_ALL_VALID (VMFLAGS_CC | VMFLAGS_STEP)
     53 
     54 //
     55 // Macros for operating on the VM flags register
     56 //
     57 #define VMFLAG_SET(pVM, Flag)   (pVM->Flags |= (Flag))
     58 #define VMFLAG_ISSET(pVM, Flag) ((pVM->Flags & (Flag)) ? 1 : 0)
     59 #define VMFLAG_CLEAR(pVM, Flag) (pVM->Flags &= ~(Flag))
     60 
     61 //
     62 // Define a macro to get the operand. Then we can change it to be either a
     63 // direct read or have it call a function to read memory.
     64 //
     65 #define GETOPERANDS(pVM)  (UINT8) (*(UINT8 *) (pVM->Ip + 1))
     66 #define GETOPCODE(pVM)    (UINT8) (*(UINT8 *) pVM->Ip)
     67 
     68 //
     69 // Macros for operating on the VM GP registers
     70 //
     71 #define OPERAND1_REGDATA(pVM, Op) pVM->Gpr[OPERAND1_REGNUM (Op)]
     72 #define OPERAND2_REGDATA(pVM, Op) pVM->Gpr[OPERAND2_REGNUM (Op)]
     73 
     74 //
     75 // Bits of exception flags field of VM context
     76 //
     77 #define EXCEPTION_FLAG_FATAL    0x80000000  // can't continue
     78 #define EXCEPTION_FLAG_ERROR    0x40000000  // bad, but try to continue
     79 #define EXCEPTION_FLAG_WARNING  0x20000000  // harmless problem
     80 #define EXCEPTION_FLAG_NONE     0x00000000  // for normal return
     81 
     82 ///
     83 /// instruction pointer for the VM
     84 ///
     85 typedef UINT8   *VMIP;
     86 
     87 typedef INT64   VM_REGISTER;
     88 typedef UINT32  EXCEPTION_FLAGS;
     89 
     90 typedef struct {
     91   VM_REGISTER       Gpr[8];                 ///< General purpose registers.
     92                                             ///< Flags register:
     93                                             ///<   0  Set to 1 if the result of the last compare was true
     94                                             ///<   1  Set to 1 if stepping
     95   UINT64            Flags;                  ///<   2..63 Reserved.
     96   VMIP              Ip;                     ///< Instruction pointer.
     97   UINTN             LastException;
     98   EXCEPTION_FLAGS   ExceptionFlags;         ///< to keep track of exceptions
     99   UINT32            StopFlags;
    100   UINT32            CompilerVersion;        ///< via break(6)
    101   UINTN             HighStackBottom;        ///< bottom of the upper stack
    102   UINTN             LowStackTop;            ///< top of the lower stack
    103   UINT64            StackRetAddr;           ///< location of final return address on stack
    104   UINTN             *StackMagicPtr;         ///< pointer to magic value on stack to detect corruption
    105   EFI_HANDLE        ImageHandle;            ///< for this EBC driver
    106   EFI_SYSTEM_TABLE  *SystemTable;           ///< for debugging only
    107   UINTN             LastAddrConverted;      ///< for debug
    108   UINTN             LastAddrConvertedValue; ///< for debug
    109   VOID              *FramePtr;
    110   VOID              *EntryPoint;            ///< entry point of EBC image
    111   UINTN             ImageBase;
    112   VOID              *StackPool;
    113   VOID              *StackTop;
    114 } VM_CONTEXT;
    115 
    116 /**
    117   Given a pointer to a new VM context, execute one or more instructions. This
    118   function is only used for test purposes.
    119 
    120   @param[in]      This              A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
    121   @param[in]      VmPtr             A pointer to a VM context.
    122   @param[in, out] InstructionCount  A pointer to a UINTN value holding the number of
    123                                     instructions to execute. If it holds value of 0,
    124                                     then the instruction to be executed is 1.
    125 
    126   @retval EFI_UNSUPPORTED       At least one of the opcodes is not supported.
    127   @retval EFI_SUCCESS           All of the instructions are executed successfully.
    128 
    129 **/
    130 typedef
    131 EFI_STATUS
    132 (EFIAPI *EBC_VM_TEST_EXECUTE) (
    133   IN EFI_EBC_VM_TEST_PROTOCOL         *This,
    134   IN VM_CONTEXT                       *VmPtr,
    135   IN OUT UINTN                        *InstructionCount
    136   );
    137 
    138 /**
    139   Convert AsmText to the instruction. This function is only used for test purposes.
    140 
    141   @param[in]  This              A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
    142   @param[in]  AsmText           A pointer to EBC ASM text code.
    143   @param[out] Buffer            Buffer to store the instruction.
    144   @param[out] BufferLen         Size of buffer that is required to store data.
    145 
    146   @retval EFI_UNSUPPORTED       This functionality is unsupported.
    147   @retval EFI_SUCCESS           Successfully convert AsmText to the instruction.
    148 
    149 **/
    150 typedef
    151 EFI_STATUS
    152 (EFIAPI *EBC_VM_TEST_ASM) (
    153   IN EFI_EBC_VM_TEST_PROTOCOL         *This,
    154   IN CHAR16                           *AsmText,
    155   IN OUT INT8                         *Buffer,
    156   IN OUT UINTN                        *BufferLen
    157   );
    158 
    159 /**
    160   Dump the executed instruction. This function is only used for test purposes.
    161 
    162   @param[in]  This              A pointer to the EFI_EBC_VM_TEST_PROTOCOL structure.
    163   @param[out] AsmText           Contain the disasm text.
    164   @param[out] Buffer            Buffer to store the instruction.
    165   @param[out] BufferLen         Size of buffer that is required to store data.
    166 
    167   @retval EFI_UNSUPPORTED       This functionality is unsupported.
    168   @retval EFI_SUCCESS           Successfully dump the executed instruction.
    169 
    170 **/
    171 typedef
    172 EFI_STATUS
    173 (EFIAPI *EBC_VM_TEST_DASM) (
    174   IN EFI_EBC_VM_TEST_PROTOCOL         *This,
    175   IN OUT CHAR16                       *AsmText,
    176   IN OUT INT8                         *Buffer,
    177   IN OUT UINTN                        *Len
    178   );
    179 
    180 //
    181 // Prototype for the actual EBC test protocol interface
    182 //
    183 struct _EFI_EBC_VM_TEST_PROTOCOL {
    184   EBC_VM_TEST_EXECUTE Execute;
    185   EBC_VM_TEST_ASM     Assemble;
    186   EBC_VM_TEST_DASM    Disassemble;
    187 };
    188 
    189 extern EFI_GUID gEfiEbcVmTestProtocolGuid;
    190 
    191 #endif
    192