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