CpuExceptionHandlerLib: Added PcdSerialUseMmio condition.

This commit is contained in:
Mikhail Krichanov 2024-09-23 17:35:27 +03:00
parent 469ae18183
commit 0dd56c8dae
8 changed files with 37 additions and 27 deletions

View File

@ -149,6 +149,7 @@
gEfiHobMemoryAllocStackGuid ## SOMETIMES_CONSUMES ## SystemTable
gUefiImageLoaderImageContextGuid ## CONSUMES ## HOB
gEfiGlobalVariableGuid ## SOMETIMES_CONSUMES ## SysCall
gEarlyPL011BaseAddressGuid ## CONSUMES
[Ppis]
gEfiVectorHandoffInfoPpiGuid ## UNDEFINED # HOB

View File

@ -58,7 +58,7 @@ InitializeRing3 (
CopyMem ((VOID *)gRing3Data, (VOID *)Image->Info.SystemTable, sizeof (EFI_SYSTEM_TABLE));
if (FixedPcdGetBool (PcdSerialUseMmio)) {
if (PcdGetBool (PcdSerialUseMmio)) {
Status = CoreAllocatePages (
AllocateAnyPages,
EfiRing3MemoryType,
@ -79,7 +79,7 @@ InitializeRing3 (
if (CompareGuid (&gEfiHobListGuid, &(Conf->VendorGuid))) {
UartBase = GET_GUID_HOB_DATA (Conf->VendorTable);
gUartBaseAddress = UartBase->DebugAddress;
gUartBaseAddress = (UINTN)UartBase->DebugAddress;
}
++Conf;

View File

@ -52,6 +52,7 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize
gUefiOvmfPkgTokenSpaceGuid.PcdUartBase ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
[FeaturePcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackGuard ## CONSUMES

View File

@ -231,22 +231,25 @@ ArchSetupExceptionStack (
StackTop -= CPU_KNOWN_GOOD_STACK_SIZE;
Tss->SS0 = AsmReadSs ();
Tss->IOMapBaseAddress = sizeof (IA32_TASK_STATE_SEGMENT);
//
// Allow access to gUartBase = 0x3F8 and Offsets: 0x01, 0x03, 0x04, 0x05, 0x06;
// and DebugIoPort = 0x402.
//
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
SetMem (IOBitMap, IO_BIT_MAP_SIZE, 0xFF);
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
| (1U << (Offset + 3)) | (1U << (Offset + 4))
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
if (!PcdGetBool (PcdSerialUseMmio)) {
//
// Allow access to gUartBase = 0x3F8 and Offsets: 0x01, 0x03, 0x04, 0x05, 0x06;
// and DebugIoPort = 0x402.
//
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
| (1U << (Offset + 3)) | (1U << (Offset + 4))
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
*IOBitMapPointer &= ~(1U << Offset);
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
*IOBitMapPointer &= ~(1U << Offset);
}
Tss = (IA32_TASK_STATE_SEGMENT *)((UINTN)Tss + sizeof (IA32_TASK_STATE_SEGMENT) + IO_BIT_MAP_SIZE);
++TssDesc;

View File

@ -61,6 +61,7 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList
gUefiOvmfPkgTokenSpaceGuid.PcdUartBase ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
[FeaturePcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackGuard ## CONSUMES

View File

@ -72,6 +72,7 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize
gUefiOvmfPkgTokenSpaceGuid.PcdUartBase ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
[FeaturePcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackGuard ## CONSUMES

View File

@ -59,6 +59,7 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize
gUefiOvmfPkgTokenSpaceGuid.PcdUartBase ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio ## CONSUMES
[FeaturePcd]
gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackGuard ## CONSUMES

View File

@ -238,23 +238,25 @@ ArchSetupExceptionStack (
Tss->RSP0 = StackTop;
StackTop -= CPU_KNOWN_GOOD_STACK_SIZE;
Tss->IOMapBaseAddress = sizeof (IA32_TASK_STATE_SEGMENT);
//
// Allow access to gUartBase = 0x3F8 and Offsets: 0x01, 0x03, 0x04, 0x05, 0x06;
// and DebugIoPort = 0x402.
//
IOBitMap = (UINT8 *)((UINTN)Tss + Tss->IOMapBaseAddress);
SetMem (IOBitMap, IO_BIT_MAP_SIZE, 0xFF);
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
| (1U << (Offset + 3)) | (1U << (Offset + 4))
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
*IOBitMapPointer &= ~(1U << Offset);
if (!PcdGetBool (PcdSerialUseMmio)) {
//
// Allow access to gUartBase = 0x3F8 and Offsets: 0x01, 0x03, 0x04, 0x05, 0x06;
// and DebugIoPort = 0x402.
//
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdUartBase) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdUartBase) & 0x7U);
*(UINT16 *)IOBitMapPointer &= ~((1U << Offset) | (1U << (Offset + 1))
| (1U << (Offset + 3)) | (1U << (Offset + 4))
| (1U << (Offset + 5)) | (1U << (Offset + 6)));
IOBitMapPointer = (UINT8 *)((UINTN)IOBitMap + FixedPcdGet16 (PcdDebugIoPort) / 8);
Offset = (UINT8)(FixedPcdGet16 (PcdDebugIoPort) & 0x7U);
*IOBitMapPointer &= ~(1U << Offset);
}
//
// Fixup IST and task-state segment
//