BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198 A hypervisor is not allowed to update an SEV-ES guests register state, so when booting an SEV-ES guest AP, the hypervisor is not allowed to set the RIP to the guest requested value. Instead, an SEV-ES AP must be transition from 64-bit long mode to 16-bit real mode in response to an INIT-SIPI-SIPI sequence. This requires a 16-bit code segment descriptor. For PEI, create this descriptor in the reset vector GDT table. For DXE, create this descriptor from the newly reserved entry at location 0x28. Cc: Eric Dong <eric.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Eric Dong <eric.dong@intel.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   C based implementation of IA32 interrupt handling only
 | |
|   requiring a minimal assembly interrupt entry point.
 | |
| 
 | |
|   Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _CPU_GDT_H_
 | |
| #define _CPU_GDT_H_
 | |
| 
 | |
| //
 | |
| // Local structure definitions
 | |
| //
 | |
| 
 | |
| #pragma pack (1)
 | |
| 
 | |
| //
 | |
| // Global Descriptor Entry structures
 | |
| //
 | |
| 
 | |
| typedef struct _GDT_ENTRY {
 | |
|   UINT16 Limit15_0;
 | |
|   UINT16 Base15_0;
 | |
|   UINT8  Base23_16;
 | |
|   UINT8  Type;
 | |
|   UINT8  Limit19_16_and_flags;
 | |
|   UINT8  Base31_24;
 | |
| } GDT_ENTRY;
 | |
| 
 | |
| typedef
 | |
| struct _GDT_ENTRIES {
 | |
|   GDT_ENTRY Null;
 | |
|   GDT_ENTRY Linear;
 | |
|   GDT_ENTRY LinearCode;
 | |
|   GDT_ENTRY SysData;
 | |
|   GDT_ENTRY SysCode;
 | |
|   GDT_ENTRY SysCode16;
 | |
|   GDT_ENTRY LinearData64;
 | |
|   GDT_ENTRY LinearCode64;
 | |
|   GDT_ENTRY Spare5;
 | |
| } GDT_ENTRIES;
 | |
| 
 | |
| #pragma pack ()
 | |
| 
 | |
| #define NULL_SEL          OFFSET_OF (GDT_ENTRIES, Null)
 | |
| #define LINEAR_SEL        OFFSET_OF (GDT_ENTRIES, Linear)
 | |
| #define LINEAR_CODE_SEL   OFFSET_OF (GDT_ENTRIES, LinearCode)
 | |
| #define SYS_DATA_SEL      OFFSET_OF (GDT_ENTRIES, SysData)
 | |
| #define SYS_CODE_SEL      OFFSET_OF (GDT_ENTRIES, SysCode)
 | |
| #define SYS_CODE16_SEL    OFFSET_OF (GDT_ENTRIES, SysCode16)
 | |
| #define LINEAR_DATA64_SEL OFFSET_OF (GDT_ENTRIES, LinearData64)
 | |
| #define LINEAR_CODE64_SEL OFFSET_OF (GDT_ENTRIES, LinearCode64)
 | |
| #define SPARE5_SEL        OFFSET_OF (GDT_ENTRIES, Spare5)
 | |
| 
 | |
| #if defined (MDE_CPU_IA32)
 | |
| #define CPU_CODE_SEL LINEAR_CODE_SEL
 | |
| #define CPU_DATA_SEL LINEAR_SEL
 | |
| #elif defined (MDE_CPU_X64)
 | |
| #define CPU_CODE_SEL LINEAR_CODE64_SEL
 | |
| #define CPU_DATA_SEL LINEAR_DATA64_SEL
 | |
| #else
 | |
| #error CPU type not supported for CPU GDT initialization!
 | |
| #endif
 | |
| 
 | |
| #endif // _CPU_GDT_H_
 | |
| 
 |