* [PATCH v3] Features/Intel/PostCodeDebugFeaturePkg: add it.
@ 2020-06-12 3:40 Tan, Ming
2020-06-15 2:45 ` Dong, Eric
0 siblings, 1 reply; 2+ messages in thread
From: Tan, Ming @ 2020-06-12 3:40 UTC (permalink / raw)
To: devel; +Cc: Eric Dong, Liming Gao
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2478
The PostCodeDebugFeaturePkg include some useful post code debug
libraries, such as get post code from status code and show it.
It provide a library PostCodeStatusCodeHandlerLib used by edk2
StatusCodeHandler.efi, used to show the post code.
It also provide a library of PostCodeMap lib, it map the status code
to post code.
Cc: Eric Dong <eric.dong@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Ming Tan <ming.tan@intel.com>
---
V3: Modify according Eric's comments.
Modify some bugs about dsc file when it is included.
Update Readme.md.
V2: Delete the last empty line in PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
.../Include/Library/PostCodeMapLib.h | 32 +++
.../Include/PostCodeDebugFeature.dsc | 200 +++++++++++++
.../PlatformStatusCodesInternal.h | 270 ++++++++++++++++++
.../Library/PostCodeMapLib/PostCodeMapLib.c | 207 ++++++++++++++
.../Library/PostCodeMapLib/PostCodeMapLib.inf | 27 ++
.../PeiPostCodeStatusCodeHandlerLib.c | 102 +++++++
.../PeiPostCodeStatusCodeHandlerLib.inf | 49 ++++
.../RuntimeDxePostCodeStatusCodeHandlerLib.c | 188 ++++++++++++
...RuntimeDxePostCodeStatusCodeHandlerLib.inf | 51 ++++
.../SmmPostCodeStatusCodeHandlerLib.c | 141 +++++++++
.../SmmPostCodeStatusCodeHandlerLib.inf | 50 ++++
.../PostCodeDebugFeaturePkg.dec | 32 +++
.../PostCodeDebugFeaturePkg.dsc | 30 ++
.../PostCodeDebugFeaturePkg/Readme.md | 117 ++++++++
14 files changed, 1496 insertions(+)
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/PostCodeMapLib.h
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCodeDebugFeature.dsc
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PlatformStatusCodesInternal.h
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.c
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dsc
create mode 100644 Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/PostCodeMapLib.h b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/PostCodeMapLib.h
new file mode 100644
index 0000000000..834be623a1
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/PostCodeMapLib.h
@@ -0,0 +1,32 @@
+/** @file
+ This library class provides Platform PostCode Map.
+
+ Copyright (c) 2011 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __POST_CODE_MAP_LIB__
+#define __POST_CODE_MAP_LIB__
+
+/**
+ Get PostCode from status code type and value.
+
+ @param CodeType Indicates the type of status code being reported.
+ @param Value Describes the current status of a hardware or
+ software entity. This includes information about the class and
+ subclass that is used to classify the entity as well as an operation.
+ For progress codes, the operation is the current activity.
+ For error codes, it is the exception.For debug codes,it is not defined at this time.
+
+ @return PostCode
+
+**/
+UINT32
+EFIAPI
+GetPostCodeFromStatusCode (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value
+ );
+
+#endif
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCodeDebugFeature.dsc b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCodeDebugFeature.dsc
new file mode 100644
index 0000000000..2852b9cf7c
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCodeDebugFeature.dsc
@@ -0,0 +1,200 @@
+## @file
+# This package provides PostCode Debug feature.
+# This file should be included into another package DSC file to build this feature.
+#
+# The DEC files are used by the utilities that parse DSC and
+# INF files to generate AutoGen.c and AutoGen.h files
+# for the build infrastructure.
+#
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+!ifndef $(PEI_ARCH)
+ !error "PEI_ARCH must be specified to build this feature!"
+!endif
+!ifndef $(DXE_ARCH)
+ !error "DXE_ARCH must be specified to build this feature!"
+!endif
+
+################################################################################
+#
+# PCD Section - list of PCD Entries modified by the feature.
+#
+################################################################################
+
+# Unmark the following and StatusCodeHandler.efi to build the .dsc file directly
+#[PcdsDynamicDefault]
+# gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode|TRUE
+
+################################################################################
+#
+# Library Class section - list of all Library Classes needed by this feature.
+#
+################################################################################
+[LibraryClasses]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
+ BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+ DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
+ DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+ DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
+ PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
+ PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+ TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplate.inf
+ UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
+ UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
+ UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
+ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
+ PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
+
+[LibraryClasses.common.PEIM]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
+ PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf
+
+[LibraryClasses.IA32.PEIM,LibraryClasses.IA32.PEI_CORE,LibraryClasses.IA32.SEC]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
+
+[LibraryClasses.common.DXE_DRIVER]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+ UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+ ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf
+
+[LibraryClasses.common.UEFI_DRIVER]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
+ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
+
+[LibraryClasses.X64.DXE_SMM_DRIVER]
+ #######################################
+ # Edk2 Packages
+ #######################################
+ SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf
+ MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf
+ SmmIoLib|MdePkg/Library/SmmIoLib/SmmIoLib.inf
+ SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf
+ ReportStatusCodeLib|MdeModulePkg/Library/SmmReportStatusCodeLib/SmmReportStatusCodeLib.inf
+
+################################################################################
+#
+# Component section - list of all components that need built for this feature.
+#
+# Note: The EDK II DSC file is not used to specify how compiled binary images get placed
+# into firmware volume images. This section is just a list of modules to compile from
+# source into UEFI-compliant binaries.
+# It is the FDF file that contains information on combining binary files into firmware
+# volume images, whose concept is beyond UEFI and is described in PI specification.
+# There may also be modules listed in this section that are not required in the FDF file,
+# When a module listed here is excluded from FDF file, then UEFI-compliant binary will be
+# generated for it, but the binary will not be put into any firmware volume.
+#
+################################################################################
+#
+# Feature PEI Components
+#
+
+# @todo: Change below line to [Components.$(PEI_ARCH)] after https://bugzilla.tianocore.org/show_bug.cgi?id=2308
+# is completed.
+[Components.IA32]
+ #####################################
+ # PostCode Debug Feature Package
+ #####################################
+
+ # Add library instances here that are not included in package components and should be tested
+ # in the package build.
+ PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
+
+ # The following is an example for used with StatusCodeHandler:
+# MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.inf {
+# <LibraryClasses>
+# OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+# SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
+# PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDebug.inf
+# PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
+# NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
+# }
+
+ # Add components here that should be included in the package build.
+
+#
+# Feature DXE Components
+#
+
+# @todo: Change below line to [Components.$(DXE_ARCH)] after https://bugzilla.tianocore.org/show_bug.cgi?id=2308
+# is completed.
+[Components.X64]
+ #####################################
+ # PostCode Debug Feature Package
+ #####################################
+
+ # Add library instances here that are not included in package components and should be tested
+ # in the package build.
+ PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
+ PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
+
+ # The following is an example for used with StatusCodeHandler:
+# MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf {
+# <LibraryClasses>
+# OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+# SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
+# PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDebug.inf
+# PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
+# NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
+# }
+
+# MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerSmm.inf {
+# <LibraryClasses>
+# OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibNull/OemHookStatusCodeLibNull.inf
+# SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf
+# PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDebug.inf
+# PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
+# NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
+# }
+
+ # Add components here that should be included in the package build.
+
+###################################################################################################
+#
+# BuildOptions Section - Define the module specific tool chain flags that should be used as
+# the default flags for a module. These flags are appended to any
+# standard flags that are defined by the build process. They can be
+# applied for any modules or only those modules with the specific
+# module style (EDK or EDKII) specified in [Components] section.
+#
+# For advanced features, it is recommended to enable [BuildOptions] in
+# the applicable INF file so it does not affect the whole board package
+# build when this DSC file is active.
+#
+###################################################################################################
+[BuildOptions]
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PlatformStatusCodesInternal.h b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PlatformStatusCodesInternal.h
new file mode 100644
index 0000000000..7c8daf052d
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PlatformStatusCodesInternal.h
@@ -0,0 +1,270 @@
+/** @file
+ PostCode status code definition.
+
+ Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __PLATFORM_STATUS_CODES_INTERNAL_H__
+#define __PLATFORM_STATUS_CODES_INTERNAL_H__
+
+#include <Pi/PiStatusCode.h>
+
+typedef struct{
+ EFI_STATUS_CODE_VALUE Value;
+ UINT32 Data;
+} STATUS_CODE_TO_DATA_MAP;
+
+//
+// Enable PEI/DXE status code
+//
+#define PEI_STATUS_CODE 1
+#define DXE_STATUS_CODE 1
+
+#define STATUS_CODE_TYPE(Type) ((Type)&EFI_STATUS_CODE_TYPE_MASK)
+#define STATUS_CODE_CLASS(Value) ((Value)&EFI_STATUS_CODE_CLASS_MASK)
+
+//Progress/Error codes
+#define PEI_CORE_STARTED (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_PC_ENTRY_POINT)
+#define PEI_RESET_NOT_AVAILABLE (EFI_SOFTWARE_PEI_CORE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE)
+#define PEI_DXEIPL_NOT_FOUND (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_EC_DXEIPL_NOT_FOUND)
+#define PEI_DXE_CORE_NOT_FOUND (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_EC_DXE_CORRUPT)
+#define PEI_S3_RESUME_ERROR (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_EC_S3_RESUME_FAILED)
+#define PEI_RECOVERY_FAILED (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_EC_RECOVERY_FAILED)
+#define DXE_CORE_STARTED (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ENTRY_POINT)
+
+//#define DXE_EXIT_BOOT_SERVICES_BEGIN 0xF8
+#define DXE_EXIT_BOOT_SERVICES_END (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES)
+
+// Reported by CPU PEIM
+#define PEI_CAR_CPU_INIT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_POWER_ON_INIT)
+
+// Reported by NB PEIM
+//#define PEI_CAR_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_CHIPSET_NORTH_INIT)
+
+// Reported by SB PEIM
+//#define PEI_CAR_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CU_CHIPSET_PC_SOUTH_INIT)
+
+//Reported by Memory Detection PEIM
+#define PEI_MEMORY_SPD_READ (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_SPD_READ)
+#define PEI_MEMORY_PRESENCE_DETECT (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_PRESENCE_DETECT)
+#define PEI_MEMORY_TIMING (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_TIMING)
+#define PEI_MEMORY_CONFIGURING (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_CONFIGURING)
+#define PEI_MEMORY_OPTIMIZING (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_OPTIMIZING)
+#define PEI_MEMORY_INIT (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_INIT)
+#define PEI_MEMORY_TEST (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_TEST)
+#define PEI_MEMORY_INVALID_TYPE (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_TYPE)
+#define PEI_MEMORY_INVALID_SPEED (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SPEED)
+#define PEI_MEMORY_SPD_FAIL (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_SPD_FAIL)
+#define PEI_MEMORY_INVALID_SIZE (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SIZE)
+#define PEI_MEMORY_MISMATCH (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH)
+#define PEI_MEMORY_S3_RESUME_FAILED (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_S3_RESUME_FAIL)
+#define PEI_MEMORY_NOT_DETECTED (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_DETECTED)
+#define PEI_MEMORY_NONE_USEFUL (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_USEFUL)
+#define PEI_MEMORY_ERROR (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_EC_NON_SPECIFIC)
+#define PEI_MEMORY_INSTALLED (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_PC_INSTALL_PEI_MEMORY)
+#define PEI_MEMORY_NOT_INSTALLED (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PEI_CORE_EC_MEMORY_NOT_INSTALLED)
+#define PEI_MEMORY_INSTALLED_TWICE (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_EC_MEMORY_INSTALLED_TWICE)
+
+//Reported by CPU PEIM
+#define PEI_CPU_INIT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_PC_INIT_BEGIN)
+#define PEI_CPU_CACHE_INIT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_CACHE_INIT)
+#define PEI_CPU_BSP_SELECT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_BSP_SELECT)
+#define PEI_CPU_AP_INIT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_AP_INIT)
+#define PEI_CPU_SMM_INIT (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_SMM_INIT)
+#define PEI_CPU_INVALID_TYPE (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_TYPE)
+#define PEI_CPU_INVALID_SPEED (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INVALID_SPEED)
+#define PEI_CPU_MISMATCH (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_MISMATCH)
+#define PEI_CPU_SELF_TEST_FAILED (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
+#define PEI_CPU_CACHE_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_CACHE)
+#define PEI_CPU_MICROCODE_UPDATE_FAILED (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_MICROCODE_UPDATE)
+#define PEI_CPU_NO_MICROCODE (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_NO_MICROCODE_UPDATE)
+//If non of the errors above apply use this one
+#define PEI_CPU_INTERNAL_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INTERNAL)
+//Generic CPU error. It should only be used if non of the errors above apply
+#define PEI_CPU_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_EC_NON_SPECIFIC)
+
+// Reported by NB PEIM
+#define PEI_MEM_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_PEI_MEM_NB_INIT)
+// Reported by SB PEIM
+#define PEI_MEM_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_PEI_MEM_SB_INIT)
+
+//Reported by PEIM which detected forced or auto recovery condition
+#define PEI_RECOVERY_AUTO (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_AUTO)
+#define PEI_RECOVERY_USER (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_USER)
+
+//Reported by DXE IPL
+#define PEI_RECOVERY_PPI_NOT_FOUND (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)
+#define PEI_S3_RESUME_PPI_NOT_FOUND (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_RESUME_PPI_NOT_FOUND)
+#define PEI_S3_RESUME_FAILED (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_RESUME_FAILED)
+
+//Reported by Recovery PEIM
+#define PEI_RECOVERY_STARTED (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_RECOVERY_BEGIN)
+#define PEI_RECOVERY_CAPSULE_FOUND (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD)
+#define PEI_RECOVERY_NO_CAPSULE (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE)
+#define PEI_RECOVERY_CAPSULE_LOADED (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START)
+#define PEI_RECOVERY_INVALID_CAPSULE (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_INVALID_CAPSULE_DESCRIPTOR)
+
+//Reported by S3 Resume PEIM
+#define PEI_S3_BOOT_SCRIPT (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_S3_BOOT_SCRIPT)
+#define PEI_S3_OS_WAKE (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_OS_WAKE)
+#define PEI_S3_BOOT_SCRIPT_ERROR (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_BOOT_SCRIPT_ERROR)
+#define PEI_S3_OS_WAKE_ERROR (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_OS_WAKE_ERROR)
+
+#define PEI_PEIM_STARTED (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT_BEGIN)
+#define PEI_PEIM_ENDED (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT_END)
+
+//Reported by DXE IPL
+#define PEI_DXE_IPL_STARTED (EFI_SOFTWARE_PEI_CORE | EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT)
+
+//Reported by PEIM which installs Reset PPI
+#define PEI_RESET_SYSTEM (EFI_SOFTWARE_PEI_SERVICE | EFI_SW_PS_PC_RESET_SYSTEM)
+
+//Reported by the PEIM or DXE driver which detected the error
+#define GENERIC_MEMORY_CORRECTABLE_ERROR (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_CORRECTABLE)
+#define GENERIC_MEMORY_UNCORRECTABLE_ERROR (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_UNCORRECTABLE)
+
+//Reported by Flash Update DXE driver
+#define DXE_FLASH_UPDATE_FAILED (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_UPDATE_FAIL)
+
+//Reported by the PEIM or DXE driver which detected the error
+#define GENERIC_CPU_THERMAL_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_THERMAL)
+#define GENERIC_CPU_LOW_VOLTAGE (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_LOW_VOLTAGE)
+#define GENERIC_CPU_HIGH_VOLTAGE (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_HIGH_VOLTAGE)
+#define GENERIC_CPU_CORRECTABLE_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_CORRECTABLE)
+#define GENERIC_CPU_UNCORRECTABLE_ERROR (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_UNCORRECTABLE)
+#define GENERIC_BAD_DATE_TIME_ERROR (EFI_SOFTWARE_UNSPECIFIED | EFI_SW_EC_BAD_DATE_TIME)
+#define GENERIC_MEMORY_SIZE_DECREASE (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH)
+
+//Reported by DXE Core
+#define DXE_DRIVER_STARTED (EFI_SOFTWARE_EFI_DXE_SERVICE | EFI_SW_PC_INIT_BEGIN)
+#define DXE_DRIVER_ENED (EFI_SOFTWARE_DXE_CORE | EFI_SW_PC_INIT_END)
+#define DXE_ARCH_PROTOCOLS_AVAILABLE (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ARCH_READY)
+#define DXE_DRIVER_CONNECTED (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_START_DRIVER)
+#define DXE_ARCH_PROTOCOL_NOT_AVAILABLE (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH)
+
+//Reported by DXE CPU driver
+#define DXE_CPU_SELF_TEST_FAILED (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
+
+//Reported by PCI Host Bridge driver
+#define DXE_NB_HB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_HB_INIT )
+
+// Reported by NB Driver
+#define DXE_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_NB_INIT )
+#define DXE_NB_SMM_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_NB_SMM_INIT )
+#define DXE_NB_ERROR (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_EC_DXE_NB_ERROR )
+
+// Reported by SB Driver(s)
+#define DXE_SBRUN_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_SB_RT_INIT )
+#define DXE_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_SB_INIT )
+#define DXE_SB_SMM_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_SB_SMM_INIT )
+#define DXE_SB_DEVICES_INIT (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_PC_DXE_SB_DEVICES_INIT )
+#define DXE_SB_BAD_BATTERY (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_EC_BAD_BATTERY)
+#define DXE_SB_ERROR (EFI_COMPUTING_UNIT_CHIPSET | EFI_CHIPSET_EC_DXE_SB_ERROR )
+
+//Reported by DXE Core
+#define DXE_BDS_STARTED (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT)
+
+//Reported by BDS
+//#define DXE_BDS_CONNECT_DRIVERS (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_BEGIN_CONNECTING_DRIVERS)
+
+//Reported by Boot Manager
+#define DXE_READY_TO_BOOT (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)
+
+//Reported by DXE Core
+#define DXE_EXIT_BOOT_SERVICES (EFI_SOFTWARE_EFI_BOOT_SERVICE | EFI_SW_BS_PC_EXIT_BOOT_SERVICES)
+#define DXE_EXIT_BOOT_SERVICES_EVENT (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_EXIT_BOOT_SERVICES_EVENT)
+
+//Reported by driver that installs Runtime AP
+#define RT_SET_VIRTUAL_ADDRESS_MAP_BEGIN (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP)
+#define RT_SET_VIRTUAL_ADDRESS_MAP_END (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VIRTUAL_ADDRESS_CHANGE_EVENT)
+
+//Reported by CSM
+#define DXE_LEGACY_OPROM_INIT (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_LEGACY_OPROM_INIT)
+#define DXE_LEGACY_BOOT (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_LEGACY_BOOT_EVENT)
+#define DXE_LEGACY_OPROM_NO_SPACE (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_LEGACY_OPROM_NO_SPACE)
+
+//Reported by SETUP
+//#define DXE_SETUP_VERIFYING_PASSWORD (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_VERIFYING_PASSWORD)
+#define DXE_SETUP_START (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_USER_SETUP)
+#define DXE_SETUP_INPUT_WAIT (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)
+#define DXE_INVALID_PASSWORD (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_INVALID_PASSWORD)
+#define DXE_INVALID_IDE_PASSWORD (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_INVALID_IDE_PASSWORD)
+#define DXE_BOOT_OPTION_LOAD_ERROR (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR)
+#define DXE_BOOT_OPTION_FAILED (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED)
+
+//Reported by a Driver that installs Reset AP
+#define DXE_RESET_SYSTEM (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_RESET_SYSTEM)
+#define DXE_RESET_NOT_AVAILABLE (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_PS_EC_RESET_NOT_AVAILABLE)
+
+// Reported by PCI bus driver
+#define DXE_PCI_BUS_BEGIN (EFI_IO_BUS_PCI | EFI_IOB_PC_INIT)
+#define DXE_PCI_BUS_ENUM (EFI_IO_BUS_PCI | EFI_IOB_PCI_BUS_ENUM)
+#define DXE_PCI_BUS_HPC_INIT (EFI_IO_BUS_PCI | EFI_IOB_PCI_HPC_INIT)
+#define DXE_PCI_BUS_REQUEST_RESOURCES (EFI_IO_BUS_PCI | EFI_IOB_PCI_RES_ALLOC)
+#define DXE_PCI_BUS_ASSIGN_RESOURCES (EFI_IO_BUS_PCI | EFI_IOB_PC_ENABLE)
+#define DXE_PCI_BUS_HOTPLUG (EFI_IO_BUS_PCI | EFI_IOB_PC_HOTPLUG)
+#define DXE_PCI_BUS_OUT_OF_RESOURCES (EFI_IO_BUS_PCI | EFI_IOB_EC_RESOURCE_CONFLICT)
+
+// Reported by USB bus driver
+#define DXE_USB_BEGIN (EFI_IO_BUS_USB | EFI_IOB_PC_INIT)
+#define DXE_USB_RESET (EFI_IO_BUS_USB | EFI_IOB_PC_RESET)
+#define DXE_USB_DETECT (EFI_IO_BUS_USB | EFI_IOB_PC_DETECT)
+#define DXE_USB_ENABLE (EFI_IO_BUS_USB | EFI_IOB_PC_ENABLE)
+#define DXE_USB_HOTPLUG (EFI_IO_BUS_USB | EFI_IOB_PC_HOTPLUG)
+
+//Reported by IDE bus driver
+#define DXE_IDE_BEGIN (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_INIT)
+#define DXE_IDE_RESET (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_RESET)
+#define DXE_IDE_DETECT (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_DETECT)
+#define DXE_IDE_ENABLE (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_PC_ENABLE)
+#define DXE_IDE_SMART_ERROR (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_ATA_BUS_SMART_OVERTHRESHOLD)
+#define DXE_IDE_CONTROLLER_ERROR (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_EC_CONTROLLER_ERROR)
+#define DXE_IDE_DEVICE_FAILURE (EFI_IO_BUS_ATA_ATAPI | EFI_IOB_EC_INTERFACE_ERROR)
+
+// Reported by SCSI bus driver
+#define DXE_SCSI_BEGIN (EFI_IO_BUS_SCSI | EFI_IOB_PC_INIT)
+#define DXE_SCSI_RESET (EFI_IO_BUS_SCSI | EFI_IOB_PC_RESET)
+#define DXE_SCSI_DETECT (EFI_IO_BUS_SCSI | EFI_IOB_PC_DETECT)
+#define DXE_SCSI_ENABLE (EFI_IO_BUS_SCSI | EFI_IOB_PC_ENABLE)
+
+// Reported by Super I/O driver
+#define DXE_SIO_INIT (EFI_IO_BUS_LPC | EFI_IOB_PC_INIT)
+
+// Reported by Keyboard driver
+#define DXE_KEYBOARD_INIT (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_INIT)
+#define DXE_KEYBOARD_RESET (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_RESET)
+#define DXE_KEYBOARD_DISABLE (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE)
+#define DXE_KEYBOARD_DETECT (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT)
+#define DXE_KEYBOARD_ENABLE (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE)
+#define DXE_KEYBOARD_CLEAR_BUFFER (EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_CLEAR_BUFFER)
+#define DXE_KEYBOARD_SELF_TEST (EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_SELF_TEST)
+
+// Reported by Mouse driver
+#define DXE_MOUSE_INIT (EFI_PERIPHERAL_MOUSE | EFI_P_PC_INIT)
+#define DXE_MOUSE_RESET (EFI_PERIPHERAL_MOUSE | EFI_P_PC_RESET)
+#define DXE_MOUSE_DISABLE (EFI_PERIPHERAL_MOUSE | EFI_P_PC_DISABLE)
+#define DXE_MOUSE_DETECT (EFI_PERIPHERAL_MOUSE | EFI_P_PC_PRESENCE_DETECT)
+#define DXE_MOUSE_ENABLE (EFI_PERIPHERAL_MOUSE | EFI_P_PC_ENABLE)
+
+// Reported by Mass Storage drivers
+#define DXE_FIXED_MEDIA_INIT (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_INIT)
+#define DXE_FIXED_MEDIA_RESET (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_RESET)
+#define DXE_FIXED_MEDIA_DISABLE (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_DISABLE)
+#define DXE_FIXED_MEDIA_DETECT (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_PRESENCE_DETECT)
+#define DXE_FIXED_MEDIA_ENABLE (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_ENABLE)
+#define DXE_REMOVABLE_MEDIA_INIT (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_INIT)
+#define DXE_REMOVABLE_MEDIA_RESET (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_RESET)
+#define DXE_REMOVABLE_MEDIA_DISABLE (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_DISABLE)
+#define DXE_REMOVABLE_MEDIA_DETECT (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_PRESENCE_DETECT)
+#define DXE_REMOVABLE_MEDIA_ENABLE (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_ENABLE)
+
+
+// Reported by BDS
+#define DXE_CON_OUT_CONNECT (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_INIT)
+#define DXE_CON_IN_CONNECT (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_INIT)
+#define DXE_NO_CON_OUT (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_NOT_DETECTED)
+#define DXE_NO_CON_IN (EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED)
+
+#endif
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.c b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.c
new file mode 100644
index 0000000000..2246e59f8b
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.c
@@ -0,0 +1,207 @@
+/** @file
+ PostCodeMap implementation.
+
+ Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Base.h>
+#include <Uefi.h>
+
+#include "PlatformStatusCodesInternal.h"
+
+STATUS_CODE_TO_DATA_MAP mPostCodeProgressMap[] = {
+ //
+ // PEI
+ //
+ //Regular boot
+ { PEI_CORE_STARTED, 0x10 },
+ { PEI_CAR_CPU_INIT, 0x11 },
+ { PEI_MEMORY_SPD_READ, 0x1D },
+ { PEI_MEMORY_PRESENCE_DETECT, 0x1E },
+ { PEI_MEMORY_TIMING, 0x1F},
+ { PEI_MEMORY_CONFIGURING, 0x20 },
+ { PEI_MEMORY_INIT, 0x21 },
+ { PEI_MEMORY_INSTALLED, 0x31 },
+ { PEI_CPU_INIT, 0x32 },
+ { PEI_CPU_CACHE_INIT, 0x33 },
+ { PEI_CPU_BSP_SELECT, 0x34 },
+ { PEI_CPU_AP_INIT, 0x35 },
+ { PEI_CPU_SMM_INIT, 0x36 },
+ { PEI_MEM_NB_INIT, 0x37 },
+ { PEI_MEM_SB_INIT, 0x3B },
+ { PEI_DXE_IPL_STARTED, 0x4F },
+ //Recovery
+ { PEI_RECOVERY_AUTO, 0xF0 },
+ { PEI_RECOVERY_USER, 0xF1 },
+ { PEI_RECOVERY_STARTED, 0xF2 },
+ { PEI_RECOVERY_CAPSULE_FOUND, 0xF3 },
+ { PEI_RECOVERY_CAPSULE_LOADED, 0xF4 },
+ //S3
+ //{ PEI_S3_STARTED, 0xE0 },
+ { PEI_S3_BOOT_SCRIPT, 0xE1 },
+ //{ PEI_S3_VIDEO_REPOST, 0xE2 },
+ { PEI_S3_OS_WAKE, 0xE3 },
+
+ //
+ // DXE
+ //
+ { DXE_CORE_STARTED, 0x1060 },
+ { DXE_SBRUN_INIT, 0x1062 },
+ { DXE_NB_HB_INIT, 0x1068 },
+ { DXE_NB_INIT, 0x1069 },
+ { DXE_NB_SMM_INIT, 0x106A },
+ { DXE_SB_INIT, 0x1070 },
+ { DXE_SB_SMM_INIT, 0x1071 },
+ { DXE_SB_DEVICES_INIT, 0x1072 },
+ { DXE_BDS_STARTED, 0x1090 },
+ { DXE_PCI_BUS_BEGIN, 0x1092 },
+ { DXE_PCI_BUS_HPC_INIT, 0x1093 },
+ { DXE_PCI_BUS_ENUM, 0x1094 },
+ { DXE_PCI_BUS_REQUEST_RESOURCES, 0x1095 },
+ { DXE_PCI_BUS_ASSIGN_RESOURCES, 0x1096 },
+ { DXE_CON_OUT_CONNECT, 0x1097 },
+ { DXE_CON_IN_CONNECT, 0x1098 },
+ { DXE_SIO_INIT, 0x1099 },
+ { DXE_USB_BEGIN, 0x109A },
+ { DXE_USB_RESET, 0x109B },
+ { DXE_USB_DETECT, 0x109C },
+ { DXE_USB_ENABLE, 0x109D },
+ { DXE_IDE_BEGIN, 0x10A1 },
+ { DXE_IDE_RESET, 0x10A2 },
+ { DXE_IDE_DETECT, 0x10A3 },
+ { DXE_IDE_ENABLE, 0x10A4 },
+ { DXE_SCSI_BEGIN, 0x10A5 },
+ { DXE_SCSI_RESET, 0x10A6 },
+ { DXE_SCSI_DETECT, 0x10A7 },
+ { DXE_SCSI_ENABLE, 0x10A8 },
+ { DXE_SETUP_START, 0x10AB },
+ { DXE_SETUP_INPUT_WAIT, 0x10AC },
+ { DXE_READY_TO_BOOT, 0x10AD },
+ { DXE_LEGACY_BOOT, 0x10AE },
+ { DXE_EXIT_BOOT_SERVICES, 0x10AF },
+ { RT_SET_VIRTUAL_ADDRESS_MAP_BEGIN, 0x10B0 },
+ { RT_SET_VIRTUAL_ADDRESS_MAP_END, 0x10B1 },
+ { DXE_LEGACY_OPROM_INIT, 0x10B2 },
+ { DXE_RESET_SYSTEM, 0x10B3 },
+ { DXE_USB_HOTPLUG, 0x10B4 },
+ { DXE_PCI_BUS_HOTPLUG, 0x10B5 },
+ {0,0}
+};
+
+STATUS_CODE_TO_DATA_MAP mPostCodeErrorMap[] = {
+ //
+ // PEI
+ //
+ //Regular boot
+ { PEI_MEMORY_INVALID_TYPE, 0x50 },
+ { PEI_MEMORY_INVALID_SPEED, 0x50 },
+ { PEI_MEMORY_SPD_FAIL, 0x51 },
+ { PEI_MEMORY_INVALID_SIZE, 0x52 },
+ { PEI_MEMORY_MISMATCH, 0x52 },
+ { PEI_MEMORY_NOT_DETECTED, 0x53 },
+ { PEI_MEMORY_NONE_USEFUL, 0x53 },
+ { PEI_MEMORY_ERROR, 0x54 },
+ { PEI_MEMORY_NOT_INSTALLED, 0x55 },
+ { PEI_CPU_INVALID_TYPE, 0x56 },
+ { PEI_CPU_INVALID_SPEED, 0x56 },
+ { PEI_CPU_MISMATCH, 0x57 },
+ { PEI_CPU_SELF_TEST_FAILED, 0x58 },
+ { PEI_CPU_CACHE_ERROR, 0x58 },
+ { PEI_CPU_MICROCODE_UPDATE_FAILED, 0x59 },
+ { PEI_CPU_NO_MICROCODE, 0x59 },
+ { PEI_CPU_INTERNAL_ERROR, 0x5A },
+ { PEI_CPU_ERROR, 0x5A },
+ { PEI_RESET_NOT_AVAILABLE,0x5B },
+ //Recovery
+ { PEI_RECOVERY_PPI_NOT_FOUND, 0xF8 },
+ { PEI_RECOVERY_NO_CAPSULE, 0xF9 },
+ { PEI_RECOVERY_INVALID_CAPSULE, 0xFA },
+ //S3 Resume
+ { PEI_MEMORY_S3_RESUME_FAILED, 0xE8 },
+ { PEI_S3_RESUME_PPI_NOT_FOUND, 0xE9 },
+ { PEI_S3_BOOT_SCRIPT_ERROR, 0xEA },
+ { PEI_S3_OS_WAKE_ERROR, 0xEB },
+
+ //
+ // DXE
+ //
+ { DXE_CPU_SELF_TEST_FAILED, 0x1058 },
+ { DXE_NB_ERROR, 0x10D1 },
+ { DXE_SB_ERROR, 0x10D2 },
+ { DXE_ARCH_PROTOCOL_NOT_AVAILABLE, 0x10D3 },
+ { DXE_PCI_BUS_OUT_OF_RESOURCES, 0x10D4 },
+ { DXE_LEGACY_OPROM_NO_SPACE, 0x10D5 },
+ { DXE_NO_CON_OUT, 0x10D6 },
+ { DXE_NO_CON_IN, 0x10D7 },
+ { DXE_INVALID_PASSWORD, 0x10D8 },
+ { DXE_BOOT_OPTION_LOAD_ERROR, 0x10D9 },
+ { DXE_BOOT_OPTION_FAILED, 0x10DA },
+ { DXE_FLASH_UPDATE_FAILED, 0x10DB },
+ { DXE_RESET_NOT_AVAILABLE, 0x10DC },
+ {0,0}
+};
+
+STATUS_CODE_TO_DATA_MAP *mPostCodeStatusCodesMap[] = {
+ //#define EFI_PROGRESS_CODE 0x00000001
+ mPostCodeProgressMap,
+ //#define EFI_ERROR_CODE 0x00000002
+ mPostCodeErrorMap
+ //#define EFI_DEBUG_CODE 0x00000003
+};
+
+/**
+ Find the post code data from status code value.
+
+ @param Map The map used to find in.
+ @param Value The status code value.
+
+ @return PostCode 0 for not found.
+
+**/
+UINT32
+FindPostCodeData (
+ IN STATUS_CODE_TO_DATA_MAP *Map,
+ IN EFI_STATUS_CODE_VALUE Value
+ )
+{
+ while (Map->Value != 0) {
+ if (Map->Value == Value) {
+ return Map->Data;
+ }
+ Map++;
+ }
+ return 0;
+}
+
+/**
+ Get PostCode from status code type and value.
+
+ @param CodeType Indicates the type of status code being reported.
+ @param Value Describes the current status of a hardware or
+ software entity. This includes information about the class and
+ subclass that is used to classify the entity as well as an operation.
+ For progress codes, the operation is the current activity.
+ For error codes, it is the exception.For debug codes,it is not defined at this time.
+
+ @return PostCode
+
+**/
+UINT32
+EFIAPI
+GetPostCodeFromStatusCode (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value
+ )
+{
+ UINT32 CodeTypeIndex;
+
+ CodeTypeIndex = STATUS_CODE_TYPE (CodeType) - 1;
+
+ if (CodeTypeIndex >= sizeof (mPostCodeStatusCodesMap) / sizeof(mPostCodeStatusCodesMap[0])) {
+ return 0;
+ }
+
+ return FindPostCodeData (mPostCodeStatusCodesMap[CodeTypeIndex], Value);
+}
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
new file mode 100644
index 0000000000..18a8ac6116
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
@@ -0,0 +1,27 @@
+## @file
+# Instance of Platform Post Code Map Library.
+#
+# Copyright (c) 2011 - 2020, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010017
+ BASE_NAME = PostCodeMapLib
+ FILE_GUID = 1C579857-5328-4304-8607-77B0BC978554
+ VERSION_STRING = 1.0
+ MODULE_TYPE = BASE
+ LIBRARY_CLASS = PostCodeMapLib
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Packages]
+ MdePkg/MdePkg.dec
+
+[Sources]
+ PostCodeMapLib.c
+ PlatformStatusCodesInternal.h
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
new file mode 100644
index 0000000000..85d7a3d9a8
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
@@ -0,0 +1,102 @@
+/** @file
+ PostCode status code implementation.
+
+ Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/PeiServicesLib.h>
+#include <Library/PeimEntryPoint.h>
+#include <Library/PcdLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Ppi/ReportStatusCodeHandler.h>
+
+#include <Library/PostCodeMapLib.h>
+#include <Library/PostCodeLib.h>
+
+/**
+ Convert status code value and write data to post code.
+
+ @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.
+ @param CodeType Indicates the type of status code being reported.
+ @param Value Describes the current status of a hardware or
+ software entity. This includes information about the class and
+ subclass that is used to classify the entity as well as an operation.
+ For progress codes, the operation is the current activity.
+ For error codes, it is the exception.For debug codes,it is not defined at this time.
+ @param Instance The enumeration of a hardware or software entity within
+ the system. A system may contain multiple entities that match a class/subclass
+ pairing. The instance differentiates between them. An instance of 0 indicates
+ that instance information is unavailable, not meaningful, or not relevant.
+ Valid instance numbers start with 1.
+ @param CallerId This optional parameter may be used to identify the caller.
+ This parameter allows the status code driver to apply different rules to
+ different callers.
+ @param Data This optional parameter may be used to pass additional data.
+
+ @retval EFI_SUCCESS Status code reported to post code successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+PostCodeStatusCodeReportWorker (
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN CONST EFI_GUID *CallerId,
+ IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+{
+ UINT32 PostCodeValue;
+
+ PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
+ if (PostCodeValue != 0) {
+ DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
+ PostCode (PostCodeValue);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Constructor function of PeiPostCodeStatusCodeHandlerLib.
+
+ This function is the constructor function of this PostCode Status Code Handler Library for PEI Phase.
+ It check whether need post code, and register it to gEfiPeiRscHandlerPpiGuid.
+
+ @param FileHandle Handle of the file being invoked.
+ @param PeiServices Describes the list of possible PEI Services.
+
+ @retval EFI_SUCESS The entry point of DXE IPL PEIM executes successfully.
+
+**/
+RETURN_STATUS
+EFIAPI
+PeiPostCodeStatusCodeHandlerLibConstructor (
+ IN EFI_PEI_FILE_HANDLE FileHandle,
+ IN CONST EFI_PEI_SERVICES **PeiServices
+ )
+{
+ EFI_STATUS Status;
+ EFI_PEI_RSC_HANDLER_PPI *RscHandlerPpi;
+
+ if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
+ return RETURN_SUCCESS;
+ }
+
+ Status = PeiServicesLocatePpi (
+ &gEfiPeiRscHandlerPpiGuid,
+ 0,
+ NULL,
+ (VOID **) &RscHandlerPpi
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ Status = RscHandlerPpi->Register (PostCodeStatusCodeReportWorker);
+ ASSERT_EFI_ERROR (Status);
+
+ return RETURN_SUCCESS;
+}
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
new file mode 100644
index 0000000000..c27578fe90
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
@@ -0,0 +1,49 @@
+## @file
+# PostCode status code implementation.
+#
+# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+# vendor. This file may not be modified, except as allowed by
+# additional terms of your license agreement.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = PeiPostCodeStatusCodeHandlerLib
+ FILE_GUID = FA32350A-63DB-4AC6-88D1-BC5327EE7ECE
+ MODULE_TYPE = PEIM
+ CONSTRUCTOR = PeiPostCodeStatusCodeHandlerLibConstructor
+ LIBRARY_CLASS = StatusCodeHandlerLib|SEC PEIM PEI_COR
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
+#
+
+[Sources]
+ PeiPostCodeStatusCodeHandlerLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
+
+[LibraryClasses]
+ PeiServicesLib
+ DebugLib
+ PcdLib
+ ReportStatusCodeLib
+ PostCodeMapLib
+ PostCodeLib
+
+[Pcd]
+ gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode ## CONSUMES
+
+[Ppis]
+ gEfiPeiRscHandlerPpiGuid ## CONSUMES
+
+[Depex]
+ TRUE
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
new file mode 100644
index 0000000000..59b531fe7c
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
@@ -0,0 +1,188 @@
+/** @file
+ PostCode status code implementation.
+
+ Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Guid/EventGroup.h>
+#include <Library/HobLib.h>
+#include <Library/PcdLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Protocol/ReportStatusCodeHandler.h>
+
+#include <Library/PostCodeMapLib.h>
+#include <Library/PostCodeLib.h>
+
+EFI_RSC_HANDLER_PROTOCOL *mRscHandlerProtocol = NULL;
+EFI_EVENT mExitBootServicesEvent = NULL;
+BOOLEAN mRegisted = FALSE;
+
+/**
+ Convert status code value and write data to post code.
+
+ @param CodeType Indicates the type of status code being reported.
+ @param Value Describes the current status of a hardware or
+ software entity. This includes information about the class and
+ subclass that is used to classify the entity as well as an operation.
+ For progress codes, the operation is the current activity.
+ For error codes, it is the exception.For debug codes,it is not defined at this time.
+ @param Instance The enumeration of a hardware or software entity within
+ the system. A system may contain multiple entities that match a class/subclass
+ pairing. The instance differentiates between them. An instance of 0 indicates
+ that instance information is unavailable, not meaningful, or not relevant.
+ Valid instance numbers start with 1.
+ @param CallerId This optional parameter may be used to identify the caller.
+ This parameter allows the status code driver to apply different rules to
+ different callers.
+ @param Data This optional parameter may be used to pass additional data.
+
+ @retval EFI_SUCCESS Status code reported to post code successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+PostCodeStatusCodeReportWorker (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN EFI_GUID *CallerId,
+ IN EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+{
+ UINT32 PostCodeValue;
+
+ PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
+ if (PostCodeValue != 0) {
+ DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
+ PostCode (PostCodeValue);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Unregister status code callback functions only available at boot time from
+ report status code router when exiting boot services.
+
+ @param Event Event whose notification function is being invoked.
+ @param Context Pointer to the notification function's context, which is
+ always zero in current implementation.
+
+**/
+VOID
+EFIAPI
+UnregisterPostCodeBootTimeHandlers (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ if (mRegisted) {
+ mRscHandlerProtocol->Unregister (PostCodeStatusCodeReportWorker);
+ }
+}
+
+
+
+/**
+ Register status code callback function only when Report Status Code protocol
+ is installed.
+
+ @param Event Event whose notification function is being invoked.
+ @param Context Pointer to the notification function's context, which is
+ always zero in current implementation.
+
+**/
+VOID
+EFIAPI
+RegisterPostCodeBootTimeHandlers (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (
+ &gEfiRscHandlerProtocolGuid,
+ NULL,
+ (VOID **) &mRscHandlerProtocol
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ mRscHandlerProtocol->Register (PostCodeStatusCodeReportWorker, TPL_HIGH_LEVEL);
+ ASSERT_EFI_ERROR (Status);
+ mRegisted = TRUE;
+
+ Status = gBS->CreateEventEx (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ UnregisterPostCodeBootTimeHandlers,
+ NULL,
+ &gEfiEventExitBootServicesGuid,
+ &mExitBootServicesEvent
+ );
+ ASSERT_EFI_ERROR (Status);
+}
+
+/**
+ Constructor function of RuntimeDxePostCodeStatusCodeHandlerLib.
+
+ This function allocates memory for extended status code data, caches
+ the report status code service, and registers events.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+RuntimeDxePostCodeStatusCodeHandlerLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ EFI_EVENT RegisterStatusCodeHandlerEvent;
+ VOID *Registration;
+
+ if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
+ return EFI_SUCCESS;
+ }
+
+ Status = gBS->LocateProtocol (
+ &gEfiRscHandlerProtocolGuid,
+ NULL,
+ (VOID **) &mRscHandlerProtocol
+ );
+
+ if (!EFI_ERROR (Status)) {
+ RegisterPostCodeBootTimeHandlers (NULL, NULL);
+ } else {
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ RegisterPostCodeBootTimeHandlers,
+ NULL,
+ &RegisterStatusCodeHandlerEvent
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Register for protocol notifications on this event
+ //
+ Status = gBS->RegisterProtocolNotify (
+ &gEfiRscHandlerProtocolGuid,
+ RegisterStatusCodeHandlerEvent,
+ &Registration
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
new file mode 100644
index 0000000000..21012980fe
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
@@ -0,0 +1,51 @@
+## @file
+# PostCode status code implementation.
+#
+# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+# vendor. This file may not be modified, except as allowed by
+# additional terms of your license agreement.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = RuntimeDxePostCodeStatusCodeHandlerLib
+ FILE_GUID = FC4F3901-3E9B-4CA3-AB6C-1B65E9AA6960
+ MODULE_TYPE = DXE_RUNTIME_DRIVER
+ VERSION_STRING = 1.0
+ CONSTRUCTOR = RuntimeDxePostCodeStatusCodeHandlerLibConstructor
+ LIBRARY_CLASS = StatusCodeHandlerLib|DXE_RUNTIME_DRIVER
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
+#
+
+[Sources]
+ RuntimeDxePostCodeStatusCodeHandlerLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
+
+[LibraryClasses]
+ UefiBootServicesTableLib
+ UefiRuntimeLib
+ DebugLib
+ PcdLib
+ ReportStatusCodeLib
+ PostCodeMapLib
+ PostCodeLib
+
+[Pcd]
+ gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode ## CONSUMES
+
+[Protocols]
+ gEfiRscHandlerProtocolGuid ## CONSUMES
+
+[Depex]
+ TRUE
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
new file mode 100644
index 0000000000..efd3a7ee6f
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
@@ -0,0 +1,141 @@
+/** @file
+ PostCode status code implementation.
+
+ Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/SmmServicesTableLib.h>
+#include <Library/HobLib.h>
+#include <Library/PcdLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ReportStatusCodeLib.h>
+#include <Protocol/SmmReportStatusCodeHandler.h>
+
+#include <Library/PostCodeLib.h>
+#include <Library/PostCodeMapLib.h>
+
+
+/**
+ Convert status code value and write data to post code.
+
+ @param CodeType Indicates the type of status code being reported.
+ @param Value Describes the current status of a hardware or
+ software entity. This includes information about the class and
+ subclass that is used to classify the entity as well as an operation.
+ For progress codes, the operation is the current activity.
+ For error codes, it is the exception.For debug codes,it is not defined at this time.
+ @param Instance The enumeration of a hardware or software entity within
+ the system. A system may contain multiple entities that match a class/subclass
+ pairing. The instance differentiates between them. An instance of 0 indicates
+ that instance information is unavailable, not meaningful, or not relevant.
+ Valid instance numbers start with 1.
+ @param CallerId This optional parameter may be used to identify the caller.
+ This parameter allows the status code driver to apply different rules to
+ different callers.
+ @param Data This optional parameter may be used to pass additional data.
+
+ @retval EFI_SUCCESS Status code reported to post code successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+PostCodeStatusCodeReportWorker (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN EFI_GUID *CallerId,
+ IN EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+{
+ UINT32 PostCodeValue;
+
+ PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
+ if (PostCodeValue != 0) {
+ DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
+ PostCode (PostCodeValue);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Register status code callback function only when Report Status Code protocol
+ is installed.
+
+ @param Protocol Points to the protocol's unique identifier.
+ @param Interface Points to the interface instance.
+ @param Handle The handle on which the interface was installed.
+
+ @retval EFI_SUCCESS Notification runs successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+RegisterPostCodeBootTimeHandlers (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ EFI_SMM_RSC_HANDLER_PROTOCOL *RscHandlerProtocol;
+
+ Status = gSmst->SmmLocateProtocol (
+ &gEfiSmmRscHandlerProtocolGuid,
+ NULL,
+ (VOID **) &RscHandlerProtocol
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ RscHandlerProtocol->Register (PostCodeStatusCodeReportWorker);
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Constructor function of SmmPostCodeStatusCodeHandlerLib.
+
+ This function allocates memory for extended status code data, caches
+ the report status code service, and registers events.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmPostCodeStatusCodeHandlerLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ VOID *Registration;
+ EFI_SMM_RSC_HANDLER_PROTOCOL *RscHandlerProtocol;
+
+ if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
+ return EFI_SUCCESS;
+ }
+
+ Status = gSmst->SmmLocateProtocol (
+ &gEfiSmmRscHandlerProtocolGuid,
+ NULL,
+ (VOID **) &RscHandlerProtocol
+ );
+ if (!EFI_ERROR (Status)) {
+ RegisterPostCodeBootTimeHandlers (NULL, NULL, NULL);
+ } else {
+ gSmst->SmmRegisterProtocolNotify (
+ &gEfiSmmRscHandlerProtocolGuid,
+ RegisterPostCodeBootTimeHandlers,
+ &Registration
+ );
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
new file mode 100644
index 0000000000..7cc357fd49
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
@@ -0,0 +1,50 @@
+## @file
+# PostCode status code implementation.
+#
+# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+# vendor. This file may not be modified, except as allowed by
+# additional terms of your license agreement.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SmmPostCodeStatusCodeHandlerLib
+ FILE_GUID = AE5C0A80-309A-42F7-BFDD-80CDA1BA2D7E
+ MODULE_TYPE = DXE_SMM_DRIVER
+ VERSION_STRING = 1.0
+ CONSTRUCTOR = SmmPostCodeStatusCodeHandlerLibConstructor
+ LIBRARY_CLASS = StatusCodeHandlerLib|DXE_SMM_DRIVER
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
+#
+
+[Sources]
+ SmmPostCodeStatusCodeHandlerLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
+
+[LibraryClasses]
+ SmmServicesTableLib
+ DebugLib
+ PcdLib
+ ReportStatusCodeLib
+ PostCodeMapLib
+ PostCodeLib
+
+[Pcd]
+ gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode ## CONSUMES
+
+[Protocols]
+ gEfiSmmRscHandlerProtocolGuid ## CONSUMES
+
+[Depex]
+ TRUE
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
new file mode 100644
index 0000000000..7d0e474965
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
@@ -0,0 +1,32 @@
+## @file
+# This package provides PostCode Debug feature.
+# This package should only depend on EDK II Core packages, IntelSiliconPkg, and MinPlatformPkg.
+#
+# The DEC files are used by the utilities that parse DSC and
+# INF files to generate AutoGen.c and AutoGen.h files
+# for the build infrastructure.
+#
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ DEC_SPECIFICATION = 0x00010017
+ PACKAGE_NAME = PostCodeDebugFeaturePkg
+ PACKAGE_GUID = A579E0A8-0D27-4CA6-900E-D613003729DE
+ PACKAGE_VERSION = 0.1
+
+[Includes]
+ Include
+
+[LibraryClasses]
+ ## @libraryclass Provide the function to map the status code to post code.
+ PostCodeMapLib|Include/Library/PostCodeMapLib.h
+
+[Guids]
+ gPostCodeDebugFeaturePkgTokenSpaceGuid = {0x68886ac8, 0x7a29, 0x4845, {0xa7, 0x02, 0xe9, 0x83, 0xc8, 0x7f, 0xfb, 0xab}}
+
+[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
+ gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode|TRUE|BOOLEAN|0x00000001
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dsc b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dsc
new file mode 100644
index 0000000000..4f0bec4a6f
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dsc
@@ -0,0 +1,30 @@
+## @file
+# This package provides PostCode Debug feature.
+# This package should only depend on EDK II Core packages, IntelSiliconPkg, and MinPlatformPkg.
+#
+# The DEC files are used by the utilities that parse DSC and
+# INF files to generate AutoGen.c and AutoGen.h files
+# for the build infrastructure.
+#
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ PLATFORM_NAME = PostCodeFeaturePkg
+ PLATFORM_GUID = 4ADE0B1A-7929-495D-A221-6576C7884CAC
+ PLATFORM_VERSION = 0.1
+ DSC_SPECIFICATION = 0x00010005
+ OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME)
+ SUPPORTED_ARCHITECTURES = IA32|X64
+ BUILD_TARGETS = DEBUG|RELEASE|NOOPT
+ SKUID_IDENTIFIER = DEFAULT
+ PEI_ARCH = IA32
+ DXE_ARCH = X64
+
+#
+# This package always builds the feature.
+#
+!include Include/PostCodeDebugFeature.dsc
diff --git a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
new file mode 100644
index 0000000000..c49db35999
--- /dev/null
+++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
@@ -0,0 +1,117 @@
+# Overview
+* **Feature Name:** Post Code Debug
+* **PI Phase(s) Supported:** PEI, DXE, SMM
+* **SMM Required?** Yes
+
+More Information:
+
+## Purpose
+The PostCodeDebugFeaturePkg include some useful post code debug libraries, such as get post code from status code and show it.
+This is an important capability in firmware development to get and analyze the post code.
+
+
+# High-Level Theory of Operation
+It provide a library PostCodeStatusCodeHandlerLib used by edk2 StatusCodeHandler.efi, used to show the post code.
+It also provide a library of PostCodeMap lib, it map the status code to post code.
+A library of PostCode lib is needed by platform.
+
+In the library contstructor function, PostCodeStatusCodeHandlerLib register the call back function for ReportStatusCode.
+When called, it call GetPostCodeFromStatusCode() in PostCodeMapLib to get post code from status code, and call PostCode() in PostCodeLib to show the post code.
+
+PostCodeStatusCodeHandlerLib include 3 libraries for PEI, RuntimeDxe, SMM:
+* PeiPostCodeStatusCodeHandlerLib
+* RuntimeDxePostCodeStatusCodeHandlerLib
+* SmmPostCodeStatusCodeHandlerLib
+
+## Firmware Volumes
+Linked with StatusCodeHandler.efi, and make sure put the StatusCodeHandler.efi after the ReportStatusCodeRouter.efi.
+
+## Modules
+* PostCodeStatusCodeHandlerLib
+* PostCodeMapLib
+
+## PostCodeStatusCodeHandlerLib
+This library register the call back function for ReportStatusCode, and get post code from status code, and show post code.
+
+## PostCodeMapLib
+This library provide a function to get post code from status code.
+
+## Key Functions
+* In PeiPostCodeStatusCodeHandlerLib:
+ EFI_STATUS
+ EFIAPI
+ PostCodeStatusCodeReportWorker (
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN CONST EFI_GUID *CallerId,
+ IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+
+* In RuntimeDxePostCodeStatusCodeHandlerLib:
+ EFI_STATUS
+ EFIAPI
+ PostCodeStatusCodeReportWorker (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN EFI_GUID *CallerId,
+ IN EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+
+* In SmmPostCodeStatusCodeHandlerLib:
+ EFI_STATUS
+ EFIAPI
+ PostCodeStatusCodeReportWorker (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value,
+ IN UINT32 Instance,
+ IN EFI_GUID *CallerId,
+ IN EFI_STATUS_CODE_DATA *Data OPTIONAL
+ )
+
+* In PostCodeMapLib:
+ UINT32
+ EFIAPI
+ GetPostCodeFromStatusCode (
+ IN EFI_STATUS_CODE_TYPE CodeType,
+ IN EFI_STATUS_CODE_VALUE Value
+ )
+
+## Configuration
+* Link the library to StatusCodeHandler.efi.
+ Example:
+ MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.inf {
+ <LibraryClasses>
+ NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
+ }
+ Refer to PostCodeDebugFeature.dsc for other example.
+* Config PCD gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode.
+ In platform .dsc file, need to config the type of gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode.
+ Use PcdsFixedAtBuild to save binary size, and use PcdsDynamic if want to enable/disable in runtime.
+* Implemented platform's special PostCodeMapLib if needed.
+* Provide the platform's special PostCodeLib.
+* Make sure put the StatusCodeHandler.efi after the ReportStatusCodeRouter.efi.
+
+## Data Flows
+Status Code (ReportStatusCode) -> Post Code (GetPostCodeFromStatusCode).
+
+## Control Flows
+ReportStatusCode() -> PostCodeStatusCodeReportWorker() -> GetPostCodeFromStatusCode() -> PostCode()
+
+## Build Flows
+There is not special build flows.
+
+## Test Point Results
+Verify the post code shown is correct.
+
+## Functional Exit Criteria
+N/A
+
+## Feature Enabling Checklist
+* Set the PCD gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode to TRUE.
+* The post code can be shown.
+
+## Common Optimizations
+* Implemented platform's special PostCodeMapLib if needed.
--
2.24.0.windows.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3] Features/Intel/PostCodeDebugFeaturePkg: add it.
2020-06-12 3:40 [PATCH v3] Features/Intel/PostCodeDebugFeaturePkg: add it Tan, Ming
@ 2020-06-15 2:45 ` Dong, Eric
0 siblings, 0 replies; 2+ messages in thread
From: Dong, Eric @ 2020-06-15 2:45 UTC (permalink / raw)
To: Tan, Ming, devel@edk2.groups.io; +Cc: Gao, Liming
Reviewed-by: Eric Dong <eric.dong@intel.com>
> -----Original Message-----
> From: Tan, Ming <ming.tan@intel.com>
> Sent: Friday, June 12, 2020 11:41 AM
> To: devel@edk2.groups.io
> Cc: Dong, Eric <eric.dong@intel.com>; Gao, Liming <liming.gao@intel.com>
> Subject: [PATCH v3] Features/Intel/PostCodeDebugFeaturePkg: add it.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2478
>
> The PostCodeDebugFeaturePkg include some useful post code debug
> libraries, such as get post code from status code and show it.
>
> It provide a library PostCodeStatusCodeHandlerLib used by edk2
> StatusCodeHandler.efi, used to show the post code.
> It also provide a library of PostCodeMap lib, it map the status code
> to post code.
>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Ming Tan <ming.tan@intel.com>
> ---
> V3: Modify according Eric's comments.
> Modify some bugs about dsc file when it is included.
> Update Readme.md.
> V2: Delete the last empty line in
> PostCodeDebugFeaturePkg/Library/PostCodeMapLib/PostCodeMapLib.inf
> .../Include/Library/PostCodeMapLib.h | 32 +++
> .../Include/PostCodeDebugFeature.dsc | 200 +++++++++++++
> .../PlatformStatusCodesInternal.h | 270 ++++++++++++++++++
> .../Library/PostCodeMapLib/PostCodeMapLib.c | 207 ++++++++++++++
> .../Library/PostCodeMapLib/PostCodeMapLib.inf | 27 ++
> .../PeiPostCodeStatusCodeHandlerLib.c | 102 +++++++
> .../PeiPostCodeStatusCodeHandlerLib.inf | 49 ++++
> .../RuntimeDxePostCodeStatusCodeHandlerLib.c | 188 ++++++++++++
> ...RuntimeDxePostCodeStatusCodeHandlerLib.inf | 51 ++++
> .../SmmPostCodeStatusCodeHandlerLib.c | 141 +++++++++
> .../SmmPostCodeStatusCodeHandlerLib.inf | 50 ++++
> .../PostCodeDebugFeaturePkg.dec | 32 +++
> .../PostCodeDebugFeaturePkg.dsc | 30 ++
> .../PostCodeDebugFeaturePkg/Readme.md | 117 ++++++++
> 14 files changed, 1496 insertions(+)
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/Post
> CodeMapLib.h
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCodeDe
> bugFeature.dsc
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMa
> pLib/PlatformStatusCodesInternal.h
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMa
> pLib/PostCodeMapLib.c
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeMa
> pLib/PostCodeMapLib.inf
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeStat
> usCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeat
> urePkg.dec
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFeat
> urePkg.dsc
> create mode 100644
> Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/Po
> stCodeMapLib.h
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/Po
> stCodeMapLib.h
> new file mode 100644
> index 0000000000..834be623a1
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/Library/Po
> stCodeMapLib.h
> @@ -0,0 +1,32 @@
> +/** @file
>
> + This library class provides Platform PostCode Map.
>
> +
>
> + Copyright (c) 2011 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#ifndef __POST_CODE_MAP_LIB__
>
> +#define __POST_CODE_MAP_LIB__
>
> +
>
> +/**
>
> + Get PostCode from status code type and value.
>
> +
>
> + @param CodeType Indicates the type of status code being reported.
>
> + @param Value Describes the current status of a hardware or
>
> + software entity. This includes information about the class and
>
> + subclass that is used to classify the entity as well as an
> operation.
>
> + For progress codes, the operation is the current activity.
>
> + For error codes, it is the exception.For debug codes,it is not
> defined at this time.
>
> +
>
> + @return PostCode
>
> +
>
> +**/
>
> +UINT32
>
> +EFIAPI
>
> +GetPostCodeFromStatusCode (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value
>
> + );
>
> +
>
> +#endif
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCode
> DebugFeature.dsc
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCode
> DebugFeature.dsc
> new file mode 100644
> index 0000000000..2852b9cf7c
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Include/PostCode
> DebugFeature.dsc
> @@ -0,0 +1,200 @@
> +## @file
>
> +# This package provides PostCode Debug feature.
>
> +# This file should be included into another package DSC file to build this
> feature.
>
> +#
>
> +# The DEC files are used by the utilities that parse DSC and
>
> +# INF files to generate AutoGen.c and AutoGen.h files
>
> +# for the build infrastructure.
>
> +#
>
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
>
> +#
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +#########################################################
> #######################
>
> +#
>
> +# Defines Section - statements that will be processed to create a Makefile.
>
> +#
>
> +#########################################################
> #######################
>
> +[Defines]
>
> +!ifndef $(PEI_ARCH)
>
> + !error "PEI_ARCH must be specified to build this feature!"
>
> +!endif
>
> +!ifndef $(DXE_ARCH)
>
> + !error "DXE_ARCH must be specified to build this feature!"
>
> +!endif
>
> +
>
> +#########################################################
> #######################
>
> +#
>
> +# PCD Section - list of PCD Entries modified by the feature.
>
> +#
>
> +#########################################################
> #######################
>
> +
>
> +# Unmark the following and StatusCodeHandler.efi to build the .dsc file
> directly
>
> +#[PcdsDynamicDefault]
>
> +#
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode|
> TRUE
>
> +
>
> +#########################################################
> #######################
>
> +#
>
> +# Library Class section - list of all Library Classes needed by this feature.
>
> +#
>
> +#########################################################
> #######################
>
> +[LibraryClasses]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> + BaseLib|MdePkg/Library/BaseLib/BaseLib.inf
>
> + BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
>
> + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf
>
> + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
>
> + DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
>
> + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
>
> + PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
>
> + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
>
> +
> TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTem
> plate.inf
>
> +
> UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBo
> otServicesTableLib.inf
>
> +
> UefiDriverEntryPoint|MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntry
> Point.inf
>
> + UefiLib|MdePkg/Library/UefiLib/UefiLib.inf
>
> +
> UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib
> /UefiRuntimeServicesTableLib.inf
>
> + PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
>
> +
>
> +[LibraryClasses.common.PEIM]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> + HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
>
> +
> MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemory
> AllocationLib.inf
>
> +
> PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/P
> eiServicesTablePointerLibIdt.inf
>
> +
>
> +[LibraryClasses.IA32.PEIM,LibraryClasses.IA32.PEI_CORE,LibraryClasses.IA32
> .SEC]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> +
> ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiR
> eportStatusCodeLib.inf
>
> +
>
> +[LibraryClasses.common.DXE_DRIVER]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>
> +
> MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemo
> ryAllocationLib.inf
>
> +
>
> +[LibraryClasses.common.DXE_RUNTIME_DRIVER]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>
> +
> MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemo
> ryAllocationLib.inf
>
> + UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
>
> +
> ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCod
> eLib/RuntimeDxeReportStatusCodeLib.inf
>
> +
>
> +[LibraryClasses.common.UEFI_DRIVER]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> + HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
>
> +
> MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemo
> ryAllocationLib.inf
>
> +
>
> +[LibraryClasses.X64.DXE_SMM_DRIVER]
>
> + #######################################
>
> + # Edk2 Packages
>
> + #######################################
>
> +
> SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesT
> ableLib.inf
>
> +
> MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMe
> moryAllocationLib.inf
>
> + SmmIoLib|MdePkg/Library/SmmIoLib/SmmIoLib.inf
>
> + SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf
>
> +
> ReportStatusCodeLib|MdeModulePkg/Library/SmmReportStatusCodeLib/S
> mmReportStatusCodeLib.inf
>
> +
>
> +#########################################################
> #######################
>
> +#
>
> +# Component section - list of all components that need built for this feature.
>
> +#
>
> +# Note: The EDK II DSC file is not used to specify how compiled binary
> images get placed
>
> +# into firmware volume images. This section is just a list of modules to
> compile from
>
> +# source into UEFI-compliant binaries.
>
> +# It is the FDF file that contains information on combining binary files into
> firmware
>
> +# volume images, whose concept is beyond UEFI and is described in PI
> specification.
>
> +# There may also be modules listed in this section that are not required
> in the FDF file,
>
> +# When a module listed here is excluded from FDF file, then UEFI-
> compliant binary will be
>
> +# generated for it, but the binary will not be put into any firmware
> volume.
>
> +#
>
> +#########################################################
> #######################
>
> +#
>
> +# Feature PEI Components
>
> +#
>
> +
>
> +# @todo: Change below line to [Components.$(PEI_ARCH)] after
> https://bugzilla.tianocore.org/show_bug.cgi?id=2308
>
> +# is completed.
>
> +[Components.IA32]
>
> + #####################################
>
> + # PostCode Debug Feature Package
>
> + #####################################
>
> +
>
> + # Add library instances here that are not included in package components
> and should be tested
>
> + # in the package build.
>
> +
> PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/PeiPost
> CodeStatusCodeHandlerLib.inf
>
> +
>
> + # The following is an example for used with StatusCodeHandler:
>
> +#
> MdeModulePkg/Universal/StatusCodeHandler/Pei/StatusCodeHandlerPei.in
> f {
>
> +# <LibraryClasses>
>
> +#
> OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibN
> ull/OemHookStatusCodeLibNull.inf
>
> +#
> SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.in
> f
>
> +#
> PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDeb
> ug.inf
>
> +#
> PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/Post
> CodeMapLib.inf
>
> +#
> NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/P
> eiPostCodeStatusCodeHandlerLib.inf
>
> +# }
>
> +
>
> + # Add components here that should be included in the package build.
>
> +
>
> +#
>
> +# Feature DXE Components
>
> +#
>
> +
>
> +# @todo: Change below line to [Components.$(DXE_ARCH)] after
> https://bugzilla.tianocore.org/show_bug.cgi?id=2308
>
> +# is completed.
>
> +[Components.X64]
>
> + #####################################
>
> + # PostCode Debug Feature Package
>
> + #####################################
>
> +
>
> + # Add library instances here that are not included in package components
> and should be tested
>
> + # in the package build.
>
> +
> PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/Runtim
> eDxePostCodeStatusCodeHandlerLib.inf
>
> +
> PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/SmmPo
> stCodeStatusCodeHandlerLib.inf
>
> +
>
> + # The following is an example for used with StatusCodeHandler:
>
> +#
> MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHan
> dlerRuntimeDxe.inf {
>
> +# <LibraryClasses>
>
> +#
> OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibN
> ull/OemHookStatusCodeLibNull.inf
>
> +#
> SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.in
> f
>
> +#
> PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDeb
> ug.inf
>
> +#
> PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/Post
> CodeMapLib.inf
>
> +#
> NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/R
> untimeDxePostCodeStatusCodeHandlerLib.inf
>
> +# }
>
> +
>
> +#
> MdeModulePkg/Universal/StatusCodeHandler/Smm/StatusCodeHandlerSm
> m.inf {
>
> +# <LibraryClasses>
>
> +#
> OemHookStatusCodeLib|MdeModulePkg/Library/OemHookStatusCodeLibN
> ull/OemHookStatusCodeLibNull.inf
>
> +#
> SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.in
> f
>
> +#
> PostCodeLib|MdePkg/Library/BasePostCodeLibDebug/BasePostCodeLibDeb
> ug.inf
>
> +#
> PostCodeMapLib|PostCodeDebugFeaturePkg/Library/PostCodeMapLib/Post
> CodeMapLib.inf
>
> +#
> NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/S
> mmPostCodeStatusCodeHandlerLib.inf
>
> +# }
>
> +
>
> + # Add components here that should be included in the package build.
>
> +
>
> +#########################################################
> ##########################################
>
> +#
>
> +# BuildOptions Section - Define the module specific tool chain flags that
> should be used as
>
> +# the default flags for a module. These flags are appended to
> any
>
> +# standard flags that are defined by the build process. They can
> be
>
> +# applied for any modules or only those modules with the
> specific
>
> +# module style (EDK or EDKII) specified in [Components] section.
>
> +#
>
> +# For advanced features, it is recommended to enable
> [BuildOptions] in
>
> +# the applicable INF file so it does not affect the whole board
> package
>
> +# build when this DSC file is active.
>
> +#
>
> +#########################################################
> ##########################################
>
> +[BuildOptions]
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PlatformStatusCodesInternal.h
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PlatformStatusCodesInternal.h
> new file mode 100644
> index 0000000000..7c8daf052d
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PlatformStatusCodesInternal.h
> @@ -0,0 +1,270 @@
> +/** @file
>
> + PostCode status code definition.
>
> +
>
> + Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#ifndef __PLATFORM_STATUS_CODES_INTERNAL_H__
>
> +#define __PLATFORM_STATUS_CODES_INTERNAL_H__
>
> +
>
> +#include <Pi/PiStatusCode.h>
>
> +
>
> +typedef struct{
>
> + EFI_STATUS_CODE_VALUE Value;
>
> + UINT32 Data;
>
> +} STATUS_CODE_TO_DATA_MAP;
>
> +
>
> +//
>
> +// Enable PEI/DXE status code
>
> +//
>
> +#define PEI_STATUS_CODE 1
>
> +#define DXE_STATUS_CODE 1
>
> +
>
> +#define STATUS_CODE_TYPE(Type)
> ((Type)&EFI_STATUS_CODE_TYPE_MASK)
>
> +#define STATUS_CODE_CLASS(Value)
> ((Value)&EFI_STATUS_CODE_CLASS_MASK)
>
> +
>
> +//Progress/Error codes
>
> +#define PEI_CORE_STARTED (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_CORE_PC_ENTRY_POINT)
>
> +#define PEI_RESET_NOT_AVAILABLE (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PS_EC_RESET_NOT_AVAILABLE)
>
> +#define PEI_DXEIPL_NOT_FOUND (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_CORE_EC_DXEIPL_NOT_FOUND)
>
> +#define PEI_DXE_CORE_NOT_FOUND (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_CORE_EC_DXE_CORRUPT)
>
> +#define PEI_S3_RESUME_ERROR (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_EC_S3_RESUME_FAILED)
>
> +#define PEI_RECOVERY_FAILED (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_EC_RECOVERY_FAILED)
>
> +#define DXE_CORE_STARTED (EFI_SOFTWARE_DXE_CORE |
> EFI_SW_DXE_CORE_PC_ENTRY_POINT)
>
> +
>
> +//#define DXE_EXIT_BOOT_SERVICES_BEGIN 0xF8
>
> +#define DXE_EXIT_BOOT_SERVICES_END
> (EFI_SOFTWARE_EFI_BOOT_SERVICE |
> EFI_SW_BS_PC_EXIT_BOOT_SERVICES)
>
> +
>
> +// Reported by CPU PEIM
>
> +#define PEI_CAR_CPU_INIT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_PC_POWER_ON_INIT)
>
> +
>
> +// Reported by NB PEIM
>
> +//#define PEI_CAR_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CU_CHIPSET_NORTH_INIT)
>
> +
>
> +// Reported by SB PEIM
>
> +//#define PEI_CAR_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CU_CHIPSET_PC_SOUTH_INIT)
>
> +
>
> +//Reported by Memory Detection PEIM
>
> +#define PEI_MEMORY_SPD_READ
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_SPD_READ)
>
> +#define PEI_MEMORY_PRESENCE_DETECT
> (EFI_COMPUTING_UNIT_MEMORY |
> EFI_CU_MEMORY_PC_PRESENCE_DETECT)
>
> +#define PEI_MEMORY_TIMING
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_TIMING)
>
> +#define PEI_MEMORY_CONFIGURING
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_CONFIGURING)
>
> +#define PEI_MEMORY_OPTIMIZING
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_PC_OPTIMIZING)
>
> +#define PEI_MEMORY_INIT (EFI_COMPUTING_UNIT_MEMORY
> | EFI_CU_MEMORY_PC_INIT)
>
> +#define PEI_MEMORY_TEST (EFI_COMPUTING_UNIT_MEMORY
> | EFI_CU_MEMORY_PC_TEST)
>
> +#define PEI_MEMORY_INVALID_TYPE
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_TYPE)
>
> +#define PEI_MEMORY_INVALID_SPEED
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SPEED)
>
> +#define PEI_MEMORY_SPD_FAIL
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_SPD_FAIL)
>
> +#define PEI_MEMORY_INVALID_SIZE
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_INVALID_SIZE)
>
> +#define PEI_MEMORY_MISMATCH
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH)
>
> +#define PEI_MEMORY_S3_RESUME_FAILED
> (EFI_COMPUTING_UNIT_MEMORY |
> EFI_CU_MEMORY_EC_S3_RESUME_FAIL)
>
> +#define PEI_MEMORY_NOT_DETECTED
> (EFI_COMPUTING_UNIT_MEMORY |
> EFI_CU_MEMORY_EC_NONE_DETECTED)
>
> +#define PEI_MEMORY_NONE_USEFUL
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_NONE_USEFUL)
>
> +#define PEI_MEMORY_ERROR
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_EC_NON_SPECIFIC)
>
> +#define PEI_MEMORY_INSTALLED (EFI_SOFTWARE_PEI_SERVICE |
> EFI_SW_PS_PC_INSTALL_PEI_MEMORY)
>
> +#define PEI_MEMORY_NOT_INSTALLED
> (EFI_SOFTWARE_PEI_SERVICE |
> EFI_SW_PEI_CORE_EC_MEMORY_NOT_INSTALLED)
>
> +#define PEI_MEMORY_INSTALLED_TWICE
> (EFI_SOFTWARE_PEI_SERVICE |
> EFI_SW_PS_EC_MEMORY_INSTALLED_TWICE)
>
> +
>
> +//Reported by CPU PEIM
>
> +#define PEI_CPU_INIT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_PC_INIT_BEGIN)
>
> +#define PEI_CPU_CACHE_INIT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_CACHE_INIT)
>
> +#define PEI_CPU_BSP_SELECT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_BSP_SELECT)
>
> +#define PEI_CPU_AP_INIT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_AP_INIT)
>
> +#define PEI_CPU_SMM_INIT
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_PC_SMM_INIT)
>
> +#define PEI_CPU_INVALID_TYPE
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_INVALID_TYPE)
>
> +#define PEI_CPU_INVALID_SPEED
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_INVALID_SPEED)
>
> +#define PEI_CPU_MISMATCH
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_MISMATCH)
>
> +#define PEI_CPU_SELF_TEST_FAILED
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
>
> +#define PEI_CPU_CACHE_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_CACHE)
>
> +#define PEI_CPU_MICROCODE_UPDATE_FAILED
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_MICROCODE_UPDATE)
>
> +#define PEI_CPU_NO_MICROCODE
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_NO_MICROCODE_UPDATE)
>
> +//If non of the errors above apply use this one
>
> +#define PEI_CPU_INTERNAL_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_INTERNAL)
>
> +//Generic CPU error. It should only be used if non of the errors above apply
>
> +#define PEI_CPU_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_EC_NON_SPECIFIC)
>
> +
>
> +// Reported by NB PEIM
>
> +#define PEI_MEM_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_PEI_MEM_NB_INIT)
>
> +// Reported by SB PEIM
>
> +#define PEI_MEM_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_PEI_MEM_SB_INIT)
>
> +
>
> +//Reported by PEIM which detected forced or auto recovery condition
>
> +#define PEI_RECOVERY_AUTO (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_PC_RECOVERY_AUTO)
>
> +#define PEI_RECOVERY_USER (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_PC_RECOVERY_USER)
>
> +
>
> +//Reported by DXE IPL
>
> +#define PEI_RECOVERY_PPI_NOT_FOUND
> (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_RECOVERY_PPI_NOT_FOUND)
>
> +#define PEI_S3_RESUME_PPI_NOT_FOUND
> (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_S3_RESUME_PPI_NOT_FOUND)
>
> +#define PEI_S3_RESUME_FAILED (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_S3_RESUME_FAILED)
>
> +
>
> +//Reported by Recovery PEIM
>
> +#define PEI_RECOVERY_STARTED (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_PC_RECOVERY_BEGIN)
>
> +#define PEI_RECOVERY_CAPSULE_FOUND
> (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_LOAD)
>
> +#define PEI_RECOVERY_NO_CAPSULE
> (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_NO_RECOVERY_CAPSULE)
>
> +#define PEI_RECOVERY_CAPSULE_LOADED
> (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_PC_CAPSULE_START)
>
> +#define PEI_RECOVERY_INVALID_CAPSULE
> (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_EC_INVALID_CAPSULE_DESCRIPTOR)
>
> +
>
> +//Reported by S3 Resume PEIM
>
> +#define PEI_S3_BOOT_SCRIPT (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_PC_S3_BOOT_SCRIPT)
>
> +#define PEI_S3_OS_WAKE (EFI_SOFTWARE_PEI_MODULE |
> EFI_SW_PEI_PC_OS_WAKE)
>
> +#define PEI_S3_BOOT_SCRIPT_ERROR
> (EFI_SOFTWARE_PEI_MODULE | EFI_SW_PEI_EC_S3_BOOT_SCRIPT_ERROR)
>
> +#define PEI_S3_OS_WAKE_ERROR (EFI_SOFTWARE_PEI_MODULE
> | EFI_SW_PEI_EC_S3_OS_WAKE_ERROR)
>
> +
>
> +#define PEI_PEIM_STARTED (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PC_INIT_BEGIN)
>
> +#define PEI_PEIM_ENDED (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PC_INIT_END)
>
> +
>
> +//Reported by DXE IPL
>
> +#define PEI_DXE_IPL_STARTED (EFI_SOFTWARE_PEI_CORE |
> EFI_SW_PEI_CORE_PC_HANDOFF_TO_NEXT)
>
> +
>
> +//Reported by PEIM which installs Reset PPI
>
> +#define PEI_RESET_SYSTEM (EFI_SOFTWARE_PEI_SERVICE |
> EFI_SW_PS_PC_RESET_SYSTEM)
>
> +
>
> +//Reported by the PEIM or DXE driver which detected the error
>
> +#define GENERIC_MEMORY_CORRECTABLE_ERROR
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_CORRECTABLE)
>
> +#define GENERIC_MEMORY_UNCORRECTABLE_ERROR
> (EFI_COMPUTING_UNIT_MEMORY |
> EFI_CU_MEMORY_EC_UNCORRECTABLE)
>
> +
>
> +//Reported by Flash Update DXE driver
>
> +#define DXE_FLASH_UPDATE_FAILED
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_UPDATE_FAIL)
>
> +
>
> +//Reported by the PEIM or DXE driver which detected the error
>
> +#define GENERIC_CPU_THERMAL_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_THERMAL)
>
> +#define GENERIC_CPU_LOW_VOLTAGE
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_LOW_VOLTAGE)
>
> +#define GENERIC_CPU_HIGH_VOLTAGE
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_HIGH_VOLTAGE)
>
> +#define GENERIC_CPU_CORRECTABLE_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_CORRECTABLE)
>
> +#define GENERIC_CPU_UNCORRECTABLE_ERROR
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR |
> EFI_CU_HP_EC_UNCORRECTABLE)
>
> +#define GENERIC_BAD_DATE_TIME_ERROR
> (EFI_SOFTWARE_UNSPECIFIED | EFI_SW_EC_BAD_DATE_TIME)
>
> +#define GENERIC_MEMORY_SIZE_DECREASE
> (EFI_COMPUTING_UNIT_MEMORY | EFI_CU_MEMORY_EC_MISMATCH)
>
> +
>
> +//Reported by DXE Core
>
> +#define DXE_DRIVER_STARTED
> (EFI_SOFTWARE_EFI_DXE_SERVICE | EFI_SW_PC_INIT_BEGIN)
>
> +#define DXE_DRIVER_ENED (EFI_SOFTWARE_DXE_CORE |
> EFI_SW_PC_INIT_END)
>
> +#define DXE_ARCH_PROTOCOLS_AVAILABLE
> (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_PC_ARCH_READY)
>
> +#define DXE_DRIVER_CONNECTED (EFI_SOFTWARE_DXE_CORE |
> EFI_SW_DXE_CORE_PC_START_DRIVER)
>
> +#define DXE_ARCH_PROTOCOL_NOT_AVAILABLE
> (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH)
>
> +
>
> +//Reported by DXE CPU driver
>
> +#define DXE_CPU_SELF_TEST_FAILED
> (EFI_COMPUTING_UNIT_HOST_PROCESSOR | EFI_CU_HP_EC_SELF_TEST)
>
> +
>
> +//Reported by PCI Host Bridge driver
>
> +#define DXE_NB_HB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_HB_INIT )
>
> +
>
> +// Reported by NB Driver
>
> +#define DXE_NB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_NB_INIT )
>
> +#define DXE_NB_SMM_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_NB_SMM_INIT )
>
> +#define DXE_NB_ERROR (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_EC_DXE_NB_ERROR )
>
> +
>
> +// Reported by SB Driver(s)
>
> +#define DXE_SBRUN_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_SB_RT_INIT )
>
> +#define DXE_SB_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_SB_INIT )
>
> +#define DXE_SB_SMM_INIT (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_PC_DXE_SB_SMM_INIT )
>
> +#define DXE_SB_DEVICES_INIT (EFI_COMPUTING_UNIT_CHIPSET
> | EFI_CHIPSET_PC_DXE_SB_DEVICES_INIT )
>
> +#define DXE_SB_BAD_BATTERY (EFI_COMPUTING_UNIT_CHIPSET
> | EFI_CHIPSET_EC_BAD_BATTERY)
>
> +#define DXE_SB_ERROR (EFI_COMPUTING_UNIT_CHIPSET |
> EFI_CHIPSET_EC_DXE_SB_ERROR )
>
> +
>
> +//Reported by DXE Core
>
> +#define DXE_BDS_STARTED (EFI_SOFTWARE_DXE_CORE |
> EFI_SW_DXE_CORE_PC_HANDOFF_TO_NEXT)
>
> +
>
> +//Reported by BDS
>
> +//#define DXE_BDS_CONNECT_DRIVERS
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_BEGIN_CONNECTING_DRIVERS)
>
> +
>
> +//Reported by Boot Manager
>
> +#define DXE_READY_TO_BOOT (EFI_SOFTWARE_DXE_BS_DRIVER
> | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)
>
> +
>
> +//Reported by DXE Core
>
> +#define DXE_EXIT_BOOT_SERVICES
> (EFI_SOFTWARE_EFI_BOOT_SERVICE |
> EFI_SW_BS_PC_EXIT_BOOT_SERVICES)
>
> +#define DXE_EXIT_BOOT_SERVICES_EVENT
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_EXIT_BOOT_SERVICES_EVENT)
>
> +
>
> +//Reported by driver that installs Runtime AP
>
> +#define RT_SET_VIRTUAL_ADDRESS_MAP_BEGIN
> (EFI_SOFTWARE_EFI_RUNTIME_SERVICE |
> EFI_SW_RS_PC_SET_VIRTUAL_ADDRESS_MAP)
>
> +#define RT_SET_VIRTUAL_ADDRESS_MAP_END
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_VIRTUAL_ADDRESS_CHANGE_EVENT)
>
> +
>
> +//Reported by CSM
>
> +#define DXE_LEGACY_OPROM_INIT
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_LEGACY_OPROM_INIT)
>
> +#define DXE_LEGACY_BOOT (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_LEGACY_BOOT_EVENT)
>
> +#define DXE_LEGACY_OPROM_NO_SPACE
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_EC_LEGACY_OPROM_NO_SPACE)
>
> +
>
> +//Reported by SETUP
>
> +//#define DXE_SETUP_VERIFYING_PASSWORD
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_PC_VERIFYING_PASSWORD)
>
> +#define DXE_SETUP_START (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_PC_USER_SETUP)
>
> +#define DXE_SETUP_INPUT_WAIT
> (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_PC_INPUT_WAIT)
>
> +#define DXE_INVALID_PASSWORD
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_EC_INVALID_PASSWORD)
>
> +#define DXE_INVALID_IDE_PASSWORD
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_EC_INVALID_IDE_PASSWORD)
>
> +#define DXE_BOOT_OPTION_LOAD_ERROR
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_EC_BOOT_OPTION_LOAD_ERROR)
>
> +#define DXE_BOOT_OPTION_FAILED
> (EFI_SOFTWARE_DXE_BS_DRIVER |
> EFI_SW_DXE_BS_EC_BOOT_OPTION_FAILED)
>
> +
>
> +//Reported by a Driver that installs Reset AP
>
> +#define DXE_RESET_SYSTEM
> (EFI_SOFTWARE_EFI_RUNTIME_SERVICE | EFI_SW_RS_PC_RESET_SYSTEM)
>
> +#define DXE_RESET_NOT_AVAILABLE
> (EFI_SOFTWARE_EFI_RUNTIME_SERVICE |
> EFI_SW_PS_EC_RESET_NOT_AVAILABLE)
>
> +
>
> +// Reported by PCI bus driver
>
> +#define DXE_PCI_BUS_BEGIN (EFI_IO_BUS_PCI |
> EFI_IOB_PC_INIT)
>
> +#define DXE_PCI_BUS_ENUM (EFI_IO_BUS_PCI |
> EFI_IOB_PCI_BUS_ENUM)
>
> +#define DXE_PCI_BUS_HPC_INIT (EFI_IO_BUS_PCI |
> EFI_IOB_PCI_HPC_INIT)
>
> +#define DXE_PCI_BUS_REQUEST_RESOURCES (EFI_IO_BUS_PCI |
> EFI_IOB_PCI_RES_ALLOC)
>
> +#define DXE_PCI_BUS_ASSIGN_RESOURCES (EFI_IO_BUS_PCI |
> EFI_IOB_PC_ENABLE)
>
> +#define DXE_PCI_BUS_HOTPLUG (EFI_IO_BUS_PCI |
> EFI_IOB_PC_HOTPLUG)
>
> +#define DXE_PCI_BUS_OUT_OF_RESOURCES (EFI_IO_BUS_PCI |
> EFI_IOB_EC_RESOURCE_CONFLICT)
>
> +
>
> +// Reported by USB bus driver
>
> +#define DXE_USB_BEGIN (EFI_IO_BUS_USB | EFI_IOB_PC_INIT)
>
> +#define DXE_USB_RESET (EFI_IO_BUS_USB |
> EFI_IOB_PC_RESET)
>
> +#define DXE_USB_DETECT (EFI_IO_BUS_USB |
> EFI_IOB_PC_DETECT)
>
> +#define DXE_USB_ENABLE (EFI_IO_BUS_USB |
> EFI_IOB_PC_ENABLE)
>
> +#define DXE_USB_HOTPLUG (EFI_IO_BUS_USB |
> EFI_IOB_PC_HOTPLUG)
>
> +
>
> +//Reported by IDE bus driver
>
> +#define DXE_IDE_BEGIN (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_PC_INIT)
>
> +#define DXE_IDE_RESET (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_PC_RESET)
>
> +#define DXE_IDE_DETECT (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_PC_DETECT)
>
> +#define DXE_IDE_ENABLE (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_PC_ENABLE)
>
> +#define DXE_IDE_SMART_ERROR (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_ATA_BUS_SMART_OVERTHRESHOLD)
>
> +#define DXE_IDE_CONTROLLER_ERROR (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_EC_CONTROLLER_ERROR)
>
> +#define DXE_IDE_DEVICE_FAILURE (EFI_IO_BUS_ATA_ATAPI |
> EFI_IOB_EC_INTERFACE_ERROR)
>
> +
>
> +// Reported by SCSI bus driver
>
> +#define DXE_SCSI_BEGIN (EFI_IO_BUS_SCSI | EFI_IOB_PC_INIT)
>
> +#define DXE_SCSI_RESET (EFI_IO_BUS_SCSI |
> EFI_IOB_PC_RESET)
>
> +#define DXE_SCSI_DETECT (EFI_IO_BUS_SCSI |
> EFI_IOB_PC_DETECT)
>
> +#define DXE_SCSI_ENABLE (EFI_IO_BUS_SCSI |
> EFI_IOB_PC_ENABLE)
>
> +
>
> +// Reported by Super I/O driver
>
> +#define DXE_SIO_INIT (EFI_IO_BUS_LPC | EFI_IOB_PC_INIT)
>
> +
>
> +// Reported by Keyboard driver
>
> +#define DXE_KEYBOARD_INIT (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_INIT)
>
> +#define DXE_KEYBOARD_RESET (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_RESET)
>
> +#define DXE_KEYBOARD_DISABLE (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_DISABLE)
>
> +#define DXE_KEYBOARD_DETECT (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_PRESENCE_DETECT)
>
> +#define DXE_KEYBOARD_ENABLE (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_ENABLE)
>
> +#define DXE_KEYBOARD_CLEAR_BUFFER
> (EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_CLEAR_BUFFER)
>
> +#define DXE_KEYBOARD_SELF_TEST (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_KEYBOARD_PC_SELF_TEST)
>
> +
>
> +// Reported by Mouse driver
>
> +#define DXE_MOUSE_INIT (EFI_PERIPHERAL_MOUSE |
> EFI_P_PC_INIT)
>
> +#define DXE_MOUSE_RESET (EFI_PERIPHERAL_MOUSE |
> EFI_P_PC_RESET)
>
> +#define DXE_MOUSE_DISABLE (EFI_PERIPHERAL_MOUSE |
> EFI_P_PC_DISABLE)
>
> +#define DXE_MOUSE_DETECT (EFI_PERIPHERAL_MOUSE |
> EFI_P_PC_PRESENCE_DETECT)
>
> +#define DXE_MOUSE_ENABLE (EFI_PERIPHERAL_MOUSE |
> EFI_P_PC_ENABLE)
>
> +
>
> +// Reported by Mass Storage drivers
>
> +#define DXE_FIXED_MEDIA_INIT (EFI_PERIPHERAL_FIXED_MEDIA
> | EFI_P_PC_INIT)
>
> +#define DXE_FIXED_MEDIA_RESET (EFI_PERIPHERAL_FIXED_MEDIA
> | EFI_P_PC_RESET)
>
> +#define DXE_FIXED_MEDIA_DISABLE
> (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_DISABLE)
>
> +#define DXE_FIXED_MEDIA_DETECT
> (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_PRESENCE_DETECT)
>
> +#define DXE_FIXED_MEDIA_ENABLE
> (EFI_PERIPHERAL_FIXED_MEDIA | EFI_P_PC_ENABLE)
>
> +#define DXE_REMOVABLE_MEDIA_INIT
> (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_INIT)
>
> +#define DXE_REMOVABLE_MEDIA_RESET
> (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_RESET)
>
> +#define DXE_REMOVABLE_MEDIA_DISABLE
> (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_DISABLE)
>
> +#define DXE_REMOVABLE_MEDIA_DETECT
> (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_PRESENCE_DETECT)
>
> +#define DXE_REMOVABLE_MEDIA_ENABLE
> (EFI_PERIPHERAL_REMOVABLE_MEDIA | EFI_P_PC_ENABLE)
>
> +
>
> +
>
> +// Reported by BDS
>
> +#define DXE_CON_OUT_CONNECT
> (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_PC_INIT)
>
> +#define DXE_CON_IN_CONNECT (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_PC_INIT)
>
> +#define DXE_NO_CON_OUT
> (EFI_PERIPHERAL_LOCAL_CONSOLE | EFI_P_EC_NOT_DETECTED)
>
> +#define DXE_NO_CON_IN (EFI_PERIPHERAL_KEYBOARD |
> EFI_P_EC_NOT_DETECTED)
>
> +
>
> +#endif
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.c
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.c
> new file mode 100644
> index 0000000000..2246e59f8b
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.c
> @@ -0,0 +1,207 @@
> +/** @file
>
> + PostCodeMap implementation.
>
> +
>
> + Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#include <Base.h>
>
> +#include <Uefi.h>
>
> +
>
> +#include "PlatformStatusCodesInternal.h"
>
> +
>
> +STATUS_CODE_TO_DATA_MAP mPostCodeProgressMap[] = {
>
> + //
>
> + // PEI
>
> + //
>
> + //Regular boot
>
> + { PEI_CORE_STARTED, 0x10 },
>
> + { PEI_CAR_CPU_INIT, 0x11 },
>
> + { PEI_MEMORY_SPD_READ, 0x1D },
>
> + { PEI_MEMORY_PRESENCE_DETECT, 0x1E },
>
> + { PEI_MEMORY_TIMING, 0x1F},
>
> + { PEI_MEMORY_CONFIGURING, 0x20 },
>
> + { PEI_MEMORY_INIT, 0x21 },
>
> + { PEI_MEMORY_INSTALLED, 0x31 },
>
> + { PEI_CPU_INIT, 0x32 },
>
> + { PEI_CPU_CACHE_INIT, 0x33 },
>
> + { PEI_CPU_BSP_SELECT, 0x34 },
>
> + { PEI_CPU_AP_INIT, 0x35 },
>
> + { PEI_CPU_SMM_INIT, 0x36 },
>
> + { PEI_MEM_NB_INIT, 0x37 },
>
> + { PEI_MEM_SB_INIT, 0x3B },
>
> + { PEI_DXE_IPL_STARTED, 0x4F },
>
> + //Recovery
>
> + { PEI_RECOVERY_AUTO, 0xF0 },
>
> + { PEI_RECOVERY_USER, 0xF1 },
>
> + { PEI_RECOVERY_STARTED, 0xF2 },
>
> + { PEI_RECOVERY_CAPSULE_FOUND, 0xF3 },
>
> + { PEI_RECOVERY_CAPSULE_LOADED, 0xF4 },
>
> + //S3
>
> + //{ PEI_S3_STARTED, 0xE0 },
>
> + { PEI_S3_BOOT_SCRIPT, 0xE1 },
>
> + //{ PEI_S3_VIDEO_REPOST, 0xE2 },
>
> + { PEI_S3_OS_WAKE, 0xE3 },
>
> +
>
> + //
>
> + // DXE
>
> + //
>
> + { DXE_CORE_STARTED, 0x1060 },
>
> + { DXE_SBRUN_INIT, 0x1062 },
>
> + { DXE_NB_HB_INIT, 0x1068 },
>
> + { DXE_NB_INIT, 0x1069 },
>
> + { DXE_NB_SMM_INIT, 0x106A },
>
> + { DXE_SB_INIT, 0x1070 },
>
> + { DXE_SB_SMM_INIT, 0x1071 },
>
> + { DXE_SB_DEVICES_INIT, 0x1072 },
>
> + { DXE_BDS_STARTED, 0x1090 },
>
> + { DXE_PCI_BUS_BEGIN, 0x1092 },
>
> + { DXE_PCI_BUS_HPC_INIT, 0x1093 },
>
> + { DXE_PCI_BUS_ENUM, 0x1094 },
>
> + { DXE_PCI_BUS_REQUEST_RESOURCES, 0x1095 },
>
> + { DXE_PCI_BUS_ASSIGN_RESOURCES, 0x1096 },
>
> + { DXE_CON_OUT_CONNECT, 0x1097 },
>
> + { DXE_CON_IN_CONNECT, 0x1098 },
>
> + { DXE_SIO_INIT, 0x1099 },
>
> + { DXE_USB_BEGIN, 0x109A },
>
> + { DXE_USB_RESET, 0x109B },
>
> + { DXE_USB_DETECT, 0x109C },
>
> + { DXE_USB_ENABLE, 0x109D },
>
> + { DXE_IDE_BEGIN, 0x10A1 },
>
> + { DXE_IDE_RESET, 0x10A2 },
>
> + { DXE_IDE_DETECT, 0x10A3 },
>
> + { DXE_IDE_ENABLE, 0x10A4 },
>
> + { DXE_SCSI_BEGIN, 0x10A5 },
>
> + { DXE_SCSI_RESET, 0x10A6 },
>
> + { DXE_SCSI_DETECT, 0x10A7 },
>
> + { DXE_SCSI_ENABLE, 0x10A8 },
>
> + { DXE_SETUP_START, 0x10AB },
>
> + { DXE_SETUP_INPUT_WAIT, 0x10AC },
>
> + { DXE_READY_TO_BOOT, 0x10AD },
>
> + { DXE_LEGACY_BOOT, 0x10AE },
>
> + { DXE_EXIT_BOOT_SERVICES, 0x10AF },
>
> + { RT_SET_VIRTUAL_ADDRESS_MAP_BEGIN, 0x10B0 },
>
> + { RT_SET_VIRTUAL_ADDRESS_MAP_END, 0x10B1 },
>
> + { DXE_LEGACY_OPROM_INIT, 0x10B2 },
>
> + { DXE_RESET_SYSTEM, 0x10B3 },
>
> + { DXE_USB_HOTPLUG, 0x10B4 },
>
> + { DXE_PCI_BUS_HOTPLUG, 0x10B5 },
>
> + {0,0}
>
> +};
>
> +
>
> +STATUS_CODE_TO_DATA_MAP mPostCodeErrorMap[] = {
>
> + //
>
> + // PEI
>
> + //
>
> + //Regular boot
>
> + { PEI_MEMORY_INVALID_TYPE, 0x50 },
>
> + { PEI_MEMORY_INVALID_SPEED, 0x50 },
>
> + { PEI_MEMORY_SPD_FAIL, 0x51 },
>
> + { PEI_MEMORY_INVALID_SIZE, 0x52 },
>
> + { PEI_MEMORY_MISMATCH, 0x52 },
>
> + { PEI_MEMORY_NOT_DETECTED, 0x53 },
>
> + { PEI_MEMORY_NONE_USEFUL, 0x53 },
>
> + { PEI_MEMORY_ERROR, 0x54 },
>
> + { PEI_MEMORY_NOT_INSTALLED, 0x55 },
>
> + { PEI_CPU_INVALID_TYPE, 0x56 },
>
> + { PEI_CPU_INVALID_SPEED, 0x56 },
>
> + { PEI_CPU_MISMATCH, 0x57 },
>
> + { PEI_CPU_SELF_TEST_FAILED, 0x58 },
>
> + { PEI_CPU_CACHE_ERROR, 0x58 },
>
> + { PEI_CPU_MICROCODE_UPDATE_FAILED, 0x59 },
>
> + { PEI_CPU_NO_MICROCODE, 0x59 },
>
> + { PEI_CPU_INTERNAL_ERROR, 0x5A },
>
> + { PEI_CPU_ERROR, 0x5A },
>
> + { PEI_RESET_NOT_AVAILABLE,0x5B },
>
> + //Recovery
>
> + { PEI_RECOVERY_PPI_NOT_FOUND, 0xF8 },
>
> + { PEI_RECOVERY_NO_CAPSULE, 0xF9 },
>
> + { PEI_RECOVERY_INVALID_CAPSULE, 0xFA },
>
> + //S3 Resume
>
> + { PEI_MEMORY_S3_RESUME_FAILED, 0xE8 },
>
> + { PEI_S3_RESUME_PPI_NOT_FOUND, 0xE9 },
>
> + { PEI_S3_BOOT_SCRIPT_ERROR, 0xEA },
>
> + { PEI_S3_OS_WAKE_ERROR, 0xEB },
>
> +
>
> + //
>
> + // DXE
>
> + //
>
> + { DXE_CPU_SELF_TEST_FAILED, 0x1058 },
>
> + { DXE_NB_ERROR, 0x10D1 },
>
> + { DXE_SB_ERROR, 0x10D2 },
>
> + { DXE_ARCH_PROTOCOL_NOT_AVAILABLE, 0x10D3 },
>
> + { DXE_PCI_BUS_OUT_OF_RESOURCES, 0x10D4 },
>
> + { DXE_LEGACY_OPROM_NO_SPACE, 0x10D5 },
>
> + { DXE_NO_CON_OUT, 0x10D6 },
>
> + { DXE_NO_CON_IN, 0x10D7 },
>
> + { DXE_INVALID_PASSWORD, 0x10D8 },
>
> + { DXE_BOOT_OPTION_LOAD_ERROR, 0x10D9 },
>
> + { DXE_BOOT_OPTION_FAILED, 0x10DA },
>
> + { DXE_FLASH_UPDATE_FAILED, 0x10DB },
>
> + { DXE_RESET_NOT_AVAILABLE, 0x10DC },
>
> + {0,0}
>
> +};
>
> +
>
> +STATUS_CODE_TO_DATA_MAP *mPostCodeStatusCodesMap[] = {
>
> + //#define EFI_PROGRESS_CODE 0x00000001
>
> + mPostCodeProgressMap,
>
> + //#define EFI_ERROR_CODE 0x00000002
>
> + mPostCodeErrorMap
>
> + //#define EFI_DEBUG_CODE 0x00000003
>
> +};
>
> +
>
> +/**
>
> + Find the post code data from status code value.
>
> +
>
> + @param Map The map used to find in.
>
> + @param Value The status code value.
>
> +
>
> + @return PostCode 0 for not found.
>
> +
>
> +**/
>
> +UINT32
>
> +FindPostCodeData (
>
> + IN STATUS_CODE_TO_DATA_MAP *Map,
>
> + IN EFI_STATUS_CODE_VALUE Value
>
> + )
>
> +{
>
> + while (Map->Value != 0) {
>
> + if (Map->Value == Value) {
>
> + return Map->Data;
>
> + }
>
> + Map++;
>
> + }
>
> + return 0;
>
> +}
>
> +
>
> +/**
>
> + Get PostCode from status code type and value.
>
> +
>
> + @param CodeType Indicates the type of status code being reported.
>
> + @param Value Describes the current status of a hardware or
>
> + software entity. This includes information about the class and
>
> + subclass that is used to classify the entity as well as an
> operation.
>
> + For progress codes, the operation is the current activity.
>
> + For error codes, it is the exception.For debug codes,it is not
> defined at this time.
>
> +
>
> + @return PostCode
>
> +
>
> +**/
>
> +UINT32
>
> +EFIAPI
>
> +GetPostCodeFromStatusCode (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value
>
> + )
>
> +{
>
> + UINT32 CodeTypeIndex;
>
> +
>
> + CodeTypeIndex = STATUS_CODE_TYPE (CodeType) - 1;
>
> +
>
> + if (CodeTypeIndex >= sizeof (mPostCodeStatusCodesMap) /
> sizeof(mPostCodeStatusCodesMap[0])) {
>
> + return 0;
>
> + }
>
> +
>
> + return FindPostCodeData (mPostCodeStatusCodesMap[CodeTypeIndex],
> Value);
>
> +}
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.inf
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.inf
> new file mode 100644
> index 0000000000..18a8ac6116
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCode
> MapLib/PostCodeMapLib.inf
> @@ -0,0 +1,27 @@
> +## @file
>
> +# Instance of Platform Post Code Map Library.
>
> +#
>
> +# Copyright (c) 2011 - 2020, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010017
>
> + BASE_NAME = PostCodeMapLib
>
> + FILE_GUID = 1C579857-5328-4304-8607-77B0BC978554
>
> + VERSION_STRING = 1.0
>
> + MODULE_TYPE = BASE
>
> + LIBRARY_CLASS = PostCodeMapLib
>
> +#
>
> +# The following information is for reference only and not required by the
> build tools.
>
> +#
>
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC
>
> +#
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> +
>
> +[Sources]
>
> + PostCodeMapLib.c
>
> + PlatformStatusCodesInternal.h
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
> new file mode 100644
> index 0000000000..85d7a3d9a8
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.c
> @@ -0,0 +1,102 @@
> +/** @file
>
> + PostCode status code implementation.
>
> +
>
> + Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#include <Library/PeiServicesLib.h>
>
> +#include <Library/PeimEntryPoint.h>
>
> +#include <Library/PcdLib.h>
>
> +#include <Library/DebugLib.h>
>
> +#include <Library/ReportStatusCodeLib.h>
>
> +#include <Ppi/ReportStatusCodeHandler.h>
>
> +
>
> +#include <Library/PostCodeMapLib.h>
>
> +#include <Library/PostCodeLib.h>
>
> +
>
> +/**
>
> + Convert status code value and write data to post code.
>
> +
>
> + @param PeiServices An indirect pointer to the EFI_PEI_SERVICES table
> published by the PEI Foundation.
>
> + @param CodeType Indicates the type of status code being reported.
>
> + @param Value Describes the current status of a hardware or
>
> + software entity. This includes information about the class and
>
> + subclass that is used to classify the entity as well as an
> operation.
>
> + For progress codes, the operation is the current activity.
>
> + For error codes, it is the exception.For debug codes,it is not
> defined at this time.
>
> + @param Instance The enumeration of a hardware or software entity
> within
>
> + the system. A system may contain multiple entities that match
> a class/subclass
>
> + pairing. The instance differentiates between them. An
> instance of 0 indicates
>
> + that instance information is unavailable, not meaningful, or
> not relevant.
>
> + Valid instance numbers start with 1.
>
> + @param CallerId This optional parameter may be used to identify the
> caller.
>
> + This parameter allows the status code driver to apply different
> rules to
>
> + different callers.
>
> + @param Data This optional parameter may be used to pass
> additional data.
>
> +
>
> + @retval EFI_SUCCESS Status code reported to post code successfully.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +PostCodeStatusCodeReportWorker (
>
> + IN CONST EFI_PEI_SERVICES **PeiServices,
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN CONST EFI_GUID *CallerId,
>
> + IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +{
>
> + UINT32 PostCodeValue;
>
> +
>
> + PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
>
> + if (PostCodeValue != 0) {
>
> + DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
>
> + PostCode (PostCodeValue);
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Constructor function of PeiPostCodeStatusCodeHandlerLib.
>
> +
>
> + This function is the constructor function of this PostCode Status Code
> Handler Library for PEI Phase.
>
> + It check whether need post code, and register it to
> gEfiPeiRscHandlerPpiGuid.
>
> +
>
> + @param FileHandle Handle of the file being invoked.
>
> + @param PeiServices Describes the list of possible PEI Services.
>
> +
>
> + @retval EFI_SUCESS The entry point of DXE IPL PEIM executes successfully.
>
> +
>
> +**/
>
> +RETURN_STATUS
>
> +EFIAPI
>
> +PeiPostCodeStatusCodeHandlerLibConstructor (
>
> + IN EFI_PEI_FILE_HANDLE FileHandle,
>
> + IN CONST EFI_PEI_SERVICES **PeiServices
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> + EFI_PEI_RSC_HANDLER_PPI *RscHandlerPpi;
>
> +
>
> + if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
>
> + return RETURN_SUCCESS;
>
> + }
>
> +
>
> + Status = PeiServicesLocatePpi (
>
> + &gEfiPeiRscHandlerPpiGuid,
>
> + 0,
>
> + NULL,
>
> + (VOID **) &RscHandlerPpi
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> +
>
> + Status = RscHandlerPpi->Register (PostCodeStatusCodeReportWorker);
>
> + ASSERT_EFI_ERROR (Status);
>
> +
>
> + return RETURN_SUCCESS;
>
> +}
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
> new file mode 100644
> index 0000000000..c27578fe90
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/PeiPostCodeStatusCodeHandlerLib.inf
> @@ -0,0 +1,49 @@
> +## @file
>
> +# PostCode status code implementation.
>
> +#
>
> +# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +# vendor. This file may not be modified, except as allowed by
>
> +# additional terms of your license agreement.
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010005
>
> + BASE_NAME = PeiPostCodeStatusCodeHandlerLib
>
> + FILE_GUID = FA32350A-63DB-4AC6-88D1-BC5327EE7ECE
>
> + MODULE_TYPE = PEIM
>
> + CONSTRUCTOR = PeiPostCodeStatusCodeHandlerLibConstructor
>
> + LIBRARY_CLASS = StatusCodeHandlerLib|SEC PEIM PEI_COR
>
> +
>
> +#
>
> +# The following information is for reference only and not required by the
> build tools.
>
> +#
>
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
>
> +#
>
> +
>
> +[Sources]
>
> + PeiPostCodeStatusCodeHandlerLib.c
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> + MdeModulePkg/MdeModulePkg.dec
>
> + PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
>
> +
>
> +[LibraryClasses]
>
> + PeiServicesLib
>
> + DebugLib
>
> + PcdLib
>
> + ReportStatusCodeLib
>
> + PostCodeMapLib
>
> + PostCodeLib
>
> +
>
> +[Pcd]
>
> +
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode
> ## CONSUMES
>
> +
>
> +[Ppis]
>
> + gEfiPeiRscHandlerPpiGuid ## CONSUMES
>
> +
>
> +[Depex]
>
> + TRUE
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
> new file mode 100644
> index 0000000000..59b531fe7c
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.c
> @@ -0,0 +1,188 @@
> +/** @file
>
> + PostCode status code implementation.
>
> +
>
> + Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#include <Library/UefiDriverEntryPoint.h>
>
> +#include <Library/UefiBootServicesTableLib.h>
>
> +#include <Guid/EventGroup.h>
>
> +#include <Library/HobLib.h>
>
> +#include <Library/PcdLib.h>
>
> +#include <Library/DebugLib.h>
>
> +#include <Library/ReportStatusCodeLib.h>
>
> +#include <Protocol/ReportStatusCodeHandler.h>
>
> +
>
> +#include <Library/PostCodeMapLib.h>
>
> +#include <Library/PostCodeLib.h>
>
> +
>
> +EFI_RSC_HANDLER_PROTOCOL *mRscHandlerProtocol = NULL;
>
> +EFI_EVENT mExitBootServicesEvent = NULL;
>
> +BOOLEAN mRegisted = FALSE;
>
> +
>
> +/**
>
> + Convert status code value and write data to post code.
>
> +
>
> + @param CodeType Indicates the type of status code being reported.
>
> + @param Value Describes the current status of a hardware or
>
> + software entity. This includes information about the class and
>
> + subclass that is used to classify the entity as well as an
> operation.
>
> + For progress codes, the operation is the current activity.
>
> + For error codes, it is the exception.For debug codes,it is not
> defined at this time.
>
> + @param Instance The enumeration of a hardware or software entity
> within
>
> + the system. A system may contain multiple entities that match
> a class/subclass
>
> + pairing. The instance differentiates between them. An
> instance of 0 indicates
>
> + that instance information is unavailable, not meaningful, or
> not relevant.
>
> + Valid instance numbers start with 1.
>
> + @param CallerId This optional parameter may be used to identify the
> caller.
>
> + This parameter allows the status code driver to apply different
> rules to
>
> + different callers.
>
> + @param Data This optional parameter may be used to pass
> additional data.
>
> +
>
> + @retval EFI_SUCCESS Status code reported to post code successfully.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +PostCodeStatusCodeReportWorker (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN EFI_GUID *CallerId,
>
> + IN EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +{
>
> + UINT32 PostCodeValue;
>
> +
>
> + PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
>
> + if (PostCodeValue != 0) {
>
> + DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
>
> + PostCode (PostCodeValue);
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Unregister status code callback functions only available at boot time from
>
> + report status code router when exiting boot services.
>
> +
>
> + @param Event Event whose notification function is being invoked.
>
> + @param Context Pointer to the notification function's context, which is
>
> + always zero in current implementation.
>
> +
>
> +**/
>
> +VOID
>
> +EFIAPI
>
> +UnregisterPostCodeBootTimeHandlers (
>
> + IN EFI_EVENT Event,
>
> + IN VOID *Context
>
> + )
>
> +{
>
> + if (mRegisted) {
>
> + mRscHandlerProtocol->Unregister (PostCodeStatusCodeReportWorker);
>
> + }
>
> +}
>
> +
>
> +
>
> +
>
> +/**
>
> + Register status code callback function only when Report Status Code
> protocol
>
> + is installed.
>
> +
>
> + @param Event Event whose notification function is being invoked.
>
> + @param Context Pointer to the notification function's context, which is
>
> + always zero in current implementation.
>
> +
>
> +**/
>
> +VOID
>
> +EFIAPI
>
> +RegisterPostCodeBootTimeHandlers (
>
> + IN EFI_EVENT Event,
>
> + IN VOID *Context
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> +
>
> + Status = gBS->LocateProtocol (
>
> + &gEfiRscHandlerProtocolGuid,
>
> + NULL,
>
> + (VOID **) &mRscHandlerProtocol
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> +
>
> + mRscHandlerProtocol->Register (PostCodeStatusCodeReportWorker,
> TPL_HIGH_LEVEL);
>
> + ASSERT_EFI_ERROR (Status);
>
> + mRegisted = TRUE;
>
> +
>
> + Status = gBS->CreateEventEx (
>
> + EVT_NOTIFY_SIGNAL,
>
> + TPL_NOTIFY,
>
> + UnregisterPostCodeBootTimeHandlers,
>
> + NULL,
>
> + &gEfiEventExitBootServicesGuid,
>
> + &mExitBootServicesEvent
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> +}
>
> +
>
> +/**
>
> + Constructor function of RuntimeDxePostCodeStatusCodeHandlerLib.
>
> +
>
> + This function allocates memory for extended status code data, caches
>
> + the report status code service, and registers events.
>
> +
>
> + @param ImageHandle The firmware allocated handle for the EFI image.
>
> + @param SystemTable A pointer to the EFI System Table.
>
> +
>
> + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +RuntimeDxePostCodeStatusCodeHandlerLibConstructor (
>
> + IN EFI_HANDLE ImageHandle,
>
> + IN EFI_SYSTEM_TABLE *SystemTable
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> + EFI_EVENT RegisterStatusCodeHandlerEvent;
>
> + VOID *Registration;
>
> +
>
> + if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
>
> + return EFI_SUCCESS;
>
> + }
>
> +
>
> + Status = gBS->LocateProtocol (
>
> + &gEfiRscHandlerProtocolGuid,
>
> + NULL,
>
> + (VOID **) &mRscHandlerProtocol
>
> + );
>
> +
>
> + if (!EFI_ERROR (Status)) {
>
> + RegisterPostCodeBootTimeHandlers (NULL, NULL);
>
> + } else {
>
> + Status = gBS->CreateEvent (
>
> + EVT_NOTIFY_SIGNAL,
>
> + TPL_NOTIFY,
>
> + RegisterPostCodeBootTimeHandlers,
>
> + NULL,
>
> + &RegisterStatusCodeHandlerEvent
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> +
>
> + //
>
> + // Register for protocol notifications on this event
>
> + //
>
> + Status = gBS->RegisterProtocolNotify (
>
> + &gEfiRscHandlerProtocolGuid,
>
> + RegisterStatusCodeHandlerEvent,
>
> + &Registration
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
> new file mode 100644
> index 0000000000..21012980fe
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/RuntimeDxePostCodeStatusCodeHandlerLib.inf
> @@ -0,0 +1,51 @@
> +## @file
>
> +# PostCode status code implementation.
>
> +#
>
> +# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +# vendor. This file may not be modified, except as allowed by
>
> +# additional terms of your license agreement.
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010005
>
> + BASE_NAME = RuntimeDxePostCodeStatusCodeHandlerLib
>
> + FILE_GUID = FC4F3901-3E9B-4CA3-AB6C-1B65E9AA6960
>
> + MODULE_TYPE = DXE_RUNTIME_DRIVER
>
> + VERSION_STRING = 1.0
>
> + CONSTRUCTOR =
> RuntimeDxePostCodeStatusCodeHandlerLibConstructor
>
> + LIBRARY_CLASS = StatusCodeHandlerLib|DXE_RUNTIME_DRIVER
>
> +
>
> +#
>
> +# The following information is for reference only and not required by the
> build tools.
>
> +#
>
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
>
> +#
>
> +
>
> +[Sources]
>
> + RuntimeDxePostCodeStatusCodeHandlerLib.c
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> + MdeModulePkg/MdeModulePkg.dec
>
> + PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
>
> +
>
> +[LibraryClasses]
>
> + UefiBootServicesTableLib
>
> + UefiRuntimeLib
>
> + DebugLib
>
> + PcdLib
>
> + ReportStatusCodeLib
>
> + PostCodeMapLib
>
> + PostCodeLib
>
> +
>
> +[Pcd]
>
> +
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode
> ## CONSUMES
>
> +
>
> +[Protocols]
>
> + gEfiRscHandlerProtocolGuid ## CONSUMES
>
> +
>
> +[Depex]
>
> + TRUE
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
> new file mode 100644
> index 0000000000..efd3a7ee6f
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.c
> @@ -0,0 +1,141 @@
> +/** @file
>
> + PostCode status code implementation.
>
> +
>
> + Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +
>
> +**/
>
> +
>
> +#include <Library/UefiDriverEntryPoint.h>
>
> +#include <Library/SmmServicesTableLib.h>
>
> +#include <Library/HobLib.h>
>
> +#include <Library/PcdLib.h>
>
> +#include <Library/DebugLib.h>
>
> +#include <Library/ReportStatusCodeLib.h>
>
> +#include <Protocol/SmmReportStatusCodeHandler.h>
>
> +
>
> +#include <Library/PostCodeLib.h>
>
> +#include <Library/PostCodeMapLib.h>
>
> +
>
> +
>
> +/**
>
> + Convert status code value and write data to post code.
>
> +
>
> + @param CodeType Indicates the type of status code being reported.
>
> + @param Value Describes the current status of a hardware or
>
> + software entity. This includes information about the class and
>
> + subclass that is used to classify the entity as well as an
> operation.
>
> + For progress codes, the operation is the current activity.
>
> + For error codes, it is the exception.For debug codes,it is not
> defined at this time.
>
> + @param Instance The enumeration of a hardware or software entity
> within
>
> + the system. A system may contain multiple entities that match
> a class/subclass
>
> + pairing. The instance differentiates between them. An
> instance of 0 indicates
>
> + that instance information is unavailable, not meaningful, or
> not relevant.
>
> + Valid instance numbers start with 1.
>
> + @param CallerId This optional parameter may be used to identify the
> caller.
>
> + This parameter allows the status code driver to apply different
> rules to
>
> + different callers.
>
> + @param Data This optional parameter may be used to pass
> additional data.
>
> +
>
> + @retval EFI_SUCCESS Status code reported to post code successfully.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +PostCodeStatusCodeReportWorker (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN EFI_GUID *CallerId,
>
> + IN EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +{
>
> + UINT32 PostCodeValue;
>
> +
>
> + PostCodeValue = GetPostCodeFromStatusCode (CodeType, Value);
>
> + if (PostCodeValue != 0) {
>
> + DEBUG ((EFI_D_INFO, "POSTCODE=<%02x>\n", PostCodeValue));
>
> + PostCode (PostCodeValue);
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Register status code callback function only when Report Status Code
> protocol
>
> + is installed.
>
> +
>
> + @param Protocol Points to the protocol's unique identifier.
>
> + @param Interface Points to the interface instance.
>
> + @param Handle The handle on which the interface was installed.
>
> +
>
> + @retval EFI_SUCCESS Notification runs successfully.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +RegisterPostCodeBootTimeHandlers (
>
> + IN CONST EFI_GUID *Protocol,
>
> + IN VOID *Interface,
>
> + IN EFI_HANDLE Handle
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> + EFI_SMM_RSC_HANDLER_PROTOCOL *RscHandlerProtocol;
>
> +
>
> + Status = gSmst->SmmLocateProtocol (
>
> + &gEfiSmmRscHandlerProtocolGuid,
>
> + NULL,
>
> + (VOID **) &RscHandlerProtocol
>
> + );
>
> + ASSERT_EFI_ERROR (Status);
>
> +
>
> + RscHandlerProtocol->Register (PostCodeStatusCodeReportWorker);
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> +/**
>
> + Constructor function of SmmPostCodeStatusCodeHandlerLib.
>
> +
>
> + This function allocates memory for extended status code data, caches
>
> + the report status code service, and registers events.
>
> +
>
> + @param ImageHandle The firmware allocated handle for the EFI image.
>
> + @param SystemTable A pointer to the EFI System Table.
>
> +
>
> + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +EFIAPI
>
> +SmmPostCodeStatusCodeHandlerLibConstructor (
>
> + IN EFI_HANDLE ImageHandle,
>
> + IN EFI_SYSTEM_TABLE *SystemTable
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> + VOID *Registration;
>
> + EFI_SMM_RSC_HANDLER_PROTOCOL *RscHandlerProtocol;
>
> +
>
> + if (!PcdGetBool (PcdStatusCodeUsePostCode)) {
>
> + return EFI_SUCCESS;
>
> + }
>
> +
>
> + Status = gSmst->SmmLocateProtocol (
>
> + &gEfiSmmRscHandlerProtocolGuid,
>
> + NULL,
>
> + (VOID **) &RscHandlerProtocol
>
> + );
>
> + if (!EFI_ERROR (Status)) {
>
> + RegisterPostCodeBootTimeHandlers (NULL, NULL, NULL);
>
> + } else {
>
> + gSmst->SmmRegisterProtocolNotify (
>
> + &gEfiSmmRscHandlerProtocolGuid,
>
> + RegisterPostCodeBootTimeHandlers,
>
> + &Registration
>
> + );
>
> + }
>
> +
>
> + return EFI_SUCCESS;
>
> +}
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
> new file mode 100644
> index 0000000000..7cc357fd49
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Library/PostCodeS
> tatusCodeHandlerLib/SmmPostCodeStatusCodeHandlerLib.inf
> @@ -0,0 +1,50 @@
> +## @file
>
> +# PostCode status code implementation.
>
> +#
>
> +# Copyright (c) 2010 - 2020, Intel Corporation. All rights reserved.<BR>
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +# vendor. This file may not be modified, except as allowed by
>
> +# additional terms of your license agreement.
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + INF_VERSION = 0x00010005
>
> + BASE_NAME = SmmPostCodeStatusCodeHandlerLib
>
> + FILE_GUID = AE5C0A80-309A-42F7-BFDD-80CDA1BA2D7E
>
> + MODULE_TYPE = DXE_SMM_DRIVER
>
> + VERSION_STRING = 1.0
>
> + CONSTRUCTOR =
> SmmPostCodeStatusCodeHandlerLibConstructor
>
> + LIBRARY_CLASS = StatusCodeHandlerLib|DXE_SMM_DRIVER
>
> +
>
> +#
>
> +# The following information is for reference only and not required by the
> build tools.
>
> +#
>
> +# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is only for build)
>
> +#
>
> +
>
> +[Sources]
>
> + SmmPostCodeStatusCodeHandlerLib.c
>
> +
>
> +[Packages]
>
> + MdePkg/MdePkg.dec
>
> + MdeModulePkg/MdeModulePkg.dec
>
> + PostCodeDebugFeaturePkg/PostCodeDebugFeaturePkg.dec
>
> +
>
> +[LibraryClasses]
>
> + SmmServicesTableLib
>
> + DebugLib
>
> + PcdLib
>
> + ReportStatusCodeLib
>
> + PostCodeMapLib
>
> + PostCodeLib
>
> +
>
> +[Pcd]
>
> +
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode
> ## CONSUMES
>
> +
>
> +[Protocols]
>
> + gEfiSmmRscHandlerProtocolGuid ## CONSUMES
>
> +
>
> +[Depex]
>
> + TRUE
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dec
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dec
> new file mode 100644
> index 0000000000..7d0e474965
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dec
> @@ -0,0 +1,32 @@
> +## @file
>
> +# This package provides PostCode Debug feature.
>
> +# This package should only depend on EDK II Core packages, IntelSiliconPkg,
> and MinPlatformPkg.
>
> +#
>
> +# The DEC files are used by the utilities that parse DSC and
>
> +# INF files to generate AutoGen.c and AutoGen.h files
>
> +# for the build infrastructure.
>
> +#
>
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
>
> +#
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + DEC_SPECIFICATION = 0x00010017
>
> + PACKAGE_NAME = PostCodeDebugFeaturePkg
>
> + PACKAGE_GUID = A579E0A8-0D27-4CA6-900E-D613003729DE
>
> + PACKAGE_VERSION = 0.1
>
> +
>
> +[Includes]
>
> + Include
>
> +
>
> +[LibraryClasses]
>
> + ## @libraryclass Provide the function to map the status code to post
> code.
>
> + PostCodeMapLib|Include/Library/PostCodeMapLib.h
>
> +
>
> +[Guids]
>
> + gPostCodeDebugFeaturePkgTokenSpaceGuid = {0x68886ac8, 0x7a29,
> 0x4845, {0xa7, 0x02, 0xe9, 0x83, 0xc8, 0x7f, 0xfb, 0xab}}
>
> +
>
> +[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
>
> +
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode|
> TRUE|BOOLEAN|0x00000001
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dsc
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dsc
> new file mode 100644
> index 0000000000..4f0bec4a6f
> --- /dev/null
> +++
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/PostCodeDebugFe
> aturePkg.dsc
> @@ -0,0 +1,30 @@
> +## @file
>
> +# This package provides PostCode Debug feature.
>
> +# This package should only depend on EDK II Core packages, IntelSiliconPkg,
> and MinPlatformPkg.
>
> +#
>
> +# The DEC files are used by the utilities that parse DSC and
>
> +# INF files to generate AutoGen.c and AutoGen.h files
>
> +# for the build infrastructure.
>
> +#
>
> +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
>
> +#
>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
>
> +#
>
> +##
>
> +
>
> +[Defines]
>
> + PLATFORM_NAME = PostCodeFeaturePkg
>
> + PLATFORM_GUID = 4ADE0B1A-7929-495D-A221-6576C7884CAC
>
> + PLATFORM_VERSION = 0.1
>
> + DSC_SPECIFICATION = 0x00010005
>
> + OUTPUT_DIRECTORY = Build/$(PLATFORM_NAME)
>
> + SUPPORTED_ARCHITECTURES = IA32|X64
>
> + BUILD_TARGETS = DEBUG|RELEASE|NOOPT
>
> + SKUID_IDENTIFIER = DEFAULT
>
> + PEI_ARCH = IA32
>
> + DXE_ARCH = X64
>
> +
>
> +#
>
> +# This package always builds the feature.
>
> +#
>
> +!include Include/PostCodeDebugFeature.dsc
>
> diff --git
> a/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
> b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
> new file mode 100644
> index 0000000000..c49db35999
> --- /dev/null
> +++ b/Features/Intel/Debugging/PostCodeDebugFeaturePkg/Readme.md
> @@ -0,0 +1,117 @@
> +# Overview
>
> +* **Feature Name:** Post Code Debug
>
> +* **PI Phase(s) Supported:** PEI, DXE, SMM
>
> +* **SMM Required?** Yes
>
> +
>
> +More Information:
>
> +
>
> +## Purpose
>
> +The PostCodeDebugFeaturePkg include some useful post code debug
> libraries, such as get post code from status code and show it.
>
> +This is an important capability in firmware development to get and analyze
> the post code.
>
> +
>
> +
>
> +# High-Level Theory of Operation
>
> +It provide a library PostCodeStatusCodeHandlerLib used by edk2
> StatusCodeHandler.efi, used to show the post code.
>
> +It also provide a library of PostCodeMap lib, it map the status code to post
> code.
>
> +A library of PostCode lib is needed by platform.
>
> +
>
> +In the library contstructor function, PostCodeStatusCodeHandlerLib register
> the call back function for ReportStatusCode.
>
> +When called, it call GetPostCodeFromStatusCode() in PostCodeMapLib to
> get post code from status code, and call PostCode() in PostCodeLib to show
> the post code.
>
> +
>
> +PostCodeStatusCodeHandlerLib include 3 libraries for PEI, RuntimeDxe,
> SMM:
>
> +* PeiPostCodeStatusCodeHandlerLib
>
> +* RuntimeDxePostCodeStatusCodeHandlerLib
>
> +* SmmPostCodeStatusCodeHandlerLib
>
> +
>
> +## Firmware Volumes
>
> +Linked with StatusCodeHandler.efi, and make sure put the
> StatusCodeHandler.efi after the ReportStatusCodeRouter.efi.
>
> +
>
> +## Modules
>
> +* PostCodeStatusCodeHandlerLib
>
> +* PostCodeMapLib
>
> +
>
> +## PostCodeStatusCodeHandlerLib
>
> +This library register the call back function for ReportStatusCode, and get
> post code from status code, and show post code.
>
> +
>
> +## PostCodeMapLib
>
> +This library provide a function to get post code from status code.
>
> +
>
> +## Key Functions
>
> +* In PeiPostCodeStatusCodeHandlerLib:
>
> + EFI_STATUS
>
> + EFIAPI
>
> + PostCodeStatusCodeReportWorker (
>
> + IN CONST EFI_PEI_SERVICES **PeiServices,
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN CONST EFI_GUID *CallerId,
>
> + IN CONST EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +
>
> +* In RuntimeDxePostCodeStatusCodeHandlerLib:
>
> + EFI_STATUS
>
> + EFIAPI
>
> + PostCodeStatusCodeReportWorker (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN EFI_GUID *CallerId,
>
> + IN EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +
>
> +* In SmmPostCodeStatusCodeHandlerLib:
>
> + EFI_STATUS
>
> + EFIAPI
>
> + PostCodeStatusCodeReportWorker (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value,
>
> + IN UINT32 Instance,
>
> + IN EFI_GUID *CallerId,
>
> + IN EFI_STATUS_CODE_DATA *Data OPTIONAL
>
> + )
>
> +
>
> +* In PostCodeMapLib:
>
> + UINT32
>
> + EFIAPI
>
> + GetPostCodeFromStatusCode (
>
> + IN EFI_STATUS_CODE_TYPE CodeType,
>
> + IN EFI_STATUS_CODE_VALUE Value
>
> + )
>
> +
>
> +## Configuration
>
> +* Link the library to StatusCodeHandler.efi.
>
> + Example:
>
> +
> MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHan
> dlerRuntimeDxe.inf {
>
> + <LibraryClasses>
>
> +
> NULL|PostCodeDebugFeaturePkg/Library/PostCodeStatusCodeHandlerLib/R
> untimeDxePostCodeStatusCodeHandlerLib.inf
>
> + }
>
> + Refer to PostCodeDebugFeature.dsc for other example.
>
> +* Config PCD
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode.
>
> + In platform .dsc file, need to config the type of
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode.
>
> + Use PcdsFixedAtBuild to save binary size, and use PcdsDynamic if want to
> enable/disable in runtime.
>
> +* Implemented platform's special PostCodeMapLib if needed.
>
> +* Provide the platform's special PostCodeLib.
>
> +* Make sure put the StatusCodeHandler.efi after the
> ReportStatusCodeRouter.efi.
>
> +
>
> +## Data Flows
>
> +Status Code (ReportStatusCode) -> Post Code
> (GetPostCodeFromStatusCode).
>
> +
>
> +## Control Flows
>
> +ReportStatusCode() -> PostCodeStatusCodeReportWorker() ->
> GetPostCodeFromStatusCode() -> PostCode()
>
> +
>
> +## Build Flows
>
> +There is not special build flows.
>
> +
>
> +## Test Point Results
>
> +Verify the post code shown is correct.
>
> +
>
> +## Functional Exit Criteria
>
> +N/A
>
> +
>
> +## Feature Enabling Checklist
>
> +* Set the PCD
> gPostCodeDebugFeaturePkgTokenSpaceGuid.PcdStatusCodeUsePostCode
> to TRUE.
>
> +* The post code can be shown.
>
> +
>
> +## Common Optimizations
>
> +* Implemented platform's special PostCodeMapLib if needed.
>
> --
> 2.24.0.windows.2
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-06-15 2:45 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-12 3:40 [PATCH v3] Features/Intel/PostCodeDebugFeaturePkg: add it Tan, Ming
2020-06-15 2:45 ` Dong, Eric
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox