mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 07:17:27 +00:00 
			
		
		
		
	 9d510e61fc
			
		
	
	
		9d510e61fc
		
	
	
	
	
		
			
			https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 |