mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 11:13:53 +01:00 
			
		
		
		
	OvmfPkg/VmgExitLib: Add support for MWAIT/MWAITX NAE events
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198 Under SEV-ES, a MWAIT/MWAITX intercept generates a #VC exception. VMGEXIT must be used to allow the hypervisor to handle this intercept. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
		
							parent
							
								
									3ef8bfc2b3
								
							
						
					
					
						commit
						9f7e0d0ade
					
				| @ -858,6 +858,38 @@ MmioExit ( | |||||||
|   return Status; |   return Status; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |   Handle a MWAIT event. | ||||||
|  | 
 | ||||||
|  |   Use the VMGEXIT instruction to handle a MWAIT event. | ||||||
|  | 
 | ||||||
|  |   @param[in, out] Ghcb             Pointer to the Guest-Hypervisor Communication | ||||||
|  |                                    Block | ||||||
|  |   @param[in, out] Regs             x64 processor context | ||||||
|  |   @param[in]      InstructionData  Instruction parsing context | ||||||
|  | 
 | ||||||
|  |   @retval 0                        Event handled successfully | ||||||
|  |   @return                          New exception value to propagate | ||||||
|  | 
 | ||||||
|  | **/ | ||||||
|  | STATIC | ||||||
|  | UINT64 | ||||||
|  | MwaitExit ( | ||||||
|  |   IN OUT GHCB                     *Ghcb, | ||||||
|  |   IN OUT EFI_SYSTEM_CONTEXT_X64   *Regs, | ||||||
|  |   IN     SEV_ES_INSTRUCTION_DATA  *InstructionData | ||||||
|  |   ) | ||||||
|  | { | ||||||
|  |   DecodeModRm (Regs, InstructionData); | ||||||
|  | 
 | ||||||
|  |   Ghcb->SaveArea.Rax = Regs->Rax; | ||||||
|  |   GhcbSetRegValid (Ghcb, GhcbRax); | ||||||
|  |   Ghcb->SaveArea.Rcx = Regs->Rcx; | ||||||
|  |   GhcbSetRegValid (Ghcb, GhcbRcx); | ||||||
|  | 
 | ||||||
|  |   return VmgExit (Ghcb, SVM_EXIT_MWAIT, 0, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|   Handle a MONITOR event. |   Handle a MONITOR event. | ||||||
| 
 | 
 | ||||||
| @ -1534,6 +1566,10 @@ VmgExitHandleVc ( | |||||||
|     NaeExit = MonitorExit; |     NaeExit = MonitorExit; | ||||||
|     break; |     break; | ||||||
| 
 | 
 | ||||||
|  |   case SVM_EXIT_MWAIT: | ||||||
|  |     NaeExit = MwaitExit; | ||||||
|  |     break; | ||||||
|  | 
 | ||||||
|   case SVM_EXIT_NPF: |   case SVM_EXIT_NPF: | ||||||
|     NaeExit = MmioExit; |     NaeExit = MmioExit; | ||||||
|     break; |     break; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user