/** @file
  Private include file for GDB stub

  Copyright (c) 2008 - 2009, Apple Inc. 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 __GCC_DEBUG_AGENT_INTERNAL__
#define __GCC_DEBUG_AGENT_INTERNAL__

#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/GdbSerialLib.h>
#include <Library/PrintLib.h>
#include <Library/CacheMaintenanceLib.h>
#include <Library/DebugAgentTimerLib.h>
#include <Library/DebugAgentLib.h>

#include <IndustryStandard/PeImage.h>
#include <Protocol/DebugSupport.h>

extern CONST CHAR8 mHexToStr[];

// maximum size of input and output buffers
// This value came from the show remote command of the gdb we tested against 
#define MAX_BUF_SIZE 2000

// maximum size of address buffer
#define MAX_ADDR_SIZE 32

// maximum size of register number buffer
#define MAX_REG_NUM_BUF_SIZE 32

// maximum size of length buffer
#define MAX_LENGTH_SIZE 32

// maximum size of T signal members
#define MAX_T_SIGNAL_SIZE 64

// the mask used to clear all the cache
#define TF_BIT 0x00000100


//
// GDB Signal definitions - generic names for interrupts
//
#define GDB_SIGINT      2  // Interrupt process via ctrl-c
#define GDB_SIGILL      4  // Illegal instruction       
#define GDB_SIGTRAP     5  // Trace Trap (Breakpoint and SingleStep)
#define GDB_SIGEMT      7  // Emulator Trap
#define GDB_SIGFPE      8  // Floating point exception
#define GDB_SIGSEGV     11 // Setgment violation, page fault 


//
// GDB File I/O Error values, zero means no error
// Includes all general GDB Unix like error values
//
#define GDB_EBADMEMADDRBUFSIZE   11  // the buffer that stores memory Address to be read from/written to is not the right size
#define GDB_EBADMEMLENGBUFSIZE   12  // the buffer that stores Length is not the right size 
#define GDB_EBADMEMLENGTH        13  // Length, the given number of bytes to read or write, is not the right size
#define GDB_EBADMEMDATA          14  // one of the bytes or nibbles of the memory is leess than 0 
#define GDB_EBADMEMDATASIZE      15  // the memory data, 'XX..', is too short or too long
#define GDB_EBADBUFSIZE          21  // the buffer created is not the correct size
#define GDB_EINVALIDARG          31  // argument is invalid
#define GDB_ENOSPACE             41  //
#define GDB_EINVALIDBRKPOINTTYPE 51  // the breakpoint type is not recognized
#define GDB_EINVALIDREGNUM       61  // given register number is not valid: either <0 or >=Number of Registers
#define GDB_EUNKNOWN             255 // unknown


//
// These devices are open by GDB so we can just read and write to them
//
#define GDB_STDIN   0x00
#define GDB_STDOUT  0x01
#define GDB_STDERR  0x02

//
//Define Register size for different architectures
//
#if defined (MDE_CPU_IA32) 
#define REG_SIZE  32
#elif defined (MDE_CPU_X64)
#define REG_SIZE  64
#elif defined (MDE_CPU_ARM)
#define REG_SIZE  32
#endif


typedef struct {
  EFI_EXCEPTION_TYPE  Exception;
  UINT8               SignalNo;
} EFI_EXCEPTION_TYPE_ENTRY;


#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)

//
// Byte packed structure for DR6
// 32-bits on IA-32
// 64-bits on X64.  The upper 32-bits on X64 are reserved
//
typedef union {
  struct {
    UINT32  B0:1;           // Breakpoint condition detected
    UINT32  B1:1;           // Breakpoint condition detected
    UINT32  B2:1;           // Breakpoint condition detected
    UINT32  B3:1;           // Breakpoint condition detected
    UINT32  Reserved_1:9;   // Reserved 
    UINT32  BD:1;           // Debug register access detected
    UINT32  BS:1;           // Single step
    UINT32  BT:1;           // Task switch
    UINT32  Reserved_2:16;  // Reserved
  } Bits;
  UINTN     UintN;
} IA32_DR6;

//
// Byte packed structure for DR7
// 32-bits on IA-32
// 64-bits on X64.  The upper 32-bits on X64 are reserved
//
typedef union {
  struct {
    UINT32  L0:1;           // Local breakpoint enable
    UINT32  G0:1;           // Global breakpoint enable
    UINT32  L1:1;           // Local breakpoint enable
    UINT32  G1:1;           // Global breakpoint enable
    UINT32  L2:1;           // Local breakpoint enable
    UINT32  G2:1;           // Global breakpoint enable
    UINT32  L3:1;           // Local breakpoint enable
    UINT32  G3:1;           // Global breakpoint enable
    UINT32  LE:1;           // Local exact breakpoint enable
    UINT32  GE:1;           // Global exact breakpoint enable
    UINT32  Reserved_1:3;   // Reserved
    UINT32  GD:1;           // Global detect enable
    UINT32  Reserved_2:2;   // Reserved
    UINT32  RW0:2;          // Read/Write field
    UINT32  LEN0:2;         // Length field
    UINT32  RW1:2;          // Read/Write field
    UINT32  LEN1:2;         // Length field
    UINT32  RW2:2;          // Read/Write field
    UINT32  LEN2:2;         // Length field
    UINT32  RW3:2;          // Read/Write field
    UINT32  LEN3:2;         // Length field
  } Bits;
  UINTN     UintN;
} IA32_DR7;

#endif /* if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) */

typedef enum {
  InstructionExecution,   //Hardware breakpoint
  DataWrite,              //watch
  DataRead,               //rwatch
  DataReadWrite,          //awatch
  SoftwareBreakpoint,     //Software breakpoint
  NotSupported
} BREAK_TYPE;

//
// Array of exception types that need to be hooked by the debugger
//
extern EFI_EXCEPTION_TYPE_ENTRY gExceptionType[];

//
// If the periodic callback is called while we are processing an F packet we need
// to let the callback know to not read from the serail stream as it could steal
// characters from the F reponse packet
//
extern BOOLEAN gProcessingFPacket;


/**
 Return the number of entries in the gExceptionType[]
 
 @retval    UINTN, the number of entries in the gExceptionType[] array.    
 **/
UINTN
MaxEfiException (
  VOID
  );


/**
 Check to see if the ISA is supported. 
 ISA = Instruction Set Architecture
 
 @retval    TRUE if Isa is supported,
 FALSE otherwise.
 **/
BOOLEAN
CheckIsa (
  IN    EFI_INSTRUCTION_SET_ARCHITECTURE    Isa
  );


/**
 Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
 
 @param  SystemContext        Register content at time of the exception
 @param  GdbExceptionType     GDB exception type
 **/

VOID
GdbSendTSignal (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  UINT8	              GdbExceptionType
  );


/**
 Translates the EFI mapping to GDB mapping
 
 @param     EFIExceptionType        EFI Exception that is being processed
 @retval    UINTN that corresponds to EFIExceptionType's GDB exception type number
 **/
UINT8
ConvertEFItoGDBtype ( 
  IN  EFI_EXCEPTION_TYPE EFIExceptionType
  );


/**
 Empties the given buffer 
 @param *Buf pointer to the first element in buffer to be emptied
 **/
VOID
EmptyBuffer ( 
  IN CHAR8  *Buf
  );


/**
 Converts an 8-bit Hex Char into a INTN.
 
 @param     Char  - the hex character to be converted into UINTN
 @retval    a INTN, from 0 to 15, that corressponds to Char
 -1 if Char is not a hex character
 **/
INTN
HexCharToInt (
  IN  CHAR8 Char
  );


/** 'E NN'
 Send an error with the given error number after converting to hex.
 The error number is put into the buffer in hex. '255' is the biggest errno we can send.
 ex: 162 will be sent as A2.
 
 @param   errno    the error number that will be sent
 **/
VOID
EFIAPI
SendError (
  IN  UINT8     ErrorNum
  );


/**
 Send 'OK' when the function is done executing successfully.
 **/
VOID
SendSuccess (
  VOID
  );


/**
 Send empty packet to specify that particular command/functionality is not supported.
 **/
VOID
SendNotSupported (
  VOID
  );

/** ‘p n’ 
 Reads the n-th register's value into an output buffer and sends it as a packet 
 @param     SystemContext       Register content at time of the exception
 @param     InBuffer            This is the input buffer received from gdb server
 **/
VOID
ReadNthRegister (
  IN    EFI_SYSTEM_CONTEXT  SystemContext,
  IN    CHAR8               *InBuffer
  );


/** ‘g’ 
 Reads the general registers into an output buffer  and sends it as a packet 
 @param     SystemContext           Register content at time of the exception
 **/
VOID
ReadGeneralRegisters (  
  IN    EFI_SYSTEM_CONTEXT  SystemContext
  );


/** ‘P n...=r...’
 Writes the new value of n-th register received into the input buffer to the n-th register
 @param     SystemContext       Register content at time of the exception
 @param     InBuffer            This is the input buffer received from gdb server
 **/
VOID
WriteNthRegister (
  IN    EFI_SYSTEM_CONTEXT  SystemContext,
  IN    CHAR8               *InBuffer
  );


/** ‘G XX...’
 Writes the new values received into the input buffer to the general registers
 @param     SystemContext               Register content at time of the exception
 @param     InBuffer                    Pointer to the input buffer received from gdb server
 **/

VOID
WriteGeneralRegisters (
  IN    EFI_SYSTEM_CONTEXT  SystemContext,
  IN    CHAR8               *InBuffer
  );


/** ‘m addr,length ’
 Find the Length of the area to read and the start addres. Finally, pass them to 
 another function, TransferFromMemToOutBufAndSend, that will read from that memory space and 
 send it as a packet.
 
 @param  *PacketData  Pointer to Payload data for the packet
 **/
VOID
ReadFromMemory (
  IN  CHAR8  *PacketData
  );


/** ‘M addr,length :XX...’
 Find the Length of the area in bytes to write and the start addres. Finally, pass them to 
 another function, TransferFromInBufToMem, that will write to that memory space the info in
 the input buffer.
 
 @param   PacketData     Pointer to Payload data for the packet
 **/
VOID
WriteToMemory (
  IN CHAR8 *PacketData
  );


/** ‘c [addr ]’ 
 Continue. addr is Address to resume. If addr is omitted, resume at current 
 Address.
 
 @param SystemContext Register content at time of the exception  
 @param *PacketData   Pointer to PacketData
 **/

VOID
ContinueAtAddress (
  IN  EFI_SYSTEM_CONTEXT   SystemContext,
  IN  CHAR8                *PacketData
  );


/** ‘s [addr ]’
 Single step. addr is the Address at which to resume. If addr is omitted, resume 
 at same Address.
 
 @param SystemContext   Register content at time of the exception
 @param PacketData      Pointer to Payload data for the packet
 **/
VOID
SingleStep (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  CHAR8               *PacketData
  );

/** 
 Insert Single Step in the SystemContext
 
 @param SystemContext   Register content at time of the exception
 **/
VOID
AddSingleStep (
  IN  EFI_SYSTEM_CONTEXT  SystemContext
  );
  
/** 
 Remove Single Step in the SystemContext
 
 @param SystemContext   Register content at time of the exception
 **/
VOID
RemoveSingleStep (
  IN  EFI_SYSTEM_CONTEXT  SystemContext
  );
  
  
/**
  ‘Z1, [addr], [length]’
  ‘Z2, [addr], [length]’
  ‘Z3, [addr], [length]’
  ‘Z4, [addr], [length]’

  Insert hardware breakpoint/watchpoint at address addr of size length

  @param SystemContext  Register content at time of the exception
  @param *PacketData    Pointer to the Payload data for the packet

**/
VOID
EFIAPI
InsertBreakPoint(
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  CHAR8               *PacketData
  );


/**
  ‘z1, [addr], [length]’
  ‘z2, [addr], [length]’
  ‘z3, [addr], [length]’
  ‘z4, [addr], [length]’

  Remove hardware breakpoint/watchpoint at address addr of size length

  @param SystemContext  Register content at time of the exception
  @param *PacketData    Pointer to the Payload data for the packet

**/
VOID
EFIAPI
RemoveBreakPoint(
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  CHAR8               *PacketData
  );


/**
 Exception Hanldler for GDB. It will be called for all exceptions
 registered via the gExceptionType[] array.
 
 @param ExceptionType   Exception that is being processed
 @param SystemContext   Register content at time of the exception  
 
 **/
VOID
EFIAPI
GdbExceptionHandler ( 
  IN     EFI_EXCEPTION_TYPE  ExceptionType, 
  IN OUT EFI_SYSTEM_CONTEXT  SystemContext 
  );


/**
 Periodic callback for GDB. This function is used to catch a ctrl-c or other 
 break in type command from GDB.
 
 @param SystemContext           Register content at time of the call
 
 **/
VOID
EFIAPI
GdbPeriodicCallBack ( 
  IN OUT EFI_SYSTEM_CONTEXT  SystemContext 
  );


/**
  Make two serail consoles: 1) StdIn and StdOut via GDB. 2) StdErr via GDB.
  
  These console show up on the remote system running GDB

**/

VOID
GdbInitializeSerialConsole (
  VOID
  );


/**
  Send a GDB Remote Serial Protocol Packet
  
  $PacketData#checksum PacketData is passed in and this function adds the packet prefix '$', 
  the packet teminating character '#' and the two digit checksum.
  
  If an ack '+' is not sent resend the packet, but timeout eventually so we don't end up 
  in an infinit loop. This is so if you unplug the debugger code just keeps running

  @param PacketData   Payload data for the packet  
  
  @retval             Number of bytes of packet data sent.

**/
UINTN
SendPacket (
  IN  CHAR8 *PacketData
  );
  

/**
 Receive a GDB Remote Serial Protocol Packet
 
 $PacketData#checksum PacketData is passed in and this function adds the packet prefix '$', 
 the packet teminating character '#' and the two digit checksum.
 
 If host re-starts sending a packet without ending the previous packet, only the last valid packet is proccessed.
 (In other words, if received packet is '$12345$12345$123456#checksum', only '$123456#checksum' will be processed.)
 
 If an ack '+' is not sent resend the packet
 
 @param PacketData   Payload data for the packet  
 
 @retval             Number of bytes of packet data received.

 **/
UINTN
ReceivePacket (
 OUT  CHAR8 *PacketData,
 IN   UINTN PacketDataSize
 );
  

/**
  Read data from a FileDescriptor. On success number of bytes read is returned. Zero indicates 
  the end of a file. On error -1 is returned. If count is zero, GdbRead returns zero.

  @param  FileDescriptor   Device to talk to.
  @param  Buffer           Buffer to hold Count bytes that were read
  @param  Count            Number of bytes to transfer. 

  @retval -1               Error
  @retval {other}          Number of bytes read.

**/
INTN
GdbRead (
  IN  INTN    FileDescriptor,
  OUT VOID    *Buffer,
  IN  UINTN   Count
  );
  

/**
  Write data to a FileDescriptor. On success number of bytes written is returned. Zero indicates 
  nothing was written. On error -1 is returned. 

  @param  FileDescriptor   Device to talk to.
  @param  Buffer           Buffer to hold Count bytes that are to be written
  @param  Count            Number of bytes to transfer. 

  @retval -1               Error
  @retval {other}          Number of bytes written.

**/
INTN
GdbWrite (
  IN  INTN          FileDescriptor,
  OUT CONST VOID    *Buffer,
  IN  UINTN         Count
  );

UINTN *  
FindPointerToRegister (
  IN  EFI_SYSTEM_CONTEXT    SystemContext,
  IN  UINTN                 RegNumber  
  );

CHAR8 * 
BasicReadRegister (
  IN  EFI_SYSTEM_CONTEXT      SystemContext,
  IN  UINTN                   RegNumber,
  IN  CHAR8                   *OutBufPtr
  );

VOID
TransferFromInBufToMem (
  IN  UINTN   Length,
  IN  UINT8   *Address,
  IN  CHAR8   *NewData
  );

VOID
TransferFromMemToOutBufAndSend (
  IN  UINTN  Length,
  IN  UINT8  *Address
  );

CHAR8 *
BasicWriteRegister (
  IN  EFI_SYSTEM_CONTEXT    SystemContext,
  IN  UINTN                 RegNumber,
  IN  CHAR8                 *InBufPtr
  );

VOID  
PrintReg (
  EFI_SYSTEM_CONTEXT SystemContext
  );

UINTN
ParseBreakpointPacket (
  IN  CHAR8 *PacketData,
  OUT UINTN *Type,
  OUT UINTN *Address,
  OUT UINTN *Length
  );

UINTN
GetBreakpointDataAddress (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  UINTN               BreakpointNumber 
  );

UINTN
GetBreakpointDetected (
  IN  EFI_SYSTEM_CONTEXT  SystemContext
  );

BREAK_TYPE
GetBreakpointType (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  UINTN               BreakpointNumber  
  );

UINTN
ConvertLengthData (
  IN  UINTN  Length
  );

EFI_STATUS
FindNextFreeDebugRegister (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  OUT UINTN               *Register
  );

EFI_STATUS
EnableDebugRegister (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  UINTN               Register,
  IN  UINTN               Address,
  IN  UINTN               Length,
  IN  UINTN               Type
  );

EFI_STATUS
FindMatchingDebugRegister (
 IN  EFI_SYSTEM_CONTEXT  SystemContext,
 IN  UINTN               Address,
 IN  UINTN               Length,
 IN  UINTN               Type,
 OUT UINTN               *Register
 );

EFI_STATUS
DisableDebugRegister (
 IN  EFI_SYSTEM_CONTEXT  SystemContext,
 IN  UINTN               Register
 );

VOID
InitializeProcessor (
  VOID
  );

/**
 Send the T signal with the given exception type (in gdb order) and possibly with n:r pairs related to the watchpoints
 
 @param  SystemContext        Register content at time of the exception
 @param  GdbExceptionType     GDB exception type
 **/
VOID
ProcessorSendTSignal (
  IN  EFI_SYSTEM_CONTEXT  SystemContext,
  IN  UINT8               GdbExceptionType,
  IN  OUT CHAR8           *TSignalPtr,
  IN  UINTN               SizeOfBuffer
  );

/**
 Check to see if this exception is related to ctrl-c handling.
 
 @param ExceptionType     Exception that is being processed
 @param SystemContext     Register content at time of the exception  

 @return  TRUE  This was a ctrl-c check that did not find a ctrl-c
 @return  FALSE This was not a ctrl-c check or some one hit ctrl-c
 **/
BOOLEAN
ProcessorControlC ( 
  IN  EFI_EXCEPTION_TYPE        ExceptionType, 
  IN OUT EFI_SYSTEM_CONTEXT     SystemContext 
  );


/**
  Initialize debug agent.

  This function is used to set up debug enviroment. It may enable interrupts.

  @param[in] InitFlag   Init flag is used to decide initialize process.
  @param[in] Context    Context needed according to InitFlag, it was optional.

**/
VOID
EFIAPI
DebugAgentHookExceptions (
  IN UINT32                InitFlag,
  IN VOID                  *Context  OPTIONAL
  );


#endif
