]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
OvmfPkg/PlatformBootManagerLib: rejuvenate old-style function comments
[mirror_edk2.git] / OvmfPkg / Library / PlatformBootManagerLib / QemuKernel.c
CommitLineData
30541881
RN
1/** @file\r
2\r
3 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
4 This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution. The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include <Uefi.h>\r
15\r
16#include <Library/BaseLib.h>\r
17#include <Library/DebugLib.h>\r
18#include <Library/LoadLinuxLib.h>\r
19#include <Library/MemoryAllocationLib.h>\r
20#include <Library/QemuFwCfgLib.h>\r
21#include <Library/UefiBootServicesTableLib.h>\r
22#include <Library/UefiLib.h>\r
23\r
24\r
25EFI_STATUS\r
26TryRunningQemuKernel (\r
27 VOID\r
28 )\r
29{\r
30 EFI_STATUS Status;\r
31 UINTN KernelSize;\r
32 UINTN KernelInitialSize;\r
33 VOID *KernelBuf;\r
34 UINTN SetupSize;\r
35 VOID *SetupBuf;\r
36 UINTN CommandLineSize;\r
37 CHAR8 *CommandLine;\r
38 UINTN InitrdSize;\r
39 VOID* InitrdData;\r
40\r
41 SetupBuf = NULL;\r
42 SetupSize = 0;\r
43 KernelBuf = NULL;\r
44 KernelInitialSize = 0;\r
45 CommandLine = NULL;\r
46 CommandLineSize = 0;\r
47 InitrdData = NULL;\r
48 InitrdSize = 0;\r
49\r
50 if (!QemuFwCfgIsAvailable ()) {\r
51 return EFI_NOT_FOUND;\r
52 }\r
53\r
54 QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);\r
55 KernelSize = (UINTN) QemuFwCfgRead64 ();\r
56\r
57 QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);\r
58 SetupSize = (UINTN) QemuFwCfgRead64 ();\r
59\r
60 if (KernelSize == 0 || SetupSize == 0) {\r
61 DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n"));\r
62 return EFI_NOT_FOUND;\r
63 }\r
64\r
65 SetupBuf = LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES (SetupSize));\r
66 if (SetupBuf == NULL) {\r
67 DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel setup!\n"));\r
68 return EFI_OUT_OF_RESOURCES;\r
69 }\r
70\r
71 DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize));\r
72 DEBUG ((EFI_D_INFO, "Reading kernel setup image ..."));\r
73 QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData);\r
74 QemuFwCfgReadBytes (SetupSize, SetupBuf);\r
75 DEBUG ((EFI_D_INFO, " [done]\n"));\r
76\r
77 Status = LoadLinuxCheckKernelSetup (SetupBuf, SetupSize);\r
78 if (EFI_ERROR (Status)) {\r
79 goto FreeAndReturn;\r
80 }\r
81\r
82 Status = LoadLinuxInitializeKernelSetup (SetupBuf);\r
83 if (EFI_ERROR (Status)) {\r
84 goto FreeAndReturn;\r
85 }\r
86\r
87 KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);\r
88 if (KernelInitialSize == 0) {\r
89 Status = EFI_UNSUPPORTED;\r
90 goto FreeAndReturn;\r
91 }\r
92\r
93 KernelBuf = LoadLinuxAllocateKernelPages (\r
94 SetupBuf,\r
95 EFI_SIZE_TO_PAGES (KernelInitialSize));\r
96 if (KernelBuf == NULL) {\r
97 DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n"));\r
98 Status = EFI_OUT_OF_RESOURCES;\r
99 goto FreeAndReturn;\r
100 }\r
101\r
102 DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize));\r
103 DEBUG ((EFI_D_INFO, "Reading kernel image ..."));\r
104 QemuFwCfgSelectItem (QemuFwCfgItemKernelData);\r
105 QemuFwCfgReadBytes (KernelSize, KernelBuf);\r
106 DEBUG ((EFI_D_INFO, " [done]\n"));\r
107\r
108 QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize);\r
109 CommandLineSize = (UINTN) QemuFwCfgRead64 ();\r
110\r
111 if (CommandLineSize > 0) {\r
112 CommandLine = LoadLinuxAllocateCommandLinePages (\r
113 EFI_SIZE_TO_PAGES (CommandLineSize));\r
114 QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);\r
115 QemuFwCfgReadBytes (CommandLineSize, CommandLine);\r
116 } else {\r
117 CommandLine = NULL;\r
118 }\r
119\r
120 Status = LoadLinuxSetCommandLine (SetupBuf, CommandLine);\r
121 if (EFI_ERROR (Status)) {\r
122 goto FreeAndReturn;\r
123 }\r
124\r
125 QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);\r
126 InitrdSize = (UINTN) QemuFwCfgRead64 ();\r
127\r
128 if (InitrdSize > 0) {\r
129 InitrdData = LoadLinuxAllocateInitrdPages (\r
130 SetupBuf,\r
131 EFI_SIZE_TO_PAGES (InitrdSize)\r
132 );\r
133 DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize));\r
134 DEBUG ((EFI_D_INFO, "Reading initrd image ..."));\r
135 QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);\r
136 QemuFwCfgReadBytes (InitrdSize, InitrdData);\r
137 DEBUG ((EFI_D_INFO, " [done]\n"));\r
138 } else {\r
139 InitrdData = NULL;\r
140 }\r
141\r
142 Status = LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize);\r
143 if (EFI_ERROR (Status)) {\r
144 goto FreeAndReturn;\r
145 }\r
146\r
147 //\r
148 // Signal the EVT_SIGNAL_READY_TO_BOOT event\r
149 //\r
150 EfiSignalEventReadyToBoot();\r
151\r
152 Status = LoadLinux (KernelBuf, SetupBuf);\r
153\r
154FreeAndReturn:\r
155 if (SetupBuf != NULL) {\r
156 FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize));\r
157 }\r
158 if (KernelBuf != NULL) {\r
159 FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize));\r
160 }\r
161 if (CommandLine != NULL) {\r
162 FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize));\r
163 }\r
164 if (InitrdData != NULL) {\r
165 FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize));\r
166 }\r
167\r
168 return Status;\r
169}\r
170\r