Display error message when HOB creation fails due to lack of memory.
[people/mcb30/edk2.git] / edk2 / EdkModulePkg / Core / Pei / Hob / Hob.c
1 /*++\r
2 \r
3 Copyright (c) 2006, Intel Corporation                                                         \r
4 All rights reserved. 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 Module Name:\r
13 \r
14   Hob.c\r
15 \r
16 Abstract:\r
17 \r
18   EFI PEI Core HOB services\r
19 \r
20 --*/\r
21 \r
22 #include <PeiMain.h>\r
23 \r
24 EFI_STATUS\r
25 EFIAPI\r
26 PeiGetHobList (\r
27   IN EFI_PEI_SERVICES  **PeiServices,\r
28   IN OUT VOID          **HobList\r
29   )\r
30 /*++\r
31 \r
32 Routine Description:\r
33 \r
34   Gets the pointer to the HOB List.\r
35 \r
36 Arguments:\r
37 \r
38   PeiServices - The PEI core services table.\r
39   HobList     - Pointer to the HOB List.\r
40 \r
41 Returns:\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
71 EFI_STATUS\r
72 EFIAPI\r
73 PeiCreateHob (\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
81 Routine Description:\r
82 \r
83   Add a new HOB to the HOB List.\r
84 \r
85 Arguments:\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
92 Returns:\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
145 EFI_STATUS\r
146 PeiCoreBuildHobHandoffInfoTable (\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
153 Routine Description:\r
154 \r
155   Builds a Handoff Information Table HOB\r
156 \r
157 Arguments:\r
158 \r
159   BootMode      - Current Bootmode\r
160   MemoryBegin   - Start Memory Address.\r
161   MemoryLength  - Length of Memory.\r
162 \r
163 Returns:\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