OvmfPkg/CcExitLib: Move common X86 instruction code to separate file
https://bugzilla.tianocore.org/show_bug.cgi?id=4169 Move common X86 instruction codes from CcExitVcHandler.c to separate files (CcInstruction.h / CcInstruction.c) so that these codes can be re-used in TDX. Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Erdem Aktas <erdemaktas@google.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Min Xu <min.m.xu@intel.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
197
OvmfPkg/Library/CcExitLib/CcInstruction.h
Normal file
197
OvmfPkg/Library/CcExitLib/CcInstruction.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/** @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
|
Reference in New Issue
Block a user