git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10418 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			325 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  IPF specific types, macros, and definitions for Debug Support Driver.
 | 
						|
 | 
						|
Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
 | 
						|
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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _PLDEBUG_SUPPORT_H_
 | 
						|
#define _PLDEBUG_SUPPORT_H_
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
#include <Protocol/DebugSupport.h>
 | 
						|
#include <Protocol/LoadedImage.h>
 | 
						|
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/UefiDriverEntryPoint.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
 | 
						|
#define DISABLE_INTERRUPTS  0UL
 | 
						|
 | 
						|
#define EFI_ISA IsaIpf
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT64  Low;
 | 
						|
  UINT64  High;
 | 
						|
} BUNDLE;
 | 
						|
 | 
						|
typedef
 | 
						|
VOID
 | 
						|
(*CALLBACK_FUNC) (
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  IPF specific DebugSupport driver initialization.
 | 
						|
 | 
						|
  Must be public because it's referenced from DebugSupport.c
 | 
						|
 | 
						|
  @retval  EFI_SUCCESS     Always.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
PlInitializeDebugSupportDriver (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Unload handler that is called during UnloadImage() - deallocates pool memory
 | 
						|
  used by the driver.
 | 
						|
 | 
						|
  Must be public because it's referenced from DebugSuport.c
 | 
						|
 | 
						|
  @param  ImageHandle    The firmware allocated handle for the EFI image.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS    Always.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
PlUnloadDebugSupportDriver (
 | 
						|
  IN EFI_HANDLE                   ImageHandle
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C callable function to obtain the current value of IVA.
 | 
						|
 | 
						|
  @return Current value of IVA.
 | 
						|
 | 
						|
**/
 | 
						|
VOID  *
 | 
						|
GetIva (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C callable function that HookStub will be copied from it's loaded location into the IVT when
 | 
						|
  an IVT entry is hooked.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
HookStub (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C callable function to chain an interrupt handler.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ChainHandler (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C callable function to unchain an interrupt handler.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UnchainHandler (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C callable function to enable/disable interrupts.
 | 
						|
 | 
						|
  @param  NewInterruptState   New Interrupt State.
 | 
						|
 | 
						|
  @return Previous state of psr.ic.
 | 
						|
 | 
						|
**/
 | 
						|
UINT64
 | 
						|
ProgramInterruptFlags (
 | 
						|
  IN UINT64                       NewInterruptState
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Flushes instruction cache for specified number of bytes.
 | 
						|
 | 
						|
  @param  StartAddress     Cache Start Address.
 | 
						|
  @param  SizeInBytes      Cache Size.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InstructionCacheFlush (
 | 
						|
  IN VOID    *StartAddress,
 | 
						|
  IN UINTN   SizeInBytes
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Returns the maximum value that may be used for the ProcessorIndex parameter in
 | 
						|
  RegisterPeriodicCallback() and RegisterExceptionCallback().
 | 
						|
 | 
						|
  Hard coded to support only 1 processor for now.
 | 
						|
 | 
						|
  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
 | 
						|
  @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
 | 
						|
                                processor index is returned. Always 0 returned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           Always returned with **MaxProcessorIndex set to 0.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
GetMaximumProcessorIndex (
 | 
						|
  IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
 | 
						|
  OUT UINTN                       *MaxProcessorIndex
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Registers a function to be called back periodically in interrupt context.
 | 
						|
 | 
						|
  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
 | 
						|
  @param  ProcessorIndex        Specifies which processor the callback function applies to.
 | 
						|
  @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
 | 
						|
                                periodic entry point of the debug agent.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The function completed successfully.
 | 
						|
  @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
 | 
						|
                                function was previously registered.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
 | 
						|
                                function.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
RegisterPeriodicCallback (
 | 
						|
  IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
 | 
						|
  IN UINTN                        ProcessorIndex,
 | 
						|
  IN EFI_PERIODIC_CALLBACK        PeriodicCallback
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Registers a function to be called when a given processor exception occurs.
 | 
						|
 | 
						|
  This code executes in boot services context.
 | 
						|
 | 
						|
  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
 | 
						|
  @param  ProcessorIndex        Specifies which processor the callback function applies to.
 | 
						|
  @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called
 | 
						|
                                when the processor exception specified by ExceptionType occurs.  
 | 
						|
  @param  ExceptionType         Specifies which processor exception to hook.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The function completed successfully.
 | 
						|
  @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
 | 
						|
                                function was previously registered.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
 | 
						|
                                function.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
RegisterExceptionCallback (
 | 
						|
  IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
 | 
						|
  IN UINTN                        ProcessorIndex,
 | 
						|
  IN EFI_EXCEPTION_CALLBACK       ExceptionCallback,
 | 
						|
  IN EFI_EXCEPTION_TYPE           ExceptionType
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Invalidates processor instruction cache for a memory range. Subsequent execution in this range
 | 
						|
  causes a fresh memory fetch to retrieve code to be executed.
 | 
						|
 | 
						|
  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
 | 
						|
  @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
 | 
						|
  @param  Start                 Specifies the physical base of the memory range to be invalidated.
 | 
						|
  @param  Length                Specifies the minimum number of bytes in the processor's instruction
 | 
						|
                                cache to invalidate.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           Always returned.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
InvalidateInstructionCache (
 | 
						|
  IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
 | 
						|
  IN UINTN                        ProcessorIndex,
 | 
						|
  IN VOID                         *Start,
 | 
						|
  IN UINTN                        Length
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  C routine that is called for all registered exceptions.  This is the main
 | 
						|
  exception dispatcher.
 | 
						|
 | 
						|
  Must be public because it's referenced from AsmFuncs.s.
 | 
						|
 | 
						|
  @param  ExceptionType        Specifies which processor exception.
 | 
						|
  @param  Context              System Context.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
CommonHandler (
 | 
						|
  IN EFI_EXCEPTION_TYPE ExceptionType,
 | 
						|
  IN EFI_SYSTEM_CONTEXT Context
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This is the worker function that uninstalls and removes all handlers.
 | 
						|
 | 
						|
  @param  ExceptionType     Specifies which processor exception.
 | 
						|
  @param  NewBundles        New Boundles.
 | 
						|
  @param  NewCallback       A pointer to the new function to be registered.
 | 
						|
 | 
						|
  @retval EFI_ALEADY_STARTED Ivt already hooked.
 | 
						|
  @retval EFI_SUCCESS        Successfully uninstalled.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
ManageIvtEntryTable (
 | 
						|
  IN  EFI_EXCEPTION_TYPE    ExceptionType,
 | 
						|
  IN  BUNDLE                NewBundles[4],
 | 
						|
  IN  CALLBACK_FUNC         NewCallback
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Saves original IVT contents and inserts a few new bundles which are fixed up
 | 
						|
  to store the ExceptionType and then call the common handler.
 | 
						|
 | 
						|
  @param  ExceptionType      Specifies which processor exception.
 | 
						|
  @param  NewBundles         New Boundles.
 | 
						|
  @param  NewCallback        A pointer to the new function to be hooked.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
HookEntry (
 | 
						|
  IN  EFI_EXCEPTION_TYPE    ExceptionType,
 | 
						|
  IN  BUNDLE                NewBundles[4],
 | 
						|
  IN  CALLBACK_FUNC         NewCallback
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Restores original IVT contents when unregistering a callback function.
 | 
						|
 | 
						|
  @param  ExceptionType     Specifies which processor exception.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UnhookEntry (
 | 
						|
  IN  EFI_EXCEPTION_TYPE    ExceptionType
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Sets up cache flush and calls assembly function to chain external interrupt.
 | 
						|
 | 
						|
  Records new callback in IvtEntryTable.
 | 
						|
 | 
						|
  @param  NewCallback     A pointer to the interrupt handle.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ChainExternalInterrupt (
 | 
						|
  IN  CALLBACK_FUNC         NewCallback
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Sets up cache flush and calls assembly function to restore external interrupt.
 | 
						|
  Removes registered callback from IvtEntryTable.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
UnchainExternalInterrupt (
 | 
						|
  VOID
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Given an integer number, return the physical address of the entry point in the IFT.
 | 
						|
 | 
						|
  @param  HandlerIndex       Index of the Handler
 | 
						|
  @param  EntryPoint         IFT Entrypoint
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
GetHandlerEntryPoint (
 | 
						|
  UINTN                     HandlerIndex,
 | 
						|
  VOID                      **EntryPoint
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |