[BOOTMGFW]
[reactos.git] / reactos / boot / environ / lib / misc / util.c
1 /*
2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/lib/misc/util.c
5 * PURPOSE: Boot Library Utility Functions
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "bl.h"
12
13 /* DATA VARIABLES ************************************************************/
14
15 PVOID UtlRsdt;
16 PVOID UtlXsdt;
17
18 PVOID UtlMcContext;
19 PVOID UtlMcDisplayMessageRoutine;
20 PVOID UtlMcUpdateMessageRoutine;
21
22 PVOID UtlProgressRoutine;
23 PVOID UtlProgressContext;
24 PVOID UtlProgressInfoRoutine;
25 ULONG UtlProgressGranularity;
26 ULONG UtlCurrentPercentComplete;
27 ULONG UtlNextUpdatePercentage;
28 BOOLEAN UtlProgressNeedsInfoUpdate;
29 PVOID UtlProgressInfo;
30
31 /* FUNCTIONS *****************************************************************/
32
33 /*++
34 * @name EfiGetEfiStatusCode
35 *
36 * The EfiGetEfiStatusCode routine converts an NT Status to an EFI status.
37 *
38 * @param Status
39 * NT Status code to be converted.
40 *
41 * @remark Only certain, specific NT status codes are converted to EFI codes.
42 *
43 * @return The corresponding EFI Status code, EFI_NO_MAPPING otherwise.
44 *
45 *--*/
46 EFI_STATUS
47 EfiGetEfiStatusCode(
48 _In_ NTSTATUS Status
49 )
50 {
51 switch (Status)
52 {
53 case STATUS_NOT_SUPPORTED:
54 return EFI_UNSUPPORTED;
55 case STATUS_DISK_FULL:
56 return EFI_VOLUME_FULL;
57 case STATUS_INSUFFICIENT_RESOURCES:
58 return EFI_OUT_OF_RESOURCES;
59 case STATUS_MEDIA_WRITE_PROTECTED:
60 return EFI_WRITE_PROTECTED;
61 case STATUS_DEVICE_NOT_READY:
62 return EFI_NOT_STARTED;
63 case STATUS_DEVICE_ALREADY_ATTACHED:
64 return EFI_ALREADY_STARTED;
65 case STATUS_MEDIA_CHANGED:
66 return EFI_MEDIA_CHANGED;
67 case STATUS_INVALID_PARAMETER:
68 return EFI_INVALID_PARAMETER;
69 case STATUS_ACCESS_DENIED:
70 return EFI_ACCESS_DENIED;
71 case STATUS_BUFFER_TOO_SMALL:
72 return EFI_BUFFER_TOO_SMALL;
73 case STATUS_DISK_CORRUPT_ERROR:
74 return EFI_VOLUME_CORRUPTED;
75 case STATUS_REQUEST_ABORTED:
76 return EFI_ABORTED;
77 case STATUS_NO_MEDIA:
78 return EFI_NO_MEDIA;
79 case STATUS_IO_DEVICE_ERROR:
80 return EFI_DEVICE_ERROR;
81 case STATUS_INVALID_BUFFER_SIZE:
82 return EFI_BAD_BUFFER_SIZE;
83 case STATUS_NOT_FOUND:
84 return EFI_NOT_FOUND;
85 case STATUS_DRIVER_UNABLE_TO_LOAD:
86 return EFI_LOAD_ERROR;
87 case STATUS_NO_MATCH:
88 return EFI_NO_MAPPING;
89 case STATUS_SUCCESS:
90 return EFI_SUCCESS;
91 case STATUS_TIMEOUT:
92 return EFI_TIMEOUT;
93 default:
94 return EFI_NO_MAPPING;
95 }
96 }
97
98 /*++
99 * @name EfiGetNtStatusCode
100 *
101 * The EfiGetNtStatusCode routine converts an EFI Status to an NT status.
102 *
103 * @param EfiStatus
104 * EFI Status code to be converted.
105 *
106 * @remark Only certain, specific EFI status codes are converted to NT codes.
107 *
108 * @return The corresponding NT Status code, STATUS_UNSUCCESSFUL otherwise.
109 *
110 *--*/
111 NTSTATUS
112 EfiGetNtStatusCode (
113 _In_ EFI_STATUS EfiStatus
114 )
115 {
116 switch (EfiStatus)
117 {
118 case EFI_NOT_READY:
119 case EFI_NOT_FOUND:
120 return STATUS_NOT_FOUND;
121 case EFI_NO_MEDIA:
122 return STATUS_NO_MEDIA;
123 case EFI_MEDIA_CHANGED:
124 return STATUS_MEDIA_CHANGED;
125 case EFI_ACCESS_DENIED:
126 case EFI_SECURITY_VIOLATION:
127 return STATUS_ACCESS_DENIED;
128 case EFI_TIMEOUT:
129 case EFI_NO_RESPONSE:
130 return STATUS_TIMEOUT;
131 case EFI_NO_MAPPING:
132 return STATUS_NO_MATCH;
133 case EFI_NOT_STARTED:
134 return STATUS_DEVICE_NOT_READY;
135 case EFI_ALREADY_STARTED:
136 return STATUS_DEVICE_ALREADY_ATTACHED;
137 case EFI_ABORTED:
138 return STATUS_REQUEST_ABORTED;
139 case EFI_VOLUME_FULL:
140 return STATUS_DISK_FULL;
141 case EFI_DEVICE_ERROR:
142 return STATUS_IO_DEVICE_ERROR;
143 case EFI_WRITE_PROTECTED:
144 return STATUS_MEDIA_WRITE_PROTECTED;
145 /* @FIXME: ReactOS Headers don't yet have this */
146 //case EFI_OUT_OF_RESOURCES:
147 //return STATUS_INSUFFICIENT_NVRAM_RESOURCES;
148 case EFI_VOLUME_CORRUPTED:
149 return STATUS_DISK_CORRUPT_ERROR;
150 case EFI_BUFFER_TOO_SMALL:
151 return STATUS_BUFFER_TOO_SMALL;
152 case EFI_SUCCESS:
153 return STATUS_SUCCESS;
154 case EFI_LOAD_ERROR:
155 return STATUS_DRIVER_UNABLE_TO_LOAD;
156 case EFI_INVALID_PARAMETER:
157 return STATUS_INVALID_PARAMETER;
158 case EFI_UNSUPPORTED:
159 return STATUS_NOT_SUPPORTED;
160 case EFI_BAD_BUFFER_SIZE:
161 return STATUS_INVALID_BUFFER_SIZE;
162 default:
163 return STATUS_UNSUCCESSFUL;
164 }
165 }
166
167 NTSTATUS
168 BlUtlInitialize (
169 VOID
170 )
171 {
172 UtlRsdt = 0;
173 UtlXsdt = 0;
174
175 UtlMcContext = 0;
176 UtlMcDisplayMessageRoutine = 0;
177 UtlMcUpdateMessageRoutine = 0;
178
179 UtlProgressRoutine = 0;
180 UtlProgressContext = 0;
181 UtlProgressInfoRoutine = 0;
182 UtlProgressGranularity = 0;
183 UtlCurrentPercentComplete = 0;
184 UtlNextUpdatePercentage = 0;
185 UtlProgressNeedsInfoUpdate = 0;
186 UtlProgressInfo = 0;
187
188 return STATUS_SUCCESS;
189 }
190
191 VOID
192 BlFwReboot (
193 VOID
194 )
195 {
196 #ifdef BL_KD_SUPPORTED
197 /* Stop the boot debugger*/
198 BlBdStop();
199 #endif
200
201 /* Reset the machine */
202 EfiResetSystem(EfiResetCold);
203 }