• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Serial I/O status code reporting worker.
3 
4   Copyright (c) 2006 - 2014, 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 #include "StatusCodeRuntimeDxe.h"
16 
17 /**
18   Convert status code value and extended data to readable ASCII string, send string to serial I/O device.
19 
20   @param  CodeType         Indicates the type of status code being reported.
21   @param  Value            Describes the current status of a hardware or software entity.
22                            This included information about the class and subclass that is used to
23                            classify the entity as well as an operation.
24   @param  Instance         The enumeration of a hardware or software entity within
25                            the system. Valid instance numbers start with 1.
26   @param  CallerId         This optional parameter may be used to identify the caller.
27                            This parameter allows the status code driver to apply different rules to
28                            different callers.
29   @param  Data             This optional parameter may be used to pass additional data.
30 
31   @retval EFI_SUCCESS      Status code reported to serial I/O successfully.
32   @retval EFI_DEVICE_ERROR EFI serial device cannot work after ExitBootService() is called.
33   @retval EFI_DEVICE_ERROR EFI serial device cannot work with TPL higher than TPL_CALLBACK.
34 
35 **/
36 EFI_STATUS
SerialStatusCodeReportWorker(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)37 SerialStatusCodeReportWorker (
38   IN EFI_STATUS_CODE_TYPE     CodeType,
39   IN EFI_STATUS_CODE_VALUE    Value,
40   IN UINT32                   Instance,
41   IN EFI_GUID                 *CallerId,
42   IN EFI_STATUS_CODE_DATA     *Data OPTIONAL
43   )
44 {
45   CHAR8           *Filename;
46   CHAR8           *Description;
47   CHAR8           *Format;
48   CHAR8           Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE];
49   UINT32          ErrorLevel;
50   UINT32          LineNumber;
51   UINTN           CharCount;
52   BASE_LIST       Marker;
53 
54   Buffer[0] = '\0';
55 
56   if (Data != NULL &&
57       ReportStatusCodeExtractAssertInfo (CodeType, Value, Data, &Filename, &Description, &LineNumber)) {
58     //
59     // Print ASSERT() information into output buffer.
60     //
61     CharCount = AsciiSPrint (
62                   Buffer,
63                   sizeof (Buffer),
64                   "\n\rDXE_ASSERT!: %a (%d): %a\n\r",
65                   Filename,
66                   LineNumber,
67                   Description
68                   );
69   } else if (Data != NULL &&
70              ReportStatusCodeExtractDebugInfo (Data, &ErrorLevel, &Marker, &Format)) {
71     //
72     // Print DEBUG() information into output buffer.
73     //
74     CharCount = AsciiBSPrint (
75                   Buffer,
76                   sizeof (Buffer),
77                   Format,
78                   Marker
79                   );
80   } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_ERROR_CODE) {
81     //
82     // Print ERROR information into output buffer.
83     //
84     CharCount = AsciiSPrint (
85                   Buffer,
86                   sizeof (Buffer),
87                   "ERROR: C%08x:V%08x I%x",
88                   CodeType,
89                   Value,
90                   Instance
91                   );
92 
93     if (CallerId != NULL) {
94       CharCount += AsciiSPrint (
95                      &Buffer[CharCount],
96                      (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
97                      " %g",
98                      CallerId
99                      );
100     }
101 
102     if (Data != NULL) {
103       CharCount += AsciiSPrint (
104                      &Buffer[CharCount],
105                      (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
106                      " %x",
107                      Data
108                      );
109     }
110 
111     CharCount += AsciiSPrint (
112                    &Buffer[CharCount],
113                    (sizeof (Buffer) - (sizeof (Buffer[0]) * CharCount)),
114                    "\n\r"
115                    );
116   } else if ((CodeType & EFI_STATUS_CODE_TYPE_MASK) == EFI_PROGRESS_CODE) {
117     //
118     // Print PROGRESS information into output buffer.
119     //
120     CharCount = AsciiSPrint (
121                   Buffer,
122                   sizeof (Buffer),
123                   "PROGRESS CODE: V%08x I%x\n\r",
124                   Value,
125                   Instance
126                   );
127   } else if (Data != NULL &&
128              CompareGuid (&Data->Type, &gEfiStatusCodeDataTypeStringGuid) &&
129              ((EFI_STATUS_CODE_STRING_DATA *) Data)->StringType == EfiStringAscii) {
130     //
131     // EFI_STATUS_CODE_STRING_DATA
132     //
133     CharCount = AsciiSPrint (
134                   Buffer,
135                   sizeof (Buffer),
136                   "%a\n\r",
137                   ((EFI_STATUS_CODE_STRING_DATA *) Data)->String.Ascii
138                   );
139   } else {
140     //
141     // Code type is not defined.
142     //
143     CharCount = AsciiSPrint (
144                   Buffer,
145                   sizeof (Buffer),
146                   "Undefined: C%08x:V%08x I%x\n\r",
147                   CodeType,
148                   Value,
149                   Instance
150                   );
151   }
152 
153   //
154   // Call SerialPort Lib function to do print.
155   //
156   SerialPortWrite ((UINT8 *) Buffer, CharCount);
157 
158   return EFI_SUCCESS;
159 }
160 
161