mirror of https://github.com/acidanthera/audk.git
MdeModulePkg: Add ResetSystemRuntimeDxe driver
Signed-off-by: jljusten Reviewed-by: mdkinney git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11938 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7c636bd022
commit
51a0c5f28c
|
@ -86,6 +86,7 @@
|
||||||
PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
|
PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
|
||||||
DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
|
DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
|
||||||
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
|
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
|
||||||
|
ResetSystemLib|MdeModulePkg/Library/BaseResetSystemLibNull/BaseResetSystemLibNull.inf
|
||||||
|
|
||||||
[LibraryClasses.EBC.PEIM]
|
[LibraryClasses.EBC.PEIM]
|
||||||
IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
|
IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
|
||||||
|
@ -249,6 +250,7 @@
|
||||||
MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
|
MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
|
||||||
MdeModulePkg/Universal/Metronome/Metronome.inf
|
MdeModulePkg/Universal/Metronome/Metronome.inf
|
||||||
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
|
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
|
||||||
|
MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
|
||||||
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
|
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
|
||||||
|
|
||||||
MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
|
MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
/** @file
|
||||||
|
Reset Architectural Protocol implementation
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "ResetSystem.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// The handle onto which the Reset Architectural Protocol is installed
|
||||||
|
//
|
||||||
|
EFI_HANDLE mResetHandle = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The driver's entry point.
|
||||||
|
|
||||||
|
It initializes the Reset Architectural Protocol.
|
||||||
|
|
||||||
|
@param[in] ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
@param[in] SystemTable A pointer to the EFI System Table.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The entry point is executed successfully.
|
||||||
|
@retval other Cannot install ResetArch protocol.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
InitializeResetSystem (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make sure the Reset Architectural Protocol is not already installed in the system
|
||||||
|
//
|
||||||
|
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiResetArchProtocolGuid);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hook the runtime service table
|
||||||
|
//
|
||||||
|
gRT->ResetSystem = ResetSystem;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Now install the Reset RT AP on a new handle
|
||||||
|
//
|
||||||
|
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||||
|
&mResetHandle,
|
||||||
|
&gEfiResetArchProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Reset system for capsule update.
|
||||||
|
|
||||||
|
@param[in] CapsuleDataPtr Pointer to the capsule block descriptors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CapsuleReset (
|
||||||
|
IN UINTN CapsuleDataPtr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// This implementation assumes that we're using a variable
|
||||||
|
// to indicate capsule updates.
|
||||||
|
//
|
||||||
|
gRT->SetVariable (
|
||||||
|
EFI_CAPSULE_VARIABLE_NAME,
|
||||||
|
&gEfiCapsuleVendorGuid,
|
||||||
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS,
|
||||||
|
sizeof (UINTN),
|
||||||
|
(VOID *) &CapsuleDataPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
EnterS3WithImmediateWake ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Should not return
|
||||||
|
//
|
||||||
|
CpuDeadLoop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Put the system into S3 power state.
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
DoS3 (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EnterS3WithImmediateWake ();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Should not return
|
||||||
|
//
|
||||||
|
CpuDeadLoop ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Resets the entire platform.
|
||||||
|
|
||||||
|
@param[in] ResetType The type of reset to perform.
|
||||||
|
@param[in] ResetStatus The status code for the reset.
|
||||||
|
@param[in] DataSize The size, in bytes, of WatchdogData.
|
||||||
|
@param[in] ResetData For a ResetType of EfiResetCold, EfiResetWarm, or
|
||||||
|
EfiResetShutdown the data buffer starts with a Null-terminated
|
||||||
|
string, optionally followed by additional binary data.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ResetSystem (
|
||||||
|
IN EFI_RESET_TYPE ResetType,
|
||||||
|
IN EFI_STATUS ResetStatus,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
IN VOID *ResetData OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN Size;
|
||||||
|
UINTN CapsuleDataPtr;
|
||||||
|
|
||||||
|
switch (ResetType) {
|
||||||
|
case EfiResetWarm:
|
||||||
|
|
||||||
|
//
|
||||||
|
//Check if there are pending capsules to process
|
||||||
|
//
|
||||||
|
Size = sizeof (CapsuleDataPtr);
|
||||||
|
Status = EfiGetVariable (
|
||||||
|
EFI_CAPSULE_VARIABLE_NAME,
|
||||||
|
&gEfiCapsuleVendorGuid,
|
||||||
|
NULL,
|
||||||
|
&Size,
|
||||||
|
(VOID *) &CapsuleDataPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
if (Status == EFI_SUCCESS) {
|
||||||
|
//
|
||||||
|
//Process capsules across a system reset.
|
||||||
|
//
|
||||||
|
DoS3();
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetWarm ();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EfiResetCold:
|
||||||
|
ResetCold ();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EfiResetShutdown:
|
||||||
|
ResetShutdown ();
|
||||||
|
return ;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Given we should have reset getting here would be bad
|
||||||
|
//
|
||||||
|
ASSERT (FALSE);
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
/** @file
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
|
||||||
|
This program and the accompanying materials
|
||||||
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
http://opensource.org/licenses/bsd-license.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _RESET_SYSTEM_H_
|
||||||
|
#define _RESET_SYSTEM_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <PiDxe.h>
|
||||||
|
|
||||||
|
#include <Protocol/Reset.h>
|
||||||
|
#include <Guid/CapsuleVendor.h>
|
||||||
|
|
||||||
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/UefiLib.h>
|
||||||
|
#include <Library/IoLib.h>
|
||||||
|
#include <Library/UefiDriverEntryPoint.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiRuntimeLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/ResetSystemLib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
The driver's entry point.
|
||||||
|
|
||||||
|
It initializes the Reset Architectural Protocol.
|
||||||
|
|
||||||
|
@param[in] ImageHandle The firmware allocated handle for the EFI image.
|
||||||
|
@param[in] SystemTable A pointer to the EFI System Table.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The entry point is executed successfully.
|
||||||
|
@retval other Cannot install ResetArch protocol.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
InitializeResetSystem (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Resets the entire platform.
|
||||||
|
|
||||||
|
@param[in] ResetType The type of reset to perform.
|
||||||
|
@param[in] ResetStatus The status code for the reset.
|
||||||
|
@param[in] DataSize The size, in bytes, of WatchdogData.
|
||||||
|
@param[in] ResetData For a ResetType of EfiResetCold, EfiResetWarm, or
|
||||||
|
EfiResetShutdown the data buffer starts with a Null-terminated
|
||||||
|
string, optionally followed by additional binary data.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
ResetSystem (
|
||||||
|
IN EFI_RESET_TYPE ResetType,
|
||||||
|
IN EFI_STATUS ResetStatus,
|
||||||
|
IN UINTN DataSize,
|
||||||
|
IN VOID *ResetData OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Reset system for capsule update.
|
||||||
|
|
||||||
|
@param[in] CapsuleDataPtr Pointer to the capsule block descriptors.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
CapsuleReset (
|
||||||
|
IN UINTN CapsuleDataPtr
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,63 @@
|
||||||
|
## @file
|
||||||
|
# Component description file for ResetSystem module.
|
||||||
|
#
|
||||||
|
# This driver implements Reset Architectural Protocol.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# This program and the accompanying materials are
|
||||||
|
# licensed and made available under the terms and conditions of the BSD License
|
||||||
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
|
# http://opensource.org/licenses/bsd-license.php
|
||||||
|
#
|
||||||
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = ResetSystemRuntimeDxe
|
||||||
|
FILE_GUID = 4B28E4C7-FF36-4e10-93CF-A82159E777C5
|
||||||
|
MODULE_TYPE = DXE_RUNTIME_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
|
||||||
|
ENTRY_POINT = InitializeResetSystem
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
ResetSystem.h
|
||||||
|
ResetSystem.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
ResetSystemLib
|
||||||
|
UefiRuntimeServicesTableLib
|
||||||
|
UefiRuntimeLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
UefiDriverEntryPoint
|
||||||
|
IoLib
|
||||||
|
UefiLib
|
||||||
|
DebugLib
|
||||||
|
BaseLib
|
||||||
|
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gEfiCapsuleVendorGuid # ALWAYS_CONSUMED
|
||||||
|
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiResetArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED
|
||||||
|
|
||||||
|
|
||||||
|
[Depex]
|
||||||
|
TRUE
|
||||||
|
|
Loading…
Reference in New Issue