Fix a bug in DebugAgent that hang happens when the ACK for GO is lost.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16322 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Ruiyu Ni 2014-11-10 08:47:49 +00:00 committed by niruiyu
parent 1ff1dd0ff9
commit ace354f10b
2 changed files with 17 additions and 14 deletions

View File

@ -2,7 +2,7 @@
Transfer protocol defintions used by debug agent and host. It is only Transfer protocol defintions used by debug agent and host. It is only
intended to be used by Debug related module implementation. intended to be used by Debug related module implementation.
Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR> Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -53,6 +53,8 @@ typedef struct {
#define DEBUG_COMMAND_REQUEST (0 << 7) #define DEBUG_COMMAND_REQUEST (0 << 7)
#define DEBUG_COMMAND_RESPONSE (1 << 7) #define DEBUG_COMMAND_RESPONSE (1 << 7)
#define IS_REQUEST(x) (((x)->Command & DEBUG_COMMAND_RESPONSE) == 0)
// //
// HOST initiated commands // HOST initiated commands
// //

View File

@ -605,19 +605,20 @@ ReadRemainingBreakPacket (
return EFI_CRC_ERROR; return EFI_CRC_ERROR;
} }
Mailbox = GetMailboxPointer(); Mailbox = GetMailboxPointer();
if (((DebugHeader->Command & DEBUG_COMMAND_RESPONSE) == 0) && if (IS_REQUEST (DebugHeader)) {
(DebugHeader->SequenceNo == (UINT8) (Mailbox->HostSequenceNo + 1))) { if (DebugHeader->SequenceNo == (UINT8) (Mailbox->HostSequenceNo + 1)) {
// //
// Only updagte HostSequenceNo for new command packet // Only updagte HostSequenceNo for new command packet
// //
UpdateMailboxContent (Mailbox, DEBUG_MAILBOX_HOST_SEQUENCE_NO_INDEX, DebugHeader->SequenceNo); UpdateMailboxContent (Mailbox, DEBUG_MAILBOX_HOST_SEQUENCE_NO_INDEX, DebugHeader->SequenceNo);
return EFI_SUCCESS; return EFI_SUCCESS;
} else {
//
// If one old command or response packet received, skip it
//
return EFI_DEVICE_ERROR;
} }
if (DebugHeader->SequenceNo == Mailbox->HostSequenceNo) {
return EFI_SUCCESS;
}
}
return EFI_DEVICE_ERROR;
} }
/** /**
@ -1646,7 +1647,7 @@ CommandCommunication (
DebugAgentMsgPrint (DEBUG_AGENT_INFO, "TARGET: Try to get command from HOST...\n"); DebugAgentMsgPrint (DEBUG_AGENT_INFO, "TARGET: Try to get command from HOST...\n");
Status = ReceivePacket ((UINT8 *)DebugHeader, &BreakReceived, NULL, READ_PACKET_TIMEOUT, TRUE); Status = ReceivePacket ((UINT8 *)DebugHeader, &BreakReceived, NULL, READ_PACKET_TIMEOUT, TRUE);
if (Status != RETURN_SUCCESS || (DebugHeader->Command & DEBUG_COMMAND_RESPONSE) != 0) { if (Status != RETURN_SUCCESS || !IS_REQUEST (DebugHeader)) {
DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command[%x] sequenceno[%x] returned status is [%x] \n", DebugHeader->Command, DebugHeader->SequenceNo, Status); DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command[%x] sequenceno[%x] returned status is [%x] \n", DebugHeader->Command, DebugHeader->SequenceNo, Status);
DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command failed or it's response packet not expected! \n"); DebugAgentMsgPrint (DEBUG_AGENT_WARNING, "TARGET: Get command failed or it's response packet not expected! \n");
ReleaseMpSpinLock (&mDebugMpContext.DebugPortSpinLock); ReleaseMpSpinLock (&mDebugMpContext.DebugPortSpinLock);