diff --git a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c index 01bb6dfce8..f29831563c 100644 --- a/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c +++ b/IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/ReportStatusCodeLib.c @@ -422,7 +422,7 @@ ReportStatusCodeWithExtendedData ( is responsible for allocating a buffer large enough for the standard header and the extended data passed into this function. The standard header is filled in with a GUID specified by ExtendedDataGuid. If ExtendedDataGuid is NULL, then a - GUID of gEfiStatusCodeSpecificDatauid is used. The status code is reported with + GUID of gEfiStatusCodeSpecificDataGuid is used. The status code is reported with an instance specified by Instance and a caller ID specified by CallerId. If CallerId is NULL, then a caller ID of gEfiCallerIdGuid is used. diff --git a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c index 497d534571..4c62def93a 100644 --- a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c +++ b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c @@ -163,9 +163,12 @@ DebugAssert ( // AsciiStrCpy (Temp + AsciiStrLen (FileName) + 1, Description); - REPORT_STATUS_CODE_WITH_EXTENDED_DATA ( + REPORT_STATUS_CODE_EX ( (EFI_ERROR_CODE | EFI_ERROR_UNRECOVERED), (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_ILLEGAL_SOFTWARE_STATE), + 0, + NULL, + &gEfiStatusCodeDataTypeAssertGuid, AssertData, TotalSize ); diff --git a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf index 07b4750af2..689095917a 100644 --- a/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf +++ b/IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf @@ -53,4 +53,6 @@ [Guids.common] gEfiStatusCodeDataTypeDebugGuid + gEfiStatusCodeDataTypeAssertGuid + \ No newline at end of file diff --git a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf index eb29457ebd..010d840210 100644 --- a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf +++ b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PcatSingleSegmentPciCfgPei.inf @@ -55,13 +55,6 @@ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfgDisable gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPciCfg2Disable -[FixedPcd.common] - ## - # Disable ASSERT for unalign PCI IO access according to PI Volume 1 and PeiCis Spec - # Spec has not this requirement. - ## - gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x0E - [Depex] TRUE diff --git a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg.c b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg.c index 5becfe4701..aaabfbb58a 100644 --- a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg.c +++ b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg.c @@ -54,22 +54,47 @@ PciCfgRead ( UINTN PciLibAddress; PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address); - switch (Width) { - case EfiPeiPciCfgWidthUint8: - * (UINT8 *) Buffer = PciRead8 (PciLibAddress); - break; - case EfiPeiPciCfgWidthUint16: - * (UINT16 *) Buffer = PciRead16 (PciLibAddress); - break; - - case EfiPeiPciCfgWidthUint32: - * (UINT32 *) Buffer = PciRead32 (PciLibAddress); - break; - - default: - return EFI_INVALID_PARAMETER; + if (Width == EfiPeiPciCfgWidthUint8) { + *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); + } else if (Width == EfiPeiPciCfgWidthUint16) { + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // + WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); + *((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1); + } + } else if (Width == EfiPeiPciCfgWidthUint32) { + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // + WriteUnaligned32 (((UINT32 *) Buffer), PciRead32 (PciLibAddress)); + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress)); + WriteUnaligned16 (((UINT16 *) Buffer + 1), PciRead16 (PciLibAddress + 2)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); + *((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1); + *((UINT8 *) Buffer + 2) = PciRead8 (PciLibAddress + 2); + *((UINT8 *) Buffer + 3) = PciRead8 (PciLibAddress + 3); + } + } else { + return EFI_INVALID_PARAMETER; } + return EFI_SUCCESS; } @@ -104,22 +129,47 @@ PciCfgWrite ( UINTN PciLibAddress; PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address); - switch (Width) { - case EfiPeiPciCfgWidthUint8: - PciWrite8 (PciLibAddress, *(UINT8 *) Buffer); - break; - case EfiPeiPciCfgWidthUint16: - PciWrite16 (PciLibAddress, *(UINT16 *) Buffer); - break; - - case EfiPeiPciCfgWidthUint32: - PciWrite32 (PciLibAddress, *(UINT32 *) Buffer); - break; - - default: - return EFI_INVALID_PARAMETER; + if (Width == EfiPeiPciCfgWidthUint8) { + PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); + } else if (Width == EfiPeiPciCfgWidthUint16) { + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // + PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); + PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1)); + } + } else if (Width == EfiPeiPciCfgWidthUint32) { + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // + PciWrite32 (PciLibAddress, ReadUnaligned32 ((UINT32 *) Buffer)); + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer)); + PciWrite16 (PciLibAddress + 2, ReadUnaligned16 ((UINT16 *) Buffer + 1)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); + PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1)); + PciWrite8 (PciLibAddress + 2, *((UINT8 *) Buffer + 2)); + PciWrite8 (PciLibAddress + 3, *((UINT8 *) Buffer + 3)); + } + } else { + return EFI_INVALID_PARAMETER; } + return EFI_SUCCESS; } @@ -154,22 +204,46 @@ PciCfgModify ( UINTN PciLibAddress; PciLibAddress = PciCfgAddressConvert ((EFI_PEI_PCI_CFG_PPI_PCI_ADDRESS *) &Address); - switch (Width) { - case EfiPeiPciCfgWidthUint8: - PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits); - break; - - case EfiPeiPciCfgWidthUint16: + if (Width == EfiPeiPciCfgWidthUint8) { + PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits); + } else if (Width == EfiPeiPciCfgWidthUint16) { + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // PciAndThenOr16 (PciLibAddress, (UINT16)~ClearBits, (UINT16)SetBits); - break; - - case EfiPeiPciCfgWidthUint32: + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits); + PciAndThenOr8 (PciLibAddress + 1, (UINT8)~(ClearBits >> 8), (UINT8)(SetBits >> 8)); + } + } else if (Width == EfiPeiPciCfgWidthUint32) { + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // PciAndThenOr32 (PciLibAddress, (UINT32)~ClearBits, (UINT32)SetBits); - break; - - default: - return EFI_INVALID_PARAMETER; + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + PciAndThenOr16 (PciLibAddress, (UINT16)~ClearBits, (UINT16)SetBits); + PciAndThenOr16 (PciLibAddress + 2, (UINT16)~(ClearBits >> 16), (UINT16)(SetBits >> 16)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciAndThenOr8 (PciLibAddress, (UINT8)~ClearBits, (UINT8)SetBits); + PciAndThenOr8 (PciLibAddress + 1, (UINT8)~(ClearBits >> 8), (UINT8)(SetBits >> 8)); + PciAndThenOr8 (PciLibAddress + 2, (UINT8)~(ClearBits >> 16), (UINT8)(SetBits >> 16)); + PciAndThenOr8 (PciLibAddress + 3, (UINT8)~(ClearBits >> 24), (UINT8)(SetBits >> 24)); + } + } else { + return EFI_INVALID_PARAMETER; } + return EFI_SUCCESS; } diff --git a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg2.c b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg2.c index 6dd47324ca..852476ddd0 100644 --- a/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg2.c +++ b/IntelFrameworkModulePkg/Universal/PcatSingleSegmentPciCfgPei/PciCfg2.c @@ -134,9 +134,39 @@ PciCfg2Read ( if (Width == EfiPeiPciCfgWidthUint8) { *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); } else if (Width == EfiPeiPciCfgWidthUint16) { - *((UINT16 *) Buffer) = PciRead16 (PciLibAddress); + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // + WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); + *((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1); + } } else if (Width == EfiPeiPciCfgWidthUint32) { - *((UINT32 *) Buffer) = PciRead32 (PciLibAddress); + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // + WriteUnaligned32 (((UINT32 *) Buffer), PciRead32 (PciLibAddress)); + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + WriteUnaligned16 (((UINT16 *) Buffer), PciRead16 (PciLibAddress)); + WriteUnaligned16 (((UINT16 *) Buffer + 1), PciRead16 (PciLibAddress + 2)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + *((UINT8 *) Buffer) = PciRead8 (PciLibAddress); + *((UINT8 *) Buffer + 1) = PciRead8 (PciLibAddress + 1); + *((UINT8 *) Buffer + 2) = PciRead8 (PciLibAddress + 2); + *((UINT8 *) Buffer + 3) = PciRead8 (PciLibAddress + 3); + } } else { return EFI_INVALID_PARAMETER; } @@ -185,9 +215,39 @@ PciCfg2Write ( if (Width == EfiPeiPciCfgWidthUint8) { PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); } else if (Width == EfiPeiPciCfgWidthUint16) { - PciWrite16 (PciLibAddress, *((UINT16 *) Buffer)); + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // + PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); + PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1)); + } } else if (Width == EfiPeiPciCfgWidthUint32) { - PciWrite32 (PciLibAddress, *((UINT32 *) Buffer)); + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // + PciWrite32 (PciLibAddress, ReadUnaligned32 ((UINT32 *) Buffer)); + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + PciWrite16 (PciLibAddress, ReadUnaligned16 ((UINT16 *) Buffer)); + PciWrite16 (PciLibAddress + 2, ReadUnaligned16 ((UINT16 *) Buffer + 1)); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciWrite8 (PciLibAddress, *((UINT8 *) Buffer)); + PciWrite8 (PciLibAddress + 1, *((UINT8 *) Buffer + 1)); + PciWrite8 (PciLibAddress + 2, *((UINT8 *) Buffer + 2)); + PciWrite8 (PciLibAddress + 3, *((UINT8 *) Buffer + 3)); + } } else { return EFI_INVALID_PARAMETER; } @@ -247,13 +307,48 @@ PciCfg2Modify ( if (Width == EfiPeiPciCfgWidthUint8) { PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits)); } else if (Width == EfiPeiPciCfgWidthUint16) { - ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits)); - SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits); - PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16); + if ((PciLibAddress & 0x01) == 0) { + // + // Aligned Pci address access + // + ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits)); + SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits); + PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits)); + PciAndThenOr8 (PciLibAddress + 1, (UINT8) (~(*((UINT8 *) ClearBits + 1))), *((UINT8 *) SetBits + 1)); + } } else if (Width == EfiPeiPciCfgWidthUint32) { - ClearValue32 = (UINT32) (~ReadUnaligned32 ((UINT32 *) ClearBits)); - SetValue32 = ReadUnaligned32 ((UINT32 *) SetBits); - PciAndThenOr32 (PciLibAddress, ClearValue32, SetValue32); + if ((PciLibAddress & 0x03) == 0) { + // + // Aligned Pci address access + // + ClearValue32 = (UINT32) (~ReadUnaligned32 ((UINT32 *) ClearBits)); + SetValue32 = ReadUnaligned32 ((UINT32 *) SetBits); + PciAndThenOr32 (PciLibAddress, ClearValue32, SetValue32); + } else if ((PciLibAddress & 0x01) == 0) { + // + // Unaligned Pci address access, break up the request into word by word. + // + ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits)); + SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits); + PciAndThenOr16 (PciLibAddress, ClearValue16, SetValue16); + + ClearValue16 = (UINT16) (~ReadUnaligned16 ((UINT16 *) ClearBits + 1)); + SetValue16 = ReadUnaligned16 ((UINT16 *) SetBits + 1); + PciAndThenOr16 (PciLibAddress + 2, ClearValue16, SetValue16); + } else { + // + // Unaligned Pci address access, break up the request into byte by byte. + // + PciAndThenOr8 (PciLibAddress, (UINT8) (~(*(UINT8 *) ClearBits)), *((UINT8 *) SetBits)); + PciAndThenOr8 (PciLibAddress + 1, (UINT8) (~(*((UINT8 *) ClearBits + 1))), *((UINT8 *) SetBits + 1)); + PciAndThenOr8 (PciLibAddress + 2, (UINT8) (~(*((UINT8 *) ClearBits + 2))), *((UINT8 *) SetBits + 2)); + PciAndThenOr8 (PciLibAddress + 3, (UINT8) (~(*((UINT8 *) ClearBits + 3))), *((UINT8 *) SetBits + 3)); + } } else { return EFI_INVALID_PARAMETER; } diff --git a/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.inf b/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.inf index 3c9501a875..cb3328eab7 100644 --- a/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.inf +++ b/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.inf @@ -78,7 +78,6 @@ [Guids] gEfiDataHubStatusCodeRecordGuid # SOMETIMES_CONSUMED gMemoryStatusCodeRecordGuid # SOMETIMES_CONSUMED - gEfiStatusCodeSpecificDataGuid # SOMETIMES_CONSUMED gEfiStatusCodeDataTypeDebugGuid # PROTOCOL ALWAYS_CONSUMED [Protocols] diff --git a/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c b/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c index 166e70567d..52817283d9 100644 --- a/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c +++ b/IntelFrameworkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c @@ -13,7 +13,6 @@ **/ #include "DxeStatusCode.h" -#include "DebugInfo.h" EFI_SERIAL_IO_PROTOCOL *mSerialIoProtocol; @@ -88,7 +87,6 @@ SerialStatusCodeReportWorker ( UINT32 LineNumber; UINTN CharCount; VA_LIST Marker; - EFI_DEBUG_INFO *DebugInfo; EFI_TPL CurrentTpl; @@ -130,17 +128,6 @@ SerialStatusCodeReportWorker ( Format, Marker ); - } else if (Data != NULL && - CompareGuid (&Data->Type, &gEfiStatusCodeSpecificDataGuid) && - (CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE) { - // - // Print specific data into output buffer. - // - DebugInfo = (EFI_DEBUG_INFO *) (Data + 1); - Marker = (VA_LIST) (DebugInfo + 1); - Format = (CHAR8 *) (((UINT64 *) Marker) + 12); - - CharCount = AsciiVSPrint (Buffer, EFI_STATUS_CODE_DATA_MAX_SIZE, Format, Marker); } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE) { // // Print ERROR information into output buffer. diff --git a/IntelFrameworkModulePkg/Universal/StatusCode/Pei/SerialStatusCodeWorker.c b/IntelFrameworkModulePkg/Universal/StatusCode/Pei/SerialStatusCodeWorker.c index ad8b916e39..111f9e3f2c 100644 --- a/IntelFrameworkModulePkg/Universal/StatusCode/Pei/SerialStatusCodeWorker.c +++ b/IntelFrameworkModulePkg/Universal/StatusCode/Pei/SerialStatusCodeWorker.c @@ -12,7 +12,6 @@ **/ #include "PeiStatusCode.h" -#include "DebugInfo.h" /** Convert status code value and extended data to readable ASCII string, send string to serial I/O device. @@ -59,7 +58,6 @@ SerialStatusCodeReportWorker ( UINT32 LineNumber; UINTN CharCount; VA_LIST Marker; - EFI_DEBUG_INFO *DebugInfo; Buffer[0] = '\0'; @@ -87,17 +85,6 @@ SerialStatusCodeReportWorker ( Format, Marker ); - } else if (Data != NULL && - CompareGuid (&Data->Type, &gEfiStatusCodeSpecificDataGuid) && - (CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_DEBUG_CODE) { - // - // Print specific data into output buffer. - // - DebugInfo = (EFI_DEBUG_INFO *) (Data + 1); - Marker = (VA_LIST) (DebugInfo + 1); - Format = (CHAR8 *) (((UINT64 *) Marker) + 12); - - CharCount = AsciiVSPrint (Buffer, EFI_STATUS_CODE_DATA_MAX_SIZE, Format, Marker); } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE) { // // Print ERROR information into output buffer.