mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
Ring3: Added SetExceptionAddresses(), aligned exceptions' stacks.
This commit is contained in:
parent
1249d76ef8
commit
3615418a84
@ -113,4 +113,11 @@ GetExceptionAddresses (
|
|||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
SetExceptionAddresses (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN UINTN BufferSize
|
||||||
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -623,6 +623,7 @@ InitializeExceptionStackSwitchHandlers (
|
|||||||
EXCEPTION_STACK_SWITCH_CONTEXT *SwitchStackData;
|
EXCEPTION_STACK_SWITCH_CONTEXT *SwitchStackData;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;
|
||||||
|
|
||||||
Status = MpInitLibWhoAmI (&Index);
|
Status = MpInitLibWhoAmI (&Index);
|
||||||
|
|
||||||
@ -632,6 +633,7 @@ InitializeExceptionStackSwitchHandlers (
|
|||||||
}
|
}
|
||||||
|
|
||||||
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
|
// 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)) {
|
if ((SwitchStackData[Index].Status == EFI_NOT_STARTED) || (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL)) {
|
||||||
SwitchStackData[Index].Status = InitializeSeparateExceptionStacks (SwitchStackData[Index].Buffer, &SwitchStackData[Index].BufferSize);
|
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) {
|
for (Index = 0; Index < mNumberOfProcessors; ++Index) {
|
||||||
if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
|
if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
ASSERT (SwitchStackData[Index].BufferSize != 0);
|
ASSERT (SwitchStackData[Index].BufferSize != 0);
|
||||||
|
SwitchStackData[Index].BufferSize = ALIGN_VALUE (SwitchStackData[Index].BufferSize, EFI_PAGE_SIZE);
|
||||||
BufferSize += SwitchStackData[Index].BufferSize;
|
BufferSize += SwitchStackData[Index].BufferSize;
|
||||||
} else {
|
} else {
|
||||||
ASSERT (SwitchStackData[Index].Status == EFI_SUCCESS);
|
ASSERT (SwitchStackData[Index].Status == EFI_SUCCESS);
|
||||||
|
@ -136,17 +136,13 @@ InitializeSeparateExceptionStacks (
|
|||||||
UINTN LocalBufferSize;
|
UINTN LocalBufferSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
mAddresses.ExceptionStackSize = CPU_STACK_SWITCH_EXCEPTION_NUMBER * CPU_KNOWN_GOOD_STACK_SIZE;
|
|
||||||
|
|
||||||
if ((Buffer == NULL) && (BufferSize == NULL)) {
|
if ((Buffer == NULL) && (BufferSize == NULL)) {
|
||||||
SetMem (mBuffer, sizeof (mBuffer), 0);
|
SetMem (mBuffer, sizeof (mBuffer), 0);
|
||||||
LocalBufferSize = sizeof (mBuffer);
|
LocalBufferSize = sizeof (mBuffer);
|
||||||
Status = ArchSetupExceptionStack (mBuffer, &LocalBufferSize);
|
Status = ArchSetupExceptionStack (mBuffer, &LocalBufferSize);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
mAddresses.ExceptionStackBase = (UINTN)mBuffer;
|
|
||||||
return Status;
|
return Status;
|
||||||
} else {
|
} else {
|
||||||
mAddresses.ExceptionStackBase = (UINTN)Buffer;
|
|
||||||
return ArchSetupExceptionStack (Buffer, BufferSize);
|
return ArchSetupExceptionStack (Buffer, BufferSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -209,11 +205,21 @@ GetExceptionAddresses (
|
|||||||
{
|
{
|
||||||
mSwitchCr3Flag = 1;
|
mSwitchCr3Flag = 1;
|
||||||
|
|
||||||
|
return &mAddresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
SetExceptionAddresses (
|
||||||
|
IN VOID *Buffer,
|
||||||
|
IN UINTN BufferSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
mAddresses.ExceptionStackBase = (UINTN)Buffer;
|
||||||
|
mAddresses.ExceptionStackSize = BufferSize;
|
||||||
mAddresses.ExceptionHandlerBase = (UINTN)&ExceptionHandlerBase;
|
mAddresses.ExceptionHandlerBase = (UINTN)&ExceptionHandlerBase;
|
||||||
mAddresses.ExceptionHandlerSize = (UINTN)&ExceptionHandlerEnd - mAddresses.ExceptionHandlerBase;
|
mAddresses.ExceptionHandlerSize = (UINTN)&ExceptionHandlerEnd - mAddresses.ExceptionHandlerBase;
|
||||||
mAddresses.ExceptionDataBase = (UINTN)&CorePageTable;
|
mAddresses.ExceptionDataBase = (UINTN)&CorePageTable;
|
||||||
|
|
||||||
CorePageTable = AsmReadCr3 ();
|
CorePageTable = AsmReadCr3 ();
|
||||||
|
|
||||||
return &mAddresses;
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user