]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/LoadLinuxLib/Linux.c
OvmfPkg: fix conversion specifiers in DEBUG format strings
[mirror_edk2.git] / OvmfPkg / Library / LoadLinuxLib / Linux.c
CommitLineData
3c0a051f 1/** @file\r
2\r
c4046161 3 Copyright (c) 2011 - 2014, 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
6394c35a
LE
146 DEBUG ((EFI_D_INFO, "Cleared kernel setup 0-0x1f1, 0x%Lx-0x1000\n",\r
147 (UINT64)SetupEnd));\r
c61a56f2 148\r
149 return EFI_SUCCESS;\r
150}\r
3c0a051f 151\r
152VOID*\r
153EFIAPI\r
154LoadLinuxAllocateKernelPages (\r
155 IN VOID *KernelSetup,\r
156 IN UINTN Pages\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 EFI_PHYSICAL_ADDRESS KernelAddress;\r
161 UINT32 Loop;\r
162 struct boot_params *Bp;\r
163\r
164 if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {\r
165 return NULL;\r
166 }\r
167\r
168 Bp = (struct boot_params*) KernelSetup;\r
169\r
170 for (Loop = 1; Loop < 512; Loop++) {\r
171 KernelAddress = MultU64x32 (\r
172 2 * Bp->hdr.kernel_alignment,\r
173 Loop\r
174 );\r
175 Status = gBS->AllocatePages (\r
176 AllocateAddress,\r
177 EfiLoaderData,\r
178 Pages,\r
179 &KernelAddress\r
180 );\r
181 if (!EFI_ERROR (Status)) {\r
182 return (VOID*)(UINTN) KernelAddress;\r
183 }\r
184 }\r
185\r
186 return NULL;\r
187}\r
188\r
189\r
190VOID*\r
191EFIAPI\r
192LoadLinuxAllocateCommandLinePages (\r
193 IN UINTN Pages\r
194 )\r
195{\r
196 EFI_STATUS Status;\r
197 EFI_PHYSICAL_ADDRESS Address;\r
198\r
199 Address = 0xa0000;\r
200 Status = gBS->AllocatePages (\r
201 AllocateMaxAddress,\r
202 EfiLoaderData,\r
203 Pages,\r
204 &Address\r
205 );\r
206 if (!EFI_ERROR (Status)) {\r
207 return (VOID*)(UINTN) Address;\r
208 } else {\r
209 return NULL;\r
210 }\r
211}\r
212\r
213\r
214VOID*\r
215EFIAPI\r
216LoadLinuxAllocateInitrdPages (\r
217 IN VOID *KernelSetup,\r
218 IN UINTN Pages\r
219 )\r
220{\r
221 EFI_STATUS Status;\r
222 EFI_PHYSICAL_ADDRESS Address;\r
223\r
224 struct boot_params *Bp;\r
225\r
226 if (EFI_ERROR (BasicKernelSetupCheck (KernelSetup))) {\r
227 return NULL;\r
228 }\r
229\r
230 Bp = (struct boot_params*) KernelSetup;\r
231\r
232 Address = (EFI_PHYSICAL_ADDRESS)(UINTN) Bp->hdr.ramdisk_max;\r
233 Status = gBS->AllocatePages (\r
234 AllocateMaxAddress,\r
235 EfiLoaderData,\r
236 Pages,\r
237 &Address\r
238 );\r
239 if (!EFI_ERROR (Status)) {\r
240 return (VOID*)(UINTN) Address;\r
241 } else {\r
242 return NULL;\r
243 }\r
244}\r
245\r
246\r
247STATIC\r
248VOID\r
249SetupLinuxMemmap (\r
250 IN OUT struct boot_params *Bp\r
251 )\r
252{\r
253 EFI_STATUS Status;\r
254 UINT8 TmpMemoryMap[1];\r
255 UINTN MapKey;\r
256 UINTN DescriptorSize;\r
257 UINT32 DescriptorVersion;\r
258 UINTN MemoryMapSize;\r
259 EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
260 EFI_MEMORY_DESCRIPTOR *MemoryMapPtr;\r
261 UINTN Index;\r
262 struct efi_info *Efi;\r
263 struct e820_entry *LastE820;\r
264 struct e820_entry *E820;\r
265 UINTN E820EntryCount;\r
266 EFI_PHYSICAL_ADDRESS LastEndAddr;\r
267\r
268 //\r
269 // Get System MemoryMapSize\r
270 //\r
271 MemoryMapSize = sizeof (TmpMemoryMap);\r
272 Status = gBS->GetMemoryMap (\r
273 &MemoryMapSize,\r
274 (EFI_MEMORY_DESCRIPTOR *)TmpMemoryMap,\r
275 &MapKey,\r
276 &DescriptorSize,\r
277 &DescriptorVersion\r
278 );\r
279 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
280 //\r
281 // Enlarge space here, because we will allocate pool now.\r
282 //\r
283 MemoryMapSize += EFI_PAGE_SIZE;\r
4388b0ee
LE
284 Status = gBS->AllocatePool (\r
285 EfiLoaderData,\r
286 MemoryMapSize,\r
287 (VOID **) &MemoryMap\r
288 );\r
289 ASSERT_EFI_ERROR (Status);\r
3c0a051f 290\r
291 //\r
292 // Get System MemoryMap\r
293 //\r
294 Status = gBS->GetMemoryMap (\r
295 &MemoryMapSize,\r
296 MemoryMap,\r
297 &MapKey,\r
298 &DescriptorSize,\r
299 &DescriptorVersion\r
300 );\r
301 ASSERT_EFI_ERROR (Status);\r
302\r
303 LastE820 = NULL;\r
304 E820 = &Bp->e820_map[0];\r
305 E820EntryCount = 0;\r
306 LastEndAddr = 0;\r
307 MemoryMapPtr = MemoryMap;\r
308 for (Index = 0; Index < (MemoryMapSize / DescriptorSize); Index++) {\r
309 UINTN E820Type = 0;\r
310\r
311 if (MemoryMap->NumberOfPages == 0) {\r
312 continue;\r
313 }\r
314\r
315 switch(MemoryMap->Type) {\r
316 case EfiReservedMemoryType:\r
317 case EfiRuntimeServicesCode:\r
318 case EfiRuntimeServicesData:\r
319 case EfiMemoryMappedIO:\r
320 case EfiMemoryMappedIOPortSpace:\r
321 case EfiPalCode:\r
322 E820Type = E820_RESERVED;\r
323 break;\r
324\r
325 case EfiUnusableMemory:\r
326 E820Type = E820_UNUSABLE;\r
327 break;\r
328\r
329 case EfiACPIReclaimMemory:\r
330 E820Type = E820_ACPI;\r
331 break;\r
332\r
333 case EfiLoaderCode:\r
334 case EfiLoaderData:\r
335 case EfiBootServicesCode:\r
336 case EfiBootServicesData:\r
337 case EfiConventionalMemory:\r
338 E820Type = E820_RAM;\r
339 break;\r
340\r
341 case EfiACPIMemoryNVS:\r
342 E820Type = E820_NVS;\r
343 break;\r
344\r
345 default:\r
346 DEBUG ((\r
347 EFI_D_ERROR,\r
348 "Invalid EFI memory descriptor type (0x%x)!\n",\r
349 MemoryMap->Type\r
350 ));\r
351 continue;\r
352 }\r
353\r
354 if ((LastE820 != NULL) &&\r
355 (LastE820->type == (UINT32) E820Type) &&\r
356 (MemoryMap->PhysicalStart == LastEndAddr)) {\r
0086fca0
RN
357 LastE820->size += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
358 LastEndAddr += EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
3c0a051f 359 } else {\r
360 if (E820EntryCount >= (sizeof (Bp->e820_map) / sizeof (Bp->e820_map[0]))) {\r
361 break;\r
362 }\r
363 E820->type = (UINT32) E820Type;\r
364 E820->addr = MemoryMap->PhysicalStart;\r
0086fca0 365 E820->size = EFI_PAGES_TO_SIZE ((UINTN) MemoryMap->NumberOfPages);\r
3c0a051f 366 LastE820 = E820;\r
367 LastEndAddr = E820->addr + E820->size;\r
368 E820++;\r
369 E820EntryCount++;\r
370 }\r
371\r
372 //\r
373 // Get next item\r
374 //\r
375 MemoryMap = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryMap + DescriptorSize);\r
376 }\r
377 Bp->e820_entries = (UINT8) E820EntryCount;\r
378\r
379 Efi = &Bp->efi_info;\r
380 Efi->efi_systab = (UINT32)(UINTN) gST;\r
381 Efi->efi_memdesc_size = (UINT32) DescriptorSize;\r
382 Efi->efi_memdesc_version = DescriptorVersion;\r
383 Efi->efi_memmap = (UINT32)(UINTN) MemoryMapPtr;\r
384 Efi->efi_memmap_size = (UINT32) MemoryMapSize;\r
385#ifdef MDE_CPU_IA32\r
386 Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '3', '2');\r
387#else\r
c4046161
JJ
388 Efi->efi_systab_hi = (UINT32) (((UINT64)(UINTN) gST) >> 32);\r
389 Efi->efi_memmap_hi = (UINT32) (((UINT64)(UINTN) MemoryMapPtr) >> 32);\r
3c0a051f 390 Efi->efi_loader_signature = SIGNATURE_32 ('E', 'L', '6', '4');\r
391#endif\r
392\r
393 gBS->ExitBootServices (gImageHandle, MapKey);\r
394}\r
395\r
396\r
397EFI_STATUS\r
398EFIAPI\r
399LoadLinuxSetCommandLine (\r
400 IN OUT VOID *KernelSetup,\r
401 IN CHAR8 *CommandLine\r
402 )\r
403{\r
404 EFI_STATUS Status;\r
405 struct boot_params *Bp;\r
406\r
407 Status = BasicKernelSetupCheck (KernelSetup);\r
408 if (EFI_ERROR (Status)) {\r
409 return Status;\r
410 }\r
411\r
412 Bp = (struct boot_params*) KernelSetup;\r
413\r
414 Bp->hdr.cmd_line_ptr = (UINT32)(UINTN) CommandLine;\r
415\r
416 return EFI_SUCCESS;\r
417}\r
418\r
419\r
420EFI_STATUS\r
421EFIAPI\r
422LoadLinuxSetInitrd (\r
423 IN OUT VOID *KernelSetup,\r
424 IN VOID *Initrd,\r
425 IN UINTN InitrdSize\r
426 )\r
427{\r
428 EFI_STATUS Status;\r
429 struct boot_params *Bp;\r
430\r
431 Status = BasicKernelSetupCheck (KernelSetup);\r
432 if (EFI_ERROR (Status)) {\r
433 return Status;\r
434 }\r
435\r
436 Bp = (struct boot_params*) KernelSetup;\r
437\r
438 Bp->hdr.ramdisk_start = (UINT32)(UINTN) Initrd;\r
439 Bp->hdr.ramdisk_len = (UINT32) InitrdSize;\r
440\r
441 return EFI_SUCCESS;\r
442}\r
443\r
444\r
445STATIC VOID\r
446FindBits (\r
447 unsigned long Mask,\r
448 UINT8 *Pos,\r
449 UINT8 *Size\r
450 )\r
451{\r
452 UINT8 First, Len;\r
453\r
454 First = 0;\r
455 Len = 0;\r
456\r
457 if (Mask) {\r
458 while (!(Mask & 0x1)) {\r
459 Mask = Mask >> 1;\r
460 First++;\r
461 }\r
462\r
463 while (Mask & 0x1) {\r
464 Mask = Mask >> 1;\r
465 Len++;\r
466 }\r
467 }\r
468 *Pos = First;\r
469 *Size = Len;\r
470}\r
471\r
472\r
473STATIC\r
474EFI_STATUS\r
475SetupGraphicsFromGop (\r
476 struct screen_info *Si,\r
477 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop\r
478 )\r
479{\r
480 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
481 EFI_STATUS Status;\r
482 UINTN Size;\r
483\r
484 Status = Gop->QueryMode(Gop, Gop->Mode->Mode, &Size, &Info);\r
485 if (EFI_ERROR (Status)) {\r
486 return Status;\r
487 }\r
488\r
489 /* We found a GOP */\r
490\r
491 /* EFI framebuffer */\r
492 Si->orig_video_isVGA = 0x70;\r
493\r
494 Si->orig_x = 0;\r
495 Si->orig_y = 0;\r
496 Si->orig_video_page = 0;\r
497 Si->orig_video_mode = 0;\r
498 Si->orig_video_cols = 0;\r
499 Si->orig_video_lines = 0;\r
500 Si->orig_video_ega_bx = 0;\r
501 Si->orig_video_points = 0;\r
502\r
503 Si->lfb_base = (UINT32) Gop->Mode->FrameBufferBase;\r
504 Si->lfb_size = (UINT32) Gop->Mode->FrameBufferSize;\r
505 Si->lfb_width = (UINT16) Info->HorizontalResolution;\r
506 Si->lfb_height = (UINT16) Info->VerticalResolution;\r
507 Si->pages = 1;\r
508 Si->vesapm_seg = 0;\r
509 Si->vesapm_off = 0;\r
510\r
511 if (Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) {\r
512 Si->lfb_depth = 32;\r
513 Si->red_size = 8;\r
514 Si->red_pos = 0;\r
515 Si->green_size = 8;\r
516 Si->green_pos = 8;\r
517 Si->blue_size = 8;\r
518 Si->blue_pos = 16;\r
519 Si->rsvd_size = 8;\r
520 Si->rsvd_pos = 24;\r
521 Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);\r
522\r
523 } else if (Info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {\r
524 Si->lfb_depth = 32;\r
525 Si->red_size = 8;\r
526 Si->red_pos = 16;\r
527 Si->green_size = 8;\r
528 Si->green_pos = 8;\r
529 Si->blue_size = 8;\r
530 Si->blue_pos = 0;\r
531 Si->rsvd_size = 8;\r
532 Si->rsvd_pos = 24;\r
533 Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);\r
534 } else if (Info->PixelFormat == PixelBitMask) {\r
535 FindBits(Info->PixelInformation.RedMask,\r
536 &Si->red_pos, &Si->red_size);\r
537 FindBits(Info->PixelInformation.GreenMask,\r
538 &Si->green_pos, &Si->green_size);\r
539 FindBits(Info->PixelInformation.BlueMask,\r
540 &Si->blue_pos, &Si->blue_size);\r
541 FindBits(Info->PixelInformation.ReservedMask,\r
542 &Si->rsvd_pos, &Si->rsvd_size);\r
543 Si->lfb_depth = Si->red_size + Si->green_size +\r
544 Si->blue_size + Si->rsvd_size;\r
545 Si->lfb_linelength = (UINT16) ((Info->PixelsPerScanLine * Si->lfb_depth) / 8);\r
546 } else {\r
547 Si->lfb_depth = 4;\r
548 Si->red_size = 0;\r
549 Si->red_pos = 0;\r
550 Si->green_size = 0;\r
551 Si->green_pos = 0;\r
552 Si->blue_size = 0;\r
553 Si->blue_pos = 0;\r
554 Si->rsvd_size = 0;\r
555 Si->rsvd_pos = 0;\r
556 Si->lfb_linelength = Si->lfb_width / 2;\r
557 }\r
558\r
559 return Status;\r
560}\r
561\r
562\r
563STATIC\r
564EFI_STATUS\r
565SetupGraphics (\r
566 IN OUT struct boot_params *Bp\r
567 )\r
568{\r
569 EFI_STATUS Status;\r
570 EFI_HANDLE *HandleBuffer;\r
571 UINTN HandleCount;\r
572 UINTN Index;\r
573 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;\r
574\r
575 ZeroMem ((VOID*)&Bp->screen_info, sizeof(Bp->screen_info));\r
576\r
577 Status = gBS->LocateHandleBuffer (\r
578 ByProtocol,\r
579 &gEfiGraphicsOutputProtocolGuid,\r
580 NULL,\r
581 &HandleCount,\r
582 &HandleBuffer\r
583 );\r
584 if (!EFI_ERROR (Status)) {\r
585 for (Index = 0; Index < HandleCount; Index++) {\r
586 Status = gBS->HandleProtocol (\r
587 HandleBuffer[Index],\r
588 &gEfiGraphicsOutputProtocolGuid,\r
589 (VOID*) &Gop\r
590 );\r
591 if (EFI_ERROR (Status)) {\r
592 continue;\r
593 }\r
594\r
595 Status = SetupGraphicsFromGop (&Bp->screen_info, Gop);\r
596 if (!EFI_ERROR (Status)) {\r
597 FreePool (HandleBuffer);\r
598 return EFI_SUCCESS;\r
599 }\r
600 }\r
601\r
602 FreePool (HandleBuffer);\r
603 }\r
604\r
605 return EFI_NOT_FOUND;\r
606}\r
607\r
608\r
609STATIC\r
610EFI_STATUS\r
611SetupLinuxBootParams (\r
3c0a051f 612 IN OUT struct boot_params *Bp\r
613 )\r
614{\r
615 SetupGraphics (Bp);\r
616\r
3c0a051f 617 SetupLinuxMemmap (Bp);\r
618\r
619 return EFI_SUCCESS;\r
620}\r
621\r
622\r
623EFI_STATUS\r
624EFIAPI\r
625LoadLinux (\r
626 IN VOID *Kernel,\r
627 IN OUT VOID *KernelSetup\r
628 )\r
629{\r
630 EFI_STATUS Status;\r
631 struct boot_params *Bp;\r
632\r
633 Status = BasicKernelSetupCheck (KernelSetup);\r
634 if (EFI_ERROR (Status)) {\r
635 return Status;\r
636 }\r
637\r
638 Bp = (struct boot_params *) KernelSetup;\r
639\r
38851e78 640 if (Bp->hdr.version < 0x205 || !Bp->hdr.relocatable_kernel) {\r
3c0a051f 641 //\r
642 // We only support relocatable kernels\r
643 //\r
644 return EFI_UNSUPPORTED;\r
645 }\r
646\r
647 InitLinuxDescriptorTables ();\r
648\r
dd71f6e2 649 Bp->hdr.code32_start = (UINT32)(UINTN) Kernel;\r
650 if (Bp->hdr.version >= 0x20c && Bp->hdr.handover_offset &&\r
b1362258 651 (Bp->hdr.xloadflags & (sizeof (UINTN) == 4 ? BIT2 : BIT3))) {\r
dd71f6e2 652 DEBUG ((EFI_D_INFO, "Jumping to kernel EFI handover point at ofs %x\n", Bp->hdr.handover_offset));\r
653\r
654 DisableInterrupts ();\r
655 JumpToUefiKernel ((VOID*) gImageHandle, (VOID*) gST, KernelSetup, Kernel);\r
656 }\r
657\r
658 //\r
659 // Old kernels without EFI handover protocol\r
660 //\r
661 SetupLinuxBootParams (KernelSetup);\r
3c0a051f 662\r
663 DEBUG ((EFI_D_INFO, "Jumping to kernel\n"));\r
664 DisableInterrupts ();\r
665 SetLinuxDescriptorTables ();\r
666 JumpToKernel (Kernel, (VOID*) KernelSetup);\r
667\r
668 return EFI_SUCCESS;\r
669}\r
670\r