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