// Instruction execution mode definition\r
//\r
typedef enum {\r
- LongMode64Bit = 0,\r
+ LongMode64Bit = 0,\r
LongModeCompat32Bit,\r
LongModeCompat16Bit,\r
} SEV_ES_INSTRUCTION_MODE;\r
// Instruction size definition (for operand and address)\r
//\r
typedef enum {\r
- Size8Bits = 0,\r
+ Size8Bits = 0,\r
Size16Bits,\r
Size32Bits,\r
Size64Bits,\r
// Intruction segment definition\r
//\r
typedef enum {\r
- SegmentEs = 0,\r
+ SegmentEs = 0,\r
SegmentCs,\r
SegmentSs,\r
SegmentDs,\r
// Instruction rep function definition\r
//\r
typedef enum {\r
- RepNone = 0,\r
+ RepNone = 0,\r
RepZ,\r
RepNZ,\r
} SEV_ES_INSTRUCTION_REP;\r
\r
typedef struct {\r
- UINT8 Rm;\r
- UINT8 Reg;\r
- UINT8 Mod;\r
+ UINT8 Rm;\r
+ UINT8 Reg;\r
+ UINT8 Mod;\r
} SEV_ES_INSTRUCTION_MODRM_EXT;\r
\r
typedef struct {\r
- UINT8 Base;\r
- UINT8 Index;\r
- UINT8 Scale;\r
+ UINT8 Base;\r
+ UINT8 Index;\r
+ UINT8 Scale;\r
} SEV_ES_INSTRUCTION_SIB_EXT;\r
\r
//\r
// Instruction opcode definition\r
//\r
typedef struct {\r
- SEV_ES_INSTRUCTION_MODRM_EXT ModRm;\r
+ SEV_ES_INSTRUCTION_MODRM_EXT ModRm;\r
\r
- SEV_ES_INSTRUCTION_SIB_EXT Sib;\r
+ SEV_ES_INSTRUCTION_SIB_EXT Sib;\r
\r
- UINTN RegData;\r
- UINTN RmData;\r
+ UINTN RegData;\r
+ UINTN RmData;\r
} SEV_ES_INSTRUCTION_OPCODE_EXT;\r
\r
//\r
// Instruction parsing context definition\r
//\r
typedef struct {\r
- GHCB *Ghcb;\r
+ GHCB *Ghcb;\r
\r
- SEV_ES_INSTRUCTION_MODE Mode;\r
- SEV_ES_INSTRUCTION_SIZE DataSize;\r
- SEV_ES_INSTRUCTION_SIZE AddrSize;\r
- BOOLEAN SegmentSpecified;\r
- SEV_ES_INSTRUCTION_SEGMENT Segment;\r
- SEV_ES_INSTRUCTION_REP RepMode;\r
+ SEV_ES_INSTRUCTION_MODE Mode;\r
+ SEV_ES_INSTRUCTION_SIZE DataSize;\r
+ SEV_ES_INSTRUCTION_SIZE AddrSize;\r
+ BOOLEAN SegmentSpecified;\r
+ SEV_ES_INSTRUCTION_SEGMENT Segment;\r
+ SEV_ES_INSTRUCTION_REP RepMode;\r
\r
- UINT8 *Begin;\r
- UINT8 *End;\r
+ UINT8 *Begin;\r
+ UINT8 *End;\r
\r
- UINT8 *Prefixes;\r
- UINT8 *OpCodes;\r
- UINT8 *Displacement;\r
- UINT8 *Immediate;\r
+ UINT8 *Prefixes;\r
+ UINT8 *OpCodes;\r
+ UINT8 *Displacement;\r
+ UINT8 *Immediate;\r
\r
- INSTRUCTION_REX_PREFIX RexPrefix;\r
+ INSTRUCTION_REX_PREFIX RexPrefix;\r
\r
- BOOLEAN ModRmPresent;\r
- INSTRUCTION_MODRM ModRm;\r
+ BOOLEAN ModRmPresent;\r
+ INSTRUCTION_MODRM ModRm;\r
\r
- BOOLEAN SibPresent;\r
- INSTRUCTION_SIB Sib;\r
+ BOOLEAN SibPresent;\r
+ INSTRUCTION_SIB Sib;\r
\r
- UINTN PrefixSize;\r
- UINTN OpCodeSize;\r
- UINTN DisplacementSize;\r
- UINTN ImmediateSize;\r
+ UINTN PrefixSize;\r
+ UINTN OpCodeSize;\r
+ UINTN DisplacementSize;\r
+ UINTN ImmediateSize;\r
\r
- SEV_ES_INSTRUCTION_OPCODE_EXT Ext;\r
+ SEV_ES_INSTRUCTION_OPCODE_EXT Ext;\r
} SEV_ES_INSTRUCTION_DATA;\r
\r
//\r
STATIC\r
UINT64 *\r
GetRegisterPointer (\r
- IN EFI_SYSTEM_CONTEXT_X64 *Regs,\r
- IN UINT8 Register\r
+ IN EFI_SYSTEM_CONTEXT_X64 *Regs,\r
+ IN UINT8 Register\r
)\r
{\r
- UINT64 *Reg;\r
+ UINT64 *Reg;\r
\r
switch (Register) {\r
- case 0:\r
- Reg = &Regs->Rax;\r
- break;\r
- case 1:\r
- Reg = &Regs->Rcx;\r
- break;\r
- case 2:\r
- Reg = &Regs->Rdx;\r
- break;\r
- case 3:\r
- Reg = &Regs->Rbx;\r
- break;\r
- case 4:\r
- Reg = &Regs->Rsp;\r
- break;\r
- case 5:\r
- Reg = &Regs->Rbp;\r
- break;\r
- case 6:\r
- Reg = &Regs->Rsi;\r
- break;\r
- case 7:\r
- Reg = &Regs->Rdi;\r
- break;\r
- case 8:\r
- Reg = &Regs->R8;\r
- break;\r
- case 9:\r
- Reg = &Regs->R9;\r
- break;\r
- case 10:\r
- Reg = &Regs->R10;\r
- break;\r
- case 11:\r
- Reg = &Regs->R11;\r
- break;\r
- case 12:\r
- Reg = &Regs->R12;\r
- break;\r
- case 13:\r
- Reg = &Regs->R13;\r
- break;\r
- case 14:\r
- Reg = &Regs->R14;\r
- break;\r
- case 15:\r
- Reg = &Regs->R15;\r
- break;\r
- default:\r
- Reg = NULL;\r
+ case 0:\r
+ Reg = &Regs->Rax;\r
+ break;\r
+ case 1:\r
+ Reg = &Regs->Rcx;\r
+ break;\r
+ case 2:\r
+ Reg = &Regs->Rdx;\r
+ break;\r
+ case 3:\r
+ Reg = &Regs->Rbx;\r
+ break;\r
+ case 4:\r
+ Reg = &Regs->Rsp;\r
+ break;\r
+ case 5:\r
+ Reg = &Regs->Rbp;\r
+ break;\r
+ case 6:\r
+ Reg = &Regs->Rsi;\r
+ break;\r
+ case 7:\r
+ Reg = &Regs->Rdi;\r
+ break;\r
+ case 8:\r
+ Reg = &Regs->R8;\r
+ break;\r
+ case 9:\r
+ Reg = &Regs->R9;\r
+ break;\r
+ case 10:\r
+ Reg = &Regs->R10;\r
+ break;\r
+ case 11:\r
+ Reg = &Regs->R11;\r
+ break;\r
+ case 12:\r
+ Reg = &Regs->R12;\r
+ break;\r
+ case 13:\r
+ Reg = &Regs->R13;\r
+ break;\r
+ case 14:\r
+ Reg = &Regs->R14;\r
+ break;\r
+ case 15:\r
+ Reg = &Regs->R15;\r
+ break;\r
+ default:\r
+ Reg = NULL;\r
}\r
+\r
ASSERT (Reg != NULL);\r
\r
return Reg;\r
)\r
{\r
InstructionData->DisplacementSize = Size;\r
- InstructionData->Immediate += Size;\r
- InstructionData->End += Size;\r
+ InstructionData->Immediate += Size;\r
+ InstructionData->End += Size;\r
}\r
\r
/**\r
SEV_ES_INSTRUCTION_OPCODE_EXT *Ext;\r
UINT64 EffectiveAddress;\r
\r
- Ext = &InstructionData->Ext;\r
+ Ext = &InstructionData->Ext;\r
EffectiveAddress = 0;\r
\r
if (IsRipRelative (InstructionData)) {\r
//\r
// RIP-relative displacement is a 32-bit signed value\r
//\r
- INT32 RipRelative;\r
+ INT32 RipRelative;\r
\r
- RipRelative = *(INT32 *) InstructionData->Displacement;\r
+ RipRelative = *(INT32 *)InstructionData->Displacement;\r
\r
UpdateForDisplacement (InstructionData, 4);\r
\r
//\r
// Negative displacement is handled by standard UINT64 wrap-around.\r
//\r
- return Regs->Rip + (UINT64) RipRelative;\r
+ return Regs->Rip + (UINT64)RipRelative;\r
}\r
\r
switch (Ext->ModRm.Mod) {\r
- case 1:\r
- UpdateForDisplacement (InstructionData, 1);\r
- EffectiveAddress += (UINT64) (*(INT8 *) (InstructionData->Displacement));\r
- break;\r
- case 2:\r
- switch (InstructionData->AddrSize) {\r
- case Size16Bits:\r
- UpdateForDisplacement (InstructionData, 2);\r
- EffectiveAddress += (UINT64) (*(INT16 *) (InstructionData->Displacement));\r
+ case 1:\r
+ UpdateForDisplacement (InstructionData, 1);\r
+ EffectiveAddress += (UINT64)(*(INT8 *)(InstructionData->Displacement));\r
break;\r
- default:\r
- UpdateForDisplacement (InstructionData, 4);\r
- EffectiveAddress += (UINT64) (*(INT32 *) (InstructionData->Displacement));\r
+ case 2:\r
+ switch (InstructionData->AddrSize) {\r
+ case Size16Bits:\r
+ UpdateForDisplacement (InstructionData, 2);\r
+ EffectiveAddress += (UINT64)(*(INT16 *)(InstructionData->Displacement));\r
+ break;\r
+ default:\r
+ UpdateForDisplacement (InstructionData, 4);\r
+ EffectiveAddress += (UINT64)(*(INT32 *)(InstructionData->Displacement));\r
+ break;\r
+ }\r
+\r
break;\r
- }\r
- break;\r
}\r
\r
if (InstructionData->SibPresent) {\r
//\r
// Negative displacement is handled by standard UINT64 wrap-around.\r
//\r
- EffectiveAddress += (UINT64) Displacement;\r
+ EffectiveAddress += (UINT64)Displacement;\r
}\r
\r
if ((Ext->Sib.Base != 5) || Ext->ModRm.Mod) {\r
EffectiveAddress += *GetRegisterPointer (Regs, Ext->Sib.Base);\r
} else {\r
UpdateForDisplacement (InstructionData, 4);\r
- EffectiveAddress += (UINT64) (*(INT32 *) (InstructionData->Displacement));\r
+ EffectiveAddress += (UINT64)(*(INT32 *)(InstructionData->Displacement));\r
}\r
} else {\r
EffectiveAddress += *GetRegisterPointer (Regs, Ext->ModRm.Rm);\r
INSTRUCTION_SIB *Sib;\r
\r
RexPrefix = &InstructionData->RexPrefix;\r
- Ext = &InstructionData->Ext;\r
- ModRm = &InstructionData->ModRm;\r
- Sib = &InstructionData->Sib;\r
+ Ext = &InstructionData->Ext;\r
+ ModRm = &InstructionData->ModRm;\r
+ Sib = &InstructionData->Sib;\r
\r
InstructionData->ModRmPresent = TRUE;\r
- ModRm->Uint8 = *(InstructionData->End);\r
+ ModRm->Uint8 = *(InstructionData->End);\r
\r
InstructionData->Displacement++;\r
InstructionData->Immediate++;\r
} else {\r
if (ModRm->Bits.Rm == 4) {\r
InstructionData->SibPresent = TRUE;\r
- Sib->Uint8 = *(InstructionData->End);\r
+ Sib->Uint8 = *(InstructionData->End);\r
\r
InstructionData->Displacement++;\r
InstructionData->Immediate++;\r
//\r
// Always in 64-bit mode\r
//\r
- Mode = LongMode64Bit;\r
+ Mode = LongMode64Bit;\r
ModeDataSize = Size32Bits;\r
ModeAddrSize = Size64Bits;\r
\r
- InstructionData->Mode = Mode;\r
+ InstructionData->Mode = Mode;\r
InstructionData->DataSize = ModeDataSize;\r
InstructionData->AddrSize = ModeAddrSize;\r
\r
if ((*Byte & REX_64BIT_OPERAND_SIZE_MASK) != 0) {\r
InstructionData->DataSize = Size64Bits;\r
}\r
+\r
continue;\r
}\r
\r
switch (*Byte) {\r
- case OVERRIDE_SEGMENT_CS:\r
- case OVERRIDE_SEGMENT_DS:\r
- case OVERRIDE_SEGMENT_ES:\r
- case OVERRIDE_SEGMENT_SS:\r
- if (Mode != LongMode64Bit) {\r
+ case OVERRIDE_SEGMENT_CS:\r
+ case OVERRIDE_SEGMENT_DS:\r
+ case OVERRIDE_SEGMENT_ES:\r
+ case OVERRIDE_SEGMENT_SS:\r
+ if (Mode != LongMode64Bit) {\r
+ InstructionData->SegmentSpecified = TRUE;\r
+ InstructionData->Segment = (*Byte >> 3) & 3;\r
+ }\r
+\r
+ break;\r
+\r
+ case OVERRIDE_SEGMENT_FS:\r
+ case OVERRIDE_SEGMENT_GS:\r
InstructionData->SegmentSpecified = TRUE;\r
- InstructionData->Segment = (*Byte >> 3) & 3;\r
- }\r
- break;\r
-\r
- case OVERRIDE_SEGMENT_FS:\r
- case OVERRIDE_SEGMENT_GS:\r
- InstructionData->SegmentSpecified = TRUE;\r
- InstructionData->Segment = *Byte & 7;\r
- break;\r
-\r
- case OVERRIDE_OPERAND_SIZE:\r
- if (InstructionData->RexPrefix.Uint8 == 0) {\r
- InstructionData->DataSize =\r
- (Mode == LongMode64Bit) ? Size16Bits :\r
+ InstructionData->Segment = *Byte & 7;\r
+ break;\r
+\r
+ case OVERRIDE_OPERAND_SIZE:\r
+ if (InstructionData->RexPrefix.Uint8 == 0) {\r
+ InstructionData->DataSize =\r
+ (Mode == LongMode64Bit) ? Size16Bits :\r
+ (Mode == LongModeCompat32Bit) ? Size16Bits :\r
+ (Mode == LongModeCompat16Bit) ? Size32Bits : 0;\r
+ }\r
+\r
+ break;\r
+\r
+ case OVERRIDE_ADDRESS_SIZE:\r
+ InstructionData->AddrSize =\r
+ (Mode == LongMode64Bit) ? Size32Bits :\r
(Mode == LongModeCompat32Bit) ? Size16Bits :\r
(Mode == LongModeCompat16Bit) ? Size32Bits : 0;\r
- }\r
- break;\r
-\r
- case OVERRIDE_ADDRESS_SIZE:\r
- InstructionData->AddrSize =\r
- (Mode == LongMode64Bit) ? Size32Bits :\r
- (Mode == LongModeCompat32Bit) ? Size16Bits :\r
- (Mode == LongModeCompat16Bit) ? Size32Bits : 0;\r
- break;\r
+ break;\r
\r
- case LOCK_PREFIX:\r
- break;\r
+ case LOCK_PREFIX:\r
+ break;\r
\r
- case REPZ_PREFIX:\r
- InstructionData->RepMode = RepZ;\r
- break;\r
+ case REPZ_PREFIX:\r
+ InstructionData->RepMode = RepZ;\r
+ break;\r
\r
- case REPNZ_PREFIX:\r
- InstructionData->RepMode = RepNZ;\r
- break;\r
+ case REPNZ_PREFIX:\r
+ InstructionData->RepMode = RepNZ;\r
+ break;\r
\r
- default:\r
- InstructionData->OpCodes = Byte;\r
- InstructionData->OpCodeSize = (*Byte == TWO_BYTE_OPCODE_ESCAPE) ? 2 : 1;\r
+ default:\r
+ InstructionData->OpCodes = Byte;\r
+ InstructionData->OpCodeSize = (*Byte == TWO_BYTE_OPCODE_ESCAPE) ? 2 : 1;\r
\r
- InstructionData->End = Byte + InstructionData->OpCodeSize;\r
- InstructionData->Displacement = InstructionData->End;\r
- InstructionData->Immediate = InstructionData->End;\r
- return;\r
+ InstructionData->End = Byte + InstructionData->OpCodeSize;\r
+ InstructionData->Displacement = InstructionData->End;\r
+ InstructionData->Immediate = InstructionData->End;\r
+ return;\r
}\r
}\r
}\r
IN SEV_ES_INSTRUCTION_DATA *InstructionData\r
)\r
{\r
- return (UINT64) (InstructionData->End - InstructionData->Begin);\r
+ return (UINT64)(InstructionData->End - InstructionData->Begin);\r
}\r
\r
/**\r
)\r
{\r
SetMem (InstructionData, sizeof (*InstructionData), 0);\r
- InstructionData->Ghcb = Ghcb;\r
- InstructionData->Begin = (UINT8 *) Regs->Rip;\r
- InstructionData->End = (UINT8 *) Regs->Rip;\r
+ InstructionData->Ghcb = Ghcb;\r
+ InstructionData->Begin = (UINT8 *)Regs->Rip;\r
+ InstructionData->End = (UINT8 *)Regs->Rip;\r
\r
DecodePrefixes (Regs, InstructionData);\r
}\r
if (Status == 0) {\r
GHCB_EVENT_INJECTION Event;\r
\r
- Event.Uint64 = 0;\r
+ Event.Uint64 = 0;\r
Event.Elements.Vector = GP_EXCEPTION;\r
Event.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION;\r
Event.Elements.Valid = 1;\r
//\r
// Any state other than unencrypted is an error, issue a #GP.\r
//\r
- DEBUG ((DEBUG_ERROR,\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
"MMIO using encrypted memory: %lx\n",\r
- (UINT64) MemoryAddress));\r
- GpEvent.Uint64 = 0;\r
+ (UINT64)MemoryAddress\r
+ ));\r
+ GpEvent.Uint64 = 0;\r
GpEvent.Elements.Vector = GP_EXCEPTION;\r
GpEvent.Elements.Type = GHCB_EVENT_INJECTION_TYPE_EXCEPTION;\r
GpEvent.Elements.Valid = 1;\r
}\r
\r
switch (OpCode) {\r
- //\r
- // MMIO write (MOV reg/memX, regX)\r
- //\r
- case 0x88:\r
- Bytes = 1;\r
+ //\r
+ // MMIO write (MOV reg/memX, regX)\r
+ //\r
+ case 0x88:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0x89:\r
- DecodeModRm (Regs, InstructionData);\r
- Bytes = ((Bytes != 0) ? Bytes :\r
- (InstructionData->DataSize == Size16Bits) ? 2 :\r
- (InstructionData->DataSize == Size32Bits) ? 4 :\r
- (InstructionData->DataSize == Size64Bits) ? 8 :\r
- 0);\r
-\r
- if (InstructionData->Ext.ModRm.Mod == 3) {\r
- //\r
- // NPF on two register operands???\r
- //\r
- return UnsupportedExit (Ghcb, Regs, InstructionData);\r
- }\r
+ case 0x89:\r
+ DecodeModRm (Regs, InstructionData);\r
+ Bytes = ((Bytes != 0) ? Bytes :\r
+ (InstructionData->DataSize == Size16Bits) ? 2 :\r
+ (InstructionData->DataSize == Size32Bits) ? 4 :\r
+ (InstructionData->DataSize == Size64Bits) ? 8 :\r
+ 0);\r
+\r
+ if (InstructionData->Ext.ModRm.Mod == 3) {\r
+ //\r
+ // NPF on two register operands???\r
+ //\r
+ return UnsupportedExit (Ghcb, Regs, InstructionData);\r
+ }\r
\r
- Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- ExitInfo1 = InstructionData->Ext.RmData;\r
- ExitInfo2 = Bytes;\r
- CopyMem (Ghcb->SharedBuffer, &InstructionData->Ext.RegData, Bytes);\r
+ ExitInfo1 = InstructionData->Ext.RmData;\r
+ ExitInfo2 = Bytes;\r
+ CopyMem (Ghcb->SharedBuffer, &InstructionData->Ext.RegData, Bytes);\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
- break;\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- //\r
- // MMIO write (MOV moffsetX, aX)\r
- //\r
- case 0xA2:\r
- Bytes = 1;\r
+ break;\r
+\r
+ //\r
+ // MMIO write (MOV moffsetX, aX)\r
+ //\r
+ case 0xA2:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0xA3:\r
- Bytes = ((Bytes != 0) ? Bytes :\r
- (InstructionData->DataSize == Size16Bits) ? 2 :\r
- (InstructionData->DataSize == Size32Bits) ? 4 :\r
- (InstructionData->DataSize == Size64Bits) ? 8 :\r
- 0);\r
+ case 0xA3:\r
+ Bytes = ((Bytes != 0) ? Bytes :\r
+ (InstructionData->DataSize == Size16Bits) ? 2 :\r
+ (InstructionData->DataSize == Size32Bits) ? 4 :\r
+ (InstructionData->DataSize == Size64Bits) ? 8 :\r
+ 0);\r
\r
- InstructionData->ImmediateSize = (UINTN) (1 << InstructionData->AddrSize);\r
- InstructionData->End += InstructionData->ImmediateSize;\r
+ InstructionData->ImmediateSize = (UINTN)(1 << InstructionData->AddrSize);\r
+ InstructionData->End += InstructionData->ImmediateSize;\r
\r
- //\r
- // This code is X64 only, so a possible 8-byte copy to a UINTN is ok.\r
- // Use a STATIC_ASSERT to be certain the code is being built as X64.\r
- //\r
- STATIC_ASSERT (\r
- sizeof (UINTN) == sizeof (UINT64),\r
- "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"\r
- );\r
-\r
- Address = 0;\r
- CopyMem (\r
- &Address,\r
- InstructionData->Immediate,\r
- InstructionData->ImmediateSize\r
- );\r
-\r
- Status = ValidateMmioMemory (Ghcb, Address, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ //\r
+ // This code is X64 only, so a possible 8-byte copy to a UINTN is ok.\r
+ // Use a STATIC_ASSERT to be certain the code is being built as X64.\r
+ //\r
+ STATIC_ASSERT (\r
+ sizeof (UINTN) == sizeof (UINT64),\r
+ "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"\r
+ );\r
\r
- ExitInfo1 = Address;\r
- ExitInfo2 = Bytes;\r
- CopyMem (Ghcb->SharedBuffer, &Regs->Rax, Bytes);\r
+ Address = 0;\r
+ CopyMem (\r
+ &Address,\r
+ InstructionData->Immediate,\r
+ InstructionData->ImmediateSize\r
+ );\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
- break;\r
+ Status = ValidateMmioMemory (Ghcb, Address, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- //\r
- // MMIO write (MOV reg/memX, immX)\r
- //\r
- case 0xC6:\r
- Bytes = 1;\r
+ ExitInfo1 = Address;\r
+ ExitInfo2 = Bytes;\r
+ CopyMem (Ghcb->SharedBuffer, &Regs->Rax, Bytes);\r
+\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
+\r
+ break;\r
+\r
+ //\r
+ // MMIO write (MOV reg/memX, immX)\r
+ //\r
+ case 0xC6:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0xC7:\r
- DecodeModRm (Regs, InstructionData);\r
- Bytes = ((Bytes != 0) ? Bytes :\r
- (InstructionData->DataSize == Size16Bits) ? 2 :\r
- (InstructionData->DataSize == Size32Bits) ? 4 :\r
- 0);\r
+ case 0xC7:\r
+ DecodeModRm (Regs, InstructionData);\r
+ Bytes = ((Bytes != 0) ? Bytes :\r
+ (InstructionData->DataSize == Size16Bits) ? 2 :\r
+ (InstructionData->DataSize == Size32Bits) ? 4 :\r
+ 0);\r
\r
- InstructionData->ImmediateSize = Bytes;\r
- InstructionData->End += Bytes;\r
+ InstructionData->ImmediateSize = Bytes;\r
+ InstructionData->End += Bytes;\r
\r
- Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- ExitInfo1 = InstructionData->Ext.RmData;\r
- ExitInfo2 = Bytes;\r
- CopyMem (Ghcb->SharedBuffer, InstructionData->Immediate, Bytes);\r
+ ExitInfo1 = InstructionData->Ext.RmData;\r
+ ExitInfo2 = Bytes;\r
+ CopyMem (Ghcb->SharedBuffer, InstructionData->Immediate, Bytes);\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
- break;\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- //\r
- // MMIO read (MOV regX, reg/memX)\r
- //\r
- case 0x8A:\r
- Bytes = 1;\r
+ break;\r
+\r
+ //\r
+ // MMIO read (MOV regX, reg/memX)\r
+ //\r
+ case 0x8A:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0x8B:\r
- DecodeModRm (Regs, InstructionData);\r
- Bytes = ((Bytes != 0) ? Bytes :\r
- (InstructionData->DataSize == Size16Bits) ? 2 :\r
- (InstructionData->DataSize == Size32Bits) ? 4 :\r
- (InstructionData->DataSize == Size64Bits) ? 8 :\r
- 0);\r
- if (InstructionData->Ext.ModRm.Mod == 3) {\r
- //\r
- // NPF on two register operands???\r
- //\r
- return UnsupportedExit (Ghcb, Regs, InstructionData);\r
- }\r
+ case 0x8B:\r
+ DecodeModRm (Regs, InstructionData);\r
+ Bytes = ((Bytes != 0) ? Bytes :\r
+ (InstructionData->DataSize == Size16Bits) ? 2 :\r
+ (InstructionData->DataSize == Size32Bits) ? 4 :\r
+ (InstructionData->DataSize == Size64Bits) ? 8 :\r
+ 0);\r
+ if (InstructionData->Ext.ModRm.Mod == 3) {\r
+ //\r
+ // NPF on two register operands???\r
+ //\r
+ return UnsupportedExit (Ghcb, Regs, InstructionData);\r
+ }\r
\r
- Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- ExitInfo1 = InstructionData->Ext.RmData;\r
- ExitInfo2 = Bytes;\r
+ ExitInfo1 = InstructionData->Ext.RmData;\r
+ ExitInfo2 = Bytes;\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
- if (Bytes == 4) {\r
- //\r
- // Zero-extend for 32-bit operation\r
- //\r
- *Register = 0;\r
- }\r
- CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
- break;\r
+ Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
+ if (Bytes == 4) {\r
+ //\r
+ // Zero-extend for 32-bit operation\r
+ //\r
+ *Register = 0;\r
+ }\r
+\r
+ CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
+ break;\r
\r
- //\r
- // MMIO read (MOV aX, moffsetX)\r
- //\r
- case 0xA0:\r
- Bytes = 1;\r
//\r
- // fall through\r
+ // MMIO read (MOV aX, moffsetX)\r
//\r
- case 0xA1:\r
- Bytes = ((Bytes != 0) ? Bytes :\r
- (InstructionData->DataSize == Size16Bits) ? 2 :\r
- (InstructionData->DataSize == Size32Bits) ? 4 :\r
- (InstructionData->DataSize == Size64Bits) ? 8 :\r
- 0);\r
-\r
- InstructionData->ImmediateSize = (UINTN) (1 << InstructionData->AddrSize);\r
- InstructionData->End += InstructionData->ImmediateSize;\r
-\r
+ case 0xA0:\r
+ Bytes = 1;\r
//\r
- // This code is X64 only, so a possible 8-byte copy to a UINTN is ok.\r
- // Use a STATIC_ASSERT to be certain the code is being built as X64.\r
+ // fall through\r
//\r
- STATIC_ASSERT (\r
- sizeof (UINTN) == sizeof (UINT64),\r
- "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"\r
- );\r
-\r
- Address = 0;\r
- CopyMem (\r
- &Address,\r
- InstructionData->Immediate,\r
- InstructionData->ImmediateSize\r
- );\r
-\r
- Status = ValidateMmioMemory (Ghcb, Address, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
-\r
- ExitInfo1 = Address;\r
- ExitInfo2 = Bytes;\r
+ case 0xA1:\r
+ Bytes = ((Bytes != 0) ? Bytes :\r
+ (InstructionData->DataSize == Size16Bits) ? 2 :\r
+ (InstructionData->DataSize == Size32Bits) ? 4 :\r
+ (InstructionData->DataSize == Size64Bits) ? 8 :\r
+ 0);\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ InstructionData->ImmediateSize = (UINTN)(1 << InstructionData->AddrSize);\r
+ InstructionData->End += InstructionData->ImmediateSize;\r
\r
- if (Bytes == 4) {\r
//\r
- // Zero-extend for 32-bit operation\r
+ // This code is X64 only, so a possible 8-byte copy to a UINTN is ok.\r
+ // Use a STATIC_ASSERT to be certain the code is being built as X64.\r
//\r
- Regs->Rax = 0;\r
- }\r
- CopyMem (&Regs->Rax, Ghcb->SharedBuffer, Bytes);\r
- break;\r
+ STATIC_ASSERT (\r
+ sizeof (UINTN) == sizeof (UINT64),\r
+ "sizeof (UINTN) != sizeof (UINT64), this file must be built as X64"\r
+ );\r
\r
- //\r
- // MMIO read w/ zero-extension ((MOVZX regX, reg/memX)\r
- //\r
- case 0xB6:\r
- Bytes = 1;\r
+ Address = 0;\r
+ CopyMem (\r
+ &Address,\r
+ InstructionData->Immediate,\r
+ InstructionData->ImmediateSize\r
+ );\r
+\r
+ Status = ValidateMmioMemory (Ghcb, Address, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
+\r
+ ExitInfo1 = Address;\r
+ ExitInfo2 = Bytes;\r
+\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
+\r
+ if (Bytes == 4) {\r
+ //\r
+ // Zero-extend for 32-bit operation\r
+ //\r
+ Regs->Rax = 0;\r
+ }\r
+\r
+ CopyMem (&Regs->Rax, Ghcb->SharedBuffer, Bytes);\r
+ break;\r
+\r
+ //\r
+ // MMIO read w/ zero-extension ((MOVZX regX, reg/memX)\r
+ //\r
+ case 0xB6:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0xB7:\r
- DecodeModRm (Regs, InstructionData);\r
- Bytes = (Bytes != 0) ? Bytes : 2;\r
+ case 0xB7:\r
+ DecodeModRm (Regs, InstructionData);\r
+ Bytes = (Bytes != 0) ? Bytes : 2;\r
\r
- Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- ExitInfo1 = InstructionData->Ext.RmData;\r
- ExitInfo2 = Bytes;\r
+ ExitInfo1 = InstructionData->Ext.RmData;\r
+ ExitInfo2 = Bytes;\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
- SetMem (Register, (UINTN) (1 << InstructionData->DataSize), 0);\r
- CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
- break;\r
+ Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
+ SetMem (Register, (UINTN)(1 << InstructionData->DataSize), 0);\r
+ CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
+ break;\r
\r
- //\r
- // MMIO read w/ sign-extension (MOVSX regX, reg/memX)\r
- //\r
- case 0xBE:\r
- Bytes = 1;\r
+ //\r
+ // MMIO read w/ sign-extension (MOVSX regX, reg/memX)\r
+ //\r
+ case 0xBE:\r
+ Bytes = 1;\r
//\r
// fall through\r
//\r
- case 0xBF:\r
- DecodeModRm (Regs, InstructionData);\r
- Bytes = (Bytes != 0) ? Bytes : 2;\r
+ case 0xBF:\r
+ DecodeModRm (Regs, InstructionData);\r
+ Bytes = (Bytes != 0) ? Bytes : 2;\r
\r
- Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Status = ValidateMmioMemory (Ghcb, InstructionData->Ext.RmData, Bytes);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- ExitInfo1 = InstructionData->Ext.RmData;\r
- ExitInfo2 = Bytes;\r
+ ExitInfo1 = InstructionData->Ext.RmData;\r
+ ExitInfo2 = Bytes;\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
- VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
- if (Status != 0) {\r
- return Status;\r
- }\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
+ VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
+ Status = VmgExit (Ghcb, SVM_EXIT_MMIO_READ, ExitInfo1, ExitInfo2);\r
+ if (Status != 0) {\r
+ return Status;\r
+ }\r
\r
- if (Bytes == 1) {\r
- UINT8 *Data;\r
+ if (Bytes == 1) {\r
+ UINT8 *Data;\r
\r
- Data = (UINT8 *) Ghcb->SharedBuffer;\r
- SignByte = ((*Data & BIT7) != 0) ? 0xFF : 0x00;\r
- } else {\r
- UINT16 *Data;\r
+ Data = (UINT8 *)Ghcb->SharedBuffer;\r
+ SignByte = ((*Data & BIT7) != 0) ? 0xFF : 0x00;\r
+ } else {\r
+ UINT16 *Data;\r
\r
- Data = (UINT16 *) Ghcb->SharedBuffer;\r
- SignByte = ((*Data & BIT15) != 0) ? 0xFF : 0x00;\r
- }\r
+ Data = (UINT16 *)Ghcb->SharedBuffer;\r
+ SignByte = ((*Data & BIT15) != 0) ? 0xFF : 0x00;\r
+ }\r
\r
- Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
- SetMem (Register, (UINTN) (1 << InstructionData->DataSize), SignByte);\r
- CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
- break;\r
+ Register = GetRegisterPointer (Regs, InstructionData->Ext.ModRm.Reg);\r
+ SetMem (Register, (UINTN)(1 << InstructionData->DataSize), SignByte);\r
+ CopyMem (Register, Ghcb->SharedBuffer, Bytes);\r
+ break;\r
\r
- default:\r
- DEBUG ((DEBUG_ERROR, "Invalid MMIO opcode (%x)\n", OpCode));\r
- Status = GP_EXCEPTION;\r
- ASSERT (FALSE);\r
+ default:\r
+ DEBUG ((DEBUG_ERROR, "Invalid MMIO opcode (%x)\n", OpCode));\r
+ Status = GP_EXCEPTION;\r
+ ASSERT (FALSE);\r
}\r
\r
return Status;\r
\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax) ||\r
!VmgIsOffsetValid (Ghcb, GhcbRcx) ||\r
- !VmgIsOffsetValid (Ghcb, GhcbRdx)) {\r
+ !VmgIsOffsetValid (Ghcb, GhcbRdx))\r
+ {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
Regs->Rcx = Ghcb->SaveArea.Rcx;\r
Regs->Rdx = Ghcb->SaveArea.Rdx;\r
\r
Ghcb->SaveArea.Rax = Regs->Rax;\r
VmgSetOffsetValid (Ghcb, GhcbRax);\r
- Ghcb->SaveArea.Cpl = (UINT8) (Regs->Cs & 0x3);\r
+ Ghcb->SaveArea.Cpl = (UINT8)(Regs->Cs & 0x3);\r
VmgSetOffsetValid (Ghcb, GhcbCpl);\r
\r
Status = VmgExit (Ghcb, SVM_EXIT_VMMCALL, 0, 0);\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax)) {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
\r
return 0;\r
ExitInfo1 = 0;\r
\r
switch (*(InstructionData->OpCodes + 1)) {\r
- case 0x30: // WRMSR\r
- ExitInfo1 = 1;\r
- Ghcb->SaveArea.Rax = Regs->Rax;\r
- VmgSetOffsetValid (Ghcb, GhcbRax);\r
- Ghcb->SaveArea.Rdx = Regs->Rdx;\r
- VmgSetOffsetValid (Ghcb, GhcbRdx);\r
+ case 0x30: // WRMSR\r
+ ExitInfo1 = 1;\r
+ Ghcb->SaveArea.Rax = Regs->Rax;\r
+ VmgSetOffsetValid (Ghcb, GhcbRax);\r
+ Ghcb->SaveArea.Rdx = Regs->Rdx;\r
+ VmgSetOffsetValid (Ghcb, GhcbRdx);\r
//\r
// fall through\r
//\r
- case 0x32: // RDMSR\r
- Ghcb->SaveArea.Rcx = Regs->Rcx;\r
- VmgSetOffsetValid (Ghcb, GhcbRcx);\r
- break;\r
- default:\r
- return UnsupportedExit (Ghcb, Regs, InstructionData);\r
+ case 0x32: // RDMSR\r
+ Ghcb->SaveArea.Rcx = Regs->Rcx;\r
+ VmgSetOffsetValid (Ghcb, GhcbRcx);\r
+ break;\r
+ default:\r
+ return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
\r
Status = VmgExit (Ghcb, SVM_EXIT_MSR, ExitInfo1, 0);\r
\r
if (ExitInfo1 == 0) {\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax) ||\r
- !VmgIsOffsetValid (Ghcb, GhcbRdx)) {\r
+ !VmgIsOffsetValid (Ghcb, GhcbRdx))\r
+ {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
Regs->Rdx = Ghcb->SaveArea.Rdx;\r
}\r
ExitInfo = 0;\r
\r
switch (*(InstructionData->OpCodes)) {\r
- //\r
- // INS opcodes\r
- //\r
- case 0x6C:\r
- case 0x6D:\r
- ExitInfo |= IOIO_TYPE_INS;\r
- ExitInfo |= IOIO_SEG_ES;\r
- ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
- break;\r
+ //\r
+ // INS opcodes\r
+ //\r
+ case 0x6C:\r
+ case 0x6D:\r
+ ExitInfo |= IOIO_TYPE_INS;\r
+ ExitInfo |= IOIO_SEG_ES;\r
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
+ break;\r
\r
- //\r
- // OUTS opcodes\r
- //\r
- case 0x6E:\r
- case 0x6F:\r
- ExitInfo |= IOIO_TYPE_OUTS;\r
- ExitInfo |= IOIO_SEG_DS;\r
- ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
- break;\r
+ //\r
+ // OUTS opcodes\r
+ //\r
+ case 0x6E:\r
+ case 0x6F:\r
+ ExitInfo |= IOIO_TYPE_OUTS;\r
+ ExitInfo |= IOIO_SEG_DS;\r
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
+ break;\r
\r
- //\r
- // IN immediate opcodes\r
- //\r
- case 0xE4:\r
- case 0xE5:\r
- InstructionData->ImmediateSize = 1;\r
- InstructionData->End++;\r
- ExitInfo |= IOIO_TYPE_IN;\r
- ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16);\r
- break;\r
+ //\r
+ // IN immediate opcodes\r
+ //\r
+ case 0xE4:\r
+ case 0xE5:\r
+ InstructionData->ImmediateSize = 1;\r
+ InstructionData->End++;\r
+ ExitInfo |= IOIO_TYPE_IN;\r
+ ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16);\r
+ break;\r
\r
- //\r
- // OUT immediate opcodes\r
- //\r
- case 0xE6:\r
- case 0xE7:\r
- InstructionData->ImmediateSize = 1;\r
- InstructionData->End++;\r
- ExitInfo |= IOIO_TYPE_OUT;\r
- ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16) | IOIO_TYPE_OUT;\r
- break;\r
+ //\r
+ // OUT immediate opcodes\r
+ //\r
+ case 0xE6:\r
+ case 0xE7:\r
+ InstructionData->ImmediateSize = 1;\r
+ InstructionData->End++;\r
+ ExitInfo |= IOIO_TYPE_OUT;\r
+ ExitInfo |= ((*(InstructionData->OpCodes + 1)) << 16) | IOIO_TYPE_OUT;\r
+ break;\r
\r
- //\r
- // IN register opcodes\r
- //\r
- case 0xEC:\r
- case 0xED:\r
- ExitInfo |= IOIO_TYPE_IN;\r
- ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
- break;\r
+ //\r
+ // IN register opcodes\r
+ //\r
+ case 0xEC:\r
+ case 0xED:\r
+ ExitInfo |= IOIO_TYPE_IN;\r
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
+ break;\r
\r
- //\r
- // OUT register opcodes\r
- //\r
- case 0xEE:\r
- case 0xEF:\r
- ExitInfo |= IOIO_TYPE_OUT;\r
- ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
- break;\r
+ //\r
+ // OUT register opcodes\r
+ //\r
+ case 0xEE:\r
+ case 0xEF:\r
+ ExitInfo |= IOIO_TYPE_OUT;\r
+ ExitInfo |= ((Regs->Rdx & 0xffff) << 16);\r
+ break;\r
\r
- default:\r
- return 0;\r
+ default:\r
+ return 0;\r
}\r
\r
switch (*(InstructionData->OpCodes)) {\r
- //\r
- // Single-byte opcodes\r
- //\r
- case 0x6C:\r
- case 0x6E:\r
- case 0xE4:\r
- case 0xE6:\r
- case 0xEC:\r
- case 0xEE:\r
- ExitInfo |= IOIO_DATA_8;\r
- break;\r
+ //\r
+ // Single-byte opcodes\r
+ //\r
+ case 0x6C:\r
+ case 0x6E:\r
+ case 0xE4:\r
+ case 0xE6:\r
+ case 0xEC:\r
+ case 0xEE:\r
+ ExitInfo |= IOIO_DATA_8;\r
+ break;\r
\r
- //\r
- // Length determined by instruction parsing\r
- //\r
- default:\r
- ExitInfo |= (InstructionData->DataSize == Size16Bits) ? IOIO_DATA_16\r
+ //\r
+ // Length determined by instruction parsing\r
+ //\r
+ default:\r
+ ExitInfo |= (InstructionData->DataSize == Size16Bits) ? IOIO_DATA_16\r
: IOIO_DATA_32;\r
}\r
\r
switch (InstructionData->AddrSize) {\r
- case Size16Bits:\r
- ExitInfo |= IOIO_ADDR_16;\r
- break;\r
+ case Size16Bits:\r
+ ExitInfo |= IOIO_ADDR_16;\r
+ break;\r
\r
- case Size32Bits:\r
- ExitInfo |= IOIO_ADDR_32;\r
- break;\r
+ case Size32Bits:\r
+ ExitInfo |= IOIO_ADDR_32;\r
+ break;\r
\r
- case Size64Bits:\r
- ExitInfo |= IOIO_ADDR_64;\r
- break;\r
+ case Size64Bits:\r
+ ExitInfo |= IOIO_ADDR_64;\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
}\r
\r
if (InstructionData->RepMode != 0) {\r
\r
Status = 0;\r
\r
- IoBytes = IOIO_DATA_BYTES (ExitInfo1);\r
+ IoBytes = IOIO_DATA_BYTES (ExitInfo1);\r
GhcbCount = sizeof (Ghcb->SharedBuffer) / IoBytes;\r
\r
OpCount = ((ExitInfo1 & IOIO_REP) != 0) ? Regs->Rcx : 1;\r
while (OpCount != 0) {\r
- ExitInfo2 = MIN (OpCount, GhcbCount);\r
+ ExitInfo2 = MIN (OpCount, GhcbCount);\r
VmgExitBytes = ExitInfo2 * IoBytes;\r
\r
if ((ExitInfo1 & IOIO_TYPE_IN) == 0) {\r
- CopyMem (Ghcb->SharedBuffer, (VOID *) Regs->Rsi, VmgExitBytes);\r
+ CopyMem (Ghcb->SharedBuffer, (VOID *)Regs->Rsi, VmgExitBytes);\r
Regs->Rsi += VmgExitBytes;\r
}\r
\r
- Ghcb->SaveArea.SwScratch = (UINT64) Ghcb->SharedBuffer;\r
+ Ghcb->SaveArea.SwScratch = (UINT64)Ghcb->SharedBuffer;\r
VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
Status = VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, ExitInfo2);\r
if (Status != 0) {\r
}\r
\r
if ((ExitInfo1 & IOIO_TYPE_IN) != 0) {\r
- CopyMem ((VOID *) Regs->Rdi, Ghcb->SharedBuffer, VmgExitBytes);\r
+ CopyMem ((VOID *)Regs->Rdi, Ghcb->SharedBuffer, VmgExitBytes);\r
Regs->Rdi += VmgExitBytes;\r
}\r
\r
} else {\r
CopyMem (&Ghcb->SaveArea.Rax, &Regs->Rax, IOIO_DATA_BYTES (ExitInfo1));\r
}\r
+\r
VmgSetOffsetValid (Ghcb, GhcbRax);\r
\r
Status = VmgExit (Ghcb, SVM_EXIT_IOIO_PROT, ExitInfo1, 0);\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax)) {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
CopyMem (&Regs->Rax, &Ghcb->SaveArea.Rax, IOIO_DATA_BYTES (ExitInfo1));\r
}\r
}\r
if (Regs->Rax == CPUID_EXTENDED_STATE) {\r
IA32_CR4 Cr4;\r
\r
- Cr4.UintN = AsmReadCr4 ();\r
+ Cr4.UintN = AsmReadCr4 ();\r
Ghcb->SaveArea.XCr0 = (Cr4.Bits.OSXSAVE == 1) ? AsmXGetBv (0) : 1;\r
VmgSetOffsetValid (Ghcb, GhcbXCr0);\r
}\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax) ||\r
!VmgIsOffsetValid (Ghcb, GhcbRbx) ||\r
!VmgIsOffsetValid (Ghcb, GhcbRcx) ||\r
- !VmgIsOffsetValid (Ghcb, GhcbRdx)) {\r
+ !VmgIsOffsetValid (Ghcb, GhcbRdx))\r
+ {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
Regs->Rbx = Ghcb->SaveArea.Rbx;\r
Regs->Rcx = Ghcb->SaveArea.Rcx;\r
}\r
\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax) ||\r
- !VmgIsOffsetValid (Ghcb, GhcbRdx)) {\r
+ !VmgIsOffsetValid (Ghcb, GhcbRdx))\r
+ {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
Regs->Rdx = Ghcb->SaveArea.Rdx;\r
\r
}\r
\r
if (!VmgIsOffsetValid (Ghcb, GhcbRax) ||\r
- !VmgIsOffsetValid (Ghcb, GhcbRdx)) {\r
+ !VmgIsOffsetValid (Ghcb, GhcbRdx))\r
+ {\r
return UnsupportedExit (Ghcb, Regs, InstructionData);\r
}\r
+\r
Regs->Rax = Ghcb->SaveArea.Rax;\r
Regs->Rdx = Ghcb->SaveArea.Rdx;\r
\r
UINT64 *Register;\r
UINT64 Status;\r
\r
- Ext = &InstructionData->Ext;\r
- SevEsData = (SEV_ES_PER_CPU_DATA *) (Ghcb + 1);\r
+ Ext = &InstructionData->Ext;\r
+ SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);\r
\r
DecodeModRm (Regs, InstructionData);\r
\r
return Status;\r
}\r
\r
- SevEsData->Dr7 = *Register;\r
+ SevEsData->Dr7 = *Register;\r
SevEsData->Dr7Cached = 1;\r
\r
return 0;\r
SEV_ES_PER_CPU_DATA *SevEsData;\r
UINT64 *Register;\r
\r
- Ext = &InstructionData->Ext;\r
- SevEsData = (SEV_ES_PER_CPU_DATA *) (Ghcb + 1);\r
+ Ext = &InstructionData->Ext;\r
+ SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);\r
\r
DecodeModRm (Regs, InstructionData);\r
\r
IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
- EFI_SYSTEM_CONTEXT_X64 *Regs;\r
- NAE_EXIT NaeExit;\r
- SEV_ES_INSTRUCTION_DATA InstructionData;\r
- UINT64 ExitCode, Status;\r
- EFI_STATUS VcRet;\r
- BOOLEAN InterruptState;\r
+ EFI_SYSTEM_CONTEXT_X64 *Regs;\r
+ NAE_EXIT NaeExit;\r
+ SEV_ES_INSTRUCTION_DATA InstructionData;\r
+ UINT64 ExitCode, Status;\r
+ EFI_STATUS VcRet;\r
+ BOOLEAN InterruptState;\r
\r
VcRet = EFI_SUCCESS;\r
\r
\r
ExitCode = Regs->ExceptionData;\r
switch (ExitCode) {\r
- case SVM_EXIT_DR7_READ:\r
- NaeExit = Dr7ReadExit;\r
- break;\r
+ case SVM_EXIT_DR7_READ:\r
+ NaeExit = Dr7ReadExit;\r
+ break;\r
\r
- case SVM_EXIT_DR7_WRITE:\r
- NaeExit = Dr7WriteExit;\r
- break;\r
+ case SVM_EXIT_DR7_WRITE:\r
+ NaeExit = Dr7WriteExit;\r
+ break;\r
\r
- case SVM_EXIT_RDTSC:\r
- NaeExit = RdtscExit;\r
- break;\r
+ case SVM_EXIT_RDTSC:\r
+ NaeExit = RdtscExit;\r
+ break;\r
\r
- case SVM_EXIT_RDPMC:\r
- NaeExit = RdpmcExit;\r
- break;\r
+ case SVM_EXIT_RDPMC:\r
+ NaeExit = RdpmcExit;\r
+ break;\r
\r
- case SVM_EXIT_CPUID:\r
- NaeExit = CpuidExit;\r
- break;\r
+ case SVM_EXIT_CPUID:\r
+ NaeExit = CpuidExit;\r
+ break;\r
\r
- case SVM_EXIT_INVD:\r
- NaeExit = InvdExit;\r
- break;\r
+ case SVM_EXIT_INVD:\r
+ NaeExit = InvdExit;\r
+ break;\r
\r
- case SVM_EXIT_IOIO_PROT:\r
- NaeExit = IoioExit;\r
- break;\r
+ case SVM_EXIT_IOIO_PROT:\r
+ NaeExit = IoioExit;\r
+ break;\r
\r
- case SVM_EXIT_MSR:\r
- NaeExit = MsrExit;\r
- break;\r
+ case SVM_EXIT_MSR:\r
+ NaeExit = MsrExit;\r
+ break;\r
\r
- case SVM_EXIT_VMMCALL:\r
- NaeExit = VmmCallExit;\r
- break;\r
+ case SVM_EXIT_VMMCALL:\r
+ NaeExit = VmmCallExit;\r
+ break;\r
\r
- case SVM_EXIT_RDTSCP:\r
- NaeExit = RdtscpExit;\r
- break;\r
+ case SVM_EXIT_RDTSCP:\r
+ NaeExit = RdtscpExit;\r
+ break;\r
\r
- case SVM_EXIT_WBINVD:\r
- NaeExit = WbinvdExit;\r
- break;\r
+ case SVM_EXIT_WBINVD:\r
+ NaeExit = WbinvdExit;\r
+ break;\r
\r
- case SVM_EXIT_MONITOR:\r
- NaeExit = MonitorExit;\r
- break;\r
+ case SVM_EXIT_MONITOR:\r
+ NaeExit = MonitorExit;\r
+ break;\r
\r
- case SVM_EXIT_MWAIT:\r
- NaeExit = MwaitExit;\r
- break;\r
+ case SVM_EXIT_MWAIT:\r
+ NaeExit = MwaitExit;\r
+ break;\r
\r
- case SVM_EXIT_NPF:\r
- NaeExit = MmioExit;\r
- break;\r
+ case SVM_EXIT_NPF:\r
+ NaeExit = MmioExit;\r
+ break;\r
\r
- default:\r
- NaeExit = UnsupportedExit;\r
+ default:\r
+ NaeExit = UnsupportedExit;\r
}\r
\r
InitInstructionData (&InstructionData, Ghcb, Regs);\r