]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbInfo.c
UefiCpuPkg/PiSmmCpuDxeSmm: Avoid possible NULL ptr dereference
[mirror_edk2.git] / OvmfPkg / QemuFlashFvbServicesRuntimeDxe / FvbInfo.c
... / ...
CommitLineData
1/**@file\r
2\r
3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
4\r
5 This program and the accompanying materials are licensed and made available\r
6 under the terms and conditions of the BSD License which accompanies this\r
7 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 Module Name:\r
14\r
15 FvbInfo.c\r
16\r
17 Abstract:\r
18\r
19 Defines data structure that is the volume header found.These data is intent\r
20 to decouple FVB driver with FV header.\r
21\r
22**/\r
23\r
24//\r
25// The package level header files this module uses\r
26//\r
27#include <Pi/PiFirmwareVolume.h>\r
28\r
29//\r
30// The protocols, PPI and GUID defintions for this module\r
31//\r
32#include <Guid/SystemNvDataGuid.h>\r
33//\r
34// The Library classes this module consumes\r
35//\r
36#include <Library/BaseLib.h>\r
37#include <Library/PcdLib.h>\r
38\r
39typedef struct {\r
40 UINT64 FvLength;\r
41 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;\r
42 //\r
43 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0\r
44 //\r
45 EFI_FV_BLOCK_MAP_ENTRY End[1];\r
46} EFI_FVB_MEDIA_INFO;\r
47\r
48EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {\r
49 //\r
50 // Systen NvStorage FVB\r
51 //\r
52 {\r
53 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
54 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
55 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
56 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
57 {\r
58 {\r
59 0,\r
60 }, // ZeroVector[16]\r
61 EFI_SYSTEM_NV_DATA_FV_GUID,\r
62 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
63 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
64 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
65 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize),\r
66 EFI_FVH_SIGNATURE,\r
67 EFI_FVB2_MEMORY_MAPPED |\r
68 EFI_FVB2_READ_ENABLED_CAP |\r
69 EFI_FVB2_READ_STATUS |\r
70 EFI_FVB2_WRITE_ENABLED_CAP |\r
71 EFI_FVB2_WRITE_STATUS |\r
72 EFI_FVB2_ERASE_POLARITY |\r
73 EFI_FVB2_ALIGNMENT_16,\r
74 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),\r
75 0, // CheckSum\r
76 0, // ExtHeaderOffset\r
77 {\r
78 0,\r
79 }, // Reserved[1]\r
80 2, // Revision\r
81 {\r
82 {\r
83 (FixedPcdGet32 (PcdFlashNvStorageVariableSize) +\r
84 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +\r
85 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +\r
86 FixedPcdGet32 (PcdOvmfFlashNvStorageEventLogSize)) /\r
87 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
88 FixedPcdGet32 (PcdOvmfFirmwareBlockSize),\r
89 }\r
90 } // BlockMap[1]\r
91 },\r
92 {\r
93 {\r
94 0,\r
95 0\r
96 }\r
97 } // End[1]\r
98 }\r
99};\r
100\r
101EFI_STATUS\r
102GetFvbInfo (\r
103 IN UINT64 FvLength,\r
104 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo\r
105 )\r
106{\r
107 STATIC BOOLEAN Checksummed = FALSE;\r
108 UINTN Index;\r
109\r
110 if (!Checksummed) {\r
111 for (Index = 0;\r
112 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
113 Index += 1) {\r
114 UINT16 Checksum;\r
115 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = 0;\r
116 Checksum = CalculateCheckSum16 (\r
117 (UINT16*) &mPlatformFvbMediaInfo[Index].FvbInfo,\r
118 mPlatformFvbMediaInfo[Index].FvbInfo.HeaderLength\r
119 );\r
120 mPlatformFvbMediaInfo[Index].FvbInfo.Checksum = Checksum;\r
121 }\r
122 Checksummed = TRUE;\r
123 }\r
124\r
125 for (Index = 0;\r
126 Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO);\r
127 Index += 1) {\r
128 if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {\r
129 *FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;\r
130 return EFI_SUCCESS;\r
131 }\r
132 }\r
133\r
134 return EFI_NOT_FOUND;\r
135}\r