mirror of https://github.com/acidanthera/audk.git
430 lines
9.8 KiB
C
430 lines
9.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2004, 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:
|
||
|
|
||
|
EfiMgmtModeRuntimeLib.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Light weight lib to support EFI drivers.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _EFI_RT_SUPPORT_LIB_H_
|
||
|
#define _EFI_RT_SUPPORT_LIB_H_
|
||
|
|
||
|
#ifndef EFI_LOAD_IMAGE_SMM
|
||
|
#define EFI_LOAD_DRIVER_SMM FALSE
|
||
|
#else
|
||
|
#define EFI_LOAD_DRIVER_SMM TRUE
|
||
|
#endif
|
||
|
|
||
|
#ifndef EFI_NO_LOAD_IMAGE_RT
|
||
|
#define EFI_NO_LOAD_DRIVER_RT FALSE
|
||
|
#else
|
||
|
#define EFI_NO_LOAD_DRIVER_RT TRUE
|
||
|
#endif
|
||
|
|
||
|
#include "EfiCommonLib.h"
|
||
|
#include "LinkedList.h"
|
||
|
#include "ProcDep.h"
|
||
|
|
||
|
#include EFI_PROTOCOL_DEFINITION (CpuIo)
|
||
|
#include EFI_PROTOCOL_DEFINITION (FirmwareVolumeBlock)
|
||
|
|
||
|
//
|
||
|
// Driver Lib Globals.
|
||
|
//
|
||
|
extern EFI_BOOT_SERVICES *gBS;
|
||
|
extern EFI_SYSTEM_TABLE *gST;
|
||
|
extern UINTN gRtErrorLevel;
|
||
|
extern BOOLEAN mEfiLoadDriverSmm;
|
||
|
extern BOOLEAN mEfiNoLoadDriverRt;
|
||
|
extern EFI_DEVICE_PATH_PROTOCOL *mFilePath;
|
||
|
|
||
|
//
|
||
|
// Runtime Memory Allocation/De-Allocation tools (Should be used in Boot Phase only)
|
||
|
//
|
||
|
EFI_STATUS
|
||
|
EfiAllocateRuntimeMemoryPool (
|
||
|
IN UINTN Size,
|
||
|
OUT VOID **Buffer
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Allocate EfiRuntimeServicesData pool of specified size.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Size - Pool size
|
||
|
Buffer - Memory pointer for output
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiFreeRuntimeMemoryPool (
|
||
|
IN VOID *Buffer
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Free allocated pool
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Buffer - Pool to be freed
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiLocateProtocolHandleBuffers (
|
||
|
IN EFI_GUID *Protocol,
|
||
|
IN OUT UINTN *NumberHandles,
|
||
|
OUT EFI_HANDLE **Buffer
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Returns an array of handles that support the requested protocol in a buffer allocated from pool.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Protocol - Provides the protocol to search by.
|
||
|
NumberHandles - The number of handles returned in Buffer.
|
||
|
Buffer - A pointer to the buffer to return the requested array of handles that
|
||
|
support Protocol.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiHandleProtocol (
|
||
|
IN EFI_HANDLE Handle,
|
||
|
IN EFI_GUID *Protocol,
|
||
|
OUT VOID **Interface
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Queries a handle to determine if it supports a specified protocol.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - The handle being queried.
|
||
|
Protocol - The published unique identifier of the protocol.
|
||
|
Interface - Supplies the address where a pointer to the corresponding Protocol
|
||
|
Interface is returned. NULL will be returned in *Interface if a
|
||
|
structure is not associated with Protocol.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiInstallProtocolInterface (
|
||
|
IN OUT EFI_HANDLE *Handle,
|
||
|
IN EFI_GUID *Protocol,
|
||
|
IN EFI_INTERFACE_TYPE InterfaceType,
|
||
|
IN VOID *Interface
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Installs a protocol interface on a device handle. If the handle does not exist, it is created and added
|
||
|
to the list of handles in the system.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Handle - A pointer to the EFI_HANDLE on which the interface is to be installed.
|
||
|
Protocol - The numeric ID of the protocol interface.
|
||
|
InterfaceType - Indicates whether Interface is supplied in native form.
|
||
|
Interface - A pointer to the protocol interface.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiReinstallProtocolInterface (
|
||
|
IN EFI_HANDLE SmmProtocolHandle,
|
||
|
IN EFI_GUID *Protocol,
|
||
|
IN VOID *OldInterface,
|
||
|
IN VOID *NewInterface
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Reinstalls a protocol interface on a device handle.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SmmProtocolHandle - Handle on which the interface is to be reinstalled.
|
||
|
Protocol - The numeric ID of the interface.
|
||
|
OldInterface - A pointer to the old interface.
|
||
|
NewInterface - A pointer to the new interface.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiLocateProtocolInterface (
|
||
|
EFI_GUID *Protocol,
|
||
|
VOID *Registration, OPTIONAL
|
||
|
VOID **Interface
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Returns the first protocol instance that matches the given protocol.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Protocol - Provides the protocol to search for.
|
||
|
Registration - Optional registration key returned from
|
||
|
RegisterProtocolNotify(). If Registration is NULL, then
|
||
|
it is ignored.
|
||
|
Interface - On return, a pointer to the first interface that matches Protocol and
|
||
|
Registration.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
UninstallProtocolInterface (
|
||
|
IN EFI_HANDLE SmmProtocolHandle,
|
||
|
IN EFI_GUID *Protocol,
|
||
|
IN VOID *Interface
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Removes a protocol interface from a device handle.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
SmmProtocolHandle - The handle on which the interface was installed.
|
||
|
Protocol - The numeric ID of the interface.
|
||
|
Interface - A pointer to the interface.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiRegisterProtocolCallback (
|
||
|
IN EFI_EVENT_NOTIFY CallbackFunction,
|
||
|
IN VOID *Context,
|
||
|
IN EFI_GUID *ProtocolGuid,
|
||
|
IN EFI_TPL NotifyTpl,
|
||
|
OUT VOID **Registeration,
|
||
|
OUT EFI_EVENT *Event
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Register a callback function to be signaled whenever an interface is installed for
|
||
|
a specified protocol.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
CallbackFunction - Call back function
|
||
|
Context - Context of call back function
|
||
|
ProtocolGuid - The numeric ID of the protocol for which the callback function
|
||
|
is to be registered.
|
||
|
NotifyTpl - Notify tpl of callback function
|
||
|
Registeration - A pointer to a memory location to receive the registration value.
|
||
|
Event - Event that is to be signaled whenever a protocol interface is registered
|
||
|
for Protocol.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiSignalProtocolEvent (
|
||
|
EFI_EVENT Event
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Signals an event.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Event - The event to signal.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiInstallVendorConfigurationTable (
|
||
|
IN EFI_GUID *Guid,
|
||
|
IN VOID *Table
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Adds, updates, or removes a configuration table entry from the EFI System Table.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Guid - A pointer to the GUID for the entry to add, update, or remove.
|
||
|
Table - A pointer to the configuration table for the entry to add, update, or
|
||
|
remove. May be NULL.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
Status code
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiGetVendorConfigurationTable (
|
||
|
IN EFI_GUID *Guid,
|
||
|
OUT VOID **Table
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Return the EFI 1.0 System Tabl entry with TableGuid
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Guid - Name of entry to return in the system table
|
||
|
Table - Pointer in EFI system table associated with TableGuid
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_SUCCESS - Table returned;
|
||
|
EFI_NOT_FOUND - TableGuid not in EFI system table
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EfiInitializeUtilsRuntimeDriverLib (
|
||
|
IN EFI_HANDLE ImageHandle,
|
||
|
IN EFI_SYSTEM_TABLE *SystemTable,
|
||
|
IN EFI_EVENT_NOTIFY GoVirtualChildEvent
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Intialize runtime Driver Lib if it has not yet been initialized.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
ImageHandle - The firmware allocated handle for the EFI image.
|
||
|
|
||
|
SystemTable - A pointer to the EFI System Table.
|
||
|
|
||
|
GoVirtualChildEvent - Caller can register a virtual notification event.
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
EFI_STATUS always returns EFI_SUCCESS
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
BOOLEAN
|
||
|
EfiInManagementInterrupt (
|
||
|
VOID
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Indicate whether the caller is already in SMM or not.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
TRUE - In SMM
|
||
|
FALSE - Not in SMM
|
||
|
|
||
|
--*/
|
||
|
;
|
||
|
|
||
|
//
|
||
|
// This MACRO initializes the RUNTIME invironment and optionally loads Image to SMM or Non-SMM space
|
||
|
// based upon the presence of build flags EFI_LOAD_DRIVER_SMM and EFI_NO_LOAD_DRIVER_RT.
|
||
|
//
|
||
|
#define EFI_INITIALIZE_RUNTIME_DRIVER_LIB(ImageHandle, SystemTable, GoVirtualChildEvent, FilePath) \
|
||
|
mEfiLoadDriverSmm = EFI_LOAD_DRIVER_SMM; \
|
||
|
mEfiNoLoadDriverRt = EFI_NO_LOAD_DRIVER_RT; \
|
||
|
mFilePath = (EFI_DEVICE_PATH_PROTOCOL*) FilePath; \
|
||
|
EfiInitializeUtilsRuntimeDriverLib ((EFI_HANDLE) ImageHandle, (EFI_SYSTEM_TABLE*) SystemTable, (EFI_EVENT_NOTIFY) GoVirtualChildEvent); \
|
||
|
if (!EfiInManagementInterrupt()) { \
|
||
|
if (mEfiNoLoadDriverRt) { \
|
||
|
return EFI_SUCCESS; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
#endif
|