]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/FileSystem/BootMonFs/BootMonFsImages.c
ArmPlatformPkg: remove ArmPlatformSysConfigLib library class
[mirror_edk2.git] / ArmPlatformPkg / FileSystem / BootMonFs / BootMonFsImages.c
CommitLineData
94e0955d
OM
1/** @file\r
2*\r
3* Copyright (c) 2012-2014, 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 <Library/IoLib.h>\r
16#include <Library/NorFlashPlatformLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/MemoryAllocationLib.h>\r
19\r
20#include <Protocol/SimpleFileSystem.h>\r
21\r
22#include "BootMonFsInternal.h"\r
23\r
24UINT32\r
25BootMonFsChecksum (\r
26 IN VOID *Data,\r
27 IN UINT32 Size\r
28 )\r
29{\r
30 UINT32 *Ptr;\r
31 UINT32 Word;\r
32 UINT32 Checksum;\r
33\r
34 ASSERT (Size % 4 == 0);\r
35\r
36 Checksum = 0;\r
37 Ptr = (UINT32*)Data;\r
38\r
39 while (Size > 0) {\r
40 Word = *Ptr++;\r
41 Size -= 4;\r
42\r
43 if (Word > ~Checksum) {\r
44 Checksum++;\r
45 }\r
46\r
47 Checksum += Word;\r
48 }\r
49\r
50 return ~Checksum;\r
51}\r
52\r
53EFI_STATUS\r
54BootMonFsComputeFooterChecksum (\r
55 IN OUT HW_IMAGE_DESCRIPTION *Footer\r
56 )\r
57{\r
58 HW_IMAGE_DESCRIPTION *Description;\r
59 UINT32 Index;\r
60\r
61 Footer->Attributes = 1;\r
62\r
63 Description = AllocateZeroPool (sizeof (HW_IMAGE_DESCRIPTION));\r
64 if (Description == NULL) {\r
65 DEBUG ((DEBUG_ERROR, "BootMonFsComputeFooterChecksum: Unable to allocate memory.\n"));\r
66 return EFI_OUT_OF_RESOURCES;\r
67 }\r
68\r
69 // Copy over to temporary shim\r
70 CopyMem (Description, Footer, sizeof (HW_IMAGE_DESCRIPTION));\r
71\r
72 // BootMon doesn't checksum the previous checksum\r
73 Description->FooterChecksum = 0;\r
74\r
75 // Blank out regions which aren't being used.\r
76 for (Index = Footer->RegionCount; Index < HW_IMAGE_DESCRIPTION_REGION_MAX; Index++) {\r
77 Description->Region[Index].Checksum = 0;\r
78 Description->Region[Index].LoadAddress = 0;\r
79 Description->Region[Index].Offset = 0;\r
80 Description->Region[Index].Size = 0;\r
81 }\r
82\r
83 // Compute the checksum\r
84 Footer->FooterChecksum = BootMonFsChecksum (Description, sizeof (HW_IMAGE_DESCRIPTION));\r
85\r
86 FreePool (Description);\r
87\r
88 return EFI_SUCCESS;\r
89}\r
90\r
91BOOLEAN\r
a9185e76
BJ
92BootMonFsIsImageValid (\r
93 IN HW_IMAGE_DESCRIPTION *Desc,\r
94 IN EFI_LBA Lba\r
94e0955d
OM
95 )\r
96{\r
97 EFI_STATUS Status;\r
a9185e76 98 HW_IMAGE_FOOTER *Footer;\r
94e0955d
OM
99 UINT32 Checksum;\r
100\r
a9185e76 101 Footer = &Desc->Footer;\r
94e0955d
OM
102\r
103 // Check that the verification bytes are present\r
a9185e76
BJ
104 if ((Footer->FooterSignature1 != HW_IMAGE_FOOTER_SIGNATURE_1) ||\r
105 (Footer->FooterSignature2 != HW_IMAGE_FOOTER_SIGNATURE_2)) {\r
94e0955d
OM
106 return FALSE;\r
107 }\r
108\r
a9185e76
BJ
109 if (Footer->Version == HW_IMAGE_FOOTER_VERSION) {\r
110 if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET) {\r
cb77b48a
OM
111 return FALSE;\r
112 }\r
a9185e76
BJ
113 } else if (Footer->Version == HW_IMAGE_FOOTER_VERSION2) {\r
114 if (Footer->Offset != HW_IMAGE_FOOTER_OFFSET2) {\r
cb77b48a
OM
115 return FALSE;\r
116 }\r
117 } else {\r
94e0955d
OM
118 return FALSE;\r
119 }\r
120\r
a9185e76
BJ
121 Checksum = Desc->FooterChecksum;\r
122 Status = BootMonFsComputeFooterChecksum (Desc);\r
94e0955d 123 if (EFI_ERROR (Status)) {\r
a9185e76 124 DEBUG ((DEBUG_ERROR, "Warning: failed to compute checksum for image '%a'\n", Desc->Footer.Filename));\r
94e0955d
OM
125 }\r
126\r
a9185e76
BJ
127 if (Desc->FooterChecksum != Checksum) {\r
128 DEBUG ((DEBUG_ERROR, "Warning: image '%a' checksum mismatch.\n", Desc->Footer.Filename));\r
94e0955d
OM
129 }\r
130\r
a9185e76 131 if ((Desc->BlockEnd != Lba) || (Desc->BlockStart > Desc->BlockEnd)) {\r
94e0955d
OM
132 return FALSE;\r
133 }\r
134\r
94e0955d
OM
135 return TRUE;\r
136}\r
137\r
79e12331 138STATIC\r
94e0955d
OM
139EFI_STATUS\r
140BootMonFsDiscoverNextImage (\r
79e12331
BJ
141 IN BOOTMON_FS_INSTANCE *Instance,\r
142 IN OUT EFI_LBA *LbaStart,\r
143 IN OUT BOOTMON_FS_FILE *File\r
94e0955d
OM
144 )\r
145{\r
a9185e76 146 EFI_DISK_IO_PROTOCOL *DiskIo;\r
94e0955d 147 EFI_LBA CurrentLba;\r
a9185e76
BJ
148 UINT64 DescOffset;\r
149 EFI_STATUS Status;\r
94e0955d 150\r
a9185e76 151 DiskIo = Instance->DiskIo;\r
94e0955d 152\r
94e0955d
OM
153 CurrentLba = *LbaStart;\r
154\r
155 // Look for images in the rest of this block\r
156 while (CurrentLba <= Instance->Media->LastBlock) {\r
a9185e76
BJ
157 // Work out the byte offset into media of the image description in this block\r
158 // If present, the image description is at the very end of the block.\r
159 DescOffset = ((CurrentLba + 1) * Instance->Media->BlockSize) - sizeof (HW_IMAGE_DESCRIPTION);\r
160\r
161 // Read the image description from media\r
162 Status = DiskIo->ReadDisk (DiskIo,\r
163 Instance->Media->MediaId,\r
164 DescOffset,\r
165 sizeof (HW_IMAGE_DESCRIPTION),\r
79e12331 166 &File->HwDescription\r
a9185e76
BJ
167 );\r
168 if (EFI_ERROR (Status)) {\r
169 return Status;\r
170 }\r
171\r
172 // If we found a valid image description...\r
79e12331
BJ
173 if (BootMonFsIsImageValid (&File->HwDescription, (CurrentLba - Instance->Media->LowestAlignedLba))) {\r
174 DEBUG ((EFI_D_ERROR, "Found image: %a in block %d.\n",\r
175 &(File->HwDescription.Footer.Filename),\r
176 (UINTN)(CurrentLba - Instance->Media->LowestAlignedLba)\r
177 ));\r
178 File->HwDescAddress = DescOffset;\r
179\r
180 *LbaStart = CurrentLba + 1;\r
94e0955d
OM
181 return EFI_SUCCESS;\r
182 } else {\r
183 CurrentLba++;\r
184 }\r
185 }\r
186\r
187 *LbaStart = CurrentLba;\r
94e0955d
OM
188 return EFI_NOT_FOUND;\r
189}\r
190\r
191EFI_STATUS\r
192BootMonFsInitialize (\r
193 IN BOOTMON_FS_INSTANCE *Instance\r
194 )\r
195{\r
196 EFI_STATUS Status;\r
197 EFI_LBA Lba;\r
198 UINT32 ImageCount;\r
199 BOOTMON_FS_FILE *NewFile;\r
200\r
201 ImageCount = 0;\r
202 Lba = 0;\r
203\r
204 while (1) {\r
205 Status = BootMonFsCreateFile (Instance, &NewFile);\r
206 if (EFI_ERROR (Status)) {\r
207 return Status;\r
208 }\r
209\r
79e12331 210 Status = BootMonFsDiscoverNextImage (Instance, &Lba, NewFile);\r
94e0955d
OM
211 if (EFI_ERROR (Status)) {\r
212 // Free NewFile allocated by BootMonFsCreateFile ()\r
213 FreePool (NewFile);\r
214 break;\r
215 }\r
216 InsertTailList (&Instance->RootFile->Link, &NewFile->Link);\r
217 ImageCount++;\r
218 }\r
219\r
220 Instance->Initialized = TRUE;\r
221 return EFI_SUCCESS;\r
222}\r