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