/** @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
