mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 07:34:13 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6694 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			140 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  SAL Library implementation retrieving the SAL Entry Point from the SAL System Table
 | 
						|
  register in the EFI System Confguration Table.
 | 
						|
 | 
						|
  Copyright (c) 2007 - 2008, 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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <PiDxe.h>
 | 
						|
#include <IndustryStandard/Sal.h>
 | 
						|
 | 
						|
#include <Library/SalLib.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
 | 
						|
#include <Guid/SalSystemTable.h>
 | 
						|
 | 
						|
EFI_PLABEL       mPlabel;
 | 
						|
SAL_PROC         mSalProcEntry;
 | 
						|
 | 
						|
/**
 | 
						|
  Makes a SAL procedure call.
 | 
						|
  
 | 
						|
  This is a wrapper function to make a SAL procedure call.  
 | 
						|
  No parameter checking is performed on the 8 input parameters,
 | 
						|
  but there are some common rules that the caller should follow
 | 
						|
  when making a SAL call.  Any address passed to SAL as buffers
 | 
						|
  for return parameters must be 8-byte aligned.  Unaligned
 | 
						|
  addresses may cause undefined results.  For those parameters
 | 
						|
  defined as reserved or some fields defined as reserved must be
 | 
						|
  zero filled or the invalid argument return value may be returned
 | 
						|
  or undefined result may occur during the execution of the procedure.
 | 
						|
  This function is only available on IPF.
 | 
						|
 | 
						|
  @param  Index       The SAL procedure Index number
 | 
						|
  @param  Arg2        The 2nd parameter for SAL procedure calls
 | 
						|
  @param  Arg3        The 3rd parameter for SAL procedure calls
 | 
						|
  @param  Arg4        The 4th parameter for SAL procedure calls
 | 
						|
  @param  Arg5        The 5th parameter for SAL procedure calls
 | 
						|
  @param  Arg6        The 6th parameter for SAL procedure calls
 | 
						|
  @param  Arg7        The 7th parameter for SAL procedure calls
 | 
						|
  @param  Arg8        The 8th parameter for SAL procedure calls
 | 
						|
 | 
						|
  @return SAL returned registers.
 | 
						|
 | 
						|
**/
 | 
						|
SAL_RETURN_REGS
 | 
						|
EFIAPI
 | 
						|
SalCall (
 | 
						|
  IN UINT64  Index,
 | 
						|
  IN UINT64  Arg2,
 | 
						|
  IN UINT64  Arg3,
 | 
						|
  IN UINT64  Arg4,
 | 
						|
  IN UINT64  Arg5,
 | 
						|
  IN UINT64  Arg6,
 | 
						|
  IN UINT64  Arg7,
 | 
						|
  IN UINT64  Arg8
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // mSalProcEntry is initialized in library constructor as SAL entry.
 | 
						|
  //
 | 
						|
  return mSalProcEntry(
 | 
						|
           Index,
 | 
						|
           Arg2,
 | 
						|
           Arg3,
 | 
						|
           Arg4,
 | 
						|
           Arg5,
 | 
						|
           Arg6,
 | 
						|
           Arg7,
 | 
						|
           Arg8
 | 
						|
           );
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  The constructor function of UEFI SAL Lib.
 | 
						|
 | 
						|
  The constructor function looks up the SAL System Table in the EFI System Configuration
 | 
						|
  Table. Once the SAL System Table is found, the SAL Entry Point in the SAL System Table
 | 
						|
  will be derived and stored into a global variable for library usage.
 | 
						|
  It will ASSERT() if the SAL System Table cannot be found or the data in the SAL System
 | 
						|
  Table is not the valid data.
 | 
						|
 | 
						|
  @param  ImageHandle   The firmware allocated handle for the EFI image.
 | 
						|
  @param  SystemTable   A pointer to the EFI System Table.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
UefiSalLibConstructor (
 | 
						|
  IN EFI_HANDLE        ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                     Status;
 | 
						|
  SAL_ST_ENTRY_POINT_DESCRIPTOR  *SalStEntryDes;
 | 
						|
  SAL_SYSTEM_TABLE_HEADER        *SalSystemTable;
 | 
						|
 | 
						|
  Status = EfiGetSystemConfigurationTable (
 | 
						|
             &gEfiSalSystemTableGuid,
 | 
						|
             (VOID **) &SalSystemTable
 | 
						|
             );
 | 
						|
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  //
 | 
						|
  // Check the first entry of SAL System Table,
 | 
						|
  // because the SAL entry is in ascending order with the entry type,
 | 
						|
  // the type 0 entry should be the first if exist.
 | 
						|
  //
 | 
						|
  SalStEntryDes = (SAL_ST_ENTRY_POINT_DESCRIPTOR *)(SalSystemTable + 1);
 | 
						|
 | 
						|
  //
 | 
						|
  // Assure the SAL ENTRY Type is 0
 | 
						|
  //
 | 
						|
  ASSERT (SalStEntryDes->Type == EFI_SAL_ST_ENTRY_POINT);
 | 
						|
 | 
						|
  mPlabel.EntryPoint = SalStEntryDes->SalProcEntry;
 | 
						|
  mPlabel.GP = SalStEntryDes->SalGlobalDataPointer;
 | 
						|
  //
 | 
						|
  // Make sure the EntryPoint has the valid value
 | 
						|
  //
 | 
						|
  ASSERT ((mPlabel.EntryPoint != 0) && (mPlabel.GP != 0));
 | 
						|
 | 
						|
  mSalProcEntry = (SAL_PROC)((UINT64)&(mPlabel.EntryPoint));
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 |