- EFI_STATUS Status;\r
- IA32_IDT_GATE_DESCRIPTOR *IdtTable;\r
- IA32_DESCRIPTOR IdtDescriptor;\r
- UINTN IdtEntryCount;\r
- EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap;\r
- UINTN Index;\r
- UINTN InterruptEntry;\r
- UINT8 *InterruptEntryCode;\r
- RESERVED_VECTORS_DATA *ReservedVectors;\r
- EFI_CPU_INTERRUPT_HANDLER *ExternalInterruptHandler;\r
-\r
- ReservedVectors = AllocatePool (sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM);\r
- ASSERT (ReservedVectors != NULL);\r
- SetMem ((VOID *) ReservedVectors, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
- if (VectorInfo != NULL) {\r
- Status = ReadAndVerifyVectorInfo (VectorInfo, ReservedVectors, CPU_INTERRUPT_NUM);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (ReservedVectors);\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
- InitializeSpinLock (&mDisplayMessageSpinLock);\r
- ExternalInterruptHandler = AllocateZeroPool (sizeof (EFI_CPU_INTERRUPT_HANDLER) * CPU_INTERRUPT_NUM);\r
- ASSERT (ExternalInterruptHandler != NULL);\r
-\r
- //\r
- // Read IDT descriptor and calculate IDT size\r
- //\r
- AsmReadIdtr (&IdtDescriptor);\r
- IdtEntryCount = (IdtDescriptor.Limit + 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR);\r
- if (IdtEntryCount > CPU_INTERRUPT_NUM) {\r
- IdtEntryCount = CPU_INTERRUPT_NUM;\r
- }\r
- //\r
- // Create Interrupt Descriptor Table and Copy the old IDT table in\r
- //\r
- IdtTable = AllocateZeroPool (sizeof (IA32_IDT_GATE_DESCRIPTOR) * CPU_INTERRUPT_NUM);\r
- ASSERT (IdtTable != NULL);\r
- CopyMem (IdtTable, (VOID *)IdtDescriptor.Base, sizeof (IA32_IDT_GATE_DESCRIPTOR) * IdtEntryCount);\r
-\r
- AsmGetTemplateAddressMap (&TemplateMap);\r
- ASSERT (TemplateMap.ExceptionStubHeaderSize <= HOOKAFTER_STUB_SIZE);\r
- InterruptEntryCode = AllocatePool (TemplateMap.ExceptionStubHeaderSize * CPU_INTERRUPT_NUM);\r
- ASSERT (InterruptEntryCode != NULL);\r
- \r
- InterruptEntry = (UINTN) InterruptEntryCode;\r
- for (Index = 0; Index < CPU_INTERRUPT_NUM; Index ++) {\r
- CopyMem (\r
- (VOID *) InterruptEntry,\r
- (VOID *) TemplateMap.ExceptionStart,\r
- TemplateMap.ExceptionStubHeaderSize\r
- );\r
- AsmVectorNumFixup ((VOID *) InterruptEntry, (UINT8) Index, (VOID *) TemplateMap.ExceptionStart);\r
- InterruptEntry += TemplateMap.ExceptionStubHeaderSize;\r
- }\r
-\r
- TemplateMap.ExceptionStart = (UINTN) InterruptEntryCode;\r
- mExceptionHandlerData.IdtEntryCount = CPU_INTERRUPT_NUM;\r
- mExceptionHandlerData.ReservedVectors = ReservedVectors;\r
- mExceptionHandlerData.ExternalInterruptHandler = ExternalInterruptHandler;\r