+\r
+\r
+ if (FeaturePcdGet (PcdDxeIplEnableIdt)) {\r
+ SizeOfTemplate = AsmGetVectorTemplatInfo (&TemplateBase);\r
+ \r
+ Status = PeiServicesAllocatePages (\r
+ EfiBootServicesData, \r
+ EFI_SIZE_TO_PAGES((SizeOfTemplate + sizeof (X64_IDT_GATE_DESCRIPTOR)) * 32), \r
+ &VectorAddress\r
+ );\r
+ \r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ IdtTable = (X64_IDT_GATE_DESCRIPTOR *) (UINTN) (VectorAddress + SizeOfTemplate * 32);\r
+ for (Index = 0; Index < 32; Index++) {\r
+ IdtTable[Index].Ia32IdtEntry.Bits.GateType = 0x8e;\r
+ IdtTable[Index].Ia32IdtEntry.Bits.Reserved_0 = 0;\r
+ IdtTable[Index].Ia32IdtEntry.Bits.Selector = SYS_CODE64_SEL;\r
+ \r
+ IdtTable[Index].Ia32IdtEntry.Bits.OffsetLow = (UINT16) VectorAddress;\r
+ IdtTable[Index].Ia32IdtEntry.Bits.OffsetHigh = (UINT16) (VectorAddress >> 16);\r
+ IdtTable[Index].Offset32To63 = (UINT32) (VectorAddress >> 32);\r
+ IdtTable[Index].Reserved = 0;\r
+ \r
+ CopyMem ((VOID *) (UINTN) VectorAddress, TemplateBase, SizeOfTemplate);\r
+ AsmVectorFixup ((VOID *) (UINTN) VectorAddress, (UINT8) Index);\r
+ \r
+ VectorAddress += SizeOfTemplate;\r
+ }\r
+ \r
+ gLidtDescriptor.Base = (UINTN) IdtTable;\r
+ AsmWriteIdtr (&gLidtDescriptor);\r
+ }\r
+ //\r