1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
/** @file
Implements get/set firmware volume attributes.
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions
of the BSD License which accompanies this distribution. The
full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "FwVolDriver.h"
/**
Retrieves attributes, insures positive polarity of attribute bits, returns
resulting attributes in output parameter.
@param This Calling context
@param Attributes output buffer which contains attributes
@retval EFI_SUCCESS Successfully got volume attributes
**/
EFI_STATUS
EFIAPI
FvGetVolumeAttributes (
IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
OUT EFI_FV_ATTRIBUTES *Attributes
)
{
EFI_STATUS Status;
FV_DEVICE *FvDevice;
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
EFI_FVB_ATTRIBUTES_2 FvbAttributes;
FvDevice = FV_DEVICE_FROM_THIS (This);
Fvb = FvDevice->Fvb;
//
// First get the Firmware Volume Block Attributes
//
Status = Fvb->GetAttributes (Fvb, &FvbAttributes);
FvbAttributes &= 0xfffff0ff;
*Attributes = FvbAttributes;
*Attributes |= EFI_FV2_WRITE_POLICY_RELIABLE;
return Status;
}
/**
Sets current attributes for volume.
@param This Calling context
@param Attributes On input, FvAttributes is a pointer to
an EFI_FV_ATTRIBUTES containing the
desired firmware volume settings. On
successful return, it contains the new
settings of the firmware volume. On
unsuccessful return, FvAttributes is not
modified and the firmware volume
settings are not changed.
@retval EFI_SUCCESS The requested firmware volume attributes
were set and the resulting
EFI_FV_ATTRIBUTES is returned in
FvAttributes.
@retval EFI_ACCESS_DENIED Atrribute is locked down.
@retval EFI_INVALID_PARAMETER Atrribute is not valid.
**/
EFI_STATUS
EFIAPI
FvSetVolumeAttributes (
IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
IN OUT EFI_FV_ATTRIBUTES *Attributes
)
{
EFI_STATUS Status;
FV_DEVICE *FvDevice;
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
EFI_FVB_ATTRIBUTES_2 OldFvbAttributes;
EFI_FVB_ATTRIBUTES_2 NewFvbAttributes;
UINT64 NewStatus;
UINT32 Capabilities;
FvDevice = FV_DEVICE_FROM_THIS (This);
Fvb = FvDevice->Fvb;
//
// First get the current Volume Attributes
//
Status = Fvb->GetAttributes (
Fvb,
&OldFvbAttributes
);
if ((OldFvbAttributes & EFI_FVB2_LOCK_STATUS) != 0) {
return EFI_ACCESS_DENIED;
}
//
// Only status attributes can be updated.
//
Capabilities = OldFvbAttributes & EFI_FVB2_CAPABILITIES;
NewStatus = (*Attributes) & EFI_FVB2_STATUS;
//
// Test read disable
//
if ((Capabilities & EFI_FVB2_READ_DISABLED_CAP) == 0) {
if ((NewStatus & EFI_FVB2_READ_STATUS) == 0) {
return EFI_INVALID_PARAMETER;
}
}
//
// Test read enable
//
if ((Capabilities & EFI_FVB2_READ_ENABLED_CAP) == 0) {
if ((NewStatus & EFI_FVB2_READ_STATUS) != 0) {
return EFI_INVALID_PARAMETER;
}
}
//
// Test write disable
//
if ((Capabilities & EFI_FVB2_WRITE_DISABLED_CAP) == 0) {
if ((NewStatus & EFI_FVB2_WRITE_STATUS) == 0) {
return EFI_INVALID_PARAMETER;
}
}
//
// Test write enable
//
if ((Capabilities & EFI_FVB2_WRITE_ENABLED_CAP) == 0) {
if ((NewStatus & EFI_FVB2_WRITE_STATUS) != 0) {
return EFI_INVALID_PARAMETER;
}
}
//
// Test lock
//
if ((Capabilities & EFI_FVB2_LOCK_CAP) == 0) {
if ((NewStatus & EFI_FVB2_LOCK_STATUS) != 0) {
return EFI_INVALID_PARAMETER;
}
}
NewFvbAttributes = OldFvbAttributes & (0xFFFFFFFF & (~EFI_FVB2_STATUS));
NewFvbAttributes |= NewStatus;
Status = Fvb->SetAttributes (
Fvb,
&NewFvbAttributes
);
if (EFI_ERROR (Status)) {
return Status;
}
*Attributes = 0;
This->GetVolumeAttributes (
This,
Attributes
);
return EFI_SUCCESS;
}
/**
Return information of type InformationType for the requested firmware
volume.
@param This Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
@param InformationType InformationType for requested.
@param BufferSize On input, size of Buffer.On output, the amount of
data returned in Buffer.
@param Buffer A poniter to the data buffer to return.
@return EFI_UNSUPPORTED Could not get.
**/
EFI_STATUS
EFIAPI
FvGetVolumeInfo (
IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
IN CONST EFI_GUID *InformationType,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
)
{
return EFI_UNSUPPORTED;
}
/**
Set information with InformationType into the requested firmware volume.
@param This Pointer to EFI_FIRMWARE_VOLUME2_PROTOCOL.
@param InformationType InformationType for requested.
@param BufferSize Size of Buffer data.
@param Buffer A poniter to the data buffer to be set.
@retval EFI_UNSUPPORTED Could not set.
**/
EFI_STATUS
EFIAPI
FvSetVolumeInfo (
IN CONST EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
IN CONST EFI_GUID *InformationType,
IN UINTN BufferSize,
IN CONST VOID *Buffer
)
{
return EFI_UNSUPPORTED;
}
|