1 /**@file
2
3 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 FvbInfo.c
15
16 Abstract:
17
18 Defines data structure that is the volume header found.These data is intent
19 to decouple FVB driver with FV header.
20
21 **/
22
23 //
24 // The package level header files this module uses
25 //
26 #include <PiDxe.h>
27 #include <WinNtDxe.h>
28 //
29 // The protocols, PPI and GUID defintions for this module
30 //
31 #include <Guid/EventGroup.h>
32 #include <Guid/FirmwareFileSystem2.h>
33 #include <Guid/SystemNvDataGuid.h>
34 #include <Protocol/FirmwareVolumeBlock.h>
35 #include <Protocol/DevicePath.h>
36 //
37 // The Library classes this module consumes
38 //
39 #include <Library/UefiLib.h>
40 #include <Library/UefiDriverEntryPoint.h>
41 #include <Library/BaseLib.h>
42 #include <Library/DxeServicesTableLib.h>
43 #include <Library/UefiRuntimeLib.h>
44 #include <Library/DebugLib.h>
45 #include <Library/HobLib.h>
46 #include <Library/BaseMemoryLib.h>
47 #include <Library/MemoryAllocationLib.h>
48 #include <Library/UefiBootServicesTableLib.h>
49 #include <Library/PcdLib.h>
50
51 typedef struct {
52 UINT64 FvLength;
53 EFI_FIRMWARE_VOLUME_HEADER FvbInfo;
54 //
55 // EFI_FV_BLOCK_MAP_ENTRY ExtraBlockMap[n];//n=0
56 //
57 EFI_FV_BLOCK_MAP_ENTRY End[1];
58 } EFI_FVB_MEDIA_INFO;
59
60 EFI_FVB_MEDIA_INFO mPlatformFvbMediaInfo[] = {
61 //
62 // Recovery BOIS FVB
63 //
64 {
65 FixedPcdGet32 (PcdWinNtFlashFvRecoverySize),
66 {
67 {
68 0,
69 }, // ZeroVector[16]
70 EFI_FIRMWARE_FILE_SYSTEM2_GUID,
71 FixedPcdGet32 (PcdWinNtFlashFvRecoverySize),
72 EFI_FVH_SIGNATURE,
73 EFI_FVB2_MEMORY_MAPPED |
74 EFI_FVB2_READ_ENABLED_CAP |
75 EFI_FVB2_READ_STATUS |
76 EFI_FVB2_WRITE_ENABLED_CAP |
77 EFI_FVB2_WRITE_STATUS |
78 EFI_FVB2_ERASE_POLARITY |
79 EFI_FVB2_ALIGNMENT_16,
80 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
81 0xE947, // CheckSum
82 0, // ExtHeaderOffset
83 {
84 0,
85 }, // Reserved[1]
86 2, // Revision
87 {
88 FixedPcdGet32 (PcdWinNtFlashFvRecoverySize)/FixedPcdGet32 (PcdWinNtFirmwareBlockSize),
89 FixedPcdGet32 (PcdWinNtFirmwareBlockSize),
90 }
91 },
92 {
93 0,
94 0
95 }
96 },
97 //
98 // Systen NvStorage FVB
99 //
100 {
101 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
102 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
103 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
104 FixedPcdGet32 (PcdWinNtFlashNvStorageEventLogSize),
105 {
106 {
107 0,
108 }, // ZeroVector[16]
109 EFI_SYSTEM_NV_DATA_FV_GUID,
110 FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
111 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
112 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
113 FixedPcdGet32 (PcdWinNtFlashNvStorageEventLogSize),
114 EFI_FVH_SIGNATURE,
115 EFI_FVB2_MEMORY_MAPPED |
116 EFI_FVB2_READ_ENABLED_CAP |
117 EFI_FVB2_READ_STATUS |
118 EFI_FVB2_WRITE_ENABLED_CAP |
119 EFI_FVB2_WRITE_STATUS |
120 EFI_FVB2_ERASE_POLARITY |
121 EFI_FVB2_ALIGNMENT_16,
122 sizeof (EFI_FIRMWARE_VOLUME_HEADER) + sizeof (EFI_FV_BLOCK_MAP_ENTRY),
123 0xFBFF, // CheckSum
124 0, // ExtHeaderOffset
125 {
126 0,
127 }, // Reserved[1]
128 2, // Revision
129 {
130 (FixedPcdGet32 (PcdFlashNvStorageVariableSize) +
131 FixedPcdGet32 (PcdFlashNvStorageFtwWorkingSize) +
132 FixedPcdGet32 (PcdFlashNvStorageFtwSpareSize) +
133 FixedPcdGet32 (PcdWinNtFlashNvStorageEventLogSize)) / FixedPcdGet32 (PcdWinNtFirmwareBlockSize),
134 FixedPcdGet32 (PcdWinNtFirmwareBlockSize),
135 }
136 },
137 {
138 0,
139 0
140 }
141 }
142 };
143
144 EFI_STATUS
GetFvbInfo(IN UINT64 FvLength,OUT EFI_FIRMWARE_VOLUME_HEADER ** FvbInfo)145 GetFvbInfo (
146 IN UINT64 FvLength,
147 OUT EFI_FIRMWARE_VOLUME_HEADER **FvbInfo
148 )
149 {
150 UINTN Index;
151
152 for (Index = 0; Index < sizeof (mPlatformFvbMediaInfo) / sizeof (EFI_FVB_MEDIA_INFO); Index += 1) {
153 if (mPlatformFvbMediaInfo[Index].FvLength == FvLength) {
154 *FvbInfo = &mPlatformFvbMediaInfo[Index].FvbInfo;
155 return EFI_SUCCESS;
156 }
157 }
158
159 return EFI_NOT_FOUND;
160 }
161