hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/** @file
 
  Copyright (c) 2004  - 2020, Intel Corporation. All rights reserved.<BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
Module Name:
 
  MonoStatusCode.c
 
Abstract:
 
  PEIM to provide the status code functionality, to aid in system debug.
  It includes output to 0x80 port and/or to serial port.
  This PEIM is monolithic. Different platform should provide different library.
 
--*/
 
#include "MonoStatusCode.h"
#include "PlatformStatusCode.h"
#define CMOS_EFI_DEBUG              0x14
 
//
// Module globals
//
EFI_PEI_PROGRESS_CODE_PPI     mStatusCodePpi = { PlatformReportStatusCode };
 
EFI_PEI_PPI_DESCRIPTOR  mPpiListStatusCode = {
  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
  &gEfiPeiStatusCodePpiGuid,
  &mStatusCodePpi
};
 
//
// Function implementations
//
 
/**
  Translate from a DXE status code interface into a PEI-callable
  interface, making the PEI the least common denominator..
 
  Same as DXE ReportStatusCode RT service
 
 
**/
EFI_STATUS
EFIAPI
TranslateDxeStatusCodeToPeiStatusCode (
  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
  )
{
  return PlatformReportStatusCode (NULL, CodeType, Value, Instance, CallerId, Data);
}
 
/**
  Build a hob describing the status code listener that has been installed.
  This will be used by DXE code until a runtime status code listener is
  installed.
 
  @param PeiServices      General purpose services available to every PEIM.
 
  @retval Status          EFI_SUCCESS if the interface could be successfully
                          installed
 
**/
EFI_STATUS
EFIAPI
InitializeDxeReportStatusCode (
  IN const EFI_PEI_SERVICES       **PeiServices
  )
{
  EFI_STATUS  Status = EFI_UNSUPPORTED;
 
  VOID        *Instance;
 
  VOID        *Result;
 
  Instance = (VOID *) (UINTN) TranslateDxeStatusCodeToPeiStatusCode;
 
  Result = BuildGuidDataHob (
             &gEfiStatusCodeRuntimeProtocolGuid,
             &Instance,
             sizeof (VOID *)
             );
  if (Result != NULL) {
    Status = EFI_SUCCESS;
  }
  return Status;
}
 
/**
  Initialize the platform status codes and publish the platform status code
  PPI.
 
  @param  FfsHeader      FV this PEIM was loaded from.
  @param  PeiServices    General purpose services available to every PEIM.
 
  @retval Status         EFI_SUCCESS
 
**/
VOID
EFIAPI
InitializeMonoStatusCode (
  IN EFI_FFS_FILE_HEADER       *FfsHeader,
  IN CONST EFI_PEI_SERVICES          **PeiServices
  )
{
  EFI_STATUS  Status;
 
  //
  // Initialize status code listeners.
  //
  PlatformInitializeStatusCode (FfsHeader, PeiServices);
 
  //
  // Publish the status code capability to other modules
  //
  Status = (*PeiServices)->InstallPpi (PeiServices, &mPpiListStatusCode);
 
  ASSERT_EFI_ERROR (Status);
 
  DEBUG ((DEBUG_ERROR, "\nMono Status Code PEIM Loaded\n"));
 
  return ;
}