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