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
This commit is contained in:
xli24 2007-04-11 03:15:15 +00:00
parent 7e9f4e1d8e
commit 735561c27f
7 changed files with 114 additions and 81 deletions

View File

@ -55,7 +55,7 @@ ASM_PFX(WriteInterruptFlag):
and $0x200,%eax and $0x200,%eax
shr $0x9,%eax shr $0x9,%eax
mov 0x8(%ebp),%ecx mov 0x8(%ebp),%ecx
or %ecx,%ecx or %cl,%cl
jne ASM_PFX(WriteInterruptFlag+0x17) jne ASM_PFX(WriteInterruptFlag+0x17)
cli cli
jmp ASM_PFX(WriteInterruptFlag+0x18) jmp ASM_PFX(WriteInterruptFlag+0x18)

View File

@ -164,7 +164,7 @@ WriteInterruptFlag PROC C PUBLIC State:DWORD
and eax, 200h and eax, 200h
shr eax, 9 shr eax, 9
mov ecx, State mov ecx, State
.IF ecx == 0 .IF cl == 0
cli cli
.ELSE .ELSE
sti sti

View File

@ -46,41 +46,32 @@ Returns:
{ {
UINT8 *StubCopy; 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);
// // The stub code looks like this:
// Next fixup the stub code for this vector //
// // 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
//
// The stub code looks like this: //
// // poke in the exception type so the second push pushes the exception type
// 00000000 89 25 00000004 R mov AppEsp, esp ; save stack top //
// 00000006 BC 00008014 R mov esp, offset DbgStkBot ; switch to debugger stack StubCopy[0x0c] = (UINT8) ExceptionType;
// 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 // fixup the jump target to point to the common entry
// //
StubCopy[0x0c] = (UINT8) ExceptionType; *(UINT32 *) &StubCopy[0x0e] = (UINT32) CommonIdtEntry - (UINT32) &StubCopy[StubSize];
// return EFI_SUCCESS;
// 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;
} }
STATIC STATIC
@ -151,8 +142,6 @@ Returns:
OldIntFlagState = WriteInterruptFlag (0); OldIntFlagState = WriteInterruptFlag (0);
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc)); WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
FreePool ((VOID *) (UINTN) IdtEntryTable[ExceptionType].StubEntry);
ZeroMem (&IdtEntryTable[ExceptionType], sizeof (IDT_ENTRY));
WriteInterruptFlag (OldIntFlagState); WriteInterruptFlag (OldIntFlagState);
return EFI_SUCCESS; return EFI_SUCCESS;
@ -362,16 +351,37 @@ Returns:
--*/ --*/
{ {
EFI_EXCEPTION_TYPE ExceptionType;
if (!FxStorSupport ()) { if (!FxStorSupport ()) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} else { }
IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES);
if (IdtEntryTable != NULL) { IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES);
return EFI_SUCCESS; if (IdtEntryTable == NULL) {
} else { return EFI_OUT_OF_RESOURCES;
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 EFI_STATUS

View File

@ -28,11 +28,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
typedef UINT64 DESCRIPTOR; typedef UINT64 DESCRIPTOR;
typedef
VOID
(*DEBUG_PROC) (
VOID
)
;
typedef struct { typedef struct {
DESCRIPTOR OrigDesc; DESCRIPTOR OrigDesc;
VOID (*OrigVector) (VOID); DEBUG_PROC OrigVector;
DESCRIPTOR NewDesc; DESCRIPTOR NewDesc;
VOID (*StubEntry) (VOID); DEBUG_PROC StubEntry;
VOID (*RegisteredCallback) (); VOID (*RegisteredCallback) ();
} IDT_ENTRY; } IDT_ENTRY;

View File

@ -156,9 +156,8 @@ GetIdtr PROC PUBLIC
push rbp push rbp
mov rbp, rsp mov rbp, rsp
sub rsp, 8h sidt QWORD PTR [rbp - 0ah]
sidt QWORD PTR [rbp - 6] mov rax, QWORD PTR [rbp - 8h]
mov rax, QWORD PTR [rbp - 4]
mov rsp, rbp mov rsp, rbp
pop rbp pop rbp

View File

@ -46,39 +46,30 @@ Returns:
{ {
UINT8 *StubCopy; 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);
// // The stub code looks like this:
// Next fixup the stub code for this vector //
// // 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
//
// The stub code looks like this: //
// // poke in the exception type so the second push pushes the exception type
// 00000000 6A 00 push 0 ; push vector number - will be modified before installed //
// 00000002 E9 db 0e9h ; jump rel32 StubCopy[0x1] = (UINT8) ExceptionType;
// 00000003 00000000 dd 0 ; fixed up to relative address of CommonIdtEntry
//
// //
// poke in the exception type so the second push pushes the exception type // fixup the jump target to point to the common entry
// //
StubCopy[0x1] = (UINT8) ExceptionType; *(UINT32 *) &StubCopy[0x3] = (UINT32)((UINTN) CommonIdtEntry - (UINTN) &StubCopy[StubSize]);
// return EFI_SUCCESS;
// fixup the jump target to point to the common entry
//
*(UINT32 *) &StubCopy[0x3] = (UINT32)((UINTN) CommonIdtEntry - (UINTN) &StubCopy[StubSize]);
return EFI_SUCCESS;
}
return EFI_OUT_OF_RESOURCES;
} }
STATIC STATIC
@ -150,8 +141,6 @@ Returns:
OldIntFlagState = WriteInterruptFlag (0); OldIntFlagState = WriteInterruptFlag (0);
WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc)); WriteIdt (ExceptionType, &(IdtEntryTable[ExceptionType].OrigDesc));
FreePool ((VOID *) (UINTN) IdtEntryTable[ExceptionType].StubEntry);
ZeroMem (&IdtEntryTable[ExceptionType], sizeof (IDT_ENTRY));
WriteInterruptFlag (OldIntFlagState); WriteInterruptFlag (OldIntFlagState);
return EFI_SUCCESS; return EFI_SUCCESS;
@ -359,16 +348,37 @@ Returns:
--*/ --*/
{ {
EFI_EXCEPTION_TYPE ExceptionType;
if (!FxStorSupport ()) { if (!FxStorSupport ()) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} else { }
IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES);
if (IdtEntryTable != NULL) { IdtEntryTable = AllocateZeroPool (sizeof (IDT_ENTRY) * NUM_IDT_ENTRIES);
return EFI_SUCCESS; if (IdtEntryTable == NULL) {
} else { return EFI_OUT_OF_RESOURCES;
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 EFI_STATUS

View File

@ -31,11 +31,18 @@ typedef struct {
UINT64 High; UINT64 High;
} DESCRIPTOR; } DESCRIPTOR;
typedef
VOID
(*DEBUG_PROC) (
VOID
)
;
typedef struct { typedef struct {
DESCRIPTOR OrigDesc; DESCRIPTOR OrigDesc;
VOID (*OrigVector) (VOID); DEBUG_PROC OrigVector;
DESCRIPTOR NewDesc; DESCRIPTOR NewDesc;
VOID (*StubEntry) (VOID); DEBUG_PROC StubEntry;
VOID (*RegisteredCallback) (); VOID (*RegisteredCallback) ();
} IDT_ENTRY; } IDT_ENTRY;