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
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
;\r
AsmIdtVectorBegin:\r
%assign Vector 0\r
-%rep 32\r
+%rep 256\r
push byte %[Vector];\r
push eax\r
mov eax, ASM_PFX(CommonInterruptEntry)\r
\r
mov ebx, dword [ebp + 0x8]\r
mov dword [ebx], AsmIdtVectorBegin\r
- mov dword [ebx + 0x4], (AsmIdtVectorEnd - AsmIdtVectorBegin) / 32\r
+ mov dword [ebx + 0x4], (AsmIdtVectorEnd - AsmIdtVectorBegin) / 256\r
mov dword [ebx + 0x8], HookAfterStubBegin\r
\r
popad\r
\r
ALIGN 8\r
\r
+; Generate 32 IDT vectors.\r
+; 32 IDT vectors are enough because interrupts (32+) are not enabled in SEC and PEI phase.\r
AsmIdtVectorBegin:\r
%assign Vector 0\r
%rep 32\r
\r
ALIGN 8\r
\r
+; Generate 256 IDT vectors.\r
AsmIdtVectorBegin:\r
%assign Vector 0\r
-%rep 32\r
+%rep 256\r
push byte %[Vector]\r
push rax\r
mov rax, strict qword 0 ; mov rax, ASM_PFX(CommonInterruptEntry)\r
ASM_PFX(AsmGetTemplateAddressMap):\r
lea rax, [AsmIdtVectorBegin]\r
mov qword [rcx], rax\r
- mov qword [rcx + 0x8], (AsmIdtVectorEnd - AsmIdtVectorBegin) / 32\r
+ mov qword [rcx + 0x8], (AsmIdtVectorEnd - AsmIdtVectorBegin) / 256\r
lea rax, [HookAfterStubHeaderBegin]\r
mov qword [rcx + 0x10], rax\r
\r
; Fix up CommonInterruptEntry address\r
lea rax, [ASM_PFX(CommonInterruptEntry)]\r
lea rcx, [AsmIdtVectorBegin]\r
-%rep 32\r
+%rep 256\r
mov qword [rcx + (JmpAbsoluteAddress - 8 - HookAfterStubHeaderBegin)], rax\r
- add rcx, (AsmIdtVectorEnd - AsmIdtVectorBegin) / 32\r
+ add rcx, (AsmIdtVectorEnd - AsmIdtVectorBegin) / 256\r
%endrep\r
; Fix up HookAfterStubHeaderEnd\r
lea rax, [HookAfterStubHeaderEnd]\r