/*++

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:

  PlatformStatusCode.c 
   
Abstract:

  Contains NT32 specific implementations required to use status codes.

--*/

#include "MonoStatusCode.h"


BOOLEAN gRunningFromMemory = FALSE;
//
// Platform definitions
//
EFI_PEI_REPORT_STATUS_CODE  mSecReportStatusCode = NULL;

extern EFI_PEI_PROGRESS_CODE_PPI  mStatusCodePpi;

//
// Function implementations
//
EFI_STATUS
EFIAPI
PlatformReportStatusCode (
  IN EFI_PEI_SERVICES         **PeiServices,
  IN EFI_STATUS_CODE_TYPE     CodeType,
  IN EFI_STATUS_CODE_VALUE    Value,
  IN UINT32                   Instance,
  IN EFI_GUID                 * CallerId,
  IN EFI_STATUS_CODE_DATA     * Data OPTIONAL
  )
/*++

Routine Description:

  Call all status code listeners in the MonoStatusCode.

Arguments:

  Same as ReportStatusCode service
  
Returns:

  EFI_SUCCESS     Always returns success.

--*/
{
  if (mSecReportStatusCode != NULL) {
    mSecReportStatusCode (PeiServices, CodeType, Value, Instance, CallerId, Data);
  }
  MemoryReportStatusCode (CodeType, Value, Instance, CallerId, Data);
  return EFI_SUCCESS;
}

VOID
PlatformInitializeStatusCode (
  IN EFI_FFS_FILE_HEADER       *FfsHeader,
  IN EFI_PEI_SERVICES          **PeiServices
  )
/*++

Routine Description:

  Initialize the status code listeners.  This consists of locating the 
  listener produced by SecMain.exe.

Arguments:

  FfsHeader   - FV this PEIM was loaded from.
  PeiServices - General purpose services available to every PEIM.

Returns:

  None

--*/
{
  EFI_STATUS                  Status;
  EFI_PEI_PROGRESS_CODE_PPI   *ReportStatusCodePpi;
  EFI_PEI_PPI_DESCRIPTOR      *ReportStatusCodeDescriptor;

  //
  // Cache the existing status code listener installed by the SEC core.
  // We should actually do a heap allocate, install a PPI, etc, but since we
  // know that we are running from a DLL, we can use global variables, and
  // directly update the status code PPI descriptor
  //
  //
  // Locate SEC status code PPI
  //
  Status = (*PeiServices)->LocatePpi (
                            PeiServices,
                            &gEfiPeiStatusCodePpiGuid,
                            0,
                            &ReportStatusCodeDescriptor,
                            &ReportStatusCodePpi
                            );
  if (EFI_ERROR (Status)) {
    return ;
  }

  mSecReportStatusCode            = ReportStatusCodePpi->ReportStatusCode;
  ReportStatusCodeDescriptor->Ppi = &mStatusCodePpi;

  //
  // Always initialize memory status code listener.
  //
  MemoryStatusCodeInitialize (FfsHeader, PeiServices);

}

EFI_STATUS
EFIAPI
InstallMonoStatusCode (
  IN EFI_FFS_FILE_HEADER       *FfsHeader,
  IN EFI_PEI_SERVICES          **PeiServices
  )
/*++

Routine Description:

  Install the PEIM.  Publish the DXE callback as well.

Arguments:

  FfsHeader   - FV this PEIM was loaded from.
  PeiServices - General purpose services available to every PEIM.

Returns:

  EFI_SUCCESS   The function always returns success.

--*/
{
  if (!gRunningFromMemory) {
    //
    // First pass, running from flash, initialize everything
    //
    InitializeMonoStatusCode (FfsHeader, PeiServices);
  } else {
    //
    // Second pass, running from memory, initialize memory listener and
    // publish the DXE listener in a HOB.
    //
    MemoryStatusCodeInitialize (FfsHeader, PeiServices);
    InitializeDxeReportStatusCode (PeiServices);
  }

  return EFI_SUCCESS;
}
