Home | History | Annotate | Download | only in Ipf
      1 /** @file
      2   IPF specific types, macros, and definitions for Debug Support Driver.
      3 
      4 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _PLDEBUG_SUPPORT_H_
     16 #define _PLDEBUG_SUPPORT_H_
     17 
     18 #include <Uefi.h>
     19 
     20 #include <Protocol/DebugSupport.h>
     21 #include <Protocol/LoadedImage.h>
     22 
     23 #include <Library/DebugLib.h>
     24 #include <Library/UefiDriverEntryPoint.h>
     25 #include <Library/BaseMemoryLib.h>
     26 #include <Library/MemoryAllocationLib.h>
     27 #include <Library/UefiBootServicesTableLib.h>
     28 
     29 #define DISABLE_INTERRUPTS  0UL
     30 
     31 #define EFI_ISA IsaIpf
     32 
     33 typedef struct {
     34   UINT64  Low;
     35   UINT64  High;
     36 } BUNDLE;
     37 
     38 typedef
     39 VOID
     40 (*CALLBACK_FUNC) (
     41   );
     42 
     43 /**
     44   IPF specific DebugSupport driver initialization.
     45 
     46   Must be public because it's referenced from DebugSupport.c
     47 
     48   @retval  EFI_SUCCESS     Always.
     49 
     50 **/
     51 EFI_STATUS
     52 PlInitializeDebugSupportDriver (
     53   VOID
     54   );
     55 
     56 /**
     57   Unload handler that is called during UnloadImage() - deallocates pool memory
     58   used by the driver.
     59 
     60   Must be public because it's referenced from DebugSuport.c
     61 
     62   @param  ImageHandle    The firmware allocated handle for the EFI image.
     63 
     64   @retval EFI_SUCCESS    Always.
     65 
     66 **/
     67 EFI_STATUS
     68 EFIAPI
     69 PlUnloadDebugSupportDriver (
     70   IN EFI_HANDLE                   ImageHandle
     71   );
     72 
     73 /**
     74   C callable function to obtain the current value of IVA.
     75 
     76   @return Current value of IVA.
     77 
     78 **/
     79 VOID  *
     80 GetIva (
     81   VOID
     82   );
     83 
     84 /**
     85   C callable function that HookStub will be copied from it's loaded location into the IVT when
     86   an IVT entry is hooked.
     87 
     88 **/
     89 VOID
     90 HookStub (
     91   VOID
     92   );
     93 
     94 /**
     95   C callable function to chain an interrupt handler.
     96 
     97 **/
     98 VOID
     99 ChainHandler (
    100   VOID
    101   );
    102 
    103 /**
    104   C callable function to unchain an interrupt handler.
    105 
    106 **/
    107 VOID
    108 UnchainHandler (
    109   VOID
    110   );
    111 
    112 /**
    113   C callable function to enable/disable interrupts.
    114 
    115   @param  NewInterruptState   New Interrupt State.
    116 
    117   @return Previous state of psr.ic.
    118 
    119 **/
    120 UINT64
    121 ProgramInterruptFlags (
    122   IN UINT64                       NewInterruptState
    123   );
    124 
    125 /**
    126   Flushes instruction cache for specified number of bytes.
    127 
    128   @param  StartAddress     Cache Start Address.
    129   @param  SizeInBytes      Cache Size.
    130 
    131 **/
    132 VOID
    133 InstructionCacheFlush (
    134   IN VOID    *StartAddress,
    135   IN UINTN   SizeInBytes
    136   );
    137 
    138 /**
    139   Returns the maximum value that may be used for the ProcessorIndex parameter in
    140   RegisterPeriodicCallback() and RegisterExceptionCallback().
    141 
    142   Hard coded to support only 1 processor for now.
    143 
    144   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
    145   @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
    146                                 processor index is returned. Always 0 returned.
    147 
    148   @retval EFI_SUCCESS           Always returned with **MaxProcessorIndex set to 0.
    149 
    150 **/
    151 EFI_STATUS
    152 EFIAPI
    153 GetMaximumProcessorIndex (
    154   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
    155   OUT UINTN                       *MaxProcessorIndex
    156   );
    157 
    158 /**
    159   Registers a function to be called back periodically in interrupt context.
    160 
    161   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
    162   @param  ProcessorIndex        Specifies which processor the callback function applies to.
    163   @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
    164                                 periodic entry point of the debug agent.
    165 
    166   @retval EFI_SUCCESS           The function completed successfully.
    167   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
    168                                 function was previously registered.
    169   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
    170                                 function.
    171 **/
    172 EFI_STATUS
    173 EFIAPI
    174 RegisterPeriodicCallback (
    175   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
    176   IN UINTN                        ProcessorIndex,
    177   IN EFI_PERIODIC_CALLBACK        PeriodicCallback
    178   );
    179 
    180 /**
    181   Registers a function to be called when a given processor exception occurs.
    182 
    183   This code executes in boot services context.
    184 
    185   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
    186   @param  ProcessorIndex        Specifies which processor the callback function applies to.
    187   @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called
    188                                 when the processor exception specified by ExceptionType occurs.
    189   @param  ExceptionType         Specifies which processor exception to hook.
    190 
    191   @retval EFI_SUCCESS           The function completed successfully.
    192   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
    193                                 function was previously registered.
    194   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
    195                                 function.
    196 **/
    197 EFI_STATUS
    198 EFIAPI
    199 RegisterExceptionCallback (
    200   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
    201   IN UINTN                        ProcessorIndex,
    202   IN EFI_EXCEPTION_CALLBACK       ExceptionCallback,
    203   IN EFI_EXCEPTION_TYPE           ExceptionType
    204   );
    205 
    206 /**
    207   Invalidates processor instruction cache for a memory range. Subsequent execution in this range
    208   causes a fresh memory fetch to retrieve code to be executed.
    209 
    210   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
    211   @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
    212   @param  Start                 Specifies the physical base of the memory range to be invalidated.
    213   @param  Length                Specifies the minimum number of bytes in the processor's instruction
    214                                 cache to invalidate.
    215 
    216   @retval EFI_SUCCESS           Always returned.
    217 
    218 **/
    219 EFI_STATUS
    220 EFIAPI
    221 InvalidateInstructionCache (
    222   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
    223   IN UINTN                        ProcessorIndex,
    224   IN VOID                         *Start,
    225   IN UINTN                        Length
    226   );
    227 
    228 /**
    229   C routine that is called for all registered exceptions.  This is the main
    230   exception dispatcher.
    231 
    232   Must be public because it's referenced from AsmFuncs.s.
    233 
    234   @param  ExceptionType        Specifies which processor exception.
    235   @param  Context              System Context.
    236 **/
    237 VOID
    238 CommonHandler (
    239   IN EFI_EXCEPTION_TYPE ExceptionType,
    240   IN EFI_SYSTEM_CONTEXT Context
    241   );
    242 
    243 /**
    244   This is the worker function that uninstalls and removes all handlers.
    245 
    246   @param  ExceptionType     Specifies which processor exception.
    247   @param  NewBundles        New Boundles.
    248   @param  NewCallback       A pointer to the new function to be registered.
    249 
    250   @retval EFI_ALEADY_STARTED Ivt already hooked.
    251   @retval EFI_SUCCESS        Successfully uninstalled.
    252 
    253 **/
    254 EFI_STATUS
    255 ManageIvtEntryTable (
    256   IN  EFI_EXCEPTION_TYPE    ExceptionType,
    257   IN  BUNDLE                NewBundles[4],
    258   IN  CALLBACK_FUNC         NewCallback
    259   );
    260 
    261 /**
    262   Saves original IVT contents and inserts a few new bundles which are fixed up
    263   to store the ExceptionType and then call the common handler.
    264 
    265   @param  ExceptionType      Specifies which processor exception.
    266   @param  NewBundles         New Boundles.
    267   @param  NewCallback        A pointer to the new function to be hooked.
    268 
    269 **/
    270 VOID
    271 HookEntry (
    272   IN  EFI_EXCEPTION_TYPE    ExceptionType,
    273   IN  BUNDLE                NewBundles[4],
    274   IN  CALLBACK_FUNC         NewCallback
    275   );
    276 
    277 /**
    278   Restores original IVT contents when unregistering a callback function.
    279 
    280   @param  ExceptionType     Specifies which processor exception.
    281 
    282 **/
    283 VOID
    284 UnhookEntry (
    285   IN  EFI_EXCEPTION_TYPE    ExceptionType
    286   );
    287 
    288 /**
    289   Sets up cache flush and calls assembly function to chain external interrupt.
    290 
    291   Records new callback in IvtEntryTable.
    292 
    293   @param  NewCallback     A pointer to the interrupt handle.
    294 
    295 **/
    296 VOID
    297 ChainExternalInterrupt (
    298   IN  CALLBACK_FUNC         NewCallback
    299   );
    300 
    301 /**
    302   Sets up cache flush and calls assembly function to restore external interrupt.
    303   Removes registered callback from IvtEntryTable.
    304 
    305 **/
    306 VOID
    307 UnchainExternalInterrupt (
    308   VOID
    309   );
    310 
    311 /**
    312   Given an integer number, return the physical address of the entry point in the IFT.
    313 
    314   @param  HandlerIndex       Index of the Handler
    315   @param  EntryPoint         IFT Entrypoint
    316 
    317 **/
    318 VOID
    319 GetHandlerEntryPoint (
    320   UINTN                     HandlerIndex,
    321   VOID                      **EntryPoint
    322   );
    323 
    324 #endif
    325