]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
SecurityPkg:Tcg: Fix comment typos
[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
0a0566d5 21#include <Library/ReportStatusCodeLib.h>\r
30541881
RN
22#include <Library/UefiBootServicesTableLib.h>\r
23#include <Library/UefiLib.h>\r
24\r
25\r
26EFI_STATUS\r
27TryRunningQemuKernel (\r
28 VOID\r
29 )\r
30{\r
31 EFI_STATUS Status;\r
32 UINTN KernelSize;\r
33 UINTN KernelInitialSize;\r
34 VOID *KernelBuf;\r
35 UINTN SetupSize;\r
36 VOID *SetupBuf;\r
37 UINTN CommandLineSize;\r
38 CHAR8 *CommandLine;\r
39 UINTN InitrdSize;\r
40 VOID* InitrdData;\r
41\r
42 SetupBuf = NULL;\r
43 SetupSize = 0;\r
44 KernelBuf = NULL;\r
45 KernelInitialSize = 0;\r
46 CommandLine = NULL;\r
47 CommandLineSize = 0;\r
48 InitrdData = NULL;\r
49 InitrdSize = 0;\r
50\r
51 if (!QemuFwCfgIsAvailable ()) {\r
52 return EFI_NOT_FOUND;\r
53 }\r
54\r
55 QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);\r
56 KernelSize = (UINTN) QemuFwCfgRead64 ();\r
57\r
58 QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);\r
59 SetupSize = (UINTN) QemuFwCfgRead64 ();\r
60\r
61 if (KernelSize == 0 || SetupSize == 0) {\r
62 DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n"));\r
63 return EFI_NOT_FOUND;\r
64 }\r
65\r
66 SetupBuf = LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES (SetupSize));\r
67 if (SetupBuf == NULL) {\r
68 DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel setup!\n"));\r
69 return EFI_OUT_OF_RESOURCES;\r
70 }\r
71\r
72 DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize));\r
73 DEBUG ((EFI_D_INFO, "Reading kernel setup image ..."));\r
74 QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData);\r
75 QemuFwCfgReadBytes (SetupSize, SetupBuf);\r
76 DEBUG ((EFI_D_INFO, " [done]\n"));\r
77\r
78 Status = LoadLinuxCheckKernelSetup (SetupBuf, SetupSize);\r
79 if (EFI_ERROR (Status)) {\r
80 goto FreeAndReturn;\r
81 }\r
82\r
83 Status = LoadLinuxInitializeKernelSetup (SetupBuf);\r
84 if (EFI_ERROR (Status)) {\r
85 goto FreeAndReturn;\r
86 }\r
87\r
88 KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);\r
89 if (KernelInitialSize == 0) {\r
90 Status = EFI_UNSUPPORTED;\r
91 goto FreeAndReturn;\r
92 }\r
93\r
94 KernelBuf = LoadLinuxAllocateKernelPages (\r
95 SetupBuf,\r
96 EFI_SIZE_TO_PAGES (KernelInitialSize));\r
97 if (KernelBuf == NULL) {\r
98 DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n"));\r
99 Status = EFI_OUT_OF_RESOURCES;\r
100 goto FreeAndReturn;\r
101 }\r
102\r
103 DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize));\r
104 DEBUG ((EFI_D_INFO, "Reading kernel image ..."));\r
105 QemuFwCfgSelectItem (QemuFwCfgItemKernelData);\r
106 QemuFwCfgReadBytes (KernelSize, KernelBuf);\r
107 DEBUG ((EFI_D_INFO, " [done]\n"));\r
108\r
109 QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize);\r
110 CommandLineSize = (UINTN) QemuFwCfgRead64 ();\r
111\r
112 if (CommandLineSize > 0) {\r
113 CommandLine = LoadLinuxAllocateCommandLinePages (\r
114 EFI_SIZE_TO_PAGES (CommandLineSize));\r
115 QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);\r
116 QemuFwCfgReadBytes (CommandLineSize, CommandLine);\r
117 } else {\r
118 CommandLine = NULL;\r
119 }\r
120\r
121 Status = LoadLinuxSetCommandLine (SetupBuf, CommandLine);\r
122 if (EFI_ERROR (Status)) {\r
123 goto FreeAndReturn;\r
124 }\r
125\r
126 QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);\r
127 InitrdSize = (UINTN) QemuFwCfgRead64 ();\r
128\r
129 if (InitrdSize > 0) {\r
130 InitrdData = LoadLinuxAllocateInitrdPages (\r
131 SetupBuf,\r
132 EFI_SIZE_TO_PAGES (InitrdSize)\r
133 );\r
134 DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize));\r
135 DEBUG ((EFI_D_INFO, "Reading initrd image ..."));\r
136 QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);\r
137 QemuFwCfgReadBytes (InitrdSize, InitrdData);\r
138 DEBUG ((EFI_D_INFO, " [done]\n"));\r
139 } else {\r
140 InitrdData = NULL;\r
141 }\r
142\r
143 Status = LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize);\r
144 if (EFI_ERROR (Status)) {\r
145 goto FreeAndReturn;\r
146 }\r
147\r
148 //\r
149 // Signal the EVT_SIGNAL_READY_TO_BOOT event\r
150 //\r
151 EfiSignalEventReadyToBoot();\r
152\r
0a0566d5
AB
153 REPORT_STATUS_CODE (EFI_PROGRESS_CODE,\r
154 (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));\r
155\r
30541881
RN
156 Status = LoadLinux (KernelBuf, SetupBuf);\r
157\r
158FreeAndReturn:\r
159 if (SetupBuf != NULL) {\r
160 FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize));\r
161 }\r
162 if (KernelBuf != NULL) {\r
163 FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize));\r
164 }\r
165 if (CommandLine != NULL) {\r
166 FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize));\r
167 }\r
168 if (InitrdData != NULL) {\r
169 FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize));\r
170 }\r
171\r
172 return Status;\r
173}\r
174\r