2. Fixed issue that Ovmf with debug agent cannot boot if HOST software was not connected. Signed-off-by: vanjeff Reviewed-by: geekboy15a Reviewed-by: erictian git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12486 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			310 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			310 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Command header of for Debug Agent library instance.
 | |
| 
 | |
|   Copyright (c) 2010 - 2011, 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 _DEBUG_AGENT_H_
 | |
| #define _DEBUG_AGENT_H_
 | |
| 
 | |
| #include <Register/LocalApic.h>
 | |
| 
 | |
| #include <Guid/DebugAgentGuid.h>
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/ResetSystemLib.h>
 | |
| #include <Library/IoLib.h>
 | |
| #include <Library/HobLib.h>
 | |
| #include <Library/DebugCommunicationLib.h>
 | |
| #include <Library/DebugAgentLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/SynchronizationLib.h>
 | |
| #include <Library/LocalApicLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| 
 | |
| #include <TransferProtocol.h>
 | |
| #include <ImageDebugSupport.h>
 | |
| 
 | |
| #include "DebugMp.h"
 | |
| #include "DebugTimer.h"
 | |
| #include "ArchDebugSupport.h"
 | |
| 
 | |
| #define DEBUG_AGENT_REVISION            ((0 << 16) | 01)
 | |
| #define DEBUG_AGENT_CAPABILITIES        0
 | |
| 
 | |
| #define DEBUG_INT1_VECTOR               1
 | |
| #define DEBUG_INT3_VECTOR               3
 | |
| #define DEBUG_TIMER_VECTOR              32
 | |
| #define DEBUG_MAILBOX_VECTOR            33
 | |
| 
 | |
| #define SOFT_INTERRUPT_SIGNATURE    SIGNATURE_32('S','O','F','T')
 | |
| #define SYSTEM_RESET_SIGNATURE      SIGNATURE_32('S','Y','S','R')
 | |
| #define MEMORY_READY_SIGNATURE      SIGNATURE_32('M','E','M','R')
 | |
| 
 | |
| extern UINTN  Exception0Handle;
 | |
| extern UINTN  TimerInterruptHandle;
 | |
| extern UINT16 ExceptionStubHeaderSize;
 | |
| 
 | |
| typedef union {
 | |
|   struct {
 | |
|     UINT32  HostPresent      : 1;
 | |
|     UINT32  BreakOnNextSmi   : 1;
 | |
|     UINT32  Reserved         : 30;
 | |
|   } Bits;
 | |
|   UINT32  Uint32;
 | |
| } DEBUG_AGENT_FLAG;
 | |
| 
 | |
| #pragma pack(1)
 | |
| typedef struct {
 | |
|   DEBUG_AGENT_FLAG           DebugFlag;
 | |
|   UINT64                     DebugPortHandle;
 | |
| } DEBUG_AGENT_MAILBOX;
 | |
| #pragma pack()
 | |
| 
 | |
| typedef union {
 | |
|   struct {
 | |
|     UINT32  LimitLow    : 16;
 | |
|     UINT32  BaseLow     : 16;
 | |
|     UINT32  BaseMid     : 8;
 | |
|     UINT32  Type        : 4;
 | |
|     UINT32  System      : 1;
 | |
|     UINT32  Dpl         : 2;
 | |
|     UINT32  Present     : 1;
 | |
|     UINT32  LimitHigh   : 4;
 | |
|     UINT32  Software    : 1;
 | |
|     UINT32  Reserved    : 1;
 | |
|     UINT32  DefaultSize : 1;
 | |
|     UINT32  Granularity : 1;
 | |
|     UINT32  BaseHigh    : 8;
 | |
|   } Bits;
 | |
|   UINT64  Uint64;
 | |
| } IA32_GDT;
 | |
| 
 | |
| /**
 | |
|   Caller provided function to be invoked at the end of DebugPortInitialize().
 | |
| 
 | |
|   Refer to the descrption for DebugPortInitialize() for more details.
 | |
| 
 | |
|   @param[in] Context           The first input argument of DebugPortInitialize().
 | |
|   @param[in] DebugPortHandle   Debug port handle created by Debug Communication Libary.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| InitializeDebugAgentPhase2 (
 | |
|   IN VOID                  *Context,
 | |
|   IN DEBUG_PORT_HANDLE     DebugPortHandle
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initialize IDT entries to support source level debug.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| InitializeDebugIdt (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Write specified register into save CPU context.
 | |
| 
 | |
|   @param[in] CpuContext         Pointer to saved CPU context.
 | |
|   @param[in] Index              Register index value.
 | |
|   @param[in] Offset             Offset in register address range
 | |
|   @param[in] Width              Data width to read.
 | |
|   @param[in] RegisterBuffer     Pointer to input buffer with data.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ArchWriteRegisterBuffer (
 | |
|   IN DEBUG_CPU_CONTEXT               *CpuContext,
 | |
|   IN UINT8                           Index,
 | |
|   IN UINT8                           Offset,
 | |
|   IN UINT8                           Width,
 | |
|   IN UINT8                           *RegisterBuffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read register value from saved CPU context.
 | |
| 
 | |
|   @param[in] CpuContext         Pointer to saved CPU context.
 | |
|   @param[in] Index              Register index value.
 | |
|   @param[in] Offset             Offset in register address range
 | |
|   @param[in] Width              Data width to read.
 | |
| 
 | |
|   @return The address of register value.
 | |
| 
 | |
| **/
 | |
| UINT8 *
 | |
| ArchReadRegisterBuffer (
 | |
|   IN DEBUG_CPU_CONTEXT               *CpuContext,
 | |
|   IN UINT8                           Index,
 | |
|   IN UINT8                           Offset,
 | |
|   IN UINT8                           *Width
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Send packet with response data to HOST.
 | |
| 
 | |
|   @param[in] CpuContext  Pointer to saved CPU context.
 | |
|   @param[in] Data        Pointer to response data buffer.
 | |
|   @param[in] DataSize    Size of response data in byte.
 | |
| 
 | |
|   @retval RETURN_SUCCESS      Response data was sent successfully.
 | |
|   @retval RETURN_DEVICE_ERROR Cannot receive DEBUG_COMMAND_OK from HOST.
 | |
| 
 | |
| **/
 | |
| RETURN_STATUS
 | |
| SendDataResponsePacket (
 | |
|   IN DEBUG_CPU_CONTEXT    *CpuContext,
 | |
|   IN UINT8                *Data,
 | |
|   IN UINT16               DataSize
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read segment selector by register index.
 | |
| 
 | |
|   @param[in] CpuContext           Pointer to saved CPU context.
 | |
|   @param[in] RegisterIndex        Register Index.
 | |
| 
 | |
|   @return Value of segment selector.
 | |
| 
 | |
| **/
 | |
| UINT64
 | |
| ReadRegisterSelectorByIndex (
 | |
|   IN DEBUG_CPU_CONTEXT                       *CpuContext,
 | |
|   IN UINT8                                   RegisterIndex
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read group register of common registers.
 | |
| 
 | |
|   @param[in] CpuContext           Pointer to saved CPU context.
 | |
|   @param[in] RegisterGroup        Pointer to Group registers.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ReadRegisterGroup (
 | |
|   IN DEBUG_CPU_CONTEXT                       *CpuContext,
 | |
|   IN DEBUG_DATA_REPONSE_READ_REGISTER_GROUP  *RegisterGroup
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read group register of Segment Base.
 | |
| 
 | |
|   @param[in] CpuContext           Pointer to saved CPU context.
 | |
|   @param[in] RegisterGroupSegBase Pointer to Group registers.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ReadRegisterGroupSegBase (
 | |
|   IN DEBUG_CPU_CONTEXT                              *CpuContext,
 | |
|   IN DEBUG_DATA_REPONSE_READ_REGISTER_GROUP_SEGBASE *RegisterGroupSegBase
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read gourp register of Segment Limit.
 | |
| 
 | |
|   @param[in] CpuContext           Pointer to saved CPU context.
 | |
|   @param[in] RegisterGroupSegLim  Pointer to Group registers.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| ReadRegisterGroupSegLim (
 | |
|   IN DEBUG_CPU_CONTEXT                             *CpuContext,
 | |
|   IN DEBUG_DATA_REPONSE_READ_REGISTER_GROUP_SEGLIM *RegisterGroupSegLim
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Read group register by group index.
 | |
| 
 | |
|   @param[in] CpuContext           Pointer to saved CPU context.
 | |
|   @param[in] GroupIndex           Group Index.
 | |
| 
 | |
|   @retval RETURN_SUCCESS         Read successfully.
 | |
|   @retval RETURN_NOT_SUPPORTED   Group index cannot be supported.
 | |
| 
 | |
| **/
 | |
| RETURN_STATUS
 | |
| ArchReadRegisterGroup (
 | |
|   IN DEBUG_CPU_CONTEXT                             *CpuContext,
 | |
|   IN UINT8                                         GroupIndex
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Send acknowledge packet to HOST.
 | |
| 
 | |
|   @param AckCommand    Type of Acknowledge packet.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SendAckPacket (
 | |
|   IN UINT8                AckCommand
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Receive acknowledge packet OK from HOST in specified time.
 | |
| 
 | |
|   @param[in]  Timeout       Time out value to wait for acknowlege from HOST.
 | |
|                             The unit is microsecond.
 | |
|   @param[out] BreakReceived If BreakReceived is not NULL,
 | |
|                             TRUE is retured if break-in symbol received.
 | |
|                             FALSE is retured if break-in symbol not received.
 | |
| 
 | |
|   @retval  RETRUEN_SUCCESS  Succeed to receive acknowlege packet from HOST,
 | |
|                             the type of acknowlege packet saved in Ack.
 | |
|   @retval  RETURN_TIMEOUT   Specified timeout value was up.
 | |
| 
 | |
| **/
 | |
| RETURN_STATUS
 | |
| WaitForAckPacketOK (
 | |
|   IN  UINTN                     Timeout,
 | |
|   OUT BOOLEAN                   *BreakReceived OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Check if HOST is connected based on Mailbox.
 | |
| 
 | |
|   @retval TRUE        HOST is connected.
 | |
|   @retval FALSE       HOST is not connected.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| IsHostConnected (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get Debug Agent Mailbox pointer.
 | |
| 
 | |
|   @return Mailbox pointer.
 | |
| 
 | |
| **/
 | |
| DEBUG_AGENT_MAILBOX *
 | |
| GetMailboxPointer (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get debug port handle.
 | |
| 
 | |
|   @return Debug port handle.
 | |
| 
 | |
| **/
 | |
| DEBUG_PORT_HANDLE
 | |
| GetDebugPortHandle (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| #endif
 | |
| 
 |