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