From 735561c27f91ea1a729492d17dd0efbf021645b0 Mon Sep 17 00:00:00 2001 From: xli24 Date: Wed, 11 Apr 2007 03:15:15 +0000 Subject: Allocate memory in DebugSupport beforehand, in order to avoid calling memory allocation services in high TPL level. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2556 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S | 2 +- .../Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm | 2 +- .../DebugSupport/Dxe/Ia32/plDebugSupport.c | 90 ++++++++++++---------- .../DebugSupport/Dxe/Ia32/plDebugSupport.h | 11 ++- .../Universal/DebugSupport/Dxe/x64/AsmFuncs.asm | 5 +- .../DebugSupport/Dxe/x64/plDebugSupport.c | 80 ++++++++++--------- .../DebugSupport/Dxe/x64/plDebugSupport.h | 11 ++- 7 files changed, 117 insertions(+), 84 deletions(-) diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S index 18cb47b..3063e82 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.S @@ -55,7 +55,7 @@ ASM_PFX(WriteInterruptFlag): and $0x200,%eax shr $0x9,%eax mov 0x8(%ebp),%ecx - or %ecx,%ecx + or %cl,%cl jne ASM_PFX(WriteInterruptFlag+0x17) cli jmp ASM_PFX(WriteInterruptFlag+0x18) diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm index 6dd114b..28a43cf 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/AsmFuncs.asm @@ -164,7 +164,7 @@ WriteInterruptFlag PROC C PUBLIC State:DWORD and eax, 200h shr eax, 9 mov ecx, State - .IF ecx == 0 + .IF cl == 0 cli .ELSE sti diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.c b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.c index 88b8c5a..1eaa5ec 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.c +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.c @@ -46,41 +46,32 @@ Returns: { UINT8 *StubCopy; + StubCopy = *Stub; + // - // First, allocate a new buffer and copy the stub code into it + // Fixup the stub code for this vector // - *Stub = AllocatePool (StubSize); - if (*Stub != NULL) { - StubCopy = *Stub; - CopyMem (StubCopy, InterruptEntryStub, StubSize); - - // - // Next fixup the stub code for this vector - // - - // The stub code looks like this: - // - // 00000000 89 25 00000004 R mov AppEsp, esp ; save stack top - // 00000006 BC 00008014 R mov esp, offset DbgStkBot ; switch to debugger stack - // 0000000B 6A 00 push 0 ; push vector number - will be modified before installed - // 0000000D E9 db 0e9h ; jump rel32 - // 0000000E 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry - // - - // - // poke in the exception type so the second push pushes the exception type - // - StubCopy[0x0c] = (UINT8) ExceptionType; - - // - // fixup the jump target to point to the common entry - // - *(UINT32 *) &StubCopy[0x0e] = (UINT32) CommonIdtEntry - (UINT32) &StubCopy[StubSize]; - - return EFI_SUCCESS; - } - return EFI_OUT_OF_RESOURCES; + // The stub code looks like this: + // + // 00000000 89 25 00000004 R mov AppEsp, esp ; save stack top + // 00000006 BC 00008014 R mov esp, offset DbgStkBot ; switch to debugger stack + // 0000000B 6A 00 push 0 ; push vector number - will be modified before installed + // 0000000D E9 db 0e9h ; jump rel32 + // 0000000E 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry + // + + // + // poke in the exception type so the second push pushes the exception type + // + StubCopy[0x0c] = (UINT8) ExceptionType; + + // + // fixup the jump target to point to the common entry + // + *(UINT32 *) &StubCopy[0x0e] = (UINT32) CommonIdtEntry - (UINT32) &StubCopy[StubSize]; + + return EFI_SUCCESS; } STATIC @@ -151,8 +142,6 @@ Returns: OldIntFlagState = WriteInterruptFlag (0); WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc)); - FreePool ((VOID *) (UINTN) IdtEntryTable[ExceptionType].StubEntry); - ZeroMem (&IdtEntryTable[ExceptionType], sizeof (IDT_ENTRY)); WriteInterruptFlag (OldIntFlagState); return EFI_SUCCESS; @@ -362,16 +351,37 @@ Returns: --*/ { + EFI_EXCEPTION_TYPE ExceptionType; + if (!FxStorSupport ()) { return EFI_UNSUPPORTED; - } else { - IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES); - if (IdtEntryTable != NULL) { - return EFI_SUCCESS; - } else { - return EFI_OUT_OF_RESOURCES; + } + + IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES); + if (IdtEntryTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType++) { + IdtEntryTable[ExceptionType].StubEntry = (DEBUG_PROC) (UINTN) AllocatePool (StubSize); + if (IdtEntryTable[ExceptionType].StubEntry == NULL) { + goto ErrorCleanup; } + + CopyMem ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry, InterruptEntryStub, StubSize); } + return EFI_SUCCESS; + +ErrorCleanup: + + for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType++) { + if (IdtEntryTable[ExceptionType].StubEntry != NULL) { + FreePool ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry); + } + } + FreePool (IdtEntryTable); + + return EFI_OUT_OF_RESOURCES; } EFI_STATUS diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.h b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.h index cb1a6c7..ce8a3fe 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.h +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/Ia32/plDebugSupport.h @@ -28,11 +28,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. typedef UINT64 DESCRIPTOR; +typedef +VOID +(*DEBUG_PROC) ( + VOID + ) +; + typedef struct { DESCRIPTOR OrigDesc; - VOID (*OrigVector) (VOID); + DEBUG_PROC OrigVector; DESCRIPTOR NewDesc; - VOID (*StubEntry) (VOID); + DEBUG_PROC StubEntry; VOID (*RegisteredCallback) (); } IDT_ENTRY; diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/AsmFuncs.asm b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/AsmFuncs.asm index 10e998f..810de90 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/AsmFuncs.asm +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/AsmFuncs.asm @@ -156,9 +156,8 @@ GetIdtr PROC PUBLIC push rbp mov rbp, rsp - sub rsp, 8h - sidt QWORD PTR [rbp - 6] - mov rax, QWORD PTR [rbp - 4] + sidt QWORD PTR [rbp - 0ah] + mov rax, QWORD PTR [rbp - 8h] mov rsp, rbp pop rbp diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.c b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.c index 3f12a76..8b907ee 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.c +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.c @@ -46,39 +46,30 @@ Returns: { UINT8 *StubCopy; + StubCopy = *Stub; + // - // First, allocate a new buffer and copy the stub code into it + // Fixup the stub code for this vector // - *Stub = AllocatePool (StubSize); - if (*Stub != NULL) { - StubCopy = *Stub; - CopyMem (StubCopy, InterruptEntryStub, StubSize); - - // - // Next fixup the stub code for this vector - // - - // The stub code looks like this: - // - // 00000000 6A 00 push 0 ; push vector number - will be modified before installed - // 00000002 E9 db 0e9h ; jump rel32 - // 00000003 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry - // - // - // poke in the exception type so the second push pushes the exception type - // - StubCopy[0x1] = (UINT8) ExceptionType; + // The stub code looks like this: + // + // 00000000 6A 00 push 0 ; push vector number - will be modified before installed + // 00000002 E9 db 0e9h ; jump rel32 + // 00000003 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry + // - // - // fixup the jump target to point to the common entry - // - *(UINT32 *) &StubCopy[0x3] = (UINT32)((UINTN) CommonIdtEntry - (UINTN) &StubCopy[StubSize]); + // + // poke in the exception type so the second push pushes the exception type + // + StubCopy[0x1] = (UINT8) ExceptionType; - return EFI_SUCCESS; - } + // + // fixup the jump target to point to the common entry + // + *(UINT32 *) &StubCopy[0x3] = (UINT32)((UINTN) CommonIdtEntry - (UINTN) &StubCopy[StubSize]); - return EFI_OUT_OF_RESOURCES; + return EFI_SUCCESS; } STATIC @@ -150,8 +141,6 @@ Returns: OldIntFlagState = WriteInterruptFlag (0); WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc)); - FreePool ((VOID *) (UINTN) IdtEntryTable[ExceptionType].StubEntry); - ZeroMem (&IdtEntryTable[ExceptionType], sizeof (IDT_ENTRY)); WriteInterruptFlag (OldIntFlagState); return EFI_SUCCESS; @@ -359,16 +348,37 @@ Returns: --*/ { + EFI_EXCEPTION_TYPE ExceptionType; + if (!FxStorSupport ()) { return EFI_UNSUPPORTED; - } else { - IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES); - if (IdtEntryTable != NULL) { - return EFI_SUCCESS; - } else { - return EFI_OUT_OF_RESOURCES; + } + + IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES); + if (IdtEntryTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType++) { + IdtEntryTable[ExceptionType].StubEntry = (DEBUG_PROC) (UINTN) AllocatePool (StubSize); + if (IdtEntryTable[ExceptionType].StubEntry == NULL) { + goto ErrorCleanup; } + + CopyMem ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry, InterruptEntryStub, StubSize); } + return EFI_SUCCESS; + +ErrorCleanup: + + for (ExceptionType = 0; ExceptionType < NUM_IDT_ENTRIES; ExceptionType++) { + if (IdtEntryTable[ExceptionType].StubEntry != NULL) { + FreePool ((VOID *)(UINTN)IdtEntryTable[ExceptionType].StubEntry); + } + } + FreePool (IdtEntryTable); + + return EFI_OUT_OF_RESOURCES; } EFI_STATUS diff --git a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.h b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.h index 68866a8..42c849e 100644 --- a/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.h +++ b/EdkModulePkg/Universal/DebugSupport/Dxe/x64/plDebugSupport.h @@ -31,11 +31,18 @@ typedef struct { UINT64 High; } DESCRIPTOR; +typedef +VOID +(*DEBUG_PROC) ( + VOID + ) +; + typedef struct { DESCRIPTOR OrigDesc; - VOID (*OrigVector) (VOID); + DEBUG_PROC OrigVector; DESCRIPTOR NewDesc; - VOID (*StubEntry) (VOID); + DEBUG_PROC StubEntry; VOID (*RegisteredCallback) (); } IDT_ENTRY; -- cgit v1.1