mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-24 22:24:37 +02:00
Ring3: Added SetExceptionAddresses(), aligned exceptions' stacks.
This commit is contained in:
parent
1249d76ef8
commit
3615418a84
@ -113,4 +113,11 @@ GetExceptionAddresses (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
SetExceptionAddresses (
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -623,6 +623,7 @@ InitializeExceptionStackSwitchHandlers (
|
||||
EXCEPTION_STACK_SWITCH_CONTEXT *SwitchStackData;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;
|
||||
|
||||
Status = MpInitLibWhoAmI (&Index);
|
||||
|
||||
@ -631,7 +632,8 @@ InitializeExceptionStackSwitchHandlers (
|
||||
return;
|
||||
}
|
||||
|
||||
SwitchStackData = (EXCEPTION_STACK_SWITCH_CONTEXT *)Buffer;
|
||||
SwitchStackData = (EXCEPTION_STACK_SWITCH_CONTEXT *)Buffer;
|
||||
ApicBaseMsr.Uint64 = AsmReadMsr64 (MSR_IA32_APIC_BASE);
|
||||
|
||||
//
|
||||
// This may be called twice for each Cpu. Only run InitializeSeparateExceptionStacks
|
||||
@ -639,6 +641,9 @@ InitializeExceptionStackSwitchHandlers (
|
||||
//
|
||||
if ((SwitchStackData[Index].Status == EFI_NOT_STARTED) || (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL)) {
|
||||
SwitchStackData[Index].Status = InitializeSeparateExceptionStacks (SwitchStackData[Index].Buffer, &SwitchStackData[Index].BufferSize);
|
||||
if ((ApicBaseMsr.Bits.BSP != 0) && (SwitchStackData[Index].Status == EFI_SUCCESS)) {
|
||||
SetExceptionAddresses (SwitchStackData[Index].Buffer, SwitchStackData[Index].BufferSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -687,6 +692,7 @@ InitializeMpExceptionStackSwitchHandlers (
|
||||
for (Index = 0; Index < mNumberOfProcessors; ++Index) {
|
||||
if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
|
||||
ASSERT (SwitchStackData[Index].BufferSize != 0);
|
||||
SwitchStackData[Index].BufferSize = ALIGN_VALUE (SwitchStackData[Index].BufferSize, EFI_PAGE_SIZE);
|
||||
BufferSize += SwitchStackData[Index].BufferSize;
|
||||
} else {
|
||||
ASSERT (SwitchStackData[Index].Status == EFI_SUCCESS);
|
||||
|
@ -136,17 +136,13 @@ InitializeSeparateExceptionStacks (
|
||||
UINTN LocalBufferSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
mAddresses.ExceptionStackSize = CPU_STACK_SWITCH_EXCEPTION_NUMBER * CPU_KNOWN_GOOD_STACK_SIZE;
|
||||
|
||||
if ((Buffer == NULL) && (BufferSize == NULL)) {
|
||||
SetMem (mBuffer, sizeof (mBuffer), 0);
|
||||
LocalBufferSize = sizeof (mBuffer);
|
||||
Status = ArchSetupExceptionStack (mBuffer, &LocalBufferSize);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
mAddresses.ExceptionStackBase = (UINTN)mBuffer;
|
||||
return Status;
|
||||
} else {
|
||||
mAddresses.ExceptionStackBase = (UINTN)Buffer;
|
||||
return ArchSetupExceptionStack (Buffer, BufferSize);
|
||||
}
|
||||
}
|
||||
@ -209,11 +205,21 @@ GetExceptionAddresses (
|
||||
{
|
||||
mSwitchCr3Flag = 1;
|
||||
|
||||
mAddresses.ExceptionHandlerBase = (UINTN)&ExceptionHandlerBase;
|
||||
mAddresses.ExceptionHandlerSize = (UINTN)&ExceptionHandlerEnd - mAddresses.ExceptionHandlerBase;
|
||||
mAddresses.ExceptionDataBase = (UINTN)&CorePageTable;
|
||||
|
||||
CorePageTable = AsmReadCr3 ();
|
||||
|
||||
return &mAddresses;
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
SetExceptionAddresses (
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
)
|
||||
{
|
||||
mAddresses.ExceptionStackBase = (UINTN)Buffer;
|
||||
mAddresses.ExceptionStackSize = BufferSize;
|
||||
mAddresses.ExceptionHandlerBase = (UINTN)&ExceptionHandlerBase;
|
||||
mAddresses.ExceptionHandlerSize = (UINTN)&ExceptionHandlerEnd - mAddresses.ExceptionHandlerBase;
|
||||
mAddresses.ExceptionDataBase = (UINTN)&CorePageTable;
|
||||
|
||||
CorePageTable = AsmReadCr3 ();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user