/** Writes a buffer to variable storage space, in the working block. This function writes a buffer to variable storage space into a firmware volume block device. The destination is specified by parameter VariableBase. Fault Tolerant Write protocol is used for writing. @param VariableBase Base address of variable to write @param VariableBuffer Point to the variable data buffer. @retval EFI_SUCCESS The function completed successfully. @retval EFI_NOT_FOUND Fail to locate Fault Tolerant Write protocol. @retval EFI_ABORTED The function could not complete successfully. **/ EFI_STATUS FtwVariableSpace ( IN EFI_PHYSICAL_ADDRESS VariableBase, IN VARIABLE_STORE_HEADER *VariableBuffer ) { EFI_STATUS Status; EFI_HANDLE FvbHandle; EFI_LBA VarLba; UINTN VarOffset; UINTN FtwBufferSize; EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol; // // Locate fault tolerant write protocol. // Status = GetFtwProtocol((VOID **) &FtwProtocol); if (EFI_ERROR (Status)) { return EFI_NOT_FOUND; } // // Locate Fvb handle by address. // Status = GetFvbInfoByAddress (VariableBase, &FvbHandle, NULL); if (EFI_ERROR (Status)) { return Status; } // // Get LBA and Offset by address. // Status = GetLbaAndOffsetByAddress (VariableBase, &VarLba, &VarOffset); if (EFI_ERROR (Status)) { return EFI_ABORTED; } FtwBufferSize = ((VARIABLE_STORE_HEADER *) ((UINTN) VariableBase))->Size; ASSERT (FtwBufferSize == VariableBuffer->Size); // // FTW write record. // Status = FtwProtocol->Write ( FtwProtocol, VarLba, // LBA VarOffset, // Offset FtwBufferSize, // NumBytes NULL, // PrivateData NULL FvbHandle, // Fvb Handle (VOID *) VariableBuffer // write buffer ); return Status; }
/** Writes a buffer to variable storage space, in the working block. This function writes a buffer to variable storage space into a firmware volume block device. The destination is specified by parameter VariableBase. Fault Tolerant Write protocol is used for writing. @param VariableBase Base address of variable to write @param Buffer Point to the data buffer. @param BufferSize The number of bytes of the data Buffer. @retval EFI_SUCCESS The function completed successfully. @retval EFI_NOT_FOUND Fail to locate Fault Tolerant Write protocol. @retval EFI_ABORTED The function could not complete successfully. **/ EFI_STATUS FtwVariableSpace ( IN EFI_PHYSICAL_ADDRESS VariableBase, IN UINT8 *Buffer, IN UINTN BufferSize ) { EFI_STATUS Status; EFI_HANDLE FvbHandle; EFI_LBA VarLba; UINTN VarOffset; UINT8 *FtwBuffer; UINTN FtwBufferSize; EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol; // // Locate fault tolerant write protocol. // Status = GetFtwProtocol((VOID **) &FtwProtocol); if (EFI_ERROR (Status)) { return EFI_NOT_FOUND; } // // Locate Fvb handle by address. // Status = GetFvbInfoByAddress (VariableBase, &FvbHandle, NULL); if (EFI_ERROR (Status)) { return Status; } // // Get LBA and Offset by address. // Status = GetLbaAndOffsetByAddress (VariableBase, &VarLba, &VarOffset); if (EFI_ERROR (Status)) { return EFI_ABORTED; } // // Prepare for the variable data. // FtwBufferSize = ((VARIABLE_STORE_HEADER *) ((UINTN) VariableBase))->Size; FtwBuffer = AllocatePool (FtwBufferSize); if (FtwBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } SetMem (FtwBuffer, FtwBufferSize, (UINT8) 0xff); CopyMem (FtwBuffer, Buffer, BufferSize); // // FTW write record. // Status = FtwProtocol->Write ( FtwProtocol, VarLba, // LBA VarOffset, // Offset FtwBufferSize, // NumBytes NULL, // PrivateData NULL FvbHandle, // Fvb Handle FtwBuffer // write buffer ); FreePool (FtwBuffer); return Status; }
/** Writes a buffer to variable storage space. This function writes a buffer to variable storage space into firmware volume block device. The destination is specified by parameter VariableBase. Fault Tolerant Write protocol is used for writing. @param[in] VariableBase The base address of the variable to write. @param[in] Buffer Points to the data buffer. @param[in] BufferSize The number of bytes of the data Buffer. @retval EFI_SUCCESS The function completed successfully. @retval EFI_NOT_FOUND Fail to locate Fault Tolerant Write protocol. @retval Other The function could not complete successfully. **/ EFI_STATUS FtwVariableSpace ( IN EFI_PHYSICAL_ADDRESS VariableBase, IN UINT8 *Buffer, IN UINTN BufferSize ) { EFI_STATUS Status; EFI_HANDLE FvbHandle; EFI_LBA VarLba; UINTN VarOffset; UINT8 *FtwBuffer; UINTN FtwBufferSize; EFI_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol; // // Locate Fault Tolerant Write protocol // Status = gBS->LocateProtocol ( &gEfiFaultTolerantWriteProtocolGuid, NULL, (VOID **) &FtwProtocol ); if (EFI_ERROR (Status)) { return EFI_NOT_FOUND; } // // Gets firmware volume block handle by VariableBase. // Status = GetFvbHandleByAddress (VariableBase, &FvbHandle); if (EFI_ERROR (Status)) { return Status; } // // Gets LBA of block and offset by VariableBase. // Status = GetLbaAndOffsetByAddress (VariableBase, &VarLba, &VarOffset); if (EFI_ERROR (Status)) { return EFI_ABORTED; } // // Prepare for the variable data // FtwBufferSize = ((VARIABLE_STORE_HEADER *) ((UINTN) VariableBase))->Size; FtwBuffer = AllocatePool (FtwBufferSize); if (FtwBuffer == NULL) { return EFI_OUT_OF_RESOURCES; } SetMem (FtwBuffer, FtwBufferSize, (UINT8) 0xff); CopyMem (FtwBuffer, Buffer, BufferSize); // // FTW write record // Status = FtwProtocol->Write ( FtwProtocol, VarLba, // LBA VarOffset, // Offset FtwBufferSize, // NumBytes, NULL, FvbHandle, FtwBuffer ); FreePool (FtwBuffer); return Status; }
EFI_STATUS FtwVariableSpace ( IN EFI_PHYSICAL_ADDRESS VariableBase, IN UINT8 *Buffer, IN UINTN BufferSize ) /*++ Routine Description: Write a buffer to Variable space, in the working block. Arguments: FvbHandle - Indicates a handle to FVB to access variable store Buffer - Point to the input buffer BufferSize - The number of bytes of the input Buffer Returns: EFI_SUCCESS - The function completed successfully EFI_ABORTED - The function could not complete successfully EFI_NOT_FOUND - Locate FVB protocol by handle fails --*/ { EFI_STATUS Status; EFI_HANDLE FvbHandle; EFI_FTW_LITE_PROTOCOL *FtwLiteProtocol; EFI_LBA VarLba; UINTN VarOffset; UINT8 *FtwBuffer; UINTN FtwBufferSize; // // Locate fault tolerant write protocol // Status = gBS->LocateProtocol ( &gEfiFaultTolerantWriteLiteProtocolGuid, NULL, &FtwLiteProtocol ); if (EFI_ERROR (Status)) { return EFI_NOT_FOUND; } // // Locate Fvb handle by address // Status = GetFvbHandleByAddress (VariableBase, &FvbHandle); if (EFI_ERROR (Status)) { return Status; } // // Get LBA and Offset by address // Status = GetLbaAndOffsetByAddress (VariableBase, &VarLba, &VarOffset); if (EFI_ERROR (Status)) { return EFI_ABORTED; } // // Prepare for the variable data // FtwBufferSize = ((VARIABLE_STORE_HEADER *) ((UINTN) VariableBase))->Size; Status = gBS->AllocatePool (EfiRuntimeServicesData, FtwBufferSize, &FtwBuffer); if (EFI_ERROR (Status)) { return EFI_OUT_OF_RESOURCES; } EfiSetMem (FtwBuffer, FtwBufferSize, (UINT8) 0xff); EfiCopyMem (FtwBuffer, Buffer, BufferSize); // // FTW write record // Status = FtwLiteProtocol->Write ( FtwLiteProtocol, FvbHandle, VarLba, // LBA VarOffset, // Offset &FtwBufferSize, // NumBytes, FtwBuffer ); gBS->FreePool (FtwBuffer); return Status; }