Home | History | Annotate | Download | only in RuntimeDxe
      1 /** @file
      2   Internal include file of Status Code Runtime DXE Driver.
      3 
      4   Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __STATUS_CODE_RUNTIME_DXE_H__
     16 #define __STATUS_CODE_RUNTIME_DXE_H__
     17 
     18 
     19 #include <FrameworkDxe.h>
     20 #include <Guid/DataHubStatusCodeRecord.h>
     21 #include <Protocol/DataHub.h>
     22 #include <Guid/MemoryStatusCodeRecord.h>
     23 #include <Protocol/StatusCode.h>
     24 #include <Guid/StatusCodeDataTypeId.h>
     25 #include <Guid/StatusCodeDataTypeDebug.h>
     26 #include <Guid/EventGroup.h>
     27 
     28 #include <Library/BaseLib.h>
     29 #include <Library/SynchronizationLib.h>
     30 #include <Library/BaseMemoryLib.h>
     31 #include <Library/DebugLib.h>
     32 #include <Library/ReportStatusCodeLib.h>
     33 #include <Library/PrintLib.h>
     34 #include <Library/PcdLib.h>
     35 #include <Library/HobLib.h>
     36 #include <Library/UefiDriverEntryPoint.h>
     37 #include <Library/UefiBootServicesTableLib.h>
     38 #include <Library/UefiLib.h>
     39 #include <Library/MemoryAllocationLib.h>
     40 #include <Library/UefiRuntimeLib.h>
     41 #include <Library/SerialPortLib.h>
     42 #include <Library/OemHookStatusCodeLib.h>
     43 
     44 //
     45 // Data hub worker definition
     46 //
     47 #define DATAHUB_STATUS_CODE_SIGNATURE             SIGNATURE_32 ('B', 'D', 'H', 'S')
     48 
     49 typedef struct {
     50   UINTN       Signature;
     51   LIST_ENTRY  Node;
     52   UINT8       Data[sizeof(DATA_HUB_STATUS_CODE_DATA_RECORD) + EFI_STATUS_CODE_DATA_MAX_SIZE];
     53 } DATAHUB_STATUSCODE_RECORD;
     54 
     55 
     56 extern RUNTIME_MEMORY_STATUSCODE_HEADER  *mRtMemoryStatusCodeTable;
     57 
     58 /**
     59   Report status code to all supported device.
     60 
     61   This function implements EFI_STATUS_CODE_PROTOCOL.ReportStatusCode().
     62   It calls into the workers which dispatches the platform specific listeners.
     63 
     64   @param  CodeType         Indicates the type of status code being reported.
     65   @param  Value            Describes the current status of a hardware or software entity.
     66                            This included information about the class and subclass that is used to
     67                            classify the entity as well as an operation.
     68   @param  Instance         The enumeration of a hardware or software entity within
     69                            the system. Valid instance numbers start with 1.
     70   @param  CallerId         This optional parameter may be used to identify the caller.
     71                            This parameter allows the status code driver to apply different rules to
     72                            different callers.
     73   @param  Data             This optional parameter may be used to pass additional data.
     74 
     75   @retval EFI_SUCCESS      The function completed successfully
     76   @retval EFI_DEVICE_ERROR The function should not be completed due to a device error.
     77 
     78 **/
     79 EFI_STATUS
     80 EFIAPI
     81 ReportDispatcher (
     82   IN EFI_STATUS_CODE_TYPE     CodeType,
     83   IN EFI_STATUS_CODE_VALUE    Value,
     84   IN UINT32                   Instance,
     85   IN EFI_GUID                 *CallerId  OPTIONAL,
     86   IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL
     87   );
     88 
     89 /**
     90   Dispatch initialization request to sub status code devices based on
     91   customized feature flags.
     92 
     93 **/
     94 VOID
     95 InitializationDispatcherWorker (
     96   VOID
     97   );
     98 
     99 
    100 /**
    101   Locates Serial I/O Protocol as initialization for serial status code worker.
    102 
    103   @retval EFI_SUCCESS  Serial I/O Protocol is successfully located.
    104 
    105 **/
    106 EFI_STATUS
    107 EfiSerialStatusCodeInitializeWorker (
    108   VOID
    109   );
    110 
    111 
    112 /**
    113   Convert status code value and extended data to readable ASCII string, send string to serial I/O device.
    114 
    115   @param  CodeType         Indicates the type of status code being reported.
    116   @param  Value            Describes the current status of a hardware or software entity.
    117                            This included information about the class and subclass that is used to
    118                            classify the entity as well as an operation.
    119   @param  Instance         The enumeration of a hardware or software entity within
    120                            the system. Valid instance numbers start with 1.
    121   @param  CallerId         This optional parameter may be used to identify the caller.
    122                            This parameter allows the status code driver to apply different rules to
    123                            different callers.
    124   @param  Data             This optional parameter may be used to pass additional data.
    125 
    126   @retval EFI_SUCCESS      Status code reported to serial I/O successfully.
    127   @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called.
    128   @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK.
    129 
    130 **/
    131 EFI_STATUS
    132 SerialStatusCodeReportWorker (
    133   IN EFI_STATUS_CODE_TYPE     CodeType,
    134   IN EFI_STATUS_CODE_VALUE    Value,
    135   IN UINT32                   Instance,
    136   IN EFI_GUID                 *CallerId,
    137   IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
    138   );
    139 
    140 /**
    141   Initialize runtime memory status code table as initialization for runtime memory status code worker
    142 
    143   @retval EFI_SUCCESS  Runtime memory status code table successfully initialized.
    144 
    145 **/
    146 EFI_STATUS
    147 RtMemoryStatusCodeInitializeWorker (
    148   VOID
    149   );
    150 
    151 /**
    152   Report status code into runtime memory. If the runtime pool is full, roll back to the
    153   first record and overwrite it.
    154 
    155   @param  CodeType                Indicates the type of status code being reported.
    156   @param  Value                   Describes the current status of a hardware or software entity.
    157                                   This included information about the class and subclass that is used to
    158                                   classify the entity as well as an operation.
    159   @param  Instance                The enumeration of a hardware or software entity within
    160                                   the system. Valid instance numbers start with 1.
    161 
    162   @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table.
    163 
    164 **/
    165 EFI_STATUS
    166 RtMemoryStatusCodeReportWorker (
    167   IN EFI_STATUS_CODE_TYPE               CodeType,
    168   IN EFI_STATUS_CODE_VALUE              Value,
    169   IN UINT32                             Instance
    170   );
    171 
    172 /**
    173   Locate Data Hub Protocol and create event for logging data
    174   as initialization for data hub status code worker.
    175 
    176   @retval EFI_SUCCESS  Initialization is successful.
    177 
    178 **/
    179 EFI_STATUS
    180 DataHubStatusCodeInitializeWorker (
    181   VOID
    182   );
    183 
    184 
    185 /**
    186   Report status code into DataHub.
    187 
    188   @param  CodeType             Indicates the type of status code being reported.
    189   @param  Value                Describes the current status of a hardware or software entity.
    190                                This included information about the class and subclass that is used to
    191                                classify the entity as well as an operation.
    192   @param  Instance             The enumeration of a hardware or software entity within
    193                                the system. Valid instance numbers start with 1.
    194   @param  CallerId             This optional parameter may be used to identify the caller.
    195                                This parameter allows the status code driver to apply different rules to
    196                                different callers.
    197   @param  Data                 This optional parameter may be used to pass additional data.
    198 
    199   @retval EFI_SUCCESS          The function completed successfully.
    200   @retval EFI_DEVICE_ERROR     Function is reentered.
    201   @retval EFI_DEVICE_ERROR     Function is called at runtime.
    202   @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for free record buffer.
    203 
    204 **/
    205 EFI_STATUS
    206 DataHubStatusCodeReportWorker (
    207   IN EFI_STATUS_CODE_TYPE     CodeType,
    208   IN EFI_STATUS_CODE_VALUE    Value,
    209   IN UINT32                   Instance,
    210   IN EFI_GUID                 *CallerId,
    211   IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
    212   );
    213 
    214 
    215 /**
    216   Virtual address change notification call back. It converts global pointer
    217   to virtual address.
    218 
    219   @param  Event         Event whose notification function is being invoked.
    220   @param  Context       Pointer to the notification function's context, which is
    221                         always zero in current implementation.
    222 
    223 **/
    224 VOID
    225 EFIAPI
    226 VirtualAddressChangeCallBack (
    227   IN EFI_EVENT  Event,
    228   IN VOID       *Context
    229   );
    230 
    231 #endif
    232