From 2638c111076f9a49d4766ca5acbafa0eb7f66a18 Mon Sep 17 00:00:00 2001 From: Jeff Fan Date: Fri, 10 Jul 2015 05:48:19 +0000 Subject: SourceLevelDebugPkg/SecPeiDebugAgentLib: Restore CPU interrupt state In DEBUG_AGENT_INIT_POSTMEM_SEC case, caller may disable/restore CPU interrupt to protect the stack/heap migration. SecPeiDebugAgentLib cannot always enable CPU interrupt. Otherwise system may crash during stack/heap migration. SecPeiDebugAgentLib should restore original CPU interrupt state in DEBUG_AGENT_INIT_POSTMEM_SEC case. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan Reviewed-by: Brian J. Johnson Tested-by: Brian J. Johnson git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17916 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SecPeiDebugAgent/SecPeiDebugAgentLib.c | 29 ++++++++++++++-------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c b/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c index 09216c20fe..faec574fa4 100644 --- a/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c +++ b/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c @@ -376,8 +376,12 @@ InitializeDebugAgent ( UINT64 *MailboxLocationPointer; EFI_PHYSICAL_ADDRESS Address; UINT32 DebugTimerFrequency; + BOOLEAN CpuInterruptState; - DisableInterrupts (); + // + // Disable interrupts and save current interrupt state + // + CpuInterruptState = SaveAndDisableInterrupts(); switch (InitFlag) { @@ -611,17 +615,22 @@ InitializeDebugAgent ( break; } - // - // Enable Debug Timer interrupt. In post-memory SEC, the caller enables it. - // - if (InitFlag != DEBUG_AGENT_INIT_POSTMEM_SEC) { + if (InitFlag == DEBUG_AGENT_INIT_POSTMEM_SEC) { + // + // Restore CPU Interrupt state and keep debug timer interrupt state as is + // in DEBUG_AGENT_INIT_POSTMEM_SEC case + // + SetInterruptState (CpuInterruptState); + } else { + // + // Enable Debug Timer interrupt + // SaveAndSetDebugTimerInterrupt (TRUE); + // + // Enable CPU interrupts so debug timer interrupts can be delivered + // + EnableInterrupts (); } - // - // Enable CPU interrupts so debug timer interrupts can be delivered - // - EnableInterrupts (); - // // If Function is not NULL, invoke it always whatever debug agent was initialized sucesssfully or not. // -- cgit v1.2.3