/*++

Copyright (c) 2006, 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:

  IpfStatusCode.c

Abstract:

  Contains the IPF installation function and an ESAL entry.

--*/

#include "StatusCode.h"

SAL_RETURN_REGS
ReportStatusCodeEsalServicesClassCommonEntry (
  IN  UINT64                    FunctionId,
  IN  UINT64                    Arg2,
  IN  UINT64                    Arg3,
  IN  UINT64                    Arg4,
  IN  UINT64                    Arg5,
  IN  UINT64                    Arg6,
  IN  UINT64                    Arg7,
  IN  UINT64                    Arg8,
  IN  SAL_EXTENDED_SAL_PROC     ExtendedSalProc,
  IN   BOOLEAN                  VirtualMode,
  IN  VOID                      *Global
  )
/*++

Routine Description:

  Main entry for Extended SAL ReportStatusCode Services

Arguments:

  FunctionId        Function Id which needed to be called
  Arg2              Efi status code type
  Arg3              Efi status code value
  Arg4              Instance number 
  Arg5              Caller Id
  Arg6              Efi status code data
  Arg7              Not used       
  Arg8              Not used       
  ExtendedSalProc   Esal Proc pointer    
  VirtualMode       If this function is called in virtual mode
  Global            This module's global variable pointer
  
Returns:

  SAL_RETURN_REGS

--*/
{
  SAL_RETURN_REGS ReturnVal;

  switch (FunctionId) {

  case ReportStatusCodeService:
    ReturnVal.Status = StatusCodeReportStatusCode (
                        (EFI_STATUS_CODE_TYPE) Arg2,
                        (EFI_STATUS_CODE_VALUE) Arg3,
                        (UINT32) Arg4,
                        (EFI_GUID *) Arg5,
                        (EFI_STATUS_CODE_DATA *) Arg6
                        );
    break;

  default:
    ReturnVal.Status = EFI_SAL_INVALID_ARGUMENT;
    break;
  }

  return ReturnVal;
}

EFI_STATUS
EFIAPI
InstallStatusCode (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
/*++

Routine Description:

  Install the ReportStatusCode runtime service.

Arguments:

  ImageHandle     Image handle of the loaded driver
  SystemTable     Pointer to the System Table

Returns:

  EFI_SUCCESS     The function always returns success.

--*/
{
  //
  // Initialize RT status code
  //
  InitializeStatusCode (ImageHandle, SystemTable);

  //
  // Initialize ESAL capabilities
  //
  RegisterEsalClass (
    &gEfiExtendedSalStatusCodeServicesProtocolGuid,
    NULL,
    ReportStatusCodeEsalServicesClassCommonEntry,
    StatusCode,
    NULL
    );

  return EFI_SUCCESS;
}
