]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Protocol/EbcVmTest.h
MdeModulePkg/ResetSystemRuntimeDxe: Add platform filter and handler
[mirror_edk2.git] / MdeModulePkg / Include / Protocol / EbcVmTest.h
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