]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Core/Pei/Hob/Hob.c
Removed CommonHeader.h from MdePkg & MdeModulePkg
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Hob / Hob.c
CommitLineData
192f6d4c 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 Hob.c\r
15\r
16Abstract:\r
17\r
18 EFI PEI Core HOB services\r
19\r
20--*/\r
21\r
192f6d4c 22#include <PeiMain.h>\r
23\r
24EFI_STATUS\r
25EFIAPI\r
26PeiGetHobList (\r
27 IN EFI_PEI_SERVICES **PeiServices,\r
28 IN OUT VOID **HobList\r
29 )\r
30/*++\r
31\r
32Routine Description:\r
33\r
34 Gets the pointer to the HOB List.\r
35\r
36Arguments:\r
37\r
38 PeiServices - The PEI core services table.\r
39 HobList - Pointer to the HOB List.\r
40\r
41Returns:\r
42\r
43 EFI_SUCCESS - Get the pointer of HOB List\r
44 EFI_NOT_AVAILABLE_YET - the HOB List is not yet published\r
45 EFI_INVALID_PARAMETER - HobList is NULL (in debug mode)\r
46 \r
47--*/\r
48{\r
49 PEI_CORE_INSTANCE *PrivateData;\r
50\r
51 \r
52 //\r
53 // Only check this parameter in debug mode\r
54 //\r
55 \r
56 DEBUG_CODE_BEGIN (); \r
57 if (HobList == NULL) {\r
58 return EFI_INVALID_PARAMETER;\r
59 }\r
60 DEBUG_CODE_END ();\r
61 \r
62 PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
63\r
64 *HobList = PrivateData->HobList.Raw;\r
65\r
66\r
67 return EFI_SUCCESS; \r
68}\r
69\r
70\r
71EFI_STATUS\r
72EFIAPI\r
73PeiCreateHob (\r
74 IN EFI_PEI_SERVICES **PeiServices,\r
75 IN UINT16 Type,\r
76 IN UINT16 Length,\r
77 IN OUT VOID **Hob\r
78 )\r
79/*++\r
80\r
81Routine Description:\r
82\r
83 Add a new HOB to the HOB List.\r
84\r
85Arguments:\r
86\r
87 PeiServices - The PEI core services table.\r
88 Type - Type of the new HOB.\r
89 Length - Length of the new HOB to allocate.\r
90 Hob - Pointer to the new HOB.\r
91\r
92Returns:\r
93\r
94 Status - EFI_SUCCESS\r
95 - EFI_INVALID_PARAMETER if Hob is NULL\r
96 - EFI_NOT_AVAILABLE_YET if HobList is still not available.\r
97 - EFI_OUT_OF_RESOURCES if there is no more memory to grow the Hoblist.\r
98 \r
99--*/\r
100{\r
101 EFI_STATUS Status;\r
102 EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;\r
103 EFI_HOB_GENERIC_HEADER *HobEnd;\r
104 EFI_PHYSICAL_ADDRESS FreeMemory;\r
105\r
106\r
107 Status = PeiGetHobList (PeiServices, Hob);\r
108 if (EFI_ERROR(Status)) {\r
109 return Status;\r
110 }\r
111\r
112 HandOffHob = *Hob;\r
113\r
114 Length = (UINT16)((Length + 0x7) & (~0x7));\r
115\r
116 FreeMemory = HandOffHob->EfiFreeMemoryTop -\r
117 HandOffHob->EfiFreeMemoryBottom;\r
118\r
119 if (FreeMemory < Length) {\r
120 DEBUG ((EFI_D_ERROR, "PeiCreateHob fail: Length - 0x%08x\n", (UINTN)Length));\r
121 DEBUG ((EFI_D_ERROR, " FreeMemoryTop - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryTop));\r
122 DEBUG ((EFI_D_ERROR, " FreeMemoryBottom - 0x%08x\n", (UINTN)HandOffHob->EfiFreeMemoryBottom));\r
123 return EFI_OUT_OF_RESOURCES;\r
124 }\r
125 \r
126 *Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;\r
127 ((EFI_HOB_GENERIC_HEADER*) *Hob)->HobType = Type;\r
128 ((EFI_HOB_GENERIC_HEADER*) *Hob)->HobLength = Length;\r
129 ((EFI_HOB_GENERIC_HEADER*) *Hob)->Reserved = 0;\r
130\r
131 HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN) *Hob + Length);\r
132 HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
133 \r
134 HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
135 HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
136 HobEnd->Reserved = 0;\r
137 HobEnd++;\r
138 HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
139\r
140\r
141 return EFI_SUCCESS; \r
142}\r
143\r
144\r
145EFI_STATUS\r
146PeiCoreBuildHobHandoffInfoTable (\r
147 IN EFI_BOOT_MODE BootMode,\r
148 IN EFI_PHYSICAL_ADDRESS MemoryBegin,\r
149 IN UINT64 MemoryLength\r
150 )\r
151/*++\r
152\r
153Routine Description:\r
154\r
155 Builds a Handoff Information Table HOB\r
156\r
157Arguments:\r
158\r
159 BootMode - Current Bootmode\r
160 MemoryBegin - Start Memory Address.\r
161 MemoryLength - Length of Memory.\r
162\r
163Returns:\r
164\r
165 EFI_SUCCESS\r
166\r
167--*/\r
168{\r
169 EFI_HOB_HANDOFF_INFO_TABLE *Hob;\r
170 EFI_HOB_GENERIC_HEADER *HobEnd;\r
171\r
172 Hob = (VOID *)(UINTN)MemoryBegin;\r
173 HobEnd = (EFI_HOB_GENERIC_HEADER*) (Hob+1);\r
174 Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;\r
175 Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);\r
176 Hob->Header.Reserved = 0;\r
177 \r
178 HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
179 HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
180 HobEnd->Reserved = 0;\r
181\r
182 Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;\r
183 Hob->BootMode = BootMode;\r
184 \r
185 Hob->EfiMemoryTop = MemoryBegin + MemoryLength;\r
186 Hob->EfiMemoryBottom = MemoryBegin;\r
187 Hob->EfiFreeMemoryTop = MemoryBegin + MemoryLength;\r
188 Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) (HobEnd+1);\r
189 Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
190\r
191 return EFI_SUCCESS;\r
192}\r