#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
\r
-CONST UINTN mDoFarReturnFlag = 0;\r
+CONST UINTN mDoFarReturnFlag = 0;\r
\r
-RESERVED_VECTORS_DATA mReservedVectorsData[CPU_EXCEPTION_NUM];\r
-EFI_CPU_INTERRUPT_HANDLER mExternalInterruptHandlerTable[CPU_EXCEPTION_NUM];\r
-UINTN mEnabledInterruptNum = 0;\r
+RESERVED_VECTORS_DATA mReservedVectorsData[CPU_INTERRUPT_NUM];\r
+EFI_CPU_INTERRUPT_HANDLER mExternalInterruptHandlerTable[CPU_INTERRUPT_NUM];\r
+EXCEPTION_HANDLER_DATA mExceptionHandlerData = {\r
+ 0, // To be fixed\r
+ 0, // To be fixed\r
+ mReservedVectorsData,\r
+ mExternalInterruptHandlerTable\r
+};\r
\r
-EXCEPTION_HANDLER_DATA mExceptionHandlerData;\r
-\r
-UINT8 mNewStack[CPU_STACK_SWITCH_EXCEPTION_NUMBER *\r
- CPU_KNOWN_GOOD_STACK_SIZE];\r
-UINT8 mNewGdt[CPU_TSS_GDT_SIZE];\r
+UINT8 mNewStack[CPU_STACK_SWITCH_EXCEPTION_NUMBER *\r
+ CPU_KNOWN_GOOD_STACK_SIZE];\r
+UINT8 mNewGdt[CPU_TSS_GDT_SIZE];\r
\r
/**\r
Common exception handler.\r
VOID\r
EFIAPI\r
CommonExceptionHandler (\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN EFI_SYSTEM_CONTEXT SystemContext\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
CommonExceptionHandlerWorker (ExceptionType, SystemContext, &mExceptionHandlerData);\r
EFI_STATUS\r
EFIAPI\r
InitializeCpuExceptionHandlers (\r
- IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
)\r
{\r
- mExceptionHandlerData.ReservedVectors = mReservedVectorsData;\r
- mExceptionHandlerData.ExternalInterruptHandler = mExternalInterruptHandlerTable;\r
InitializeSpinLock (&mExceptionHandlerData.DisplayMessageSpinLock);\r
return InitializeCpuExceptionHandlersWorker (VectorInfo, &mExceptionHandlerData);\r
}\r
EFI_STATUS\r
EFIAPI\r
InitializeCpuInterruptHandlers (\r
- IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
)\r
{\r
- 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
- Status = gBS->AllocatePool (\r
- EfiBootServicesCode,\r
- sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM,\r
- (VOID **)&ReservedVectors\r
- );\r
- ASSERT (!EFI_ERROR (Status) && ReservedVectors != NULL);\r
- SetMem ((VOID *) ReservedVectors, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
+ EFI_STATUS Status;\r
+ IA32_IDT_GATE_DESCRIPTOR *IdtTable;\r
+ IA32_DESCRIPTOR IdtDescriptor;\r
+ UINTN IdtEntryCount;\r
+ EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap;\r
+\r
+ SetMem ((VOID *)mReservedVectorsData, sizeof (RESERVED_VECTORS_DATA) * CPU_INTERRUPT_NUM, 0xff);\r
if (VectorInfo != NULL) {\r
- Status = ReadAndVerifyVectorInfo (VectorInfo, ReservedVectors, CPU_INTERRUPT_NUM);\r
+ Status = ReadAndVerifyVectorInfo (VectorInfo, mReservedVectorsData, CPU_INTERRUPT_NUM);\r
if (EFI_ERROR (Status)) {\r
- FreePool (ReservedVectors);\r
return EFI_INVALID_PARAMETER;\r
}\r
}\r
\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
if (IdtEntryCount > CPU_INTERRUPT_NUM) {\r
IdtEntryCount = CPU_INTERRUPT_NUM;\r
}\r
+\r
//\r
// Create Interrupt Descriptor Table and Copy the old IDT table in\r
//\r
AsmGetTemplateAddressMap (&TemplateMap);\r
ASSERT (TemplateMap.ExceptionStubHeaderSize <= HOOKAFTER_STUB_SIZE);\r
\r
- Status = gBS->AllocatePool (\r
- EfiBootServicesCode,\r
- TemplateMap.ExceptionStubHeaderSize * CPU_INTERRUPT_NUM,\r
- (VOID **)&InterruptEntryCode\r
- );\r
- ASSERT (!EFI_ERROR (Status) && 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
InitializeSpinLock (&mExceptionHandlerData.DisplayMessageSpinLock);\r
\r
UpdateIdtTable (IdtTable, &TemplateMap, &mExceptionHandlerData);\r
//\r
// Load Interrupt Descriptor Table\r
//\r
- IdtDescriptor.Base = (UINTN) IdtTable;\r
- IdtDescriptor.Limit = (UINT16) (sizeof (IA32_IDT_GATE_DESCRIPTOR) * CPU_INTERRUPT_NUM - 1);\r
- AsmWriteIdtr ((IA32_DESCRIPTOR *) &IdtDescriptor);\r
+ IdtDescriptor.Base = (UINTN)IdtTable;\r
+ IdtDescriptor.Limit = (UINT16)(sizeof (IA32_IDT_GATE_DESCRIPTOR) * CPU_INTERRUPT_NUM - 1);\r
+ AsmWriteIdtr ((IA32_DESCRIPTOR *)&IdtDescriptor);\r
\r
return EFI_SUCCESS;\r
}\r
EFI_STATUS\r
EFIAPI\r
RegisterCpuInterruptHandler (\r
- IN EFI_EXCEPTION_TYPE InterruptType,\r
- IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
+ IN EFI_EXCEPTION_TYPE InterruptType,\r
+ IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
)\r
{\r
return RegisterCpuInterruptHandlerWorker (InterruptType, InterruptHandler, &mExceptionHandlerData);\r
EFI_STATUS\r
EFIAPI\r
InitializeCpuExceptionHandlersEx (\r
- IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL,\r
- IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL,\r
+ IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL\r
)\r
{\r
- EFI_STATUS Status;\r
- CPU_EXCEPTION_INIT_DATA EssData;\r
- IA32_DESCRIPTOR Idtr;\r
- IA32_DESCRIPTOR Gdtr;\r
+ EFI_STATUS Status;\r
+ CPU_EXCEPTION_INIT_DATA EssData;\r
+ IA32_DESCRIPTOR Idtr;\r
+ IA32_DESCRIPTOR Gdtr;\r
\r
//\r
// To avoid repeat initialization of default handlers, the caller should pass\r
// version instead; or this method must be implemented as a simple wrapper of\r
// non-ex version of it, if this version has to be called.\r
//\r
- if (InitData == NULL || InitData->X64.InitDefaultHandlers) {\r
+ if ((InitData == NULL) || InitData->X64.InitDefaultHandlers) {\r
Status = InitializeCpuExceptionHandlers (VectorInfo);\r
} else {\r
Status = EFI_SUCCESS;\r
AsmReadIdtr (&Idtr);\r
AsmReadGdtr (&Gdtr);\r
\r
- EssData.X64.Revision = CPU_EXCEPTION_INIT_DATA_REV;\r
- EssData.X64.KnownGoodStackTop = (UINTN)mNewStack + sizeof (mNewStack);\r
- EssData.X64.KnownGoodStackSize = CPU_KNOWN_GOOD_STACK_SIZE;\r
- EssData.X64.StackSwitchExceptions = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
+ EssData.X64.Revision = CPU_EXCEPTION_INIT_DATA_REV;\r
+ EssData.X64.KnownGoodStackTop = (UINTN)mNewStack + sizeof (mNewStack);\r
+ EssData.X64.KnownGoodStackSize = CPU_KNOWN_GOOD_STACK_SIZE;\r
+ EssData.X64.StackSwitchExceptions = CPU_STACK_SWITCH_EXCEPTION_LIST;\r
EssData.X64.StackSwitchExceptionNumber = CPU_STACK_SWITCH_EXCEPTION_NUMBER;\r
- EssData.X64.IdtTable = (VOID *)Idtr.Base;\r
- EssData.X64.IdtTableSize = Idtr.Limit + 1;\r
- EssData.X64.GdtTable = mNewGdt;\r
- EssData.X64.GdtTableSize = sizeof (mNewGdt);\r
- EssData.X64.ExceptionTssDesc = mNewGdt + Gdtr.Limit + 1;\r
- EssData.X64.ExceptionTssDescSize = CPU_TSS_DESC_SIZE;\r
- EssData.X64.ExceptionTss = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
- EssData.X64.ExceptionTssSize = CPU_TSS_SIZE;\r
+ EssData.X64.IdtTable = (VOID *)Idtr.Base;\r
+ EssData.X64.IdtTableSize = Idtr.Limit + 1;\r
+ EssData.X64.GdtTable = mNewGdt;\r
+ EssData.X64.GdtTableSize = sizeof (mNewGdt);\r
+ EssData.X64.ExceptionTssDesc = mNewGdt + Gdtr.Limit + 1;\r
+ EssData.X64.ExceptionTssDescSize = CPU_TSS_DESC_SIZE;\r
+ EssData.X64.ExceptionTss = mNewGdt + Gdtr.Limit + 1 + CPU_TSS_DESC_SIZE;\r
+ EssData.X64.ExceptionTssSize = CPU_TSS_SIZE;\r
\r
InitData = &EssData;\r
}\r
+\r
Status = ArchSetupExceptionStack (InitData);\r
}\r
}\r
\r
- return Status;\r
+ return Status;\r
}\r