/*
 *  MsgLog.c
 *  
 *
 *  Created by Slice on 10.04.12.
 *  Copyright 2012 Home. All rights reserved.
 *
 */

#include <Protocol/MsgLog.h>
#include <Library/PrintLib.h>

MESSAGE_LOG_PROTOCOL MsgLogProtocol;
EFI_HANDLE              mHandle = NULL;

//define BOOTER_LOG_SIZE	(4 * 1024)

/* Sample using inside other module:
@header.h file 
 #include <Protocol/MsgLog.h> 
 #include <Library/PrintLib.h>
extern  CHAR8 *msgCursor;
extern  MESSAGE_LOG_PROTOCOL *Msg; 

@main.c
 #if DEBUG_ACPI==2
 #define DBG(x...)  AsciiPrint(x)
 #elif DEBUG_ACPI==1
 #define DBG(x...)  BootLog(x)
 #else
 #define DBG(x...)
 #endif
 
 CHAR8 *msgCursor;
 MESSAGE_LOG_PROTOCOL *Msg; 
@entry point
 Msg = NULL;
 Status = gBS->LocateProtocol(&gMsgLogProtocolGuid, NULL, (VOID **) &Msg);
 if (!EFI_ERROR(Status) && (Msg != NULL)) {
   msgCursor = Msg->Cursor;
   BootLog("MsgLog Protocol installed in AcpiPlatform\n");
 }
@inf
 [Packages]
   CloverPkg.dec
 
 [LibraryClasses]
    PrintLib

 [Protocols]
    gMsgLogProtocolGuid

 [Depex]
 ...
 AND gMsgLogProtocolGuid  -- no!

 
 */

/**************************************************************************************
 * Entry point
 **************************************************************************************/

/**
 * MsgLog entry point. Installs MESSAGE_LOG_PROTOCOL.
 */
EFI_STATUS

MsgLogEntrypoint (
                    IN EFI_BOOT_SERVICES*           gBS
                    )
{
  EFI_STATUS					Status = EFI_SUCCESS;

  CHAR8    *tmp;
  
  mHandle = NULL;
  Status = gBS->AllocatePool (
                 EfiBootServicesData,
                 BOOTER_LOG_SIZE,
                 (VOID**) &tmp
                 );
	if (EFI_ERROR (Status)) {
		return Status;
	}
//  Print(L"MsgLogProtocol installed!\n");
  gBS->SetMem (tmp, BOOTER_LOG_SIZE, 0);
  MsgLogProtocol.Log = tmp;	
	MsgLogProtocol.Cursor = tmp;
  MsgLogProtocol.SizeOfLog = 0;
  MsgLogProtocol.Dirty = FALSE;
  
  Status = gBS->InstallMultipleProtocolInterfaces (
                &mHandle,
                &gMsgLogProtocolGuid,
                &MsgLogProtocol,
                NULL
                );
  
  return Status;
}