| /** @file | |
| Confidential Computing X64 Instruction | |
| Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> | |
| Copyright (c) 2022, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef CC_INSTRUCTION_H_ | |
| #define CC_INSTRUCTION_H_ | |
| #include <Base.h> | |
| #include <Uefi.h> | |
| #include <Register/Amd/Ghcb.h> | |
| #include <IndustryStandard/InstructionParsing.h> | |
| #include <Protocol/DebugSupport.h> | |
| // | |
| // Instruction execution mode definition | |
| // | |
| typedef enum { | |
| LongMode64Bit = 0, | |
| LongModeCompat32Bit, | |
| LongModeCompat16Bit, | |
| } CC_INSTRUCTION_MODE; | |
| // | |
| // Instruction size definition (for operand and address) | |
| // | |
| typedef enum { | |
| Size8Bits = 0, | |
| Size16Bits, | |
| Size32Bits, | |
| Size64Bits, | |
| } CC_INSTRUCTION_SIZE; | |
| // | |
| // Intruction segment definition | |
| // | |
| typedef enum { | |
| SegmentEs = 0, | |
| SegmentCs, | |
| SegmentSs, | |
| SegmentDs, | |
| SegmentFs, | |
| SegmentGs, | |
| } CC_INSTRUCTION_SEGMENT; | |
| // | |
| // Instruction rep function definition | |
| // | |
| typedef enum { | |
| RepNone = 0, | |
| RepZ, | |
| RepNZ, | |
| } CC_INSTRUCTION_REP; | |
| typedef struct { | |
| UINT8 Rm; | |
| UINT8 Reg; | |
| UINT8 Mod; | |
| } CC_INSTRUCTION_MODRM_EXT; | |
| typedef struct { | |
| UINT8 Base; | |
| UINT8 Index; | |
| UINT8 Scale; | |
| } CC_INSTRUCTION_SIB_EXT; | |
| // | |
| // Instruction opcode definition | |
| // | |
| typedef struct { | |
| CC_INSTRUCTION_MODRM_EXT ModRm; | |
| CC_INSTRUCTION_SIB_EXT Sib; | |
| UINTN RegData; | |
| UINTN RmData; | |
| } CC_INSTRUCTION_OPCODE_EXT; | |
| // | |
| // Instruction parsing context definition | |
| // | |
| typedef struct { | |
| GHCB *Ghcb; | |
| CC_INSTRUCTION_MODE Mode; | |
| CC_INSTRUCTION_SIZE DataSize; | |
| CC_INSTRUCTION_SIZE AddrSize; | |
| BOOLEAN SegmentSpecified; | |
| CC_INSTRUCTION_SEGMENT Segment; | |
| CC_INSTRUCTION_REP RepMode; | |
| UINT8 *Begin; | |
| UINT8 *End; | |
| UINT8 *Prefixes; | |
| UINT8 *OpCodes; | |
| UINT8 *Displacement; | |
| UINT8 *Immediate; | |
| INSTRUCTION_REX_PREFIX RexPrefix; | |
| BOOLEAN ModRmPresent; | |
| INSTRUCTION_MODRM ModRm; | |
| BOOLEAN SibPresent; | |
| INSTRUCTION_SIB Sib; | |
| UINTN PrefixSize; | |
| UINTN OpCodeSize; | |
| UINTN DisplacementSize; | |
| UINTN ImmediateSize; | |
| CC_INSTRUCTION_OPCODE_EXT Ext; | |
| } CC_INSTRUCTION_DATA; | |
| EFI_STATUS | |
| CcInitInstructionData ( | |
| IN OUT CC_INSTRUCTION_DATA *InstructionData, | |
| IN GHCB *Ghcb, | |
| IN EFI_SYSTEM_CONTEXT_X64 *Regs | |
| ); | |
| /** | |
| Return a pointer to the contents of the specified register. | |
| Based upon the input register, return a pointer to the registers contents | |
| in the x86 processor context. | |
| @param[in] Regs x64 processor context | |
| @param[in] Register Register to obtain pointer for | |
| @return Pointer to the contents of the requested register | |
| **/ | |
| UINT64 * | |
| CcGetRegisterPointer ( | |
| IN EFI_SYSTEM_CONTEXT_X64 *Regs, | |
| IN UINT8 Register | |
| ); | |
| /** | |
| Decode a ModRM byte. | |
| Examine the instruction parsing context to decode a ModRM byte and the SIB | |
| byte, if present. | |
| @param[in] Regs x64 processor context | |
| @param[in, out] InstructionData Instruction parsing context | |
| **/ | |
| VOID | |
| CcDecodeModRm ( | |
| IN EFI_SYSTEM_CONTEXT_X64 *Regs, | |
| IN OUT CC_INSTRUCTION_DATA *InstructionData | |
| ); | |
| /** | |
| Determine instruction length | |
| Return the total length of the parsed instruction. | |
| @param[in] InstructionData Instruction parsing context | |
| @return Length of parsed instruction | |
| **/ | |
| UINT64 | |
| CcInstructionLength ( | |
| IN CC_INSTRUCTION_DATA *InstructionData | |
| ); | |
| /** | |
| Initialize the instruction parsing context. | |
| Initialize the instruction parsing context, which includes decoding the | |
| instruction prefixes. | |
| @param[in, out] InstructionData Instruction parsing context | |
| @param[in] Ghcb Pointer to the Guest-Hypervisor Communication | |
| Block | |
| @param[in] Regs x64 processor context | |
| @retval EFI_SUCCESS Successfully initialize InstructionData | |
| @retval Others Other error as indicated | |
| **/ | |
| EFI_STATUS | |
| CcInitInstructionData ( | |
| IN OUT CC_INSTRUCTION_DATA *InstructionData, | |
| IN GHCB *Ghcb, | |
| IN EFI_SYSTEM_CONTEXT_X64 *Regs | |
| ); | |
| #endif |