4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SAL Library implementation retrieving the SAL Entry Point from the SAL System Table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync register in the EFI System Configuration Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync licensed and made available under the terms and conditions of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the BSD License which accompanies this distribution. The full
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <PiDxe.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <IndustryStandard/Sal.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/SalLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/SalSystemTable.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_PLABEL mPlabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSAL_PROC mSalProcEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Makes a SAL procedure call.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a wrapper function to make a SAL procedure call.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync No parameter checking is performed on the 8 input parameters,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync but there are some common rules that the caller should follow
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync when making a SAL call. Any address passed to SAL as buffers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for return parameters must be 8-byte aligned. Unaligned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync addresses may cause undefined results. For those parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync defined as reserved or some fields defined as reserved must be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zero filled or the invalid argument return value may be returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or undefined result may occur during the execution of the procedure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is only available on IPF.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Index The SAL procedure Index number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg2 The 2nd parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg3 The 3rd parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg4 The 4th parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg5 The 5th parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg6 The 6th parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg7 The 7th parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg8 The 8th parameter for SAL procedure calls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return SAL returned registers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSAL_RETURN_REGS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSalCall (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Index,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg4,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg5,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg7,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Arg8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // mSalProcEntry is initialized in library constructor as SAL entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return mSalProcEntry(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg4,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg5,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg7,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The constructor function of UEFI SAL Lib.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The constructor function looks up the SAL System Table in the EFI System Configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Table. Once the SAL System Table is found, the SAL Entry Point in the SAL System Table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be derived and stored into a global variable for library usage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It will ASSERT() if the SAL System Table cannot be found or the data in the SAL System
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Table is not the valid data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle The firmware allocated handle for the EFI image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable A pointer to the EFI System Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUefiSalLibConstructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SAL_ST_ENTRY_POINT_DESCRIPTOR *SalStEntryDes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SAL_SYSTEM_TABLE_HEADER *SalSystemTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiGetSystemConfigurationTable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiSalSystemTableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &SalSystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (SalSystemTable != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the first entry of SAL System Table,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // because the SAL entry is in ascending order with the entry type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the type 0 entry should be the first if exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SalStEntryDes = (SAL_ST_ENTRY_POINT_DESCRIPTOR *)(SalSystemTable + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assure the SAL ENTRY Type is 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (SalStEntryDes->Type == EFI_SAL_ST_ENTRY_POINT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPlabel.EntryPoint = SalStEntryDes->SalProcEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPlabel.GP = SalStEntryDes->SalGlobalDataPointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure the EntryPoint has the valid value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((mPlabel.EntryPoint != 0) && (mPlabel.GP != 0));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSalProcEntry = (SAL_PROC)((UINT64)&(mPlabel.EntryPoint));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}