2007-06-28 09:00:39 +02:00
|
|
|
/*++
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
SalDriverLib.h
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
SAL Driver Lib
|
|
|
|
|
|
|
|
Revision History
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#ifndef _SAL_DRIVER_LIB_H_
|
|
|
|
#define _SAL_DRIVER_LIB_H_
|
|
|
|
|
|
|
|
#include "Tiano.h"
|
|
|
|
#include "EfiDriverLib.h"
|
|
|
|
#include "SalApi.h"
|
|
|
|
|
|
|
|
#include EFI_PROTOCOL_DEFINITION (ExtendedSalBootService)
|
|
|
|
#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid)
|
|
|
|
|
|
|
|
//
|
|
|
|
// Assembly Functions
|
|
|
|
//
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibGetEsalPhyData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get Esal global data in physical mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibGetEsalVirtData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get Esal global data in virtual mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibSetEsalPhyData (
|
|
|
|
IN VOID *Ptr,
|
|
|
|
IN UINT64 GP
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set Esal global data in physical mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Ptr - Pointer to the data
|
|
|
|
GP - Global pointer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibSetEsalVirtData (
|
|
|
|
IN VOID *Ptr,
|
|
|
|
IN UINT64 GP
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set Esal global data in virtual mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Ptr - Pointer to the data
|
|
|
|
GP - Global pointer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibGetGlobalPhyData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get Esal global data in physical mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibGetGlobalVirtData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get Esal global data in virtual mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibSetGlobalPhyData (
|
|
|
|
IN VOID *Ptr,
|
|
|
|
IN UINT64 GP
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set Esal global data in physical mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Ptr - Pointer to the data
|
|
|
|
GP - Global pointer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibSetGlobalVirtData (
|
|
|
|
IN VOID *Ptr,
|
|
|
|
IN UINT64 GP
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set Esal global data in virtual mode.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Ptr - Pointer to the data
|
|
|
|
GP - Global pointer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
GetIrrData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get interrupt request register.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
VOID
|
|
|
|
PrepareApsForHandOverToOS (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Prepare AP info for hand over to OS.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
VOID
|
|
|
|
HandOverApsToOS (
|
|
|
|
IN UINT64 a1,
|
|
|
|
IN UINT64 a2,
|
|
|
|
IN UINT64 a3
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Hand over AP info to OS.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
a1 - Address to call into
|
|
|
|
|
|
|
|
a2 - GP
|
|
|
|
|
|
|
|
a3 - Undefined
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
GetPsrData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get PSR register.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs.
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
GetProcIdData (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get LID
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
VOID
|
|
|
|
SwitchCpuStack (
|
|
|
|
IN UINT64 NewBsp,
|
|
|
|
IN UINT64 OldBsp
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Switch BSP
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
NewBsp - New BSP index
|
|
|
|
OldBsp - Old BSP index
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SAL Reset Class
|
|
|
|
//
|
|
|
|
VOID
|
|
|
|
SalResetSystem (
|
|
|
|
IN EFI_RESET_TYPE ResetType,
|
|
|
|
IN EFI_STATUS ResetStatus,
|
|
|
|
IN UINTN DataSize,
|
|
|
|
IN CHAR16 *ResetData
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Reset system
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ResetType - Reset type
|
|
|
|
ResetStatus - Reset status
|
|
|
|
DataSize - Size of ResetData
|
|
|
|
ResetData - Description string
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// PAL PROC Class
|
|
|
|
//
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalPalProc (
|
|
|
|
IN UINT64 Arg1,
|
|
|
|
IN UINT64 Arg2,
|
|
|
|
IN UINT64 Arg3,
|
|
|
|
IN UINT64 Arg4
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Call pal proc.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Arg1 - Pal call index
|
|
|
|
Arg2 - First arg
|
|
|
|
Arg3 - Second arg
|
|
|
|
Arg4 - Third arg
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalRegisterNewPalEntry (
|
|
|
|
IN BOOLEAN PhysicalPalAddress,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS NewPalAddress
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Register Pal entry.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
PhysicalPalAddress - The address is physical or virtual
|
|
|
|
NewPalAddress - New Pal entry address
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalGetPalEntryPointer (
|
|
|
|
IN BOOLEAN PhysicalPalAddress
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get Pal entry.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
PhysicalPalAddress - The address is physical or virtual
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SAL MTC Class
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
SalGetNextHighMonotonicCount (
|
|
|
|
OUT UINT32 *HighCount
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get next high 32 bits of monotonic count.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
HighCount - High 32 bits of monotonic count.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SAL BASE Class
|
|
|
|
//
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalProcSetVectors (
|
|
|
|
IN UINT64 SalVectorType,
|
|
|
|
IN UINT64 PhyAddr1,
|
|
|
|
IN UINT64 Gp1,
|
|
|
|
IN UINT64 LengthCs1,
|
|
|
|
IN UINT64 PhyAddr2,
|
|
|
|
IN UINT64 Gp2,
|
|
|
|
IN UINT64 LengthCs2
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set vectors.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
SalVectorType - Vector type
|
|
|
|
PhyAddr1 - OS MCA entry point
|
|
|
|
Gp1 - GP for OS MCA entry
|
|
|
|
LengthCs1 - Length of OS MCA
|
|
|
|
PhyAddr2 - OS INIT entry point
|
|
|
|
Gp2 - GP for OS Init entry
|
|
|
|
LengthCs2 - Length of OS INIT
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalProcMcRendez (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Mc rendezvous function.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalProcMcSetParams (
|
|
|
|
IN UINT64 ParamType,
|
|
|
|
IN UINT64 IntOrMem,
|
|
|
|
IN UINT64 IntOrMemVal,
|
|
|
|
IN UINT64 Timeout,
|
|
|
|
IN UINT64 McaOpt
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Set MCA parameters.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ParamType - Parameter type
|
|
|
|
IntOrMem - Interrupt or memory address
|
|
|
|
IntOrMemVal - Interrupt number or memory address value
|
|
|
|
Timeout - Time out value
|
|
|
|
McaOpt - Option for MCA
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
EsalProcGetVectors (
|
|
|
|
IN UINT64 VectorType
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get OS MCA vector.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
VectorType - Vector type
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
EsalProcMcGetParams (
|
|
|
|
IN UINT64 ParamInfoType
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get MCA parameter.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ParamInfoType - Parameter info type
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
EsalProcMcGetMcParams (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get MCA parameter.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
EsalProcGetMcCheckinFlags (
|
|
|
|
IN UINT64 ProcessorUnit
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get process status.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ProcessorUnit - Processor Index
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Sal Base Class enums
|
|
|
|
//
|
|
|
|
typedef enum {
|
|
|
|
McaVector,
|
|
|
|
BspInitVector,
|
|
|
|
BootRendezVector,
|
|
|
|
ApInitVector
|
|
|
|
} ESAL_GET_VECTOR_TYPE;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Sal RTC Class
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
SalGetTime (
|
|
|
|
OUT EFI_TIME *Time,
|
|
|
|
OUT EFI_TIME_CAPABILITIES *Capabilities
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Returns the current time and date information, and the time-keeping
|
|
|
|
capabilities of the hardware platform.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Time - A pointer to storage to receive a snapshot of the current time.
|
2008-06-19 13:15:44 +02:00
|
|
|
Capabilities - An optional pointer to a buffer to receive the real time clock device's
|
2007-06-28 09:00:39 +02:00
|
|
|
capabilities.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SalSetTime (
|
|
|
|
OUT EFI_TIME *Time
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Sets the current local time and date information.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Time - A pointer to the current time.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SalGetWakeupTime (
|
|
|
|
OUT BOOLEAN *Enabled,
|
|
|
|
OUT BOOLEAN *Pending,
|
|
|
|
OUT EFI_TIME *Time
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Returns the current wakeup alarm clock setting.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Enabled - Indicates if the alarm is currently enabled or disabled.
|
|
|
|
Pending - Indicates if the alarm signal is pending and requires acknowledgement.
|
|
|
|
Time - The current alarm setting.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SalSetWakeupTime (
|
|
|
|
IN BOOLEAN Enable,
|
|
|
|
IN EFI_TIME *Time
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Sets the system wakeup alarm clock time.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Enable - Enable or disable the wakeup alarm.
|
|
|
|
Time - If Enable is TRUE, the time to set the wakeup alarm for.
|
|
|
|
If Enable is FALSE, then this parameter is optional, and may be NULL.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalInitializeThreshold (
|
|
|
|
IN VOID *ThresholdStruct,
|
|
|
|
IN UINT64 Count,
|
|
|
|
IN UINT64 Duration
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Init threshold structure.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ThresholdStruct - Threshold structure
|
|
|
|
Count - Threshold count
|
|
|
|
Duration - Duration
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalBumpThresholdCount (
|
|
|
|
IN VOID *ThresholdStruct,
|
|
|
|
IN UINT64 Count,
|
|
|
|
IN UINT64 Duration
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Bump threshold count.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ThresholdStruct - Threshold structure
|
|
|
|
Count - Threshold count
|
|
|
|
Duration - Duration
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalGetThresholdCount (
|
|
|
|
IN VOID *ThresholdStruct,
|
|
|
|
IN UINT64 Count,
|
|
|
|
IN UINT64 Duration
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Get threshold structure.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ThresholdStruct - Threshold structure
|
|
|
|
Count - Threshold count
|
|
|
|
Duration - Duration
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Common Lib Function
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
RegisterEsalFunction (
|
|
|
|
IN UINT64 FunctionId,
|
|
|
|
IN EFI_GUID *ClassGuid,
|
|
|
|
IN SAL_INTERNAL_EXTENDED_SAL_PROC Function,
|
|
|
|
IN VOID *ModuleGlobal
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Register ESAL Class Function and it's asociated global.
|
|
|
|
This function is boot service only!
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
FunctionId - ID of function to register
|
|
|
|
ClassGuid - GUID of function class
|
|
|
|
Function - Function to register under ClassGuid/FunctionId pair
|
|
|
|
ModuleGlobal - Module global for Function.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - If ClassGuid/FunctionId Function was registered.
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EfiInitializeSalDriverLib (
|
|
|
|
IN BOOLEAN Runtime
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Initialize Sal driver lib.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Runtime - At runtime or not?
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// MCA PMI INIT Registeration Functions.
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
LibRegisterMcaFunction (
|
|
|
|
IN EFI_SAL_MCA_HANDLER McaHandler,
|
|
|
|
IN VOID *ModuleGlobal,
|
|
|
|
IN BOOLEAN MakeFirst,
|
|
|
|
IN BOOLEAN MakeLast
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Register MCA handler.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaHandler - MCA handler
|
|
|
|
ModuleGlobal - Module global for function
|
|
|
|
MakeFirst - Make it as first?
|
|
|
|
MakeLast - Make it as last?
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibRegisterPmiFunction (
|
|
|
|
IN EFI_SAL_PMI_HANDLER PmiHandler,
|
|
|
|
IN VOID *ModuleGlobal,
|
|
|
|
IN BOOLEAN MakeFirst,
|
|
|
|
IN BOOLEAN MakeLast
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Register PMI handler.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
PmiHandler - PMI handler
|
|
|
|
ModuleGlobal - Module global for function
|
|
|
|
MakeFirst - Make it as first?
|
|
|
|
MakeLast - Make it as last?
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibRegisterInitFunction (
|
|
|
|
IN EFI_SAL_INIT_HANDLER InitHandler,
|
|
|
|
IN VOID *ModuleGlobal,
|
|
|
|
IN BOOLEAN MakeFirst,
|
|
|
|
IN BOOLEAN MakeLast
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Register INIT handler.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
InitHandler - INIT handler
|
|
|
|
ModuleGlobal - Module global for function
|
|
|
|
MakeFirst - Make it as first?
|
|
|
|
MakeLast - Make it as last?
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Base IO Class Functions
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
ESalIoRead (
|
|
|
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINTN Count,
|
|
|
|
IN OUT VOID *Buffer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Io read operation.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Width - Width of read operation
|
|
|
|
Address - Start IO address to read
|
|
|
|
Count - Read count
|
|
|
|
Buffer - Buffer to store result
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
ESalIoWrite (
|
|
|
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINTN Count,
|
|
|
|
IN OUT VOID *Buffer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
Io write operation.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Width - Width of write operation
|
|
|
|
Address - Start IO address to write
|
|
|
|
Count - Write count
|
|
|
|
Buffer - Buffer to write to the address
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
ESalMemRead (
|
|
|
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINTN Count,
|
|
|
|
IN OUT VOID *Buffer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Perform a Memory mapped IO read into Buffer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Width - Width of each read transaction.
|
|
|
|
Address - Memory mapped IO address to read
|
|
|
|
Count - Number of Width quanta to read
|
|
|
|
Buffer - Buffer to read data into. size is Width * Count
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
ESalMemWrite (
|
|
|
|
IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINTN Count,
|
|
|
|
IN OUT VOID *Buffer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Perform a memory mapped IO write into Buffer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Width - Width of write transaction, and repeat operation to use
|
|
|
|
Address - IO address to write
|
|
|
|
Count - Number of times to write the IO address.
|
|
|
|
Buffer - Buffer to write data from. size is Width * Count
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// PCI Class Functions
|
|
|
|
//
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalPCIConfigRead (
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINT64 Size
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Pci config space read.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Address - PCI address to read
|
|
|
|
Size - Size to read
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
SalPCIConfigWrite (
|
|
|
|
IN UINT64 Address,
|
|
|
|
IN UINT64 Size,
|
|
|
|
IN UINT64 Value
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Pci config space write.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Address - PCI address to write
|
|
|
|
Size - Size to write
|
|
|
|
Value - Value to write
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// MP Class Functions
|
|
|
|
//
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPAddCpuData (
|
|
|
|
IN UINT64 CpuGlobalId,
|
|
|
|
IN BOOLEAN Enabled,
|
|
|
|
IN UINT64 PalCompatability
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Add CPU data.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU ID
|
|
|
|
Enabled - Enabled or not
|
|
|
|
PalCompatability - Pal compatability
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPRemoveCpuData (
|
|
|
|
IN UINT64 CpuGlobalId
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Remove CPU data.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU ID
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPModifyCpuData (
|
|
|
|
IN UINT64 CpuGlobalId,
|
|
|
|
IN BOOLEAN Enabled,
|
|
|
|
IN UINT64 PalCompatability
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Modify CPU data.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU ID
|
|
|
|
Enabled - Enabled or not
|
|
|
|
PalCompatability - Pal compatability
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPGetCpuDataByID (
|
|
|
|
IN UINT64 CpuGlobalId,
|
|
|
|
IN BOOLEAN IndexByEnabledCpu
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get CPU data.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU ID
|
|
|
|
IndexByEnabledCpu - Whether indexed by enabled CPU
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPGetCpuDataByIndex (
|
|
|
|
IN UINT64 Index,
|
|
|
|
IN BOOLEAN IndexByEnabledCpu
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get CPU data.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
Index - CPU index
|
|
|
|
IndexByEnabledCpu - Whether indexed by enabled CPU
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMPSendIpi (
|
|
|
|
IN UINT64 ProcessorNumber,
|
|
|
|
IN UINT64 VectorNumber,
|
|
|
|
IN EFI_DELIVERY_MODE DeliveryMode,
|
|
|
|
IN BOOLEAN IRFlag
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Send IPI.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
ProcessorNumber - Processor number
|
|
|
|
VectorNumber - Vector number
|
|
|
|
DeliveryMode - Delivery mode
|
|
|
|
IRFlag - Interrupt Redirection flag
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMpCurrentProcessor (
|
|
|
|
IN BOOLEAN IndexByEnabledCpu
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get current processor index.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
IndexByEnabledCpu - Whether indexed by enabled CPU
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibGetNumProcessors (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get number of processors.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMpSaveMinStatePointer (
|
|
|
|
IN UINT64 CpuGlobalId,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS MinStatePointer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Register pointer to save min state.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU global ID
|
|
|
|
MinStatePointer - Pointer to save min state
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
SAL_RETURN_REGS
|
|
|
|
LibMpRestoreMinStatePointer (
|
|
|
|
IN UINT64 CpuGlobalId
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Restore pointer to save min state.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuGlobalId - CPU global ID
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Output regs
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// MCA Class Functions
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
LibMcaGetStateInfo (
|
|
|
|
IN UINT64 CpuId,
|
|
|
|
OUT EFI_PHYSICAL_ADDRESS *StateBufferPointer,
|
|
|
|
OUT UINT64 *RequiredStateBufferSize
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
MCA get state info.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuId - CPU ID
|
|
|
|
StateBufferPointer - Pointer of state buffer
|
|
|
|
RequiredStateBufferSize - Size of required state buffer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibMcaRegisterCpu (
|
|
|
|
IN UINT64 CpuId,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS StateBufferAddress
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
MCA register CPU state info.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
CpuId - CPU ID
|
|
|
|
StateBufferAddress - Pointer of state buffer
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
//
|
|
|
|
// SAL ELOG Functions
|
|
|
|
//
|
|
|
|
EFI_STATUS
|
|
|
|
LibSalGetStateInfo (
|
|
|
|
IN UINT64 McaType,
|
|
|
|
IN UINT8 *McaBuffer,
|
|
|
|
OUT UINTN *Size
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get state info.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaType - MCA type
|
|
|
|
McaBuffer - Info buffer provided by caller
|
|
|
|
Size - Size of info
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibSalGetStateInfoSize (
|
|
|
|
IN UINT64 McaType,
|
|
|
|
OUT UINTN *Size
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get state info size.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaType - MCA type
|
|
|
|
Size - Size required
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibSalClearStateInfo (
|
|
|
|
IN UINT64 McaType
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Clear state info.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaType - MCA type
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibEsalGetStateBuffer (
|
|
|
|
IN UINT64 McaType,
|
|
|
|
OUT UINT8 **McaBuffer,
|
|
|
|
OUT UINTN *Index
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Get state buffer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaType - MCA type
|
|
|
|
McaBuffer - MCA buffer
|
|
|
|
Index - CPU index
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
LibEsalSaveStateBuffer (
|
|
|
|
IN UINT64 McaType
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
Save state buffer.
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
McaType - MCA type
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
Status code
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
#endif
|