/**@file
  X64 specific debug support macros, typedefs and prototypes.

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.             

**/

#ifndef _PLDEBUG_SUPPORT_H
#define _PLDEBUG_SUPPORT_H

#define NUM_IDT_ENTRIES                 0x78
#define SYSTEM_TIMER_VECTOR             0x68
#define VECTOR_ENTRY_PAGES              1
#define CopyDescriptor(Dest, Src)       CopyMem ((Dest), (Src), sizeof (DESCRIPTOR))
#define ZeroDescriptor(Dest)            CopyDescriptor ((Dest), &NullDesc)
#define ReadIdt(Vector, Dest)           CopyDescriptor ((Dest), &((GetIdtr ())[(Vector)]))
#define WriteIdt(Vector, Src)           CopyDescriptor (&((GetIdtr ())[(Vector)]), (Src))
#define CompareDescriptor(Desc1, Desc2) CompareMem ((Desc1), (Desc2), sizeof (DESCRIPTOR))
#define EFI_ISA                         IsaX64
#define FF_FXSR                         (1 << 24)

typedef struct {
  UINT64 Low;
  UINT64 High;
} DESCRIPTOR;

typedef
VOID
(*DEBUG_PROC) (
  VOID
  )
;

typedef struct {
  DESCRIPTOR  OrigDesc;
  DEBUG_PROC  OrigVector;
  DESCRIPTOR  NewDesc;
  DEBUG_PROC  StubEntry;
  VOID (*RegisteredCallback) ();
} IDT_ENTRY;

extern EFI_SYSTEM_CONTEXT SystemContext;
extern UINT8              InterruptEntryStub[];
extern UINT32             StubSize;
extern VOID (*OrigVector) (VOID);

VOID
CommonIdtEntry (
  VOID
  )
/*++

Routine Description:

  Generic IDT entry

Arguments:

  None

Returns:

  None

--*/
;


BOOLEAN
FxStorSupport (
  VOID
  )
/*++

Routine Description:

  Check whether FXSTOR is supported

Arguments:

  None

Returns:

  TRUE  - supported
  FALSE - not supported

--*/
;

DESCRIPTOR  *
GetIdtr (
  VOID
  )
/*++

Routine Description:

  Return the physical address of IDTR

Arguments:

  None

Returns:

  The physical address of IDTR

--*/
;

VOID
Vect2Desc (
  DESCRIPTOR * DestDesc,
  VOID (*Vector) (VOID)
  )
/*++

Routine Description:

  Encodes an IDT descriptor with the given physical address

Arguments:

  DestDesc  - The IDT descriptor address
  Vector    - The interrupt vector entry

Returns:

  None

--*/
;

BOOLEAN
WriteInterruptFlag (
  BOOLEAN NewState
  )
/*++

Routine Description:

  Programs interrupt flag to the requested state and returns previous
  state.

Arguments:

  NewState  - New interrupt status

Returns:

  Old interrupt status

--*/
;

EFI_STATUS
plInitializeDebugSupportDriver (
  VOID
  )
/*++

Routine Description:
  Initializes driver's handler registration database.

  This code executes in boot services context.

Arguments:
  None

Returns:
  EFI_SUCCESS
  EFI_UNSUPPORTED - if X64 processor does not support FXSTOR/FXRSTOR instructions,
                    the context save will fail, so these processor's are not supported.
  EFI_OUT_OF_RESOURCES - not resource to finish initialization

--*/
;

EFI_STATUS
EFIAPI
plUnloadDebugSupportDriver (
  IN EFI_HANDLE                       ImageHandle
  )
/*++

Routine Description:
  This is the callback that is written to the LoadedImage protocol instance
  on the image handle. It uninstalls all registered handlers and frees all entry
  stub memory.

  This code executes in boot services context.

Arguments:
  ImageHandle - The image handle of the unload handler

Returns:

  EFI_SUCCESS - always return success

--*/
;

//
// DebugSupport protocol member functions
//
EFI_STATUS
EFIAPI
GetMaximumProcessorIndex (
  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,
  OUT UINTN                           *MaxProcessorIndex
  )
/*++

Routine Description: This is a DebugSupport protocol member function.

Arguments:
  This              - The DebugSupport instance
  MaxProcessorIndex - The maximuim supported processor index

Returns:
  Always returns EFI_SUCCESS with *MaxProcessorIndex set to 0

--*/
;

EFI_STATUS
EFIAPI
RegisterPeriodicCallback (
  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,
  IN UINTN                            ProcessorIndex,
  IN EFI_PERIODIC_CALLBACK            PeriodicCallback
  )
/*++

Routine Description: This is a DebugSupport protocol member function.

Arguments:
  This             - The DebugSupport instance
  ProcessorIndex   - Which processor the callback applies to.
  PeriodicCallback - Callback function

Returns:

  EFI_SUCCESS
  EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
                          no handler registered for it
  EFI_ALREADY_STARTED   - requested install to a vector that already has a handler registered.

  Other possible return values are passed through from UnHookEntry and HookEntry.

--*/
;

EFI_STATUS
EFIAPI
RegisterExceptionCallback (
  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,
  IN UINTN                            ProcessorIndex,
  IN EFI_EXCEPTION_CALLBACK           NewCallback,
  IN EFI_EXCEPTION_TYPE               ExceptionType
  )
/*++

Routine Description:
  This is a DebugSupport protocol member function.

  This code executes in boot services context.

Arguments:
  This             - The DebugSupport instance
  ProcessorIndex   - Which processor the callback applies to.
  NewCallback      - Callback function
  ExceptionType    - Which exception to hook

Returns:

  EFI_SUCCESS
  EFI_INVALID_PARAMETER - requested uninstalling a handler from a vector that has
                          no handler registered for it
  EFI_ALREADY_STARTED   - requested install to a vector that already has a handler registered.

  Other possible return values are passed through from UnHookEntry and HookEntry.

--*/
;

EFI_STATUS
EFIAPI
InvalidateInstructionCache (
  IN EFI_DEBUG_SUPPORT_PROTOCOL       *This,
  IN UINTN                            ProcessorIndex,
  IN VOID                             *Start,
  IN UINT64                           Length
  )
/*++

Routine Description:
  This is a DebugSupport protocol member function.
  Calls assembly routine to flush cache.

Arguments:
  This             - The DebugSupport instance
  ProcessorIndex   - Which processor the callback applies to.
  Start            - Physical base of the memory range to be invalidated
  Length           - mininum number of bytes in instruction cache to invalidate

Returns:

  EFI_SUCCESS - always return success

--*/
;

#endif
