mirror of https://github.com/acidanthera/audk.git
1)Add a new module CapsuleRuntime under EdkModulePkg\Universal\Capsule\RuntimeDxe.And add the module into Nt32.fpd
2)Modify the related files to fit for the runtime services UpdateCapsule/QueryCapsuleCapabilities defined in UEFI2.0 spec 3)Modify the related files to fit for the runtime services QueryVariableInfo defined in UEFI2.0 spec git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@790 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
1de04b4f83
commit
045f4521f2
|
@ -194,6 +194,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
|
||||||
<Protocol Usage="ALWAYS_CONSUMED">
|
<Protocol Usage="ALWAYS_CONSUMED">
|
||||||
<ProtocolCName>TianoDecompress</ProtocolCName>
|
<ProtocolCName>TianoDecompress</ProtocolCName>
|
||||||
</Protocol>
|
</Protocol>
|
||||||
|
<Protocol Usage="ALWAYS_CONSUMED">
|
||||||
|
<ProtocolCName>Capsule</ProtocolCName>
|
||||||
|
</Protocol>
|
||||||
</Protocols>
|
</Protocols>
|
||||||
<Guids>
|
<Guids>
|
||||||
<GuidCNames Usage="ALWAYS_CONSUMED">
|
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||||
|
|
|
@ -43,6 +43,9 @@ ARCHITECTURAL_PROTOCOL_ENTRY mArchProtocols[] = {
|
||||||
{ &gEfiRuntimeArchProtocolGuid, (VOID **)&gRuntime, NULL, NULL, FALSE },
|
{ &gEfiRuntimeArchProtocolGuid, (VOID **)&gRuntime, NULL, NULL, FALSE },
|
||||||
{ &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
{ &gEfiVariableArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
||||||
{ &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
{ &gEfiVariableWriteArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
{ &gEfiCapsuleArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE},
|
||||||
|
#endif
|
||||||
{ &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
{ &gEfiMonotonicCounterArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
||||||
{ &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
{ &gEfiResetArchProtocolGuid, (VOID **)NULL, NULL, NULL, FALSE },
|
||||||
// { &gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode, NULL, NULL, FALSE },
|
// { &gEfiStatusCodeRuntimeProtocolGuid, (VOID **)&gStatusCode, NULL, NULL, FALSE },
|
||||||
|
@ -225,6 +228,9 @@ static const GUID_TO_STRING_PROTOCOL_ENTRY MissingProtocols[] = {
|
||||||
{ &gEfiRuntimeArchProtocolGuid, (CHAR16 *)L"Runtime" },
|
{ &gEfiRuntimeArchProtocolGuid, (CHAR16 *)L"Runtime" },
|
||||||
{ &gEfiVariableArchProtocolGuid, (CHAR16 *)L"Variable" },
|
{ &gEfiVariableArchProtocolGuid, (CHAR16 *)L"Variable" },
|
||||||
{ &gEfiVariableWriteArchProtocolGuid, (CHAR16 *)L"Variable Write" },
|
{ &gEfiVariableWriteArchProtocolGuid, (CHAR16 *)L"Variable Write" },
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
{ &gEfiCapsuleArchProtocolGuid, (CHAR16 *)L"Capsule" },
|
||||||
|
#endif
|
||||||
{ &gEfiMonotonicCounterArchProtocolGuid, (CHAR16 *)L"Monotonic Counter" },
|
{ &gEfiMonotonicCounterArchProtocolGuid, (CHAR16 *)L"Monotonic Counter" },
|
||||||
{ &gEfiResetArchProtocolGuid, (CHAR16 *)L"Reset" },
|
{ &gEfiResetArchProtocolGuid, (CHAR16 *)L"Reset" },
|
||||||
// { &gEfiStatusCodeRuntimeProtocolGuid, (CHAR16 *)L"Status Code" },
|
// { &gEfiStatusCodeRuntimeProtocolGuid, (CHAR16 *)L"Status Code" },
|
||||||
|
|
|
@ -159,6 +159,7 @@
|
||||||
<Filename>Universal/Variable/Pei/Variable.msa</Filename>
|
<Filename>Universal/Variable/Pei/Variable.msa</Filename>
|
||||||
<Filename>Universal/EmuVariable/RuntimeDxe/EmuVariable.msa</Filename>
|
<Filename>Universal/EmuVariable/RuntimeDxe/EmuVariable.msa</Filename>
|
||||||
<Filename>Universal/Variable/RuntimeDxe/Variable.msa</Filename>
|
<Filename>Universal/Variable/RuntimeDxe/Variable.msa</Filename>
|
||||||
|
<Filename>Universal/Capsule/RuntimeDxe/CapsuleRuntime.msa</Filename>
|
||||||
<Filename>Universal/WatchdogTimer/Dxe/WatchDogTimer.msa</Filename>
|
<Filename>Universal/WatchdogTimer/Dxe/WatchDogTimer.msa</Filename>
|
||||||
</MsaFiles>
|
</MsaFiles>
|
||||||
<PackageHeaders>
|
<PackageHeaders>
|
||||||
|
@ -356,6 +357,11 @@
|
||||||
</Entry>
|
</Entry>
|
||||||
</GuidDeclarations>
|
</GuidDeclarations>
|
||||||
<ProtocolDeclarations>
|
<ProtocolDeclarations>
|
||||||
|
<Entry Name="Capsule">
|
||||||
|
<C_Name>gEfiCapsuleArchProtocolGuid</C_Name>
|
||||||
|
<GuidValue>5053697E-2EBC-4819-90D9-0580DEEE5754</GuidValue>
|
||||||
|
<HelpText/>
|
||||||
|
</Entry>
|
||||||
<Entry Name="CustomizedDecompress">
|
<Entry Name="CustomizedDecompress">
|
||||||
<C_Name>gEfiCustomizedDecompressProtocolGuid</C_Name>
|
<C_Name>gEfiCustomizedDecompressProtocolGuid</C_Name>
|
||||||
<GuidValue>9A44198E-A4A2-44E6-8A1F-39BEFDAC896F</GuidValue>
|
<GuidValue>9A44198E-A4A2-44E6-8A1F-39BEFDAC896F</GuidValue>
|
||||||
|
@ -663,5 +669,29 @@
|
||||||
<ValidUsage>FIXED_AT_BUILD</ValidUsage>
|
<ValidUsage>FIXED_AT_BUILD</ValidUsage>
|
||||||
<HelpText>HELP FIX ME!</HelpText>
|
<HelpText>HELP FIX ME!</HelpText>
|
||||||
</PcdEntry>
|
</PcdEntry>
|
||||||
|
<PcdEntry>
|
||||||
|
<C_Name>PcdSupportUpdateCapsuleRest</C_Name>
|
||||||
|
<Token>0x00010020</Token>
|
||||||
|
<TokenSpaceGuidCName>FIX_ME_PcdSupportUpdateCapsuleRest</TokenSpaceGuidCName>
|
||||||
|
<DatumType>BOOLEAN</DatumType>
|
||||||
|
<ValidUsage>FEATURE_FLAG</ValidUsage>
|
||||||
|
<HelpText>HELP FIX ME!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
|
<PcdEntry>
|
||||||
|
<C_Name>PcdMaxSizePopulateCapsule</C_Name>
|
||||||
|
<Token>0x00010021</Token>
|
||||||
|
<TokenSpaceGuidCName>FIX_ME_PcdMaxSizePopulateCapsule</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<ValidUsage>FIXED_AT_BUILD</ValidUsage>
|
||||||
|
<HelpText>HELP FIX ME!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
|
<PcdEntry>
|
||||||
|
<C_Name>PcdMaxSizeNonPopulateCapsule</C_Name>
|
||||||
|
<Token>0x00010022</Token>
|
||||||
|
<TokenSpaceGuidCName>FIX_ME_PcdMaxSizeNonPopulateCapsule</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<ValidUsage>FIXED_AT_BUILD</ValidUsage>
|
||||||
|
<HelpText>HELP FIX ME!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
</PcdDeclarations>
|
</PcdDeclarations>
|
||||||
</PackageSurfaceArea>
|
</PackageSurfaceArea>
|
|
@ -92,4 +92,8 @@ Abstract:
|
||||||
#include <Protocol/ScsiIo.h>
|
#include <Protocol/ScsiIo.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
#include <Protocol/Capsule.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,4 +50,8 @@ Abstract:
|
||||||
#include <Protocol/EdkDecompress.h>
|
#include <Protocol/EdkDecompress.h>
|
||||||
#include <Protocol/Print.h>
|
#include <Protocol/Print.h>
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
#include <Protocol/Capsule.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -143,6 +143,10 @@ typedef enum {
|
||||||
EsalGetVariable,
|
EsalGetVariable,
|
||||||
EsalGetNextVariableName,
|
EsalGetNextVariableName,
|
||||||
EsalSetVariable
|
EsalSetVariable
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
,
|
||||||
|
EsalQueryVariableInfo
|
||||||
|
#endif
|
||||||
} EFI_EXTENDED_SAL_VARIABLE_SERVICES_FUNC_ID;
|
} EFI_EXTENDED_SAL_VARIABLE_SERVICES_FUNC_ID;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
Capsule.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Capsule Architectural Protocol is newly added to produce UEFI2.0 capsule runtime services.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifndef _ARCH_PROTOCOL_CAPSULE_ARCH_H_
|
||||||
|
#define _ARCH_PROTOCOL_CAPSULE_ARCH_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// Global ID for the Capsule Architectural Protocol
|
||||||
|
//
|
||||||
|
#define EFI_CAPSULE_ARCH_PROTOCOL_GUID \
|
||||||
|
{ 0x5053697e, 0x2ebc, 0x4819, {0x90, 0xd9, 0x05, 0x80, 0xde, 0xee, 0x57, 0x54 }}
|
||||||
|
|
||||||
|
extern EFI_GUID gEfiCapsuleArchProtocolGuid;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT32 CapsuleArrayNumber;
|
||||||
|
VOID* CapsulePtr[1];
|
||||||
|
} EFI_CAPSULE_TABLE;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
Capsule.c
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Capsule Runtime Service Initialization
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include "CapsuleService.h"
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
CapsuleServiceInitialize (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
This code is capsule runtime service initialization.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
ImageHandle The image handle
|
||||||
|
SystemTable The system table.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
EFI STATUS
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HANDLE NewHandle;
|
||||||
|
|
||||||
|
SystemTable->RuntimeServices->UpdateCapsule = UpdateCapsule;
|
||||||
|
SystemTable->RuntimeServices->QueryCapsuleCapabilities = QueryCapsuleCapabilities;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now install the Capsule Architectural Protocol on a new handle
|
||||||
|
//
|
||||||
|
NewHandle = NULL;
|
||||||
|
|
||||||
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
|
&NewHandle,
|
||||||
|
&gEfiCapsuleArchProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
Capsule.dxs
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Dependency expression source file.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#include <AutoGen.h>
|
||||||
|
#include "DxeDepex.h"
|
||||||
|
|
||||||
|
DEPENDENCY_START
|
||||||
|
EFI_VARIABLE_ARCH_PROTOCOL_GUID
|
||||||
|
DEPENDENCY_END
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
-->
|
||||||
|
<ModuleBuildDescription xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.TianoCore.org/2006/Edk2.0 http://www.TianoCore.org/2006/Edk2.0/SurfaceArea.xsd">
|
||||||
|
<MbdHeader>
|
||||||
|
<BaseName>CapsuleRuntime</BaseName>
|
||||||
|
<Guid>42857F0A-13F2-4B21-8A23-53D3F714B840</Guid>
|
||||||
|
<Version>0</Version>
|
||||||
|
<Description>FIX ME!</Description>
|
||||||
|
<Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
|
||||||
|
<License>
|
||||||
|
All rights reserved. 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.
|
||||||
|
</License>
|
||||||
|
<Created>2006-03-12 17:09</Created>
|
||||||
|
<Modified>2006-03-19 15:19</Modified>
|
||||||
|
</MbdHeader>
|
||||||
|
<Libraries>
|
||||||
|
<Library>BaseLib</Library>
|
||||||
|
<Library>BaseMemoryLib</Library>
|
||||||
|
<Library>UefiDriverEntryPoint</Library>
|
||||||
|
<Library>DxeServicesTableLib</Library>
|
||||||
|
<Library>EdkDxeRuntimeDriverLib</Library>
|
||||||
|
<Library>UefiLib</Library>
|
||||||
|
<Library>BaseDebugLibNull</Library>
|
||||||
|
<Library>BasePrintLib</Library>
|
||||||
|
<Library>DxeMemoryAllocationLib</Library>
|
||||||
|
<Library>UefiBootServicesTableLib</Library>
|
||||||
|
</Libraries>
|
||||||
|
<BuildOptions ToolChain="MSFT">
|
||||||
|
<ImageEntryPoint>_ModuleEntryPoint</ImageEntryPoint>
|
||||||
|
</BuildOptions>
|
||||||
|
</ModuleBuildDescription>
|
|
@ -0,0 +1,108 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.-->
|
||||||
|
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
|
||||||
|
<MsaHeader>
|
||||||
|
<ModuleName>CapsuleRuntime</ModuleName>
|
||||||
|
<ModuleType>DXE_RUNTIME_DRIVER</ModuleType>
|
||||||
|
<GuidValue>42857F0A-13F2-4B21-8A23-53D3F714B840</GuidValue>
|
||||||
|
<Version>1.0</Version>
|
||||||
|
<Abstract>Component description file for Capsule module.</Abstract>
|
||||||
|
<Description>FIX ME!</Description>
|
||||||
|
<Copyright>Copyright (c) 2004-2006, Intel Corporation</Copyright>
|
||||||
|
<License>All rights reserved. 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.</License>
|
||||||
|
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
|
||||||
|
</MsaHeader>
|
||||||
|
<ModuleDefinitions>
|
||||||
|
<SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
|
||||||
|
<BinaryModule>false</BinaryModule>
|
||||||
|
<OutputFileBasename>CapsuleRuntime</OutputFileBasename>
|
||||||
|
</ModuleDefinitions>
|
||||||
|
<LibraryClassDefinitions>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>UefiLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>UefiDriverEntryPoint</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>DxeServicesTableLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>DxeRuntimeDriverLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>DebugLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>PcdLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>BaseMemoryLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
<LibraryClass Usage="ALWAYS_CONSUMED">
|
||||||
|
<Keyword>UefiBootServicesTableLib</Keyword>
|
||||||
|
</LibraryClass>
|
||||||
|
</LibraryClassDefinitions>
|
||||||
|
<SourceFiles>
|
||||||
|
<Filename>Capsule.c</Filename>
|
||||||
|
<Filename>CapsuleService.c</Filename>
|
||||||
|
<Filename>CapsuleService.h</Filename>
|
||||||
|
<Filename>Capsule.dxs</Filename>
|
||||||
|
</SourceFiles>
|
||||||
|
<PackageDependencies>
|
||||||
|
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Package PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
|
||||||
|
</PackageDependencies>
|
||||||
|
<Protocols>
|
||||||
|
<Protocol Usage="ALWAYS_CONSUMED">
|
||||||
|
<ProtocolCName>Capsule</ProtocolCName>
|
||||||
|
</Protocol>
|
||||||
|
</Protocols>
|
||||||
|
<Guids>
|
||||||
|
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||||
|
<GuidCName>CapsuleVendor</GuidCName>
|
||||||
|
</GuidCNames>
|
||||||
|
<GuidCNames Usage="ALWAYS_CONSUMED">
|
||||||
|
<GuidCName>Capsule</GuidCName>
|
||||||
|
</GuidCNames>
|
||||||
|
</Guids>
|
||||||
|
<Externs>
|
||||||
|
<Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
|
||||||
|
<Specification>EDK_RELEASE_VERSION 0x00090000</Specification>
|
||||||
|
<Extern>
|
||||||
|
<ModuleEntryPoint>CapsuleServiceInitialize</ModuleEntryPoint>
|
||||||
|
</Extern>
|
||||||
|
</Externs>
|
||||||
|
<PcdCoded>
|
||||||
|
<PcdEntry PcdItemType="FEATURE_FLAG">
|
||||||
|
<C_Name>PcdSupportUpdateCapsuleRest</C_Name>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<HelpText>Fix Me!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
|
<PcdEntry PcdItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>MaxSizePopulateCapsule</C_Name>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<HelpText>Fix Me!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
|
<PcdEntry PcdItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>MaxSizeNonPopulateCapsule</C_Name>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<HelpText>Fix Me!</HelpText>
|
||||||
|
</PcdEntry>
|
||||||
|
</PcdCoded>
|
||||||
|
</ModuleSurfaceArea>
|
|
@ -0,0 +1,238 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
CapsuleService.c
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Capsule Runtime Service.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include "CapsuleService.h"
|
||||||
|
|
||||||
|
|
||||||
|
STATIC EFI_GUID mEfiCapsuleHeaderGuid = EFI_CAPSULE_GUID;
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
UpdateCapsule (
|
||||||
|
IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
This code finds whether the capsules need reset to update, if not, update immediately.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
CapsuleHeaderArray A array of pointers to capsule headers passed in
|
||||||
|
CapsuleCount The number of capsule
|
||||||
|
ScatterGatherList Physical address of datablock list points to capsule
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
EFI STATUS
|
||||||
|
EFI_SUCCESS Valid capsule was passed.If CAPSULE_FLAG_PERSIT_ACROSS_RESET is
|
||||||
|
not set, the capsule has been successfully processed by the firmware.
|
||||||
|
If it set, the ScattlerGatherList is successfully to be set.
|
||||||
|
EFI_INVALID_PARAMETER CapsuleCount is less than 1,CapsuleGuid is not supported.
|
||||||
|
EFI_DEVICE_ERROR Failed to SetVariable or AllocatePool or ProcessFirmwareVolume.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
UINTN CapsuleSize;
|
||||||
|
UINTN ArrayNumber;
|
||||||
|
VOID *BufferPtr;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HANDLE FvHandle;
|
||||||
|
UEFI_CAPSULE_HEADER *CapsuleHeader;
|
||||||
|
|
||||||
|
if (CapsuleCount < 1) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
BufferPtr = NULL;
|
||||||
|
CapsuleHeader = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
//Compare GUIDs with EFI_CAPSULE_GUID, if capsule header contains CAPSULE_FLAGS_PERSIST_ACROSS_RESET
|
||||||
|
//and CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE flags,whatever the GUID is ,the service supports.
|
||||||
|
//
|
||||||
|
for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {
|
||||||
|
CapsuleHeader = CapsuleHeaderArray[ArrayNumber];
|
||||||
|
if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) && !(CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
if (!CompareGuid (&CapsuleHeader->CapsuleGuid, &mEfiCapsuleHeaderGuid)) {
|
||||||
|
if (!(CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE)) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//Assume that capsules have the same flags on reseting or not.
|
||||||
|
//
|
||||||
|
CapsuleHeader = CapsuleHeaderArray[0];
|
||||||
|
|
||||||
|
if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {
|
||||||
|
//
|
||||||
|
//Check if the platform supports update capsule across a system reset
|
||||||
|
//
|
||||||
|
if (!FeaturePcdGet(PcdSupportUpdateCapsuleRest)) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ScatterGatherList == 0) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
} else {
|
||||||
|
Status = EfiSetVariable (
|
||||||
|
EFI_CAPSULE_VARIABLE_NAME,
|
||||||
|
&gEfiCapsuleVendorGuid,
|
||||||
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||||
|
sizeof (UINTN),
|
||||||
|
(VOID *) &ScatterGatherList
|
||||||
|
);
|
||||||
|
if (Status != EFI_SUCCESS) {
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//The rest occurs in the condition of non-reset mode
|
||||||
|
//
|
||||||
|
if (EfiAtRuntime ()) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//Here should be in the boot-time
|
||||||
|
//
|
||||||
|
for (ArrayNumber = 0; ArrayNumber < CapsuleCount ; ArrayNumber++) {
|
||||||
|
CapsuleHeader = CapsuleHeaderArray[ArrayNumber];
|
||||||
|
CapsuleSize = CapsuleHeader->CapsuleImageSize - CapsuleHeader->HeaderSize;
|
||||||
|
Status = gBS->AllocatePool (EfiBootServicesData, CapsuleSize, &BufferPtr);
|
||||||
|
if (Status != EFI_SUCCESS) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
gBS->CopyMem (BufferPtr, (UINT8*)CapsuleHeader+ CapsuleHeader->HeaderSize, CapsuleSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
//Call DXE service ProcessFirmwareVolume to process immediatelly
|
||||||
|
//
|
||||||
|
Status = gDS->ProcessFirmwareVolume (BufferPtr, CapsuleSize, &FvHandle);
|
||||||
|
if (Status != EFI_SUCCESS) {
|
||||||
|
gBS->FreePool (BufferPtr);
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
gDS->Dispatch ();
|
||||||
|
gBS->FreePool (BufferPtr);
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
Done:
|
||||||
|
if (BufferPtr != NULL) {
|
||||||
|
gBS->FreePool (BufferPtr);
|
||||||
|
}
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryCapsuleCapabilities (
|
||||||
|
IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
OUT UINT64 *MaxiumCapsuleSize,
|
||||||
|
OUT EFI_RESET_TYPE *ResetType
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
This code is to query about capsule capability.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
CapsuleHeaderArray A array of pointers to capsule headers passed in
|
||||||
|
CapsuleCount The number of capsule
|
||||||
|
MaxiumCapsuleSize Max capsule size is supported
|
||||||
|
ResetType Reset type the capsule indicates, if reset is not needed,return EfiResetCold.
|
||||||
|
If reset is needed, return EfiResetWarm.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
EFI STATUS
|
||||||
|
EFI_SUCCESS Valid answer returned
|
||||||
|
EFI_INVALID_PARAMETER MaxiumCapsuleSize is NULL,ResetType is NULL.CapsuleCount is less than 1,CapsuleGuid is not supported.
|
||||||
|
EFI_UNSUPPORTED The capsule type is not supported.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
UINTN ArrayNumber;
|
||||||
|
UEFI_CAPSULE_HEADER *CapsuleHeader;
|
||||||
|
|
||||||
|
if (CapsuleCount < 1) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((MaxiumCapsuleSize == NULL) ||(ResetType == NULL)) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
CapsuleHeader = NULL;
|
||||||
|
|
||||||
|
//
|
||||||
|
//Compare GUIDs with EFI_CAPSULE_GUID, if capsule header contains CAPSULE_FLAGS_PERSIST_ACROSS_RESET
|
||||||
|
//and CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE flags,whatever the GUID is ,the service supports.
|
||||||
|
//
|
||||||
|
for (ArrayNumber = 0; ArrayNumber < CapsuleCount; ArrayNumber++) {
|
||||||
|
CapsuleHeader = CapsuleHeaderArray[ArrayNumber];
|
||||||
|
if ((CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE) && !(CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET)) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
if (!CompareGuid (&CapsuleHeader->CapsuleGuid, &mEfiCapsuleHeaderGuid)) {
|
||||||
|
if (!(CapsuleHeader->Flags & CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE)) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//Assume that capsules have the same flags on reseting or not.
|
||||||
|
//
|
||||||
|
CapsuleHeader = CapsuleHeaderArray[0];
|
||||||
|
if ((CapsuleHeader->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {
|
||||||
|
//
|
||||||
|
//Check if the platform supports update capsule across a system reset
|
||||||
|
//
|
||||||
|
if (!FeaturePcdGet(PcdSupportUpdateCapsuleRest)) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
*ResetType = EfiResetWarm;
|
||||||
|
*MaxiumCapsuleSize = FixedPcdGet32(PcdMaxSizePopulateCapsule);
|
||||||
|
} else {
|
||||||
|
*ResetType = EfiResetCold;
|
||||||
|
*MaxiumCapsuleSize = FixedPcdGet32(PcdMaxSizeNonPopulateCapsule);
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
CapsuleService.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Capsule Runtime Service
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#ifndef _CAPSULE_RUNTIME_H_
|
||||||
|
#define _CAPSULE_RUNTIME_H_
|
||||||
|
|
||||||
|
#include <Common/CapsuleName.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
UpdateCapsule(
|
||||||
|
IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
IN EFI_PHYSICAL_ADDRESS ScatterGatherList OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryCapsuleCapabilities(
|
||||||
|
IN UEFI_CAPSULE_HEADER **CapsuleHeaderArray,
|
||||||
|
IN UINTN CapsuleCount,
|
||||||
|
OUT UINT64 *MaxiumCapsuleSize,
|
||||||
|
OUT EFI_RESET_TYPE *ResetType
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?><!-- Copyright (c) 2006, Intel Corporation
|
||||||
|
All rights reserved. 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.-->
|
||||||
|
<project basedir="." default="CapsuleRuntime"><!--Apply external ANT tasks-->
|
||||||
|
<taskdef resource="GenBuild.tasks"/>
|
||||||
|
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
|
||||||
|
<property environment="env"/>
|
||||||
|
<property name="WORKSPACE_DIR" value="${env.WORKSPACE}"/>
|
||||||
|
<import file="${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml"/><!--MODULE_RELATIVE PATH is relative to PACKAGE_DIR-->
|
||||||
|
<property name="MODULE_RELATIVE_PATH" value="Universal/Capsule/RuntimeDxe"/>
|
||||||
|
<property name="MODULE_DIR" value="${PACKAGE_DIR}/${MODULE_RELATIVE_PATH}"/>
|
||||||
|
<property name="COMMON_FILE" value="${WORKSPACE_DIR}/Tools/Conf/Common.xml"/>
|
||||||
|
<target name="CapsuleRuntime">
|
||||||
|
<GenBuild baseName="CapsuleRuntime" mbdFilename="${MODULE_DIR}/CapsuleRuntime.mbd" msaFilename="${MODULE_DIR}/CapsuleRuntime.msa"/>
|
||||||
|
</target>
|
||||||
|
<target depends="CapsuleRuntime_clean" name="clean"/>
|
||||||
|
<target depends="CapsuleRuntime_cleanall" name="cleanall"/>
|
||||||
|
<target name="CapsuleRuntime_clean">
|
||||||
|
<OutputDirSetup baseName="CapsuleRuntime" mbdFilename="${MODULE_DIR}/CapsuleRuntime.mbd" msaFilename="${MODULE_DIR}/CapsuleRuntime.msa"/>
|
||||||
|
<if>
|
||||||
|
<available file="${DEST_DIR_OUTPUT}/CapsuleRuntime_build.xml"/>
|
||||||
|
<then>
|
||||||
|
<ant antfile="${DEST_DIR_OUTPUT}/CapsuleRuntime_build.xml" target="clean"/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
<delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>
|
||||||
|
</target>
|
||||||
|
<target name="CapsuleRuntime_cleanall">
|
||||||
|
<OutputDirSetup baseName="CapsuleRuntime" mbdFilename="${MODULE_DIR}/CapsuleRuntime.mbd" msaFilename="${MODULE_DIR}/CapsuleRuntime.msa"/>
|
||||||
|
<if>
|
||||||
|
<available file="${DEST_DIR_OUTPUT}/CapsuleRuntime_build.xml"/>
|
||||||
|
<then>
|
||||||
|
<ant antfile="${DEST_DIR_OUTPUT}/CapsuleRuntime_build.xml" target="cleanall"/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
<delete dir="${DEST_DIR_OUTPUT}"/>
|
||||||
|
<delete dir="${DEST_DIR_DEBUG}"/>
|
||||||
|
<delete>
|
||||||
|
<fileset dir="${BIN_DIR}" includes="**CapsuleRuntime*"/>
|
||||||
|
</delete>
|
||||||
|
</target>
|
||||||
|
</project>
|
|
@ -656,6 +656,125 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize,
|
||||||
|
IN VARIABLE_GLOBAL *Global,
|
||||||
|
IN UINT32 Instance
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
This code returns information about the EFI variables.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Attributes Attributes bitmask to specify the type of variables
|
||||||
|
on which to return information.
|
||||||
|
MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||||
|
for the EFI variables associated with the attributes specified.
|
||||||
|
RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||||
|
for the EFI variables associated with the attributes specified.
|
||||||
|
MaximumVariableSize Pointer to the maximum size of the individual EFI variables
|
||||||
|
associated with the attributes specified.
|
||||||
|
Global Pointer to VARIABLE_GLOBAL structure.
|
||||||
|
Instance Instance of the Firmware Volume.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
EFI STATUS
|
||||||
|
EFI_INVALID_PARAMETER - An invalid combination of attribute bits was supplied.
|
||||||
|
EFI_SUCCESS - Query successfully.
|
||||||
|
EFI_UNSUPPORTED - The attribute is not supported on this platform.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
VARIABLE_HEADER *Variable;
|
||||||
|
VARIABLE_HEADER *NextVariable;
|
||||||
|
UINT64 VariableSize;
|
||||||
|
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||||
|
|
||||||
|
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)) == 0) {
|
||||||
|
//
|
||||||
|
// Make sure the Attributes combination is supported by the platform.
|
||||||
|
//
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||||
|
//
|
||||||
|
// Make sure if runtime bit is set, boot service bit is set also.
|
||||||
|
//
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
} else if (EfiAtRuntime () && !(Attributes & EFI_VARIABLE_RUNTIME_ACCESS)) {
|
||||||
|
//
|
||||||
|
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||||
|
//
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
|
||||||
|
//
|
||||||
|
// Query is Volatile related.
|
||||||
|
//
|
||||||
|
VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase);
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Query is Non-Volatile related.
|
||||||
|
//
|
||||||
|
VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->NonVolatileVariableBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now let's fill *MaximumVariableStorageSize *RemainingVariableStorageSize
|
||||||
|
// with the storage size (excluding the storage header size)
|
||||||
|
//
|
||||||
|
*MaximumVariableStorageSize = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER);
|
||||||
|
*RemainingVariableStorageSize = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Let *MaximumVariableSize be MAX_VARIABLE_SIZE
|
||||||
|
//
|
||||||
|
*MaximumVariableSize = MAX_VARIABLE_SIZE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Point to the starting address of the variables.
|
||||||
|
//
|
||||||
|
Variable = (VARIABLE_HEADER *) (VariableStoreHeader + 1);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now walk through the related variable store.
|
||||||
|
//
|
||||||
|
while (Variable < GetEndPointer (VariableStoreHeader)) {
|
||||||
|
if (Variable->StartId != VARIABLE_DATA) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
NextVariable = (VARIABLE_HEADER *) (GetVariableDataPtr (Variable) + Variable->DataSize + GET_PAD_SIZE (Variable->DataSize));
|
||||||
|
VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;
|
||||||
|
|
||||||
|
if (Variable->State == VAR_ADDED) {
|
||||||
|
*RemainingVariableStorageSize -= VariableSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Go to the next one.
|
||||||
|
//
|
||||||
|
Variable = NextVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
InitializeVariableStore (
|
InitializeVariableStore (
|
||||||
|
|
|
@ -114,6 +114,36 @@ Returns:
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
RuntimeServiceQueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
return QueryVariableInfo (
|
||||||
|
Attributes,
|
||||||
|
MaximumVariableStorageSize,
|
||||||
|
RemainingVariableStorageSize,
|
||||||
|
MaximumVariableSize,
|
||||||
|
&mVariableModuleGlobal->VariableBase[Physical],
|
||||||
|
mVariableModuleGlobal->FvbInstance
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
VariableClassAddressChangeEvent (
|
VariableClassAddressChangeEvent (
|
||||||
|
@ -166,6 +196,9 @@ Returns:
|
||||||
SystemTable->RuntimeServices->GetVariable = RuntimeServiceGetVariable;
|
SystemTable->RuntimeServices->GetVariable = RuntimeServiceGetVariable;
|
||||||
SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;
|
SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;
|
||||||
SystemTable->RuntimeServices->SetVariable = RuntimeServiceSetVariable;
|
SystemTable->RuntimeServices->SetVariable = RuntimeServiceSetVariable;
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
SystemTable->RuntimeServices->QueryVariableInfo = RuntimeServiceQueryVariableInfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now install the Variable Runtime Architectural Protocol on a new handle
|
// Now install the Variable Runtime Architectural Protocol on a new handle
|
||||||
|
|
|
@ -89,6 +89,19 @@ Returns:
|
||||||
);
|
);
|
||||||
return ReturnVal;
|
return ReturnVal;
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
case EsalQueryVariableInfo:
|
||||||
|
ReturnVal.Status = QueryVariableInfo (
|
||||||
|
(UINT32) Arg2,
|
||||||
|
(UINT64 *) Arg3,
|
||||||
|
(UINT64 *) Arg4,
|
||||||
|
(UINT64 *) Arg5,
|
||||||
|
&Global->VariableBase[VirtualMode],
|
||||||
|
Global->FvbInstance
|
||||||
|
);
|
||||||
|
return ReturnVal;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;
|
ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;
|
||||||
return ReturnVal;
|
return ReturnVal;
|
||||||
|
@ -160,6 +173,10 @@ Returns:
|
||||||
EsalGetNextVariableName,
|
EsalGetNextVariableName,
|
||||||
EsalVariableCommonEntry,
|
EsalVariableCommonEntry,
|
||||||
EsalSetVariable,
|
EsalSetVariable,
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EsalVariableCommonEntry,
|
||||||
|
EsalQueryVariableInfo,
|
||||||
|
#endif
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -140,4 +140,18 @@ SetVariable (
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize,
|
||||||
|
IN VARIABLE_GLOBAL *Global,
|
||||||
|
IN UINT32 Instance
|
||||||
|
)
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -92,6 +92,9 @@ UINTN mVirtualMapMaxIndex;
|
||||||
|
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *mMyLoadedImage;
|
EFI_LOADED_IMAGE_PROTOCOL *mMyLoadedImage;
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
STATIC EFI_GUID mEfiCapsuleHeaderGuid = EFI_CAPSULE_GUID;
|
||||||
|
#endif
|
||||||
//
|
//
|
||||||
// Worker Functions
|
// Worker Functions
|
||||||
//
|
//
|
||||||
|
@ -356,6 +359,9 @@ RuntimeDriverSetVirtualAddressMap (
|
||||||
UINTN Index1;
|
UINTN Index1;
|
||||||
EFI_DRIVER_OS_HANDOFF_HEADER *DriverOsHandoffHeader;
|
EFI_DRIVER_OS_HANDOFF_HEADER *DriverOsHandoffHeader;
|
||||||
EFI_DRIVER_OS_HANDOFF *DriverOsHandoff;
|
EFI_DRIVER_OS_HANDOFF *DriverOsHandoff;
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_CAPSULE_TABLE *CapsuleTable;
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Can only switch to virtual addresses once the memory map is locked down,
|
// Can only switch to virtual addresses once the memory map is locked down,
|
||||||
|
@ -464,6 +470,11 @@ RuntimeDriverSetVirtualAddressMap (
|
||||||
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetVariable);
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetVariable);
|
||||||
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->SetVariable);
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->SetVariable);
|
||||||
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetNextVariableName);
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->GetNextVariableName);
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->QueryVariableInfo);
|
||||||
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->UpdateCapsule);
|
||||||
|
RuntimeDriverConvertInternalPointer ((VOID **) &gRT->QueryCapsuleCapabilities);
|
||||||
|
#endif
|
||||||
RuntimeDriverCalculateEfiHdrCrc (&gRT->Hdr);
|
RuntimeDriverCalculateEfiHdrCrc (&gRT->Hdr);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -486,6 +497,15 @@ RuntimeDriverSetVirtualAddressMap (
|
||||||
|
|
||||||
RuntimeDriverConvertPointer (EFI_OPTIONAL_POINTER, (VOID **) &(gST->ConfigurationTable[Index].VendorTable));
|
RuntimeDriverConvertPointer (EFI_OPTIONAL_POINTER, (VOID **) &(gST->ConfigurationTable[Index].VendorTable));
|
||||||
}
|
}
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
if (CompareGuid (&mEfiCapsuleHeaderGuid, &(gST->ConfigurationTable[Index].VendorGuid))) {
|
||||||
|
CapsuleTable = gST->ConfigurationTable[Index].VendorTable;
|
||||||
|
for (Index1 = 0; Index1 < CapsuleTable->CapsuleArrayNumber; Index1++) {
|
||||||
|
RuntimeDriverConvertPointer (EFI_OPTIONAL_POINTER, (VOID **) &CapsuleTable->CapsulePtr[Index1]);
|
||||||
|
}
|
||||||
|
RuntimeDriverConvertPointer (EFI_OPTIONAL_POINTER, (VOID **) &(gST->ConfigurationTable[Index].VendorTable));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Convert the runtime fields of the EFI System Table and recompute the CRC-32
|
// Convert the runtime fields of the EFI System Table and recompute the CRC-32
|
||||||
|
|
|
@ -114,6 +114,36 @@ Returns:
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
RuntimeServiceQueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
return QueryVariableInfo (
|
||||||
|
Attributes,
|
||||||
|
MaximumVariableStorageSize,
|
||||||
|
RemainingVariableStorageSize,
|
||||||
|
MaximumVariableSize,
|
||||||
|
&mVariableModuleGlobal->VariableBase[Physical],
|
||||||
|
mVariableModuleGlobal->FvbInstance
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
VariableClassAddressChangeEvent (
|
VariableClassAddressChangeEvent (
|
||||||
|
@ -166,6 +196,9 @@ Returns:
|
||||||
SystemTable->RuntimeServices->GetVariable = RuntimeServiceGetVariable;
|
SystemTable->RuntimeServices->GetVariable = RuntimeServiceGetVariable;
|
||||||
SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;
|
SystemTable->RuntimeServices->GetNextVariableName = RuntimeServiceGetNextVariableName;
|
||||||
SystemTable->RuntimeServices->SetVariable = RuntimeServiceSetVariable;
|
SystemTable->RuntimeServices->SetVariable = RuntimeServiceSetVariable;
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
SystemTable->RuntimeServices->QueryVariableInfo = RuntimeServiceQueryVariableInfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Now install the Variable Runtime Architectural Protocol on a new handle
|
// Now install the Variable Runtime Architectural Protocol on a new handle
|
||||||
|
|
|
@ -89,6 +89,19 @@ Returns:
|
||||||
);
|
);
|
||||||
return ReturnVal;
|
return ReturnVal;
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
case EsalQueryVariableInfo:
|
||||||
|
ReturnVal.Status = QueryVariableInfo (
|
||||||
|
(UINT32) Arg2,
|
||||||
|
(UINT64 *) Arg3,
|
||||||
|
(UINT64 *) Arg4,
|
||||||
|
(UINT64 *) Arg5,
|
||||||
|
&Global->VariableBase[VirtualMode],
|
||||||
|
Global->FvbInstance
|
||||||
|
);
|
||||||
|
return ReturnVal;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;
|
ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;
|
||||||
return ReturnVal;
|
return ReturnVal;
|
||||||
|
@ -160,6 +173,10 @@ Returns:
|
||||||
EsalGetNextVariableName,
|
EsalGetNextVariableName,
|
||||||
EsalVariableCommonEntry,
|
EsalVariableCommonEntry,
|
||||||
EsalSetVariable,
|
EsalSetVariable,
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EsalVariableCommonEntry,
|
||||||
|
EsalQueryVariableInfo,
|
||||||
|
#endif
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1090,6 +1090,135 @@ Returns:
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize,
|
||||||
|
IN VARIABLE_GLOBAL *Global,
|
||||||
|
IN UINT32 Instance
|
||||||
|
)
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
This code returns information about the EFI variables.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Attributes Attributes bitmask to specify the type of variables
|
||||||
|
on which to return information.
|
||||||
|
MaximumVariableStorageSize Pointer to the maximum size of the storage space available
|
||||||
|
for the EFI variables associated with the attributes specified.
|
||||||
|
RemainingVariableStorageSize Pointer to the remaining size of the storage space available
|
||||||
|
for the EFI variables associated with the attributes specified.
|
||||||
|
MaximumVariableSize Pointer to the maximum size of the individual EFI variables
|
||||||
|
associated with the attributes specified.
|
||||||
|
Global Pointer to VARIABLE_GLOBAL structure.
|
||||||
|
Instance Instance of the Firmware Volume.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
EFI STATUS
|
||||||
|
EFI_INVALID_PARAMETER - An invalid combination of attribute bits was supplied.
|
||||||
|
EFI_SUCCESS - Query successfully.
|
||||||
|
EFI_UNSUPPORTED - The attribute is not supported on this platform.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
{
|
||||||
|
VARIABLE_HEADER *Variable;
|
||||||
|
VARIABLE_HEADER *NextVariable;
|
||||||
|
UINT64 VariableSize;
|
||||||
|
VARIABLE_STORE_HEADER *VariableStoreHeader;
|
||||||
|
|
||||||
|
if(MaximumVariableStorageSize == NULL || RemainingVariableStorageSize == NULL || MaximumVariableSize == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Attributes & (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)) == 0) {
|
||||||
|
//
|
||||||
|
// Make sure the Attributes combination is supported by the platform.
|
||||||
|
//
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
} else if ((Attributes & (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS)) == EFI_VARIABLE_RUNTIME_ACCESS) {
|
||||||
|
//
|
||||||
|
// Make sure if runtime bit is set, boot service bit is set also.
|
||||||
|
//
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
} else if (EfiAtRuntime () && !(Attributes & EFI_VARIABLE_RUNTIME_ACCESS)) {
|
||||||
|
//
|
||||||
|
// Make sure RT Attribute is set if we are in Runtime phase.
|
||||||
|
//
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0) {
|
||||||
|
//
|
||||||
|
// Query is Volatile related.
|
||||||
|
//
|
||||||
|
VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->VolatileVariableBase);
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Query is Non-Volatile related.
|
||||||
|
//
|
||||||
|
VariableStoreHeader = (VARIABLE_STORE_HEADER *) ((UINTN) Global->NonVolatileVariableBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now let's fill *MaximumVariableStorageSize *RemainingVariableStorageSize
|
||||||
|
// with the storage size (excluding the storage header size).
|
||||||
|
//
|
||||||
|
*MaximumVariableStorageSize = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER);
|
||||||
|
*RemainingVariableStorageSize = VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Let *MaximumVariableSize be MAX_VARIABLE_SIZE.
|
||||||
|
//
|
||||||
|
*MaximumVariableSize = MAX_VARIABLE_SIZE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Point to the starting address of the variables.
|
||||||
|
//
|
||||||
|
Variable = (VARIABLE_HEADER *) (VariableStoreHeader + 1);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now walk through the related variable store.
|
||||||
|
//
|
||||||
|
while (IsValidVariableHeader (Variable) && (Variable < GetEndPointer (VariableStoreHeader))) {
|
||||||
|
NextVariable = GetNextVariablePtr (Variable);
|
||||||
|
VariableSize = (UINT64) (UINTN) NextVariable - (UINT64) (UINTN) Variable;
|
||||||
|
|
||||||
|
if (EfiAtRuntime ()) {
|
||||||
|
//
|
||||||
|
// we don't take the state of the variables in mind
|
||||||
|
// when calculating RemainingVariableStorageSize,
|
||||||
|
// since the space occupied by variables not marked with
|
||||||
|
// VAR_ADDED is not allowed to be reclaimed in Runtime.
|
||||||
|
//
|
||||||
|
*RemainingVariableStorageSize -= VariableSize;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Only care about Variables with State VAR_ADDED,because
|
||||||
|
// the space not marked as VAR_ADDED is reclaimable now.
|
||||||
|
//
|
||||||
|
if (Variable->State == VAR_ADDED) {
|
||||||
|
*RemainingVariableStorageSize -= VariableSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Go to the next one
|
||||||
|
//
|
||||||
|
Variable = NextVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
VariableCommonInitialize (
|
VariableCommonInitialize (
|
||||||
|
|
|
@ -140,4 +140,18 @@ SetVariable (
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
#if (EFI_SPECIFICATION_VERSION >= 0x00020000)
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
QueryVariableInfo (
|
||||||
|
IN UINT32 Attributes,
|
||||||
|
OUT UINT64 *MaximumVariableStorageSize,
|
||||||
|
OUT UINT64 *RemainingVariableStorageSize,
|
||||||
|
OUT UINT64 *MaximumVariableSize,
|
||||||
|
IN VARIABLE_GLOBAL *Global,
|
||||||
|
IN UINT32 Instance
|
||||||
|
)
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2600,6 +2600,106 @@
|
||||||
<FfsFormatKey>RT_DRIVER</FfsFormatKey>
|
<FfsFormatKey>RT_DRIVER</FfsFormatKey>
|
||||||
</ModuleSaBuildOptions>
|
</ModuleSaBuildOptions>
|
||||||
</ModuleSA>
|
</ModuleSA>
|
||||||
|
<ModuleSA SupArchList="IA32" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674" ModuleGuid="42857F0A-13F2-4B21-8A23-53D3F714B840">
|
||||||
|
<Libraries>
|
||||||
|
<Instance ModuleGuid="ff5c7a2c-ab7a-4366-8616-11c6e53247b6" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="fd44e603-002a-4b29-9f5f-529e815b6165" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="3a004ba5-efe0-4a61-9f1a-267a46ae5ba9" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="a86fbfca-0183-4eeb-aa8a-762e3b7da1f3" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="baa1baa3-0a8d-402c-8042-985115fae953" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="9ba1d976-0624-41a3-8650-28165e8d9ae8" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
<Instance ModuleGuid="b1ee6c28-54aa-4d17-b705-3e28ccb27b2e" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
|
||||||
|
<Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
</Libraries>
|
||||||
|
<PcdBuildDefinition>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdMaximumUnicodeStringLength</C_Name>
|
||||||
|
<Token>0x00000001</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>1000000</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdMaximumAsciiStringLength</C_Name>
|
||||||
|
<Token>0x00000002</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>1000000</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdDebugPropertyMask</C_Name>
|
||||||
|
<Token>0x00000005</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT8</DatumType>
|
||||||
|
<MaxDatumSize>1</MaxDatumSize>
|
||||||
|
<Value>0x1f</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdSpinLockTimeout</C_Name>
|
||||||
|
<Token>0x00000004</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>10000000</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="PATCHABLE_IN_MODULE">
|
||||||
|
<C_Name>PcdDebugPrintErrorLevel</C_Name>
|
||||||
|
<Token>0x00000006</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>0x80000000</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdMaximumLinkedListLength</C_Name>
|
||||||
|
<Token>0x00000003</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>1000000</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdDebugClearMemoryValue</C_Name>
|
||||||
|
<Token>0x00000008</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT8</DatumType>
|
||||||
|
<MaxDatumSize>1</MaxDatumSize>
|
||||||
|
<Value>0xAF</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FEATURE_FLAG">
|
||||||
|
<C_Name>PcdSupportUpdateCapsuleRest</C_Name>
|
||||||
|
<Token>0x00010020</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>BOOLEAN</DatumType>
|
||||||
|
<MaxDatumSize>1</MaxDatumSize>
|
||||||
|
<Value>FALSE</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdMaxSizePopulateCapsule</C_Name>
|
||||||
|
<Token>0x00010021</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>0x0</Value>
|
||||||
|
</PcdData>
|
||||||
|
<PcdData ItemType="FIXED_AT_BUILD">
|
||||||
|
<C_Name>PcdMaxSizeNonPopulateCapsule</C_Name>
|
||||||
|
<Token>0x00010022</Token>
|
||||||
|
<TokenSpaceGuidCName>gEfiEdkModulePkgTokenSpaceGuid</TokenSpaceGuidCName>
|
||||||
|
<DatumType>UINT32</DatumType>
|
||||||
|
<MaxDatumSize>4</MaxDatumSize>
|
||||||
|
<Value>0x0</Value>
|
||||||
|
</PcdData>
|
||||||
|
</PcdBuildDefinition>
|
||||||
|
<ModuleSaBuildOptions>
|
||||||
|
<FvBinding>FV_RECOVERY</FvBinding>
|
||||||
|
<FfsFormatKey>RT_DRIVER</FfsFormatKey>
|
||||||
|
</ModuleSaBuildOptions>
|
||||||
|
</ModuleSA>
|
||||||
<ModuleSA SupArchList="IA32" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674" ModuleGuid="F80697E9-7FD6-4665-8646-88E33EF71DFC">
|
<ModuleSA SupArchList="IA32" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674" ModuleGuid="F80697E9-7FD6-4665-8646-88E33EF71DFC">
|
||||||
<Libraries>
|
<Libraries>
|
||||||
<Instance ModuleGuid="ff5c7a2c-ab7a-4366-8616-11c6e53247b6" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
<Instance ModuleGuid="ff5c7a2c-ab7a-4366-8616-11c6e53247b6" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
|
||||||
|
|
Loading…
Reference in New Issue