misc.c revision 1.1.1.1.6.2 1 1.1.1.1.6.2 yamt /* $NetBSD: misc.c,v 1.1.1.1.6.2 2014/05/22 11:40:58 yamt Exp $ */
2 1.1.1.1.6.2 yamt
3 1.1.1.1.6.2 yamt /*++
4 1.1.1.1.6.2 yamt
5 1.1.1.1.6.2 yamt Copyright (c) 1998 Intel Corporation
6 1.1.1.1.6.2 yamt
7 1.1.1.1.6.2 yamt Module Name:
8 1.1.1.1.6.2 yamt
9 1.1.1.1.6.2 yamt misc.c
10 1.1.1.1.6.2 yamt
11 1.1.1.1.6.2 yamt Abstract:
12 1.1.1.1.6.2 yamt
13 1.1.1.1.6.2 yamt
14 1.1.1.1.6.2 yamt
15 1.1.1.1.6.2 yamt
16 1.1.1.1.6.2 yamt Revision History
17 1.1.1.1.6.2 yamt
18 1.1.1.1.6.2 yamt --*/
19 1.1.1.1.6.2 yamt
20 1.1.1.1.6.2 yamt #include "lib.h"
21 1.1.1.1.6.2 yamt
22 1.1.1.1.6.2 yamt
23 1.1.1.1.6.2 yamt //
24 1.1.1.1.6.2 yamt //
25 1.1.1.1.6.2 yamt //
26 1.1.1.1.6.2 yamt
27 1.1.1.1.6.2 yamt VOID *
28 1.1.1.1.6.2 yamt AllocatePool (
29 1.1.1.1.6.2 yamt IN UINTN Size
30 1.1.1.1.6.2 yamt )
31 1.1.1.1.6.2 yamt {
32 1.1.1.1.6.2 yamt EFI_STATUS Status;
33 1.1.1.1.6.2 yamt VOID *p;
34 1.1.1.1.6.2 yamt
35 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->AllocatePool, 3, PoolAllocationType, Size, &p);
36 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
37 1.1.1.1.6.2 yamt DEBUG((D_ERROR, "AllocatePool: out of pool %x\n", Status));
38 1.1.1.1.6.2 yamt p = NULL;
39 1.1.1.1.6.2 yamt }
40 1.1.1.1.6.2 yamt return p;
41 1.1.1.1.6.2 yamt }
42 1.1.1.1.6.2 yamt
43 1.1.1.1.6.2 yamt VOID *
44 1.1.1.1.6.2 yamt AllocateZeroPool (
45 1.1.1.1.6.2 yamt IN UINTN Size
46 1.1.1.1.6.2 yamt )
47 1.1.1.1.6.2 yamt {
48 1.1.1.1.6.2 yamt VOID *p;
49 1.1.1.1.6.2 yamt
50 1.1.1.1.6.2 yamt p = AllocatePool (Size);
51 1.1.1.1.6.2 yamt if (p) {
52 1.1.1.1.6.2 yamt ZeroMem (p, Size);
53 1.1.1.1.6.2 yamt }
54 1.1.1.1.6.2 yamt
55 1.1.1.1.6.2 yamt return p;
56 1.1.1.1.6.2 yamt }
57 1.1.1.1.6.2 yamt
58 1.1.1.1.6.2 yamt VOID *
59 1.1.1.1.6.2 yamt ReallocatePool (
60 1.1.1.1.6.2 yamt IN VOID *OldPool,
61 1.1.1.1.6.2 yamt IN UINTN OldSize,
62 1.1.1.1.6.2 yamt IN UINTN NewSize
63 1.1.1.1.6.2 yamt )
64 1.1.1.1.6.2 yamt {
65 1.1.1.1.6.2 yamt VOID *NewPool;
66 1.1.1.1.6.2 yamt
67 1.1.1.1.6.2 yamt NewPool = NULL;
68 1.1.1.1.6.2 yamt if (NewSize) {
69 1.1.1.1.6.2 yamt NewPool = AllocatePool (NewSize);
70 1.1.1.1.6.2 yamt }
71 1.1.1.1.6.2 yamt
72 1.1.1.1.6.2 yamt if (OldPool) {
73 1.1.1.1.6.2 yamt if (NewPool) {
74 1.1.1.1.6.2 yamt CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
75 1.1.1.1.6.2 yamt }
76 1.1.1.1.6.2 yamt
77 1.1.1.1.6.2 yamt FreePool (OldPool);
78 1.1.1.1.6.2 yamt }
79 1.1.1.1.6.2 yamt
80 1.1.1.1.6.2 yamt return NewPool;
81 1.1.1.1.6.2 yamt }
82 1.1.1.1.6.2 yamt
83 1.1.1.1.6.2 yamt
84 1.1.1.1.6.2 yamt VOID
85 1.1.1.1.6.2 yamt FreePool (
86 1.1.1.1.6.2 yamt IN VOID *Buffer
87 1.1.1.1.6.2 yamt )
88 1.1.1.1.6.2 yamt {
89 1.1.1.1.6.2 yamt uefi_call_wrapper(BS->FreePool, 1, Buffer);
90 1.1.1.1.6.2 yamt }
91 1.1.1.1.6.2 yamt
92 1.1.1.1.6.2 yamt
93 1.1.1.1.6.2 yamt
94 1.1.1.1.6.2 yamt VOID
95 1.1.1.1.6.2 yamt ZeroMem (
96 1.1.1.1.6.2 yamt IN VOID *Buffer,
97 1.1.1.1.6.2 yamt IN UINTN Size
98 1.1.1.1.6.2 yamt )
99 1.1.1.1.6.2 yamt {
100 1.1.1.1.6.2 yamt RtZeroMem (Buffer, Size);
101 1.1.1.1.6.2 yamt }
102 1.1.1.1.6.2 yamt
103 1.1.1.1.6.2 yamt VOID
104 1.1.1.1.6.2 yamt SetMem (
105 1.1.1.1.6.2 yamt IN VOID *Buffer,
106 1.1.1.1.6.2 yamt IN UINTN Size,
107 1.1.1.1.6.2 yamt IN UINT8 Value
108 1.1.1.1.6.2 yamt )
109 1.1.1.1.6.2 yamt {
110 1.1.1.1.6.2 yamt RtSetMem (Buffer, Size, Value);
111 1.1.1.1.6.2 yamt }
112 1.1.1.1.6.2 yamt
113 1.1.1.1.6.2 yamt VOID
114 1.1.1.1.6.2 yamt CopyMem (
115 1.1.1.1.6.2 yamt IN VOID *Dest,
116 1.1.1.1.6.2 yamt IN VOID *Src,
117 1.1.1.1.6.2 yamt IN UINTN len
118 1.1.1.1.6.2 yamt )
119 1.1.1.1.6.2 yamt {
120 1.1.1.1.6.2 yamt RtCopyMem (Dest, Src, len);
121 1.1.1.1.6.2 yamt }
122 1.1.1.1.6.2 yamt
123 1.1.1.1.6.2 yamt INTN
124 1.1.1.1.6.2 yamt CompareMem (
125 1.1.1.1.6.2 yamt IN VOID *Dest,
126 1.1.1.1.6.2 yamt IN VOID *Src,
127 1.1.1.1.6.2 yamt IN UINTN len
128 1.1.1.1.6.2 yamt )
129 1.1.1.1.6.2 yamt {
130 1.1.1.1.6.2 yamt return RtCompareMem (Dest, Src, len);
131 1.1.1.1.6.2 yamt }
132 1.1.1.1.6.2 yamt
133 1.1.1.1.6.2 yamt BOOLEAN
134 1.1.1.1.6.2 yamt GrowBuffer(
135 1.1.1.1.6.2 yamt IN OUT EFI_STATUS *Status,
136 1.1.1.1.6.2 yamt IN OUT VOID **Buffer,
137 1.1.1.1.6.2 yamt IN UINTN BufferSize
138 1.1.1.1.6.2 yamt )
139 1.1.1.1.6.2 yamt /*++
140 1.1.1.1.6.2 yamt
141 1.1.1.1.6.2 yamt Routine Description:
142 1.1.1.1.6.2 yamt
143 1.1.1.1.6.2 yamt Helper function called as part of the code needed
144 1.1.1.1.6.2 yamt to allocate the proper sized buffer for various
145 1.1.1.1.6.2 yamt EFI interfaces.
146 1.1.1.1.6.2 yamt
147 1.1.1.1.6.2 yamt Arguments:
148 1.1.1.1.6.2 yamt
149 1.1.1.1.6.2 yamt Status - Current status
150 1.1.1.1.6.2 yamt
151 1.1.1.1.6.2 yamt Buffer - Current allocated buffer, or NULL
152 1.1.1.1.6.2 yamt
153 1.1.1.1.6.2 yamt BufferSize - Current buffer size needed
154 1.1.1.1.6.2 yamt
155 1.1.1.1.6.2 yamt Returns:
156 1.1.1.1.6.2 yamt
157 1.1.1.1.6.2 yamt TRUE - if the buffer was reallocated and the caller
158 1.1.1.1.6.2 yamt should try the API again.
159 1.1.1.1.6.2 yamt
160 1.1.1.1.6.2 yamt --*/
161 1.1.1.1.6.2 yamt {
162 1.1.1.1.6.2 yamt BOOLEAN TryAgain;
163 1.1.1.1.6.2 yamt
164 1.1.1.1.6.2 yamt //
165 1.1.1.1.6.2 yamt // If this is an initial request, buffer will be null with a new buffer size
166 1.1.1.1.6.2 yamt //
167 1.1.1.1.6.2 yamt
168 1.1.1.1.6.2 yamt if (!*Buffer && BufferSize) {
169 1.1.1.1.6.2 yamt *Status = EFI_BUFFER_TOO_SMALL;
170 1.1.1.1.6.2 yamt }
171 1.1.1.1.6.2 yamt
172 1.1.1.1.6.2 yamt //
173 1.1.1.1.6.2 yamt // If the status code is "buffer too small", resize the buffer
174 1.1.1.1.6.2 yamt //
175 1.1.1.1.6.2 yamt
176 1.1.1.1.6.2 yamt TryAgain = FALSE;
177 1.1.1.1.6.2 yamt if (*Status == EFI_BUFFER_TOO_SMALL) {
178 1.1.1.1.6.2 yamt
179 1.1.1.1.6.2 yamt if (*Buffer) {
180 1.1.1.1.6.2 yamt FreePool (*Buffer);
181 1.1.1.1.6.2 yamt }
182 1.1.1.1.6.2 yamt
183 1.1.1.1.6.2 yamt *Buffer = AllocatePool (BufferSize);
184 1.1.1.1.6.2 yamt
185 1.1.1.1.6.2 yamt if (*Buffer) {
186 1.1.1.1.6.2 yamt TryAgain = TRUE;
187 1.1.1.1.6.2 yamt } else {
188 1.1.1.1.6.2 yamt *Status = EFI_OUT_OF_RESOURCES;
189 1.1.1.1.6.2 yamt }
190 1.1.1.1.6.2 yamt }
191 1.1.1.1.6.2 yamt
192 1.1.1.1.6.2 yamt //
193 1.1.1.1.6.2 yamt // If there's an error, free the buffer
194 1.1.1.1.6.2 yamt //
195 1.1.1.1.6.2 yamt
196 1.1.1.1.6.2 yamt if (!TryAgain && EFI_ERROR(*Status) && *Buffer) {
197 1.1.1.1.6.2 yamt FreePool (*Buffer);
198 1.1.1.1.6.2 yamt *Buffer = NULL;
199 1.1.1.1.6.2 yamt }
200 1.1.1.1.6.2 yamt
201 1.1.1.1.6.2 yamt return TryAgain;
202 1.1.1.1.6.2 yamt }
203 1.1.1.1.6.2 yamt
204 1.1.1.1.6.2 yamt
205 1.1.1.1.6.2 yamt EFI_MEMORY_DESCRIPTOR *
206 1.1.1.1.6.2 yamt LibMemoryMap (
207 1.1.1.1.6.2 yamt OUT UINTN *NoEntries,
208 1.1.1.1.6.2 yamt OUT UINTN *MapKey,
209 1.1.1.1.6.2 yamt OUT UINTN *DescriptorSize,
210 1.1.1.1.6.2 yamt OUT UINT32 *DescriptorVersion
211 1.1.1.1.6.2 yamt )
212 1.1.1.1.6.2 yamt {
213 1.1.1.1.6.2 yamt EFI_STATUS Status;
214 1.1.1.1.6.2 yamt EFI_MEMORY_DESCRIPTOR *Buffer;
215 1.1.1.1.6.2 yamt UINTN BufferSize;
216 1.1.1.1.6.2 yamt
217 1.1.1.1.6.2 yamt //
218 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
219 1.1.1.1.6.2 yamt //
220 1.1.1.1.6.2 yamt
221 1.1.1.1.6.2 yamt Buffer = NULL;
222 1.1.1.1.6.2 yamt BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR);
223 1.1.1.1.6.2 yamt
224 1.1.1.1.6.2 yamt //
225 1.1.1.1.6.2 yamt // Call the real function
226 1.1.1.1.6.2 yamt //
227 1.1.1.1.6.2 yamt
228 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
229 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->GetMemoryMap, 5, &BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion);
230 1.1.1.1.6.2 yamt }
231 1.1.1.1.6.2 yamt
232 1.1.1.1.6.2 yamt //
233 1.1.1.1.6.2 yamt // Convert buffer size to NoEntries
234 1.1.1.1.6.2 yamt //
235 1.1.1.1.6.2 yamt
236 1.1.1.1.6.2 yamt if (!EFI_ERROR(Status)) {
237 1.1.1.1.6.2 yamt *NoEntries = BufferSize / *DescriptorSize;
238 1.1.1.1.6.2 yamt }
239 1.1.1.1.6.2 yamt
240 1.1.1.1.6.2 yamt return Buffer;
241 1.1.1.1.6.2 yamt }
242 1.1.1.1.6.2 yamt
243 1.1.1.1.6.2 yamt VOID *
244 1.1.1.1.6.2 yamt LibGetVariableAndSize (
245 1.1.1.1.6.2 yamt IN CHAR16 *Name,
246 1.1.1.1.6.2 yamt IN EFI_GUID *VendorGuid,
247 1.1.1.1.6.2 yamt OUT UINTN *VarSize
248 1.1.1.1.6.2 yamt )
249 1.1.1.1.6.2 yamt {
250 1.1.1.1.6.2 yamt EFI_STATUS Status;
251 1.1.1.1.6.2 yamt VOID *Buffer;
252 1.1.1.1.6.2 yamt UINTN BufferSize;
253 1.1.1.1.6.2 yamt
254 1.1.1.1.6.2 yamt //
255 1.1.1.1.6.2 yamt // Initialize for GrowBuffer loop
256 1.1.1.1.6.2 yamt //
257 1.1.1.1.6.2 yamt
258 1.1.1.1.6.2 yamt Buffer = NULL;
259 1.1.1.1.6.2 yamt BufferSize = 100;
260 1.1.1.1.6.2 yamt
261 1.1.1.1.6.2 yamt //
262 1.1.1.1.6.2 yamt // Call the real function
263 1.1.1.1.6.2 yamt //
264 1.1.1.1.6.2 yamt
265 1.1.1.1.6.2 yamt while (GrowBuffer (&Status, &Buffer, BufferSize)) {
266 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
267 1.1.1.1.6.2 yamt RT->GetVariable,
268 1.1.1.1.6.2 yamt 5,
269 1.1.1.1.6.2 yamt Name,
270 1.1.1.1.6.2 yamt VendorGuid,
271 1.1.1.1.6.2 yamt NULL,
272 1.1.1.1.6.2 yamt &BufferSize,
273 1.1.1.1.6.2 yamt Buffer
274 1.1.1.1.6.2 yamt );
275 1.1.1.1.6.2 yamt }
276 1.1.1.1.6.2 yamt if (Buffer) {
277 1.1.1.1.6.2 yamt *VarSize = BufferSize;
278 1.1.1.1.6.2 yamt } else {
279 1.1.1.1.6.2 yamt *VarSize = 0;
280 1.1.1.1.6.2 yamt }
281 1.1.1.1.6.2 yamt return Buffer;
282 1.1.1.1.6.2 yamt }
283 1.1.1.1.6.2 yamt
284 1.1.1.1.6.2 yamt VOID *
285 1.1.1.1.6.2 yamt LibGetVariable (
286 1.1.1.1.6.2 yamt IN CHAR16 *Name,
287 1.1.1.1.6.2 yamt IN EFI_GUID *VendorGuid
288 1.1.1.1.6.2 yamt )
289 1.1.1.1.6.2 yamt {
290 1.1.1.1.6.2 yamt UINTN VarSize;
291 1.1.1.1.6.2 yamt
292 1.1.1.1.6.2 yamt return LibGetVariableAndSize (Name, VendorGuid, &VarSize);
293 1.1.1.1.6.2 yamt }
294 1.1.1.1.6.2 yamt
295 1.1.1.1.6.2 yamt EFI_STATUS
296 1.1.1.1.6.2 yamt LibDeleteVariable (
297 1.1.1.1.6.2 yamt IN CHAR16 *VarName,
298 1.1.1.1.6.2 yamt IN EFI_GUID *VarGuid
299 1.1.1.1.6.2 yamt )
300 1.1.1.1.6.2 yamt {
301 1.1.1.1.6.2 yamt VOID *VarBuf;
302 1.1.1.1.6.2 yamt EFI_STATUS Status;
303 1.1.1.1.6.2 yamt
304 1.1.1.1.6.2 yamt VarBuf = LibGetVariable(VarName,VarGuid);
305 1.1.1.1.6.2 yamt
306 1.1.1.1.6.2 yamt Status = EFI_NOT_FOUND;
307 1.1.1.1.6.2 yamt
308 1.1.1.1.6.2 yamt if (VarBuf) {
309 1.1.1.1.6.2 yamt //
310 1.1.1.1.6.2 yamt // Delete variable from Storage
311 1.1.1.1.6.2 yamt //
312 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
313 1.1.1.1.6.2 yamt RT->SetVariable,
314 1.1.1.1.6.2 yamt 5,
315 1.1.1.1.6.2 yamt VarName, VarGuid,
316 1.1.1.1.6.2 yamt EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
317 1.1.1.1.6.2 yamt 0, NULL
318 1.1.1.1.6.2 yamt );
319 1.1.1.1.6.2 yamt ASSERT (!EFI_ERROR(Status));
320 1.1.1.1.6.2 yamt FreePool(VarBuf);
321 1.1.1.1.6.2 yamt }
322 1.1.1.1.6.2 yamt
323 1.1.1.1.6.2 yamt return (Status);
324 1.1.1.1.6.2 yamt }
325 1.1.1.1.6.2 yamt
326 1.1.1.1.6.2 yamt EFI_STATUS
327 1.1.1.1.6.2 yamt LibInsertToTailOfBootOrder (
328 1.1.1.1.6.2 yamt IN UINT16 BootOption,
329 1.1.1.1.6.2 yamt IN BOOLEAN OnlyInsertIfEmpty
330 1.1.1.1.6.2 yamt )
331 1.1.1.1.6.2 yamt {
332 1.1.1.1.6.2 yamt UINT16 *BootOptionArray;
333 1.1.1.1.6.2 yamt UINT16 *NewBootOptionArray;
334 1.1.1.1.6.2 yamt UINTN VarSize;
335 1.1.1.1.6.2 yamt UINTN Index;
336 1.1.1.1.6.2 yamt EFI_STATUS Status;
337 1.1.1.1.6.2 yamt
338 1.1.1.1.6.2 yamt BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize);
339 1.1.1.1.6.2 yamt if (VarSize != 0 && OnlyInsertIfEmpty) {
340 1.1.1.1.6.2 yamt if (BootOptionArray) {
341 1.1.1.1.6.2 yamt FreePool (BootOptionArray);
342 1.1.1.1.6.2 yamt }
343 1.1.1.1.6.2 yamt return EFI_UNSUPPORTED;
344 1.1.1.1.6.2 yamt }
345 1.1.1.1.6.2 yamt
346 1.1.1.1.6.2 yamt VarSize += sizeof(UINT16);
347 1.1.1.1.6.2 yamt NewBootOptionArray = AllocatePool (VarSize);
348 1.1.1.1.6.2 yamt
349 1.1.1.1.6.2 yamt for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) {
350 1.1.1.1.6.2 yamt NewBootOptionArray[Index] = BootOptionArray[Index];
351 1.1.1.1.6.2 yamt }
352 1.1.1.1.6.2 yamt //
353 1.1.1.1.6.2 yamt // Insert in the tail of the array
354 1.1.1.1.6.2 yamt //
355 1.1.1.1.6.2 yamt NewBootOptionArray[Index] = BootOption;
356 1.1.1.1.6.2 yamt
357 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(
358 1.1.1.1.6.2 yamt RT->SetVariable,
359 1.1.1.1.6.2 yamt 5,
360 1.1.1.1.6.2 yamt VarBootOrder, &EfiGlobalVariable,
361 1.1.1.1.6.2 yamt EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
362 1.1.1.1.6.2 yamt VarSize, (VOID*) NewBootOptionArray
363 1.1.1.1.6.2 yamt );
364 1.1.1.1.6.2 yamt
365 1.1.1.1.6.2 yamt if (NewBootOptionArray) {
366 1.1.1.1.6.2 yamt FreePool (NewBootOptionArray);
367 1.1.1.1.6.2 yamt }
368 1.1.1.1.6.2 yamt if (BootOptionArray) {
369 1.1.1.1.6.2 yamt FreePool (BootOptionArray);
370 1.1.1.1.6.2 yamt }
371 1.1.1.1.6.2 yamt return Status;
372 1.1.1.1.6.2 yamt }
373 1.1.1.1.6.2 yamt
374 1.1.1.1.6.2 yamt
375 1.1.1.1.6.2 yamt BOOLEAN
376 1.1.1.1.6.2 yamt ValidMBR(
377 1.1.1.1.6.2 yamt IN MASTER_BOOT_RECORD *Mbr,
378 1.1.1.1.6.2 yamt IN EFI_BLOCK_IO *BlkIo
379 1.1.1.1.6.2 yamt )
380 1.1.1.1.6.2 yamt {
381 1.1.1.1.6.2 yamt UINT32 StartingLBA, EndingLBA;
382 1.1.1.1.6.2 yamt UINT32 NewEndingLBA;
383 1.1.1.1.6.2 yamt INTN i, j;
384 1.1.1.1.6.2 yamt BOOLEAN ValidMbr;
385 1.1.1.1.6.2 yamt
386 1.1.1.1.6.2 yamt if (Mbr->Signature != MBR_SIGNATURE) {
387 1.1.1.1.6.2 yamt //
388 1.1.1.1.6.2 yamt // The BPB also has this signature, so it can not be used alone.
389 1.1.1.1.6.2 yamt //
390 1.1.1.1.6.2 yamt return FALSE;
391 1.1.1.1.6.2 yamt }
392 1.1.1.1.6.2 yamt
393 1.1.1.1.6.2 yamt ValidMbr = FALSE;
394 1.1.1.1.6.2 yamt for (i=0; i<MAX_MBR_PARTITIONS; i++) {
395 1.1.1.1.6.2 yamt if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) {
396 1.1.1.1.6.2 yamt continue;
397 1.1.1.1.6.2 yamt }
398 1.1.1.1.6.2 yamt ValidMbr = TRUE;
399 1.1.1.1.6.2 yamt StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA);
400 1.1.1.1.6.2 yamt EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1;
401 1.1.1.1.6.2 yamt if (EndingLBA > BlkIo->Media->LastBlock) {
402 1.1.1.1.6.2 yamt //
403 1.1.1.1.6.2 yamt // Compatability Errata:
404 1.1.1.1.6.2 yamt // Some systems try to hide drive space with thier INT 13h driver
405 1.1.1.1.6.2 yamt // This does not hide space from the OS driver. This means the MBR
406 1.1.1.1.6.2 yamt // that gets created from DOS is smaller than the MBR created from
407 1.1.1.1.6.2 yamt // a real OS (NT & Win98). This leads to BlkIo->LastBlock being
408 1.1.1.1.6.2 yamt // wrong on some systems FDISKed by the OS.
409 1.1.1.1.6.2 yamt //
410 1.1.1.1.6.2 yamt //
411 1.1.1.1.6.2 yamt if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) {
412 1.1.1.1.6.2 yamt //
413 1.1.1.1.6.2 yamt // If this is a very small device then trust the BlkIo->LastBlock
414 1.1.1.1.6.2 yamt //
415 1.1.1.1.6.2 yamt return FALSE;
416 1.1.1.1.6.2 yamt }
417 1.1.1.1.6.2 yamt
418 1.1.1.1.6.2 yamt if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) {
419 1.1.1.1.6.2 yamt return FALSE;
420 1.1.1.1.6.2 yamt }
421 1.1.1.1.6.2 yamt
422 1.1.1.1.6.2 yamt }
423 1.1.1.1.6.2 yamt for (j=i+1; j<MAX_MBR_PARTITIONS; j++) {
424 1.1.1.1.6.2 yamt if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) {
425 1.1.1.1.6.2 yamt continue;
426 1.1.1.1.6.2 yamt }
427 1.1.1.1.6.2 yamt if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA &&
428 1.1.1.1.6.2 yamt EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) {
429 1.1.1.1.6.2 yamt //
430 1.1.1.1.6.2 yamt // The Start of this region overlaps with the i'th region
431 1.1.1.1.6.2 yamt //
432 1.1.1.1.6.2 yamt return FALSE;
433 1.1.1.1.6.2 yamt }
434 1.1.1.1.6.2 yamt NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1;
435 1.1.1.1.6.2 yamt if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) {
436 1.1.1.1.6.2 yamt //
437 1.1.1.1.6.2 yamt // The End of this region overlaps with the i'th region
438 1.1.1.1.6.2 yamt //
439 1.1.1.1.6.2 yamt return FALSE;
440 1.1.1.1.6.2 yamt }
441 1.1.1.1.6.2 yamt }
442 1.1.1.1.6.2 yamt }
443 1.1.1.1.6.2 yamt //
444 1.1.1.1.6.2 yamt // Non of the regions overlapped so MBR is O.K.
445 1.1.1.1.6.2 yamt //
446 1.1.1.1.6.2 yamt return ValidMbr;
447 1.1.1.1.6.2 yamt }
448 1.1.1.1.6.2 yamt
449 1.1.1.1.6.2 yamt
450 1.1.1.1.6.2 yamt UINT8
451 1.1.1.1.6.2 yamt DecimaltoBCD(
452 1.1.1.1.6.2 yamt IN UINT8 DecValue
453 1.1.1.1.6.2 yamt )
454 1.1.1.1.6.2 yamt {
455 1.1.1.1.6.2 yamt return RtDecimaltoBCD (DecValue);
456 1.1.1.1.6.2 yamt }
457 1.1.1.1.6.2 yamt
458 1.1.1.1.6.2 yamt
459 1.1.1.1.6.2 yamt UINT8
460 1.1.1.1.6.2 yamt BCDtoDecimal(
461 1.1.1.1.6.2 yamt IN UINT8 BcdValue
462 1.1.1.1.6.2 yamt )
463 1.1.1.1.6.2 yamt {
464 1.1.1.1.6.2 yamt return RtBCDtoDecimal (BcdValue);
465 1.1.1.1.6.2 yamt }
466 1.1.1.1.6.2 yamt
467 1.1.1.1.6.2 yamt EFI_STATUS
468 1.1.1.1.6.2 yamt LibGetSystemConfigurationTable(
469 1.1.1.1.6.2 yamt IN EFI_GUID *TableGuid,
470 1.1.1.1.6.2 yamt IN OUT VOID **Table
471 1.1.1.1.6.2 yamt )
472 1.1.1.1.6.2 yamt
473 1.1.1.1.6.2 yamt {
474 1.1.1.1.6.2 yamt UINTN Index;
475 1.1.1.1.6.2 yamt
476 1.1.1.1.6.2 yamt for(Index=0;Index<ST->NumberOfTableEntries;Index++) {
477 1.1.1.1.6.2 yamt if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) {
478 1.1.1.1.6.2 yamt *Table = ST->ConfigurationTable[Index].VendorTable;
479 1.1.1.1.6.2 yamt return EFI_SUCCESS;
480 1.1.1.1.6.2 yamt }
481 1.1.1.1.6.2 yamt }
482 1.1.1.1.6.2 yamt return EFI_NOT_FOUND;
483 1.1.1.1.6.2 yamt }
484 1.1.1.1.6.2 yamt
485 1.1.1.1.6.2 yamt
486 1.1.1.1.6.2 yamt CHAR16 *
487 1.1.1.1.6.2 yamt LibGetUiString (
488 1.1.1.1.6.2 yamt IN EFI_HANDLE Handle,
489 1.1.1.1.6.2 yamt IN UI_STRING_TYPE StringType,
490 1.1.1.1.6.2 yamt IN ISO_639_2 *LangCode,
491 1.1.1.1.6.2 yamt IN BOOLEAN ReturnDevicePathStrOnMismatch
492 1.1.1.1.6.2 yamt )
493 1.1.1.1.6.2 yamt {
494 1.1.1.1.6.2 yamt UI_INTERFACE *Ui;
495 1.1.1.1.6.2 yamt UI_STRING_TYPE Index;
496 1.1.1.1.6.2 yamt UI_STRING_ENTRY *Array;
497 1.1.1.1.6.2 yamt EFI_STATUS Status;
498 1.1.1.1.6.2 yamt
499 1.1.1.1.6.2 yamt Status = uefi_call_wrapper(BS->HandleProtocol, 3, Handle, &UiProtocol, (VOID *)&Ui);
500 1.1.1.1.6.2 yamt if (EFI_ERROR(Status)) {
501 1.1.1.1.6.2 yamt return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
502 1.1.1.1.6.2 yamt }
503 1.1.1.1.6.2 yamt
504 1.1.1.1.6.2 yamt //
505 1.1.1.1.6.2 yamt // Skip the first strings
506 1.1.1.1.6.2 yamt //
507 1.1.1.1.6.2 yamt for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) {
508 1.1.1.1.6.2 yamt while (Array->LangCode) {
509 1.1.1.1.6.2 yamt Array++;
510 1.1.1.1.6.2 yamt }
511 1.1.1.1.6.2 yamt }
512 1.1.1.1.6.2 yamt
513 1.1.1.1.6.2 yamt //
514 1.1.1.1.6.2 yamt // Search for the match
515 1.1.1.1.6.2 yamt //
516 1.1.1.1.6.2 yamt while (Array->LangCode) {
517 1.1.1.1.6.2 yamt if (strcmpa (Array->LangCode, LangCode) == 0) {
518 1.1.1.1.6.2 yamt return Array->UiString;
519 1.1.1.1.6.2 yamt }
520 1.1.1.1.6.2 yamt }
521 1.1.1.1.6.2 yamt return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL;
522 1.1.1.1.6.2 yamt }
523