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 //
     57 // Runtime memory status code worker definition
     58 //
     59 typedef struct {
     60   UINT32   RecordIndex;
     61   UINT32   NumberOfRecords;
     62   UINT32   MaxRecordsNumber;
     63 } RUNTIME_MEMORY_STATUSCODE_HEADER;
     64 
     65 extern RUNTIME_MEMORY_STATUSCODE_HEADER  *mRtMemoryStatusCodeTable;
     66 
     67 /**
     68   Report status code to all supported device.
     69 
     70   This function implements EFI_STATUS_CODE_PROTOCOL.ReportStatusCode().
     71   It calls into the workers which dispatches the platform specific listeners.
     72 
     73   @param  CodeType         Indicates the type of status code being reported.
     74   @param  Value            Describes the current status of a hardware or software entity.
     75                            This included information about the class and subclass that is used to
     76                            classify the entity as well as an operation.
     77   @param  Instance         The enumeration of a hardware or software entity within
     78                            the system. Valid instance numbers start with 1.
     79   @param  CallerId         This optional parameter may be used to identify the caller.
     80                            This parameter allows the status code driver to apply different rules to
     81                            different callers.
     82   @param  Data             This optional parameter may be used to pass additional data.
     83 
     84   @retval EFI_SUCCESS      The function completed successfully
     85   @retval EFI_DEVICE_ERROR The function should not be completed due to a device error.
     86 
     87 **/
     88 EFI_STATUS
     89 EFIAPI
     90 ReportDispatcher (
     91   IN EFI_STATUS_CODE_TYPE     CodeType,
     92   IN EFI_STATUS_CODE_VALUE    Value,
     93   IN UINT32                   Instance,
     94   IN EFI_GUID                 *CallerId  OPTIONAL,
     95   IN EFI_STATUS_CODE_DATA     *Data      OPTIONAL
     96   );
     97 
     98 /**
     99   Dispatch initialization request to sub status code devices based on
    100   customized feature flags.
    101 
    102 **/
    103 VOID
    104 InitializationDispatcherWorker (
    105   VOID
    106   );
    107 
    108 
    109 /**
    110   Locates Serial I/O Protocol as initialization for serial status code worker.
    111 
    112   @retval EFI_SUCCESS  Serial I/O Protocol is successfully located.
    113 
    114 **/
    115 EFI_STATUS
    116 EfiSerialStatusCodeInitializeWorker (
    117   VOID
    118   );
    119 
    120 
    121 /**
    122   Convert status code value and extended data to readable ASCII string, send string to serial I/O device.
    123 
    124   @param  CodeType         Indicates the type of status code being reported.
    125   @param  Value            Describes the current status of a hardware or software entity.
    126                            This included information about the class and subclass that is used to
    127                            classify the entity as well as an operation.
    128   @param  Instance         The enumeration of a hardware or software entity within
    129                            the system. Valid instance numbers start with 1.
    130   @param  CallerId         This optional parameter may be used to identify the caller.
    131                            This parameter allows the status code driver to apply different rules to
    132                            different callers.
    133   @param  Data             This optional parameter may be used to pass additional data.
    134 
    135   @retval EFI_SUCCESS      Status code reported to serial I/O successfully.
    136   @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called.
    137   @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK.
    138 
    139 **/
    140 EFI_STATUS
    141 SerialStatusCodeReportWorker (
    142   IN EFI_STATUS_CODE_TYPE     CodeType,
    143   IN EFI_STATUS_CODE_VALUE    Value,
    144   IN UINT32                   Instance,
    145   IN EFI_GUID                 *CallerId,
    146   IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
    147   );
    148 
    149 /**
    150   Initialize runtime memory status code table as initialization for runtime memory status code worker
    151 
    152   @retval EFI_SUCCESS  Runtime memory status code table successfully initialized.
    153 
    154 **/
    155 EFI_STATUS
    156 RtMemoryStatusCodeInitializeWorker (
    157   VOID
    158   );
    159 
    160 /**
    161   Report status code into runtime memory. If the runtime pool is full, roll back to the
    162   first record and overwrite it.
    163 
    164   @param  CodeType                Indicates the type of status code being reported.
    165   @param  Value                   Describes the current status of a hardware or software entity.
    166                                   This included information about the class and subclass that is used to
    167                                   classify the entity as well as an operation.
    168   @param  Instance                The enumeration of a hardware or software entity within
    169                                   the system. Valid instance numbers start with 1.
    170 
    171   @retval EFI_SUCCESS             Status code successfully recorded in runtime memory status code table.
    172 
    173 **/
    174 EFI_STATUS
    175 RtMemoryStatusCodeReportWorker (
    176   IN EFI_STATUS_CODE_TYPE               CodeType,
    177   IN EFI_STATUS_CODE_VALUE              Value,
    178   IN UINT32                             Instance
    179   );
    180 
    181 /**
    182   Locate Data Hub Protocol and create event for logging data
    183   as initialization for data hub status code worker.
    184 
    185   @retval EFI_SUCCESS  Initialization is successful.
    186 
    187 **/
    188 EFI_STATUS
    189 DataHubStatusCodeInitializeWorker (
    190   VOID
    191   );
    192 
    193 
    194 /**
    195   Report status code into DataHub.
    196 
    197   @param  CodeType             Indicates the type of status code being reported.
    198   @param  Value                Describes the current status of a hardware or software entity.
    199                                This included information about the class and subclass that is used to
    200                                classify the entity as well as an operation.
    201   @param  Instance             The enumeration of a hardware or software entity within
    202                                the system. Valid instance numbers start with 1.
    203   @param  CallerId             This optional parameter may be used to identify the caller.
    204                                This parameter allows the status code driver to apply different rules to
    205                                different callers.
    206   @param  Data                 This optional parameter may be used to pass additional data.
    207 
    208   @retval EFI_SUCCESS          The function completed successfully.
    209   @retval EFI_DEVICE_ERROR     Function is reentered.
    210   @retval EFI_DEVICE_ERROR     Function is called at runtime.
    211   @retval EFI_OUT_OF_RESOURCES Fail to allocate memory for free record buffer.
    212 
    213 **/
    214 EFI_STATUS
    215 DataHubStatusCodeReportWorker (
    216   IN EFI_STATUS_CODE_TYPE     CodeType,
    217   IN EFI_STATUS_CODE_VALUE    Value,
    218   IN UINT32                   Instance,
    219   IN EFI_GUID                 *CallerId,
    220   IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
    221   );
    222 
    223 
    224 /**
    225   Virtual address change notification call back. It converts global pointer
    226   to virtual address.
    227 
    228   @param  Event         Event whose notification function is being invoked.
    229   @param  Context       Pointer to the notification function's context, which is
    230                         always zero in current implementation.
    231 
    232 **/
    233 VOID
    234 EFIAPI
    235 VirtualAddressChangeCallBack (
    236   IN EFI_EVENT  Event,
    237   IN VOID       *Context
    238   );
    239 
    240 #endif
    241