mirror of https://github.com/acidanthera/audk.git
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:
parent
7e9f4e1d8e
commit
735561c27f
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue