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
|
||||
DebugAgentLib|MdeModulePkg/Library/DebugAgentLibNull/DebugAgentLibNull.inf
|
||||
PlatformHookLib|MdeModulePkg/Library/BasePlatformHookLibNull/BasePlatformHookLibNull.inf
|
||||
ResetSystemLib|MdeModulePkg/Library/BaseResetSystemLibNull/BaseResetSystemLibNull.inf
|
||||
|
||||
[LibraryClasses.EBC.PEIM]
|
||||
IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
|
||||
|
@ -249,6 +250,7 @@
|
|||
MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
|
||||
MdeModulePkg/Universal/Metronome/Metronome.inf
|
||||
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
|
||||
MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
|
||||
MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.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