]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/LoadLinuxLib/Linux.c
OvmfPkg: allocate the EFI memory map for Linux as Loader Data
[mirror_edk2.git] / OvmfPkg / Library / LoadLinuxLib / Linux.c
CommitLineData
3c0a051f 1/** @file\r
2\r
38851e78 3 Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
3c0a051f 4\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "LoadLinuxLib.h"\r
16\r
17\r
18/**\r
19 A simple check of the kernel setup image\r
20\r
21 An assumption is made that the size of the data is at least the\r
22 size of struct boot_params.\r
23\r
24 @param[in] KernelSetup - The kernel setup image\r
25\r
26 @retval EFI_SUCCESS - The kernel setup looks valid and supported\r
27 @retval EFI_INVALID_PARAMETER - KernelSetup was NULL\r
28 @retval EFI_UNSUPPORTED - The kernel setup is not valid or supported\r
29\r
30**/\r
31STATIC\r
32EFI_STATUS\r
33EFIAPI\r
34BasicKernelSetupCheck (\r
35 IN VOID *KernelSetup\r
36 )\r
37{\r
38 return LoadLinuxCheckKernelSetup(KernelSetup, sizeof (struct boot_params));\r
39}\r
40\r
41\r
42EFI_STATUS\r
43EFIAPI\r
44LoadLinuxCheckKernelSetup (\r
45 IN VOID *KernelSetup,\r
46 IN UINTN KernelSetupSize\r
47 )\r
48{\r
49 struct boot_params *Bp;\r
50\r
51 if (KernelSetup == NULL) {\r
52 return EFI_INVALID_PARAMETER;\r
53 }\r
54\r
55 if (KernelSetupSize < sizeof (*Bp)) {\r
56 return EFI_UNSUPPORTED;\r
57 }\r
58\r
59 Bp = (struct boot_params*) KernelSetup;\r
60\r
61 if ((Bp->hdr.signature != 0xAA55) || // Check boot sector signature\r
62 (Bp->hdr.header != SETUP_HDR) ||\r
38851e78 63 (Bp->hdr.version < 0x205) || // We only support relocatable kernels\r
64 (!Bp->hdr.relocatable_kernel)\r
3c0a051f 65 ) {\r
66 return EFI_UNSUPPORTED;\r
67 } else {\r
68 return EFI_SUCCESS;\r
69 }\r
70}\r
71\r
72\r
73UINTN\r
74EFIAPI\r
75LoadLinuxGetKernelSize (\r
76 IN VOID *KernelSetup,\r
77 IN UINTN KernelSize\r
78 )\r
79{\r
80 struct boot_params *Bp;\r
81\r
82 if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {\r
83 return 0;\r
84 }\r
85\r
86 Bp = (struct boot_params*) KernelSetup;\r
87\r
88 if (Bp->hdr.version > 0x20a) {\r
89 return Bp->hdr.init_size;\r
90 } else {\r
91 //\r
92 // Add extra size for kernel decompression\r
93 //\r
94 return 3 * KernelSize;\r
95 }\r
96}\r
97\r
98\r
99VOID*\r
100EFIAPI\r
101LoadLinuxAllocateKernelSetupPages (\r
102 IN UINTN Pages\r
103 )\r
104{\r
105 EFI_STATUS Status;\r
106 EFI_PHYSICAL_ADDRESS Address;\r
107\r
108 Address = BASE_1GB;\r
109 Status = gBS->AllocatePages (\r
110 AllocateMaxAddress,\r
111 EfiLoaderData,\r
112 Pages,\r
113 &Address\r
114 );\r
115 if (!EFI_ERROR (Status)) {\r
116 return (VOID*)(UINTN) Address;\r
117 } else {\r
118 return NULL;\r
119 }\r
120}\r
121\r
c61a56f2 122EFI_STATUS\r
123EFIAPI\r
124LoadLinuxInitializeKernelSetup (\r
125 IN VOID *KernelSetup\r
126 )\r
127{\r
128 EFI_STATUS Status;\r
129 UINTN SetupEnd;\r
130 struct boot_params *Bp;\r
131\r
132 Status = BasicKernelSetupCheck (KernelSetup);\r
133 if (EFI_ERROR (Status)) {\r
134 return Status;\r
135 }\r
136\r
137 Bp = (struct boot_params*) KernelSetup;\r
138\r
139 SetupEnd = 0x202 + (Bp->hdr.jump & 0xff);\r
140\r
141 //\r
142 // Clear all but the setup_header\r
143 //\r
144 ZeroMem (KernelSetup, 0x1f1);\r
145 ZeroMem (((UINT8 *)KernelSetup) + SetupEnd, 4096 - SetupEnd);\r
146 DEBUG ((EFI_D_INFO, "Cleared kernel setup 0-0x1f1, 0x%x-0x1000\n", SetupEnd));\r
147\r
148 return EFI_SUCCESS;\r
149}\r
3c0a051f 150\r
151VOID*\r
152EFIAPI\r
153LoadLinuxAllocateKernelPages (\r
154 IN VOID *KernelSetup,\r
155 IN UINTN Pages\r
156 )\r
157{\r
158 EFI_STATUS Status;\r
159 EFI_PHYSICAL_ADDRESS KernelAddress;\r
160 UINT32 Loop;\r
161 struct boot_params *Bp;\r
162\r
163 if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {\r
164 return NULL;\r
165 }\r
166\r
167 Bp = (struct boot_params*) KernelSetup;\r
168\r
169 for (Loop = 1; Loop < 512; Loop++) {\r
170 KernelAddress = MultU64x32 (\r
171 2 * Bp->hdr.kernel_alignment,\r
172 Loop\r
173 );\r
174 Status = gBS->AllocatePages (\r
175 AllocateAddress,\r
176 EfiLoaderData,\r
177 Pages,\r
178 &KernelAddress\r
179 );\r
180 if (!EFI_ERROR (Status)) {\r
181 return (VOID*)(UINTN) KernelAddress;\r
182 }\r
183 }\r
184\r
185 return NULL;\r
186}\r
187\r
188\r
189VOID*\r
190EFIAPI\r
191LoadLinuxAllocateCommandLinePages (\r
192 IN UINTN Pages\r
193 )\r
194{\r
195 EFI_STATUS Status;\r
196 EFI_PHYSICAL_ADDRESS Address;\r
197\r
198 Address = 0xa0000;\r
199 Status = gBS->AllocatePages (\r
200 AllocateMaxAddress,\r
201 EfiLoaderData,\r
202 Pages,\r
203 &Address\r
204 );\r
205 if (!EFI_ERROR (Status)) {\r
206 return (VOID*)(UINTN) Address;\r
207 } else {\r
208 return NULL;\r
209 }\r
210}\r
211\r
212\r
213VOID*\r
214EFIAPI\r
215LoadLinuxAllocateInitrdPages (\r
216 IN VOID *KernelSetup,\r
217 IN UINTN Pages\r
218 )\r
219{\r
220 EFI_STATUS Status;\r
221 EFI_PHYSICAL_ADDRESS Address;\r
222\r
223 struct boot_params *Bp;\r
224\r
225 if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {\r
226 return NULL;\r
227 }\r
228\r
229 Bp = (struct boot_params*) KernelSetup;\r
230\r
231 Address = (EFI_PHYSICAL_ADDRESS)(UINTN) Bp->hdr.ramdisk_max;\r
232 Status = gBS->AllocatePages (\r
233 AllocateMaxAddress,\r
234 EfiLoaderData,\r
235 Pages,\r
236 &Address\r
237 );\r
238 if (!EFI_ERROR (Status)) {\r
239 return (VOID*)(UINTN) Address;\r
240 } else {\r
241 return NULL;\r
242 }\r
243}\r
244\r
245\r
246STATIC\r
247VOID\r
248SetupLinuxMemmap (\r
249 IN OUT struct boot_params *Bp\r
250 )\r
251{\r
252 EFI_STATUS Status;\r
253 UINT8 TmpMemoryMap[1];\r
254 UINTN MapKey;\r
255 UINTN DescriptorSize;\r
256 UINT32 DescriptorVersion;\r
257 UINTN MemoryMapSize;\r
258 EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
259 EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;\r
260 UINTN Index;\r
261 struct efi_info *Efi;\r
262 struct e820_entry *LastE820;\r
263 struct e820_entry *E820;\r
264 UINTN E820EntryCount;\r
265 EFI_PHYSICAL_ADDRESS LastEndAddr;\r
266\r
267 //\r
268 // Get System MemoryMapSize\r
269 //\r
270 MemoryMapSize = sizeof (TmpMemoryMap);\r
271 Status = gBS->GetMemoryMap (\r
272 &MemoryMapSize,\r
273 (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,\r
274 &MapKey,\r
275 &DescriptorSize,\r
276 &DescriptorVersion\r
277 );\r
278 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
279 //\r
280 // Enlarge space here, because we will allocate pool now.\r
281 //\r
282 MemoryMapSize += EFI_PAGE_SIZE;\r
4388b0ee
LE
283 Status = gBS->AllocatePool (\r
284 EfiLoaderData,\r
285 MemoryMapSize,\r
286 (VOID **) &MemoryMap\r
287 );\r
288 ASSERT_EFI_ERROR (Status);\r
3c0a051f 289\r
290 //\r
291 // Get System MemoryMap\r
292 //\r
293 Status = gBS->GetMemoryMap (\r
294 &MemoryMapSize,\r
295 MemoryMap,\r
296 &MapKey,\r
297 &DescriptorSize,\r
298 &DescriptorVersion\r
299 );\r
300 ASSERT_EFI_ERROR (Status);\r
301\r
302 LastE820 = NULL;\r
303 E820 = &Bp->e820_map[0];\r
304 E820EntryCount = 0;\r
305 LastEndAddr = 0;\r
306 MemoryMapPtr = MemoryMap;\r
307 for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {\r
308 UINTN E820Type = 0;\r
309\r
310 if (MemoryMap->NumberOfPages == 0) {\r
311 continue;\r
312 }\r
313\r
314 switch(MemoryMap->Type) {\r
315 case EfiReservedMemoryType:\r
316 case EfiRuntimeServicesCode:\r
317 case EfiRuntimeServicesData:\r
318 case EfiMemoryMappedIO:\r
319 case EfiMemoryMappedIOPortSpace:\r
320 case EfiPalCode:\r
321 E820Type = E820_RESERVED;\r
322 break;\r
323\r
324 case EfiUnusableMemory:\r
325 E820Type = E820_UNUSABLE;\r
326 break;\r
327\r
328 case EfiACPIReclaimMemory:\r
329 E820Type = E820_ACPI;\r
330 break;\r
331\r
332 case EfiLoaderCode:\r
333 case EfiLoaderData:\r
334 case EfiBootServicesCode:\r
335 case EfiBootServicesData:\r
336 case EfiConventionalMemory:\r
337 E820Type = E820_RAM;\r
338 break;\r
339\r
340 case EfiACPIMemoryNVS:\r
341 E820Type = E820_NVS;\r
342 break;\r
343\r
344 default:\r
345 DEBUG ((\r
346 EFI_D_ERROR,\r
347 "Invalid EFI memory descriptor type (0x%x)!\n",\r
348 MemoryMap->Type\r
349 ));\r
350 continue;\r
351 }\r
352\r
353 if ((LastE820 != NULL) &&\r
354 (LastE820->type == (UINT32) E820Type) &&\r
355 (MemoryMap->PhysicalStart == LastEndAddr)) {\r
0086fca0
RN
356 LastE820->size += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
357 LastEndAddr += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
3c0a051f 358 } else {\r
359 if (E820EntryCount >= (sizeof (Bp->e820_map) / sizeof (Bp->e820_map[0]))) {\r
360 break;\r
361 }\r
362 E820->type = (UINT32) E820Type;\r
363 E820->addr = MemoryMap->PhysicalStart;\r
0086fca0 364 E820->size = EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
3c0a051f 365 LastE820 = E820;\r
366 LastEndAddr = E820->addr + E820->size;\r
367 E820++;\r
368 E820EntryCount++;\r
369 }\r
370\r
371 //\r
372 // Get next item\r
373 //\r
374 MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize);\r
375 }\r
376 Bp->e820_entries = (UINT8) E820EntryCount;\r
377\r
378 Efi = &Bp->efi_info;\r
379 Efi->efi_systab = (UINT32)(UINTN) gST;\r
380 Efi->efi_memdesc_size = (UINT32) DescriptorSize;\r
381 Efi->efi_memdesc_version = DescriptorVersion;\r
382 Efi->efi_memmap = (UINT32)(UINTN) MemoryMapPtr;\r
383 Efi->efi_memmap_size = (UINT32) MemoryMapSize;\r
384#ifdef MDE_CPU_IA32\r
385 Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');\r
386#else\r
387 Efi->efi_systab_hi = ((UINT64)(UINTN) gST) >> 32;\r
388 Efi->efi_memmap_hi = ((UINT64)(UINTN) MemoryMapPtr) >> 32;\r
389 Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');\r
390#endif\r
391\r
392 gBS->ExitBootServices (gImageHandle, MapKey);\r
393}\r
394\r
395\r
396EFI_STATUS\r
397EFIAPI\r
398LoadLinuxSetCommandLine (\r
399 IN OUT VOID *KernelSetup,\r
400 IN CHAR8 *CommandLine\r
401 )\r
402{\r
403 EFI_STATUS Status;\r
404 struct boot_params *Bp;\r
405\r
406 Status = BasicKernelSetupCheck (KernelSetup);\r
407 if (EFI_ERROR (Status)) {\r
408 return Status;\r
409 }\r
410\r
411 Bp = (struct boot_params*) KernelSetup;\r
412\r
413 Bp->hdr.cmd_line_ptr = (UINT32)(UINTN) CommandLine;\r
414\r
415 return EFI_SUCCESS;\r
416}\r
417\r
418\r
419EFI_STATUS\r
420EFIAPI\r
421LoadLinuxSetInitrd (\r
422 IN OUT VOID *KernelSetup,\r
423 IN VOID *Initrd,\r
424 IN UINTN InitrdSize\r
425 )\r
426{\r
427 EFI_STATUS Status;\r
428 struct boot_params *Bp;\r
429\r
430 Status = BasicKernelSetupCheck (KernelSetup);\r
431 if (EFI_ERROR (Status)) {\r
432 return Status;\r
433 }\r
434\r
435 Bp = (struct boot_params*) KernelSetup;\r
436\r
437 Bp->hdr.ramdisk_start = (UINT32)(UINTN) Initrd;\r
438 Bp->hdr.ramdisk_len = (UINT32) InitrdSize;\r
439\r
440 return EFI_SUCCESS;\r
441}\r
442\r
443\r
444STATIC VOID\r
445FindBits (\r
446 unsigned long Mask,\r
447 UINT8 *Pos,\r
448 UINT8 *Size\r
449 )\r
450{\r
451 UINT8 First, Len;\r
452\r
453 First = 0;\r
454 Len = 0;\r
455\r
456 if (Mask) {\r
457 while (!(Mask & 0x1)) {\r
458 Mask = Mask >> 1;\r
459 First++;\r
460 }\r
461\r
462 while (Mask & 0x1) {\r
463 Mask = Mask >> 1;\r
464 Len++;\r
465 }\r
466 }\r
467 *Pos = First;\r
468 *Size = Len;\r
469}\r
470\r
471\r
472STATIC\r
473EFI_STATUS\r
474SetupGraphicsFromGop (\r
475 struct screen_info *Si,\r
476 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop\r
477 )\r
478{\r
479 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
480 EFI_STATUS Status;\r
481 UINTN Size;\r
482\r
483 Status = Gop->QueryMode(Gop, Gop->Mode->Mode, &Size, &Info);\r
484 if (EFI_ERROR (Status)) {\r
485 return Status;\r
486 }\r
487\r
488 /* We found a GOP */\r
489\r
490 /* EFI framebuffer */\r
491 Si->orig_video_isVGA = 0x70;\r
492\r
493 Si->orig_x = 0;\r
494 Si->orig_y = 0;\r
495 Si->orig_video_page = 0;\r
496 Si->orig_video_mode = 0;\r
497 Si->orig_video_cols = 0;\r
498 Si->orig_video_lines = 0;\r
499 Si->orig_video_ega_bx = 0;\r
500 Si->orig_video_points = 0;\r
501\r
502 Si->lfb_base = (UINT32) Gop->Mode->FrameBufferBase;\r
503 Si->lfb_size = (UINT32) Gop->Mode->FrameBufferSize;\r
504 Si->lfb_width = (UINT16) Info->HorizontalResolution;\r
505 Si->lfb_height = (UINT16) Info->VerticalResolution;\r
506 Si->pages = 1;\r
507 Si->vesapm_seg = 0;\r
508 Si->vesapm_off = 0;\r
509\r
510 if (Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) {\r
511 Si->lfb_depth = 32;\r
512 Si->red_size = 8;\r
513 Si->red_pos = 0;\r
514 Si->green_size = 8;\r
515 Si->green_pos = 8;\r
516 Si->blue_size = 8;\r
517 Si->blue_pos = 16;\r
518 Si->rsvd_size = 8;\r
519 Si->rsvd_pos = 24;\r
520 Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);\r
521\r
522 } else if (Info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {\r
523 Si->lfb_depth = 32;\r
524 Si->red_size = 8;\r
525 Si->red_pos = 16;\r
526 Si->green_size = 8;\r
527 Si->green_pos = 8;\r
528 Si->blue_size = 8;\r
529 Si->blue_pos = 0;\r
530 Si->rsvd_size = 8;\r
531 Si->rsvd_pos = 24;\r
532 Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);\r
533 } else if (Info->PixelFormat == PixelBitMask) {\r
534 FindBits(Info->PixelInformation.RedMask,\r
535 &Si->red_pos, &Si->red_size);\r
536 FindBits(Info->PixelInformation.GreenMask,\r
537 &Si->green_pos, &Si->green_size);\r
538 FindBits(Info->PixelInformation.BlueMask,\r
539 &Si->blue_pos, &Si->blue_size);\r
540 FindBits(Info->PixelInformation.ReservedMask,\r
541 &Si->rsvd_pos, &Si->rsvd_size);\r
542 Si->lfb_depth = Si->red_size + Si->green_size +\r
543 Si->blue_size + Si->rsvd_size;\r
544 Si->lfb_linelength = (UINT16) ((Info->PixelsPerScanLine * Si->lfb_depth) / 8);\r
545 } else {\r
546 Si->lfb_depth = 4;\r
547 Si->red_size = 0;\r
548 Si->red_pos = 0;\r
549 Si->green_size = 0;\r
550 Si->green_pos = 0;\r
551 Si->blue_size = 0;\r
552 Si->blue_pos = 0;\r
553 Si->rsvd_size = 0;\r
554 Si->rsvd_pos = 0;\r
555 Si->lfb_linelength = Si->lfb_width / 2;\r
556 }\r
557\r
558 return Status;\r
559}\r
560\r
561\r
562STATIC\r
563EFI_STATUS\r
564SetupGraphics (\r
565 IN OUT struct boot_params *Bp\r
566 )\r
567{\r
568 EFI_STATUS Status;\r
569 EFI_HANDLE *HandleBuffer;\r
570 UINTN HandleCount;\r
571 UINTN Index;\r
572 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;\r
573\r
574 ZeroMem ((VOID*)&Bp->screen_info, sizeof(Bp->screen_info));\r
575\r
576 Status = gBS->LocateHandleBuffer (\r
577 ByProtocol,\r
578 &gEfiGraphicsOutputProtocolGuid,\r
579 NULL,\r
580 &HandleCount,\r
581 &HandleBuffer\r
582 );\r
583 if (!EFI_ERROR (Status)) {\r
584 for (Index = 0; Index < HandleCount; Index++) {\r
585 Status = gBS->HandleProtocol (\r
586 HandleBuffer[Index],\r
587 &gEfiGraphicsOutputProtocolGuid,\r
588 (VOID*) &Gop\r
589 );\r
590 if (EFI_ERROR (Status)) {\r
591 continue;\r
592 }\r
593\r
594 Status = SetupGraphicsFromGop (&Bp->screen_info, Gop);\r
595 if (!EFI_ERROR (Status)) {\r
596 FreePool (HandleBuffer);\r
597 return EFI_SUCCESS;\r
598 }\r
599 }\r
600\r
601 FreePool (HandleBuffer);\r
602 }\r
603\r
604 return EFI_NOT_FOUND;\r
605}\r
606\r
607\r
608STATIC\r
609EFI_STATUS\r
610SetupLinuxBootParams (\r
3c0a051f 611 IN OUT struct boot_params *Bp\r
612 )\r
613{\r
614 SetupGraphics (Bp);\r
615\r
3c0a051f 616 SetupLinuxMemmap (Bp);\r
617\r
618 return EFI_SUCCESS;\r
619}\r
620\r
621\r
622EFI_STATUS\r
623EFIAPI\r
624LoadLinux (\r
625 IN VOID *Kernel,\r
626 IN OUT VOID *KernelSetup\r
627 )\r
628{\r
629 EFI_STATUS Status;\r
630 struct boot_params *Bp;\r
631\r
632 Status = BasicKernelSetupCheck (KernelSetup);\r
633 if (EFI_ERROR (Status)) {\r
634 return Status;\r
635 }\r
636\r
637 Bp = (struct boot_params *) KernelSetup;\r
638\r
38851e78 639 if (Bp->hdr.version < 0x205 || !Bp->hdr.relocatable_kernel) {\r
3c0a051f 640 //\r
641 // We only support relocatable kernels\r
642 //\r
643 return EFI_UNSUPPORTED;\r
644 }\r
645\r
646 InitLinuxDescriptorTables ();\r
647\r
dd71f6e2 648 Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;\r
649 if (Bp->hdr.version >= 0x20c && Bp->hdr.handover_offset &&\r
650 (Bp->hdr.load_flags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {\r
651 DEBUG ((EFI_D_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));\r
652\r
653 DisableInterrupts ();\r
654 JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);\r
655 }\r
656\r
657 //\r
658 // Old kernels without EFI handover protocol\r
659 //\r
660 SetupLinuxBootParams (KernelSetup);\r
3c0a051f 661\r
662 DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));\r
663 DisableInterrupts ();\r
664 SetLinuxDescriptorTables ();\r
665 JumpToKernel (Kernel, (VOID*) KernelSetup);\r
666\r
667 return EFI_SUCCESS;\r
668}\r
669\r