521 IN EFI_PHYSICAL_ADDRESS VariableBase,
522 OUT UINTN *LastVariableOffset,
523 IN BOOLEAN IsVolatile,
525 IN VARIABLE_HEADER *NewVariable,
526 IN UINTN NewVariableSize
529 VARIABLE_HEADER *Variable;
530 VARIABLE_HEADER *AddedVariable;
531 VARIABLE_HEADER *NextVariable;
532 VARIABLE_HEADER *NextAddedVariable;
533 VARIABLE_STORE_HEADER *VariableStoreHeader;
535 UINTN MaximumBufferSize;
543 EFI_STATUS DoneStatus;
544 UINTN CommonVariableTotalSize;
545 UINTN CommonUserVariableTotalSize;
546 UINTN HwErrVariableTotalSize;
547 VARIABLE_HEADER *UpdatingVariable;
548 VARIABLE_HEADER *UpdatingInDeletedTransition;
552 UpdatingVariable = NULL;
553 UpdatingInDeletedTransition = NULL;
554 if (UpdatingPtrTrack != NULL) {
555 UpdatingVariable = UpdatingPtrTrack->CurrPtr;
556 UpdatingInDeletedTransition = UpdatingPtrTrack->InDeletedTransitionPtr;
559 VariableStoreHeader = (VARIABLE_STORE_HEADER *)((UINTN)VariableBase);
561 CommonVariableTotalSize = 0;
562 CommonUserVariableTotalSize = 0;
563 HwErrVariableTotalSize = 0;
570 MaximumBufferSize =
sizeof (VARIABLE_STORE_HEADER);
574 if (((Variable->State == VAR_ADDED) || (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED))) &&
575 (Variable != UpdatingVariable) &&
576 (Variable != UpdatingInDeletedTransition)
579 VariableSize = (UINTN)NextVariable - (UINTN)Variable;
580 MaximumBufferSize += VariableSize;
583 Variable = NextVariable;
586 if (NewVariable != NULL) {
590 MaximumBufferSize += NewVariableSize;
597 MaximumBufferSize += 1;
598 ValidBuffer = AllocatePool (MaximumBufferSize);
599 if (ValidBuffer == NULL) {
600 return EFI_OUT_OF_RESOURCES;
611 SetMem (ValidBuffer, MaximumBufferSize, 0xff);
616 CopyMem (ValidBuffer, VariableStoreHeader,
sizeof (VARIABLE_STORE_HEADER));
617 CurrPtr = (UINT8 *)
GetStartPointer ((VARIABLE_STORE_HEADER *)ValidBuffer);
625 if ((Variable != UpdatingVariable) && (Variable->State == VAR_ADDED)) {
626 VariableSize = (UINTN)NextVariable - (UINTN)Variable;
627 CopyMem (CurrPtr, (UINT8 *)Variable, VariableSize);
628 CurrPtr += VariableSize;
629 if ((!IsVolatile) && ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
630 HwErrVariableTotalSize += VariableSize;
631 }
else if ((!IsVolatile) && ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
632 CommonVariableTotalSize += VariableSize;
634 CommonUserVariableTotalSize += VariableSize;
639 Variable = NextVariable;
648 if ((Variable != UpdatingVariable) && (Variable != UpdatingInDeletedTransition) && (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED))) {
656 AddedVariable =
GetStartPointer ((VARIABLE_STORE_HEADER *)ValidBuffer);
667 if (
CompareMem (Point0, Point1, NameSize) == 0) {
673 AddedVariable = NextAddedVariable;
680 VariableSize = (UINTN)NextVariable - (UINTN)Variable;
681 CopyMem (CurrPtr, (UINT8 *)Variable, VariableSize);
682 ((VARIABLE_HEADER *)CurrPtr)->State = VAR_ADDED;
683 CurrPtr += VariableSize;
684 if ((!IsVolatile) && ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
685 HwErrVariableTotalSize += VariableSize;
686 }
else if ((!IsVolatile) && ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
687 CommonVariableTotalSize += VariableSize;
689 CommonUserVariableTotalSize += VariableSize;
695 Variable = NextVariable;
701 if (NewVariable != NULL) {
702 if (((UINTN)CurrPtr - (UINTN)ValidBuffer) + NewVariableSize > VariableStoreHeader->Size) {
706 Status = EFI_OUT_OF_RESOURCES;
711 if ((NewVariable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
712 HwErrVariableTotalSize += NewVariableSize;
713 }
else if ((NewVariable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
714 CommonVariableTotalSize += NewVariableSize;
716 CommonUserVariableTotalSize += NewVariableSize;
720 if ((HwErrVariableTotalSize > PcdGet32 (PcdHwErrStorageSize)) ||
727 Status = EFI_OUT_OF_RESOURCES;
732 CopyMem (CurrPtr, (UINT8 *)NewVariable, NewVariableSize);
733 ((VARIABLE_HEADER *)CurrPtr)->State = VAR_ADDED;
734 if (UpdatingVariable != NULL) {
735 UpdatingPtrTrack->CurrPtr = (VARIABLE_HEADER *)((UINTN)UpdatingPtrTrack->StartPtr + ((UINTN)CurrPtr - (UINTN)
GetStartPointer ((VARIABLE_STORE_HEADER *)ValidBuffer)));
736 UpdatingPtrTrack->InDeletedTransitionPtr = NULL;
739 CurrPtr += NewVariableSize;
746 SetMem ((UINT8 *)(UINTN)VariableBase, VariableStoreHeader->Size, 0xff);
747 CopyMem ((UINT8 *)(UINTN)VariableBase, ValidBuffer, (UINTN)CurrPtr - (UINTN)ValidBuffer);
748 *LastVariableOffset = (UINTN)CurrPtr - (UINTN)ValidBuffer;
758 Status = EFI_SUCCESS;
765 (VARIABLE_STORE_HEADER *)ValidBuffer
767 if (!EFI_ERROR (Status)) {
768 *LastVariableOffset = (UINTN)CurrPtr - (UINTN)ValidBuffer;
776 Variable =
GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)VariableBase);
779 VariableSize = (UINTN)NextVariable - (UINTN)Variable;
780 if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
782 }
else if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
789 Variable = NextVariable;
792 *LastVariableOffset = (UINTN)Variable - (UINTN)VariableBase;
797 DoneStatus = EFI_SUCCESS;
802 VariableStoreHeader->Size
804 ASSERT_EFI_ERROR (DoneStatus);
805 FreePool (ValidBuffer);
814 VariableStoreHeader->Size
816 ASSERT_EFI_ERROR (DoneStatus);
819 if (!EFI_ERROR (Status) && EFI_ERROR (DoneStatus)) {
1418 IN CHAR16 *VariableName,
1424 CHAR8 *BestPlatformLang;
1429 BOOLEAN SetLanguageCodes;
1430 VARIABLE_ENTRY_CONSISTENCY VariableEntry[2];
1435 if (DataSize == 0) {
1439 SetLanguageCodes = FALSE;
1441 if (StrCmp (VariableName, EFI_PLATFORM_LANG_CODES_VARIABLE_NAME) == 0) {
1446 return EFI_WRITE_PROTECTED;
1449 SetLanguageCodes = TRUE;
1472 }
else if (StrCmp (VariableName, EFI_LANG_CODES_VARIABLE_NAME) == 0) {
1477 return EFI_WRITE_PROTECTED;
1480 SetLanguageCodes = TRUE;
1494 if ( SetLanguageCodes
1503 if (!EFI_ERROR (Status)) {
1507 VariableName = EFI_PLATFORM_LANG_VARIABLE_NAME;
1512 if (!EFI_ERROR (Status)) {
1516 VariableName = EFI_LANG_VARIABLE_NAME;
1528 Status = EFI_SUCCESS;
1533 Attributes = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;
1535 if (StrCmp (VariableName, EFI_PLATFORM_LANG_VARIABLE_NAME) == 0) {
1544 if (BestPlatformLang != NULL) {
1560 VariableEntry[0].Name = EFI_LANG_VARIABLE_NAME;
1562 VariableEntry[1].VariableSize = AsciiStrSize (BestPlatformLang);
1564 VariableEntry[1].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
1569 Status = EFI_OUT_OF_RESOURCES;
1577 EFI_LANG_VARIABLE_NAME,
1589 DEBUG ((DEBUG_INFO,
"Variable Driver Auto Update PlatformLang, PlatformLang:%a, Lang:%a Status: %r\n", BestPlatformLang, BestLang, Status));
1592 }
else if (StrCmp (VariableName, EFI_LANG_VARIABLE_NAME) == 0) {
1601 if (BestLang != NULL) {
1615 VariableEntry[0].VariableSize = AsciiStrSize (BestPlatformLang);
1617 VariableEntry[0].Name = EFI_PLATFORM_LANG_VARIABLE_NAME;
1621 VariableEntry[1].Name = EFI_LANG_VARIABLE_NAME;
1626 Status = EFI_OUT_OF_RESOURCES;
1634 EFI_PLATFORM_LANG_VARIABLE_NAME,
1637 AsciiStrSize (BestPlatformLang),
1646 DEBUG ((DEBUG_INFO,
"Variable Driver Auto Update Lang, Lang:%a, PlatformLang:%a Status: %r\n", BestLang, BestPlatformLang, Status));
1651 if (SetLanguageCodes) {
1681 IN CHAR16 *VariableName,
1682 IN EFI_GUID *VendorGuid,
1685 IN UINT32 Attributes OPTIONAL,
1686 IN UINT32 KeyIndex OPTIONAL,
1687 IN UINT64 MonotonicCount OPTIONAL,
1693 VARIABLE_HEADER *NextVariable;
1696 UINTN VarNameOffset;
1697 UINTN VarDataOffset;
1701 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
1705 VARIABLE_STORE_HEADER *VariableStoreHeader;
1707 UINT8 *BufferForMerge;
1708 UINTN MergedBufSize;
1711 BOOLEAN IsCommonVariable;
1712 BOOLEAN IsCommonUserVariable;
1713 AUTHENTICATED_VARIABLE_HEADER *AuthVariable;
1720 if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
1724 DEBUG ((DEBUG_ERROR,
"Update NV variable before EFI_VARIABLE_WRITE_ARCH_PROTOCOL ready - %r\n", EFI_NOT_AVAILABLE_YET));
1725 return EFI_NOT_AVAILABLE_YET;
1726 }
else if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {
1731 DEBUG ((DEBUG_ERROR,
"Update AUTH variable before EFI_VARIABLE_WRITE_ARCH_PROTOCOL ready - %r\n", EFI_NOT_AVAILABLE_YET));
1732 return EFI_NOT_AVAILABLE_YET;
1742 if ((CacheVariable->CurrPtr != NULL) &&
1749 CacheVariable->Volatile = FALSE;
1750 Status =
FindVariableEx (VariableName, VendorGuid, FALSE, CacheVariable, AuthFormat);
1751 if ((CacheVariable->CurrPtr == NULL) || EFI_ERROR (Status)) {
1755 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {
1768 if ((CacheVariable->CurrPtr == NULL) || CacheVariable->Volatile) {
1769 Variable = CacheVariable;
1777 Variable = &NvVariable;
1779 Variable->
EndPtr = (VARIABLE_HEADER *)((UINTN)Variable->
StartPtr + ((UINTN)CacheVariable->EndPtr - (UINTN)CacheVariable->StartPtr));
1781 Variable->
CurrPtr = (VARIABLE_HEADER *)((UINTN)Variable->
StartPtr + ((UINTN)CacheVariable->CurrPtr - (UINTN)CacheVariable->StartPtr));
1782 if (CacheVariable->InDeletedTransitionPtr != NULL) {
1783 Variable->
InDeletedTransitionPtr = (VARIABLE_HEADER *)((UINTN)Variable->
StartPtr + ((UINTN)CacheVariable->InDeletedTransitionPtr - (UINTN)CacheVariable->StartPtr));
1799 SetMem (NextVariable, ScratchSize, 0xff);
1802 if (Variable->
CurrPtr != NULL) {
1813 Status = EFI_WRITE_PROTECTED;
1820 if ((CacheVariable->CurrPtr->Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
1821 Status = EFI_INVALID_PARAMETER;
1828 if ((CacheVariable->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) {
1829 Status = EFI_INVALID_PARAMETER;
1840 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == 0)) {
1846 ASSERT (CacheVariable->InDeletedTransitionPtr != NULL);
1847 State = CacheVariable->InDeletedTransitionPtr->State;
1848 State &= VAR_DELETED;
1858 if (!EFI_ERROR (Status)) {
1860 CacheVariable->InDeletedTransitionPtr->State = State;
1867 State = CacheVariable->CurrPtr->State;
1868 State &= VAR_DELETED;
1875 (UINTN)&Variable->
CurrPtr->State,
1879 if (!EFI_ERROR (Status)) {
1882 CacheVariable->CurrPtr->State = State;
1896 ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) &&
1903 Status = EFI_SUCCESS;
1905 }
else if ((CacheVariable->CurrPtr->State == VAR_ADDED) ||
1906 (CacheVariable->CurrPtr->State == (VAR_ADDED & VAR_IN_DELETED_TRANSITION)))
1911 if ((Attributes & EFI_VARIABLE_APPEND_WRITE) != 0) {
1917 BufferForMerge = (UINT8 *)((UINTN)NextVariable + DataOffset);
1920 (UINT8 *)((UINTN)CacheVariable->CurrPtr + DataOffset),
1927 if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {
1929 }
else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
1939 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
1940 MaxDataSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) - DataOffset;
1943 if (
DataSizeOfVariable (CacheVariable->CurrPtr, AuthFormat) + DataSize > MaxDataSize) {
1947 Status = EFI_INVALID_PARAMETER;
1964 Data = BufferForMerge;
1965 DataSize = MergedBufSize;
1972 State = CacheVariable->CurrPtr->State;
1973 State &= VAR_IN_DELETED_TRANSITION;
1980 (UINTN)&Variable->
CurrPtr->State,
1984 if (EFI_ERROR (Status)) {
1989 CacheVariable->CurrPtr->State = State;
1997 if ((DataSize == 0) && ((Attributes & EFI_VARIABLE_APPEND_WRITE) != 0)) {
1998 Status = EFI_SUCCESS;
2006 if ((DataSize == 0) || ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == 0)) {
2007 Status = EFI_NOT_FOUND;
2015 (((Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) || ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0)))
2017 Status = EFI_INVALID_PARAMETER;
2026 NextVariable->StartId = VARIABLE_DATA;
2030 NextVariable->Reserved = 0;
2032 AuthVariable = (AUTHENTICATED_VARIABLE_HEADER *)NextVariable;
2033 AuthVariable->PubKeyIndex = KeyIndex;
2034 AuthVariable->MonotonicCount = MonotonicCount;
2035 ZeroMem (&AuthVariable->TimeStamp, sizeof (EFI_TIME));
2037 if (((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) &&
2040 if ((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) {
2048 if (Variable->
CurrPtr != NULL) {
2052 CopyMem (&AuthVariable->TimeStamp, &(((AUTHENTICATED_VARIABLE_HEADER *)CacheVariable->CurrPtr)->TimeStamp), sizeof (EFI_TIME));
2063 NextVariable->Attributes = Attributes & (~EFI_VARIABLE_APPEND_WRITE);
2066 VarNameSize = StrSize (VariableName);
2068 (UINT8 *)((UINTN)NextVariable + VarNameOffset),
2072 VarDataOffset = VarNameOffset + VarNameSize + GET_PAD_SIZE (VarNameSize);
2080 (UINT8 *)((UINTN)NextVariable + VarDataOffset),
2103 VarSize = VarDataOffset + DataSize + GET_PAD_SIZE (DataSize);
2104 if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
2110 IsCommonVariable = FALSE;
2111 IsCommonUserVariable = FALSE;
2112 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == 0) {
2113 IsCommonVariable = TRUE;
2117 if ( ( ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != 0)
2125 RecordVarErrorFlag (VAR_ERROR_FLAG_USER_ERROR, VariableName, VendorGuid, Attributes, VarSize);
2129 RecordVarErrorFlag (VAR_ERROR_FLAG_SYSTEM_ERROR, VariableName, VendorGuid, Attributes, VarSize);
2132 Status = EFI_OUT_OF_RESOURCES;
2145 HEADER_ALIGN (VarSize)
2147 if (!EFI_ERROR (Status)) {
2151 if (Variable->
CurrPtr != NULL) {
2152 CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN)CacheVariable->StartPtr + ((UINTN)Variable->
CurrPtr - (UINTN)Variable->
StartPtr));
2153 CacheVariable->InDeletedTransitionPtr = NULL;
2160 RecordVarErrorFlag (VAR_ERROR_FLAG_USER_ERROR, VariableName, VendorGuid, Attributes, VarSize);
2164 RecordVarErrorFlag (VAR_ERROR_FLAG_SYSTEM_ERROR, VariableName, VendorGuid, Attributes, VarSize);
2189 (UINT8 *)NextVariable
2192 if (EFI_ERROR (Status)) {
2199 NextVariable->State = VAR_HEADER_VALID_ONLY;
2207 &NextVariable->State
2210 if (EFI_ERROR (Status)) {
2227 if (EFI_ERROR (Status)) {
2234 NextVariable->State = VAR_ADDED;
2242 &NextVariable->State
2245 if (EFI_ERROR (Status)) {
2257 NextVariable->State = VAR_ADDED;
2265 (UINT8 *)NextVariable
2268 if (EFI_ERROR (Status)) {
2275 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != 0) {
2279 if (IsCommonUserVariable) {
2301 HEADER_ALIGN (VarSize)
2303 if (!EFI_ERROR (Status)) {
2307 if (Variable->
CurrPtr != NULL) {
2308 CacheVariable->CurrPtr = (VARIABLE_HEADER *)((UINTN)CacheVariable->StartPtr + ((UINTN)Variable->
CurrPtr - (UINTN)Variable->
StartPtr));
2309 CacheVariable->InDeletedTransitionPtr = NULL;
2318 NextVariable->State = VAR_ADDED;
2326 (UINT8 *)NextVariable
2329 if (EFI_ERROR (Status)) {
2339 if (!EFI_ERROR (Status) && (Variable->
CurrPtr != NULL)) {
2345 ASSERT (CacheVariable->InDeletedTransitionPtr != NULL);
2346 State = CacheVariable->InDeletedTransitionPtr->State;
2347 State &= VAR_DELETED;
2357 if (!EFI_ERROR (Status)) {
2359 CacheVariable->InDeletedTransitionPtr->State = State;
2366 State = CacheVariable->CurrPtr->State;
2367 State &= VAR_DELETED;
2374 (UINTN)&Variable->
CurrPtr->State,
2378 if (!EFI_ERROR (Status) && !Variable->
Volatile) {
2379 CacheVariable->CurrPtr->State = State;
2383 if (!EFI_ERROR (Status)) {
2391 if (!EFI_ERROR (Status)) {
2392 if (((Variable->
CurrPtr != NULL) && !Variable->
Volatile) || ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0)) {
2398 if (VolatileCacheInstance->
Store != NULL) {
2400 VolatileCacheInstance,
2402 VolatileCacheInstance->
Store->Size
2404 ASSERT_EFI_ERROR (Status);
2628 IN CHAR16 *VariableName,
2629 IN EFI_GUID *VendorGuid,
2630 IN UINT32 Attributes,
2637 VARIABLE_HEADER *NextVariable;
2638 EFI_PHYSICAL_ADDRESS Point;
2647 if ((VariableName == NULL) || (VariableName[0] == 0) || (VendorGuid == NULL)) {
2648 return EFI_INVALID_PARAMETER;
2651 if ((DataSize != 0) && (Data == NULL)) {
2652 return EFI_INVALID_PARAMETER;
2662 return EFI_INVALID_PARAMETER;
2668 if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
2672 if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) {
2673 return EFI_UNSUPPORTED;
2675 return EFI_INVALID_PARAMETER;
2681 return EFI_INVALID_PARAMETER;
2682 }
else if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {
2687 return EFI_INVALID_PARAMETER;
2689 }
else if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != 0) {
2690 if (PcdGet32 (PcdHwErrStorageSize) == 0) {
2694 return EFI_INVALID_PARAMETER;
2702 if ( ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) == EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS)
2703 && ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS))
2705 return EFI_UNSUPPORTED;
2708 if ((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) == EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) {
2713 if (DataSize != AUTHINFO_SIZE) {
2714 return EFI_UNSUPPORTED;
2717 PayloadSize = DataSize - AUTHINFO_SIZE;
2718 }
else if ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {
2722 if ((DataSize < OFFSET_OF_AUTHINFO2_CERT_DATA) ||
2723 (((EFI_VARIABLE_AUTHENTICATION_2 *)Data)->AuthInfo.Hdr.dwLength > DataSize - (OFFSET_OF (EFI_VARIABLE_AUTHENTICATION_2, AuthInfo))) ||
2724 (((EFI_VARIABLE_AUTHENTICATION_2 *)Data)->AuthInfo.Hdr.dwLength < OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)))
2726 return EFI_SECURITY_VIOLATION;
2735 PayloadSize = DataSize - AUTHINFO2_SIZE (Data);
2737 PayloadSize = DataSize;
2740 if ((UINTN)(~0) - PayloadSize < StrSize (VariableName)) {
2744 return EFI_INVALID_PARAMETER;
2752 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
2753 if (StrSize (VariableName) + PayloadSize >
2756 return EFI_INVALID_PARAMETER;
2763 if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {
2764 if (StrSize (VariableName) + PayloadSize >
2770 "%a: Failed to set variable '%s' with Guid %g\n",
2777 "NameSize(0x%x) + PayloadSize(0x%x) > "
2778 "MaxAuthVariableSize(0x%x) - HeaderSize(0x%x)\n",
2779 StrSize (VariableName),
2784 return EFI_INVALID_PARAMETER;
2786 }
else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
2787 if (StrSize (VariableName) + PayloadSize >
2792 "%a: Failed to set variable '%s' with Guid %g\n",
2799 "NameSize(0x%x) + PayloadSize(0x%x) > "
2800 "MaxVariableSize(0x%x) - HeaderSize(0x%x)\n",
2801 StrSize (VariableName),
2806 return EFI_INVALID_PARAMETER;
2809 if (StrSize (VariableName) + PayloadSize >
2814 "%a: Failed to set variable '%s' with Guid %g\n",
2821 "NameSize(0x%x) + PayloadSize(0x%x) > "
2822 "MaxVolatileVariableSize(0x%x) - HeaderSize(0x%x)\n",
2823 StrSize (VariableName),
2828 return EFI_INVALID_PARAMETER;
2836 Status =
SetVariableCheckHandlerMor (VariableName, VendorGuid, Attributes, PayloadSize, (VOID *)((UINTN)Data + DataSize - PayloadSize));
2837 if (Status == EFI_ALREADY_STARTED) {
2845 if (EFI_ERROR (Status)) {
2849 Status = VarCheckLibSetVariableCheck (VariableName, VendorGuid, Attributes, PayloadSize, (VOID *)((UINTN)Data + DataSize - PayloadSize),
mRequestSource);
2850 if (EFI_ERROR (Status)) {
2864 NextVariable =
GetStartPointer ((VARIABLE_STORE_HEADER *)(UINTN)Point);
2876 if (!EFI_ERROR (Status)) {
2877 if (((Variable.
CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) &&
AtRuntime ()) {
2878 Status = EFI_WRITE_PROTECTED;
2882 if ((Attributes != 0) && ((Attributes & (~EFI_VARIABLE_APPEND_WRITE)) != Variable.
CurrPtr->Attributes)) {
2889 Status = EFI_INVALID_PARAMETER;
2890 DEBUG ((DEBUG_INFO,
"[Variable]: Rewritten a preexisting variable(0x%08x) with different attributes(0x%08x) - %g:%s\n", Variable.
CurrPtr->Attributes, Attributes, VendorGuid, VariableName));
2895 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
2900 if (EFI_ERROR (Status)) {
2909 Status = AuthVariableLibProcessVariable (VariableName, VendorGuid, Data, DataSize, Attributes);
2911 Status =
UpdateVariable (VariableName, VendorGuid, Data, DataSize, Attributes, 0, 0, &Variable, NULL);
2919 if (!EFI_ERROR (Status)) {
2952 IN UINT32 Attributes,
2953 OUT UINT64 *MaximumVariableStorageSize,
2954 OUT UINT64 *RemainingVariableStorageSize,
2955 OUT UINT64 *MaximumVariableSize
2958 VARIABLE_HEADER *Variable;
2959 VARIABLE_HEADER *NextVariable;
2960 UINT64 VariableSize;
2961 VARIABLE_STORE_HEADER *VariableStoreHeader;
2962 UINT64 CommonVariableTotalSize;
2963 UINT64 HwErrVariableTotalSize;
2967 CommonVariableTotalSize = 0;
2968 HwErrVariableTotalSize = 0;
2970 if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
2986 *MaximumVariableStorageSize = VariableStoreHeader->Size -
sizeof (VARIABLE_STORE_HEADER);
2991 if ((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) == (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_HARDWARE_ERROR_RECORD)) {
2992 *MaximumVariableStorageSize = PcdGet32 (PcdHwErrStorageSize);
2993 *MaximumVariableSize = PcdGet32 (PcdMaxHardwareErrorVariableSize) -
2996 if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
3007 if ((Attributes & VARIABLE_ATTRIBUTE_AT_AW) != 0) {
3010 }
else if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) {
3029 VariableSize = (UINT64)(UINTN)NextVariable - (UINT64)(UINTN)Variable;
3038 if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
3039 HwErrVariableTotalSize += VariableSize;
3041 CommonVariableTotalSize += VariableSize;
3048 if (Variable->State == VAR_ADDED) {
3049 if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
3050 HwErrVariableTotalSize += VariableSize;
3052 CommonVariableTotalSize += VariableSize;
3054 }
else if (Variable->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {
3069 if (!EFI_ERROR (Status) && (VariablePtrTrack.
CurrPtr->State != VAR_ADDED)) {
3070 if ((Variable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
3071 HwErrVariableTotalSize += VariableSize;
3073 CommonVariableTotalSize += VariableSize;
3082 Variable = NextVariable;
3085 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
3086 *RemainingVariableStorageSize = *MaximumVariableStorageSize - HwErrVariableTotalSize;
3088 if (*MaximumVariableStorageSize < CommonVariableTotalSize) {
3089 *RemainingVariableStorageSize = 0;
3091 *RemainingVariableStorageSize = *MaximumVariableStorageSize - CommonVariableTotalSize;
3096 *MaximumVariableSize = 0;
3098 *MaximumVariableSize
3101 *MaximumVariableSize = *RemainingVariableStorageSize -
3524 VARIABLE_STORE_HEADER *NormalVarStorage
3527 VARIABLE_HEADER *StartPtr;
3529 VARIABLE_HEADER *EndPtr;
3530 UINTN AuthVarStroageSize;
3531 AUTHENTICATED_VARIABLE_HEADER *AuthStartPtr;
3532 VARIABLE_STORE_HEADER *AuthVarStorage;
3534 AuthVarStroageSize =
sizeof (VARIABLE_STORE_HEADER);
3545 while (StartPtr < EndPtr) {
3546 if (StartPtr->State == VAR_ADDED) {
3547 AuthVarStroageSize = HEADER_ALIGN (AuthVarStroageSize);
3548 AuthVarStroageSize +=
sizeof (AUTHENTICATED_VARIABLE_HEADER);
3549 AuthVarStroageSize += StartPtr->NameSize + GET_PAD_SIZE (StartPtr->NameSize);
3550 AuthVarStroageSize += StartPtr->DataSize + GET_PAD_SIZE (StartPtr->DataSize);
3559 AuthVarStorage = AllocateRuntimeZeroPool (AuthVarStroageSize);
3560 ASSERT (AuthVarStorage != NULL);
3561 if (AuthVarStorage == NULL) {
3570 AuthStartPtr = (AUTHENTICATED_VARIABLE_HEADER *)
GetStartPointer (AuthVarStorage);
3571 while (StartPtr < EndPtr) {
3572 if (StartPtr->State == VAR_ADDED) {
3573 AuthStartPtr = (AUTHENTICATED_VARIABLE_HEADER *)HEADER_ALIGN (AuthStartPtr);
3577 AuthStartPtr->StartId = StartPtr->StartId;
3578 AuthStartPtr->State = StartPtr->State;
3579 AuthStartPtr->Attributes = StartPtr->Attributes;
3580 AuthStartPtr->NameSize = StartPtr->NameSize;
3581 AuthStartPtr->DataSize = StartPtr->DataSize;
3582 CopyGuid (&AuthStartPtr->VendorGuid, &StartPtr->VendorGuid);
3586 NextPtr = (UINT8 *)(AuthStartPtr + 1);
3590 AuthStartPtr->NameSize
3595 NextPtr = NextPtr + AuthStartPtr->NameSize + GET_PAD_SIZE (AuthStartPtr->NameSize);
3600 AuthStartPtr = (AUTHENTICATED_VARIABLE_HEADER *)(NextPtr + AuthStartPtr->DataSize + GET_PAD_SIZE (AuthStartPtr->DataSize));
3609 AuthVarStorage->Format = NormalVarStorage->Format;
3610 AuthVarStorage->State = NormalVarStorage->State;
3611 AuthVarStorage->Size = (UINT32)((UINTN)AuthStartPtr - (UINTN)AuthVarStorage);
3612 CopyGuid (&AuthVarStorage->Signature, &gEfiAuthenticatedVariableGuid);
3613 ASSERT (AuthVarStorage->Size <= AuthVarStroageSize);
3619 return AuthVarStorage;