]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/BdsLib/BdsHelper.c
Sync up ArmPkg with patch from mailing list. Changed name of BdsLib.h to BdsUnixLib...
[mirror_edk2.git] / ArmPkg / Library / BdsLib / BdsHelper.c
CommitLineData
1bfda055 1/** @file\r
2*\r
3* Copyright (c) 2011, ARM Limited. All rights reserved.\r
4* \r
5* This program and the accompanying materials \r
6* are licensed and made available under the terms and conditions of the BSD License \r
7* which accompanies this distribution. The full text of the license may be found at \r
8* http://opensource.org/licenses/bsd-license.php \r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12*\r
13**/\r
14\r
15#include "BdsInternal.h"\r
16\r
17#include <Library/DxeServicesTableLib.h>\r
18#include <Library/HobLib.h>\r
19\r
20EFI_STATUS\r
21ShutdownUefiBootServices( VOID )\r
22{\r
23 EFI_STATUS Status;\r
24 UINTN MemoryMapSize;\r
25 EFI_MEMORY_DESCRIPTOR *MemoryMap;\r
26 UINTN MapKey;\r
27 UINTN DescriptorSize;\r
28 UINT32 DescriptorVersion;\r
29 UINTN Pages;\r
30\r
31 MemoryMap = NULL;\r
32 MemoryMapSize = 0;\r
33 do {\r
34 Status = gBS->GetMemoryMap (\r
35 &MemoryMapSize,\r
36 MemoryMap,\r
37 &MapKey,\r
38 &DescriptorSize,\r
39 &DescriptorVersion\r
40 );\r
41 if (Status == EFI_BUFFER_TOO_SMALL) {\r
42\r
43 Pages = EFI_SIZE_TO_PAGES (MemoryMapSize) + 1;\r
44 MemoryMap = AllocatePages (Pages);\r
45\r
46 //\r
47 // Get System MemoryMap\r
48 //\r
49 Status = gBS->GetMemoryMap (\r
50 &MemoryMapSize,\r
51 MemoryMap,\r
52 &MapKey,\r
53 &DescriptorSize,\r
54 &DescriptorVersion\r
55 );\r
56 // Don't do anything between the GetMemoryMap() and ExitBootServices()\r
57 if (!EFI_ERROR (Status)) {\r
58 Status = gBS->ExitBootServices (gImageHandle, MapKey);\r
59 if (EFI_ERROR (Status)) {\r
60 FreePages (MemoryMap, Pages);\r
61 MemoryMap = NULL;\r
62 MemoryMapSize = 0;\r
63 }\r
64 }\r
65 }\r
66 } while (EFI_ERROR (Status));\r
67\r
68 return Status;\r
69}\r
70\r
71EFI_STATUS\r
72BdsConnectAllDrivers( VOID ) {\r
73 UINTN HandleCount, Index;\r
74 EFI_HANDLE *HandleBuffer;\r
75 EFI_STATUS Status;\r
76\r
77 do {\r
78 // Locate all the driver handles\r
79 Status = gBS->LocateHandleBuffer (\r
80 AllHandles,\r
81 NULL,\r
82 NULL,\r
83 &HandleCount,\r
84 &HandleBuffer\r
85 );\r
86 if (EFI_ERROR (Status)) {\r
87 break;\r
88 }\r
89\r
90 // Connect every handles\r
91 for (Index = 0; Index < HandleCount; Index++) {\r
92 gBS->ConnectController(HandleBuffer[Index], NULL, NULL, TRUE);\r
93 }\r
94\r
95 if (HandleBuffer != NULL) {\r
96 FreePool (HandleBuffer);\r
97 }\r
98 \r
99 // Check if new handles have been created after the start of the previous handles\r
100 Status = gDS->Dispatch ();\r
101 } while (!EFI_ERROR(Status));\r
102\r
103 return EFI_SUCCESS;\r
104}\r
105\r
106STATIC EFI_STATUS InsertSystemMemoryResources(LIST_ENTRY *ResourceList, EFI_HOB_RESOURCE_DESCRIPTOR *ResHob) {\r
107 BDS_SYSTEM_MEMORY_RESOURCE NewResource;\r
108 LIST_ENTRY *Link;\r
109 BDS_SYSTEM_MEMORY_RESOURCE *Resource;\r
110\r
111 //DEBUG ((EFI_D_ERROR, "** InsertSystemMemoryResources(0x%X,0x%X)\n",(UINT32)ResHob->PhysicalStart,(UINT32)ResHob->ResourceLength));\r
112\r
113 if (IsListEmpty (ResourceList)) {\r
114 ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
115 NewResource.PhysicalStart = ResHob->PhysicalStart;\r
116 NewResource.ResourceLength = ResHob->ResourceLength;\r
117 InsertTailList (ResourceList, &NewResource.Link);\r
118 return EFI_SUCCESS;\r
119 }\r
120\r
121 //for (Link = GetFirstNode (ResourceList); !IsNull (ResourceList,Link); Link = GetNextNode (ResourceList,Link)) {\r
122 Link = ResourceList->ForwardLink;\r
123 while (Link != NULL && Link != ResourceList) {\r
124 Resource = (BDS_SYSTEM_MEMORY_RESOURCE*)Link;\r
125 //DEBUG ((EFI_D_ERROR, " - (0x%X,0x%X)\n",(UINT32)Resource->PhysicalStart,(UINT32)Resource->ResourceLength));\r
126\r
127 // Sanity Check. The resources should not overlapped.\r
128 ASSERT(!((ResHob->PhysicalStart >= Resource->PhysicalStart) && (ResHob->PhysicalStart < (Resource->PhysicalStart + Resource->ResourceLength))));\r
129 ASSERT(!((ResHob->PhysicalStart + ResHob->ResourceLength >= Resource->PhysicalStart) &&\r
130 ((ResHob->PhysicalStart + ResHob->ResourceLength) < (Resource->PhysicalStart + Resource->ResourceLength))));\r
131\r
132 // The new resource is attached after this resource descriptor\r
133 if (ResHob->PhysicalStart == Resource->PhysicalStart + Resource->ResourceLength) {\r
134 Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
135 //DEBUG ((EFI_D_ERROR, "** Attached new Length:0x%X\n",(UINT32)Resource->ResourceLength));\r
136 return EFI_SUCCESS;\r
137 }\r
138 // The new resource is attached before this resource descriptor\r
139 else if (ResHob->PhysicalStart + ResHob->ResourceLength == Resource->PhysicalStart) {\r
140 Resource->PhysicalStart = ResHob->PhysicalStart;\r
141 Resource->ResourceLength = Resource->ResourceLength + ResHob->ResourceLength;\r
142 //DEBUG ((EFI_D_ERROR, "** Attached2 new Length:0x%X\n",(UINT32)Resource->ResourceLength));\r
143 return EFI_SUCCESS;\r
144 }\r
145 Link = Link->ForwardLink;\r
146 }\r
147\r
148 // None of the Resource of the list is attached to this ResHob. Create a new entry for it\r
149 ZeroMem(&NewResource,sizeof(BDS_SYSTEM_MEMORY_RESOURCE));\r
150 NewResource.PhysicalStart = ResHob->PhysicalStart;\r
151 NewResource.ResourceLength = ResHob->ResourceLength;\r
152 InsertTailList (ResourceList, &NewResource.Link);\r
153 return EFI_SUCCESS;\r
154}\r
155\r
156EFI_STATUS GetSystemMemoryResources(LIST_ENTRY *ResourceList) {\r
157 EFI_HOB_RESOURCE_DESCRIPTOR *ResHob;\r
158\r
159 InitializeListHead (ResourceList);\r
160 \r
161 // Find the first System Memory Resource Descriptor\r
162 ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetFirstHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR);\r
163 while ((ResHob != NULL) && (ResHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY)) {\r
164 ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
165 }\r
166\r
167 // Did not find any\r
168 if (ResHob == NULL) {\r
169 return EFI_NOT_FOUND;\r
170 } else {\r
171 InsertSystemMemoryResources(ResourceList, ResHob);\r
172 }\r
173\r
174 ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
175 while (ResHob != NULL) {\r
176 if (ResHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
177 InsertSystemMemoryResources(ResourceList, ResHob);\r
178 }\r
179 ResHob = (EFI_HOB_RESOURCE_DESCRIPTOR *)GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,(VOID *)((UINTN)ResHob + ResHob->Header.HobLength)); \r
180 }\r
181\r
182 return EFI_SUCCESS;\r
183}\r