diff options
Diffstat (limited to 'src/vendorcode/amd/agesa/f10/Proc/IDS/Debug/IdsDebug.c')
-rw-r--r-- | src/vendorcode/amd/agesa/f10/Proc/IDS/Debug/IdsDebug.c | 1323 |
1 files changed, 0 insertions, 1323 deletions
diff --git a/src/vendorcode/amd/agesa/f10/Proc/IDS/Debug/IdsDebug.c b/src/vendorcode/amd/agesa/f10/Proc/IDS/Debug/IdsDebug.c deleted file mode 100644 index 9da5981e36..0000000000 --- a/src/vendorcode/amd/agesa/f10/Proc/IDS/Debug/IdsDebug.c +++ /dev/null @@ -1,1323 +0,0 @@ -/** - * @file - * - * AMD Integrated Debug Debug_library Routines - * - * Contains AMD AGESA debug macros and library functions - * - * @xrefitem bom "File Content Label" "Release Content" - * @e project: AGESA - * @e sub-project: IDS - * @e \$Revision: 44323 $ @e \$Date: 2010-12-22 01:24:58 -0700 (Wed, 22 Dec 2010) $ - */ -/***************************************************************************** - * Copyright (c) 2011, Advanced Micro Devices, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Advanced Micro Devices, Inc. nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - - /*---------------------------------------------------------------------------------------- - * M O D U L E S U S E D - *---------------------------------------------------------------------------------------- - */ -#include "AGESA.h" -#include "Ids.h" -#include "IdsLib.h" -#include "amdlib.h" -#include "AMD.h" -#include "heapManager.h" -#include "cpuRegisters.h" -#include "Filecode.h" -#define FILECODE PROC_IDS_DEBUG_IDSDEBUG_FILECODE - -extern BUILD_OPT_CFG UserOptions; -typedef struct _IDS_CONSOLE IDS_CONSOLE; - -/*--------------------------------------------------------------------------------------*/ -/** - * IDS back-end code for AGESA_TESTPOINT - * - * @param[in] TestPoint Progress indicator value, see @ref AGESA_TP - * @param[in,out] StdHeader The Pointer of AGESA Header - * - **/ -/*--------------------------------------------------------------------------------------*/ -VOID -IdsAgesaTestPoint ( - IN AGESA_TP TestPoint, - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - LibAmdIoWrite (AccessWidth8, IDS_DEBUG_PORT, &TestPoint, StdHeader); - IDS_PERF_TIMESTAMP (StdHeader, TestPoint); - if (TestPoint == EndAgesaTps) { - IDS_PERF_ANALYSE (StdHeader); - } -} - -#define DEBUG_PRINT_INIT 0x10BF0000 -#define DEBUG_PRINT_EXIT 0xE0BF0000 -#define DEBUG_PRINT_COMMAND 0xC0BF0000 -#define DEBUG_PRINT_BREAKPOINT 0xB0BF0000 -#define DEBUG_PRINT_EVENT 0x1EBF0000 - -#define IDS_HDTOUT_BPFLAG_FORMAT_STR 0 -#define IDS_HDTOUT_BPFLAG_STATUS_STR 1 - -#define HDTOUT_BP_ACTION_HALT 1 -#define HDTOUT_BP_ACTION_PRINTON 2 -#define HDTOUT_BP_ACTION_PRINTONE 3 -#define HDTOUT_BP_ACTION_PRINTOFF 4 - -typedef struct _BREAKPOINT_UNIT { - UINT8 AndFlag : 1; ///< Next string is ANDed to current string - UINT8 BpFlag : 1; ///< Format string or Status string - UINT8 Action : 4; ///< Halt, start HDTOUT, or stop HDT,... - UINT8 BpStrOffset; ///< Offset from BreakpointList to the breakpoint string -} BREAKPOINT_UNIT; - -typedef enum { - IDS_STATE_OFF = 0xF0, - IDS_STATE_ON -} IDS_STATE_TYPE; - -typedef enum { - NON_CONSOLE = 0xD0, - HDT_CONSOLE, - IDS_CONSOLE_END -} IDS_CONSOLE_TYPE; - -// IDS HdtOut Event Level -typedef enum { - EVENT_OFF = 0x30, ///< Default,no event triggered. - EVENT_WARNING, ///< Event warning. - EVENT_ERROR, ///< Event error. - EVENT_FAIL_BUFFER_ALLOCATION, ///< Reserved, fail buffer allocation - EVENT_END ///< Event end sentinel. -} CONSOLE_EVENT_TYPE; - -#define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1)) - -// -// Also support coding convention rules for var arg macros -// -typedef CHAR8 *VA_LIST; -#define VA_START(ap, v) (ap = (VA_LIST) & (v) + _INT_SIZE_OF (v)) -#define VA_ARG(ap, t) (*(t *) ((ap += _INT_SIZE_OF (t)) - _INT_SIZE_OF (t))) -#define VA_END(ap) (ap = (VA_LIST) 0) - -#define LEFT_JUSTIFY 0x01 -#define PREFIX_SIGN 0x02 -#define PREFIX_BLANK 0x04 -#define COMMA_TYPE 0x08 -#define LONG_TYPE 0x10 -#define PREFIX_ZERO 0x20 - -/** - * Create console context - * - * Do hardware settings related with specific console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_CREATE_CONSOLE_CONTEXT ( - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_CREATE_CONSOLE_CONTEXT *PF_CREATE_CONSOLE_CONTEXT; - -/** - * Initialize console context - * - * Initilize preference settings related with specific console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_INIT_CONSOLE_CONTEXT ( - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_INIT_CONSOLE_CONTEXT *PF_INIT_CONSOLE_CONTEXT; - -/** - * Update console context - * - * Update preference settings related with specific console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_UPDATE_CONSOLE_CONTEXT ( - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_UPDATE_CONSOLE_CONTEXT *PF_UPDATE_CONSOLE_CONTEXT; - -/** - * Save console context - * - * Save console context snapshot - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_SAVE_CONSOLE_CONTEXT ( - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_SAVE_CONSOLE_CONTEXT *PF_SAVE_CONSOLE_CONTEXT; - -/** - * Destroy console context - * - * Destroy console context snapshot - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_DESTROY_CONSOLE_CONTEXT ( - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_DESTROY_CONSOLE_CONTEXT *PF_DESTROY_CONSOLE_CONTEXT; - -/** - * Print function - * - * Print function related with specific console - * - * @param[in] PrintType Print Type - * @param[in] ConsoleBufferAddress The address of console buffer - * @param[in] ConsoleBufferSize The size of console buffer - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -typedef VOID F_PRINT ( - IN UINT32 PrintType, - IN UINT32 ConsoleBufferAddress, - IN UINT32 ConsoleBufferSize, - IN OUT IDS_CONSOLE *IdsConsole - ); -/// Reference to a method. -typedef F_PRINT *PF_PRINT; - -/// IDS Console Operations -typedef struct _IDS_CONSOLE_OPERATIONS { - PF_CREATE_CONSOLE_CONTEXT CreateConsoleContext; - PF_INIT_CONSOLE_CONTEXT InitConsoleContext; - PF_UPDATE_CONSOLE_CONTEXT UpdateConsoleContext; - PF_DESTROY_CONSOLE_CONTEXT DestroyConsoleContext; - PF_PRINT Print; -} IDS_CONSOLE_OPERATIONS; - -/// IDS Console Header -typedef struct _IDS_CONSOLE_HEADER { - UINT32 Signature; ///< Signature information. - UINT32 Version; ///< Version. - UINT8 ConsoleType; ///< Console type - UINT8 Event; ///< Event type. - UINT8 PrintState; ///< On or Off - UINT8 OutBufferMode; ///< Off:stack mode, On: heap mode - UINT16 OutBufferSize; ///< Buffer size - UINT16 OutBufferIndex; ///< Buffer index - UINT32 NumBreakpointUnit; ///< default 0 no bp unit others number of bp unit -} IDS_CONSOLE_HEADER; - -/// IDS Console -struct _IDS_CONSOLE -{ - IDS_CONSOLE_HEADER Header; /**< IDS console header - 5 dwords */ - UINT32 FuncListAddr; /**< 32 bit address to the list of functions that script can execute */ - UINT8 Reserved[56 - 24]; /**< ----------------- New fields must be added here. */ - CHAR8 BreakpointList[300]; /**< Breakpoint list */ - CHAR8 StatusStr[156]; /**< Shows current node, DCT, CS,... */ - CHAR8 OutBuffer[2]; /**< Console Out content. Its size will be determined by BufferSize. */ -}; - -/** - * Create hdt console context - * - * Do hardware settings for hdt console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -STATIC VOID -CreateHdtConsoleContext ( - IN OUT IDS_CONSOLE *IdsConsole - ) -{ - UINT64 SMsr; - UINT32 CR4reg; - - LibAmdMsrRead (0xC001100A, (UINT64*)&SMsr, NULL); - SMsr |= 1; - LibAmdMsrWrite (0xC001100A, (UINT64*)&SMsr, NULL); - - LibAmdWriteCpuReg (DR2_REG, 0x99CC); - LibAmdWriteCpuReg (DR7_REG, 0x02000420); - - LibAmdReadCpuReg (CR4_REG, &CR4reg); - LibAmdWriteCpuReg (CR4_REG, CR4reg | ((UINT32)1 << 3)); -} - -/** - * Initialize hdt console context - * - * Initilize preference settings for hdt console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -STATIC VOID -InitHdtConsoleContext ( - IN OUT IDS_CONSOLE *IdsConsole - ) -{ - IDS_FUNCLIST_EXTERN (); - - IdsConsole->FuncListAddr = (UINT32) IDS_FUNCLIST_ADDR; - IdsConsole->StatusStr[0] = 0; - -} - -/** - * Update hdt console context - * - * Update preference settings for hdt console context - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -STATIC VOID -UpdateHdtConsoleContext ( - IN OUT IDS_CONSOLE *IdsConsole - ) -{ - if (IdsConsole->Header.OutBufferMode == IDS_STATE_OFF) { - IdsConsole->Header.OutBufferSize = 0; - } - -} - -/** - * Destroy hdt console context - * - * Save hdt console context snapshot - * - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -STATIC VOID -DestroyHdtConsoleContext ( - IN OUT IDS_CONSOLE *IdsConsole - ) -{ - UINT64 SMsr; - - LibAmdMsrRead (0xC001100A, (UINT64 *)&SMsr, NULL); - SMsr &= ~BIT0; - LibAmdMsrWrite (0xC001100A, (UINT64 *)&SMsr, NULL); - - LibAmdWriteCpuReg (DR2_REG, 0); - LibAmdWriteCpuReg (DR3_REG, 0); - LibAmdWriteCpuReg (DR7_REG, 0); -} - -/** - * Hdt console print function - * - * Print function related with hdt console - * - * @param[in] PrintType Print Type - * @param[in] ConsoleBufferAddress The address of console buffer - * @param[in] ConsoleBufferSize The size of console buffer - * @param[in,out] IdsConsole The Pointer of IDS console - * - **/ -STATIC VOID -HdtConsolePrint ( - IN UINT32 PrintType, - IN UINT32 ConsoleBufferAddress, - IN UINT32 ConsoleBufferSize, - IN OUT IDS_CONSOLE *IdsConsole - ) -{ - IdsOutPort (PrintType | 0x99CC, ConsoleBufferAddress, ConsoleBufferSize); -} - -/// Initial construction data for HDT console header. -CONST IDS_CONSOLE_HEADER ROMDATA HdtConsoleHeader = -{ - 0xDB1099CC, - 0x0100, - IDS_STATE_ON, - EVENT_OFF, - IDS_STATE_ON, - IDS_STATE_ON, - 0x1000, - 0x0, - 0, -}; - -#define OPTION_HDT_CONSOLE_HEADER &HdtConsoleHeader - -/// Initial construction data for HDT console operations. -CONST IDS_CONSOLE_OPERATIONS ROMDATA HdtConsoleOperations = -{ - CreateHdtConsoleContext, - InitHdtConsoleContext, - UpdateHdtConsoleContext, - DestroyHdtConsoleContext, - HdtConsolePrint -}; - -#define OPTION_HDT_CONSOLE_OPERATIONS &HdtConsoleOperations - -/** - * Parses flag and width information from theFormat string and returns the next index - * into the Format string that needs to be parsed. See file headed for details of Flag and Width. - * - * @param[in] Format Current location in the AvSPrint format string. - * @param[out] Flags Returns flags - * @param[out] Width Returns width of element - * @param[out] Marker Vararg list that may be partially consumed and returned. - * - * @retval Pointer indexed into the Format string for all the information parsed by this routine. - * - **/ -STATIC CHAR8 * -GetFlagsAndWidth ( - IN CHAR8 *Format, - OUT UINTN *Flags, - OUT UINTN *Width, - IN OUT VA_LIST *Marker - ) -{ - UINTN Count; - BOOLEAN Done; - - *Flags = 0; - *Width = 0; - for (Done = FALSE; !Done; ) { - Format++; - - switch (*Format) { - - case '-': - *Flags |= LEFT_JUSTIFY; - break; - case '+': - *Flags |= PREFIX_SIGN; - break; - case ' ': - *Flags |= PREFIX_BLANK; - break; - case ',': - *Flags |= COMMA_TYPE; - break; - case 'L': - case 'l': - *Flags |= LONG_TYPE; - break; - - case '*': - *Width = VA_ARG (*Marker, UINTN); - break; - - case '0': - *Flags |= PREFIX_ZERO; - break; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - Count = 0; - do { - Count = (Count * 10) + *Format - '0'; - Format++; - } while ((*Format >= '0') && (*Format <= '9')); - Format--; - *Width = Count; - break; - - default: - Done = TRUE; - } - } - return Format; -} - -CHAR8 STATIC HexStr[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; -/** - * - * @param[in] Buffer Location to place ascii hex string of Value. - * @param[in] Value - Hex value to convert to a string in Buffer. - * @param[in] Flags - Flags to use in printing Hex string, see file header for details. - * @param[in] Width - Width of hex value. - * - * @retval Number of characters printed. - **/ - -STATIC UINTN -ValueTomHexStr ( - IN OUT CHAR8 *Buffer, - IN UINT64 Value, - IN UINTN Flags, - IN UINTN Width - ) -{ - CHAR8 TempBuffer[30]; - CHAR8 *TempStr; - CHAR8 Prefix; - CHAR8 *BufferPtr; - UINTN Count; - UINTN Index; - - TempStr = TempBuffer; - BufferPtr = Buffer; - // - // Count starts at one since we will null terminate. Each iteration of the - // loop picks off one nibble. Oh yea TempStr ends up backwards - // - Count = 0; - do { - *(TempStr++) = HexStr[Value & 0x0f]; - Value >>= 4; - Count++; - } while (Value != 0); - - if (Flags & PREFIX_ZERO) { - Prefix = '0'; - } else if (!(Flags & LEFT_JUSTIFY)) { - Prefix = ' '; - } else { - Prefix = 0x00; - } - for (Index = Count; Index < Width; Index++) { - *(TempStr++) = Prefix; - } - - // - // Reverse temp string into Buffer. - // - while (TempStr != TempBuffer) { - *(BufferPtr++) = *(--TempStr); - } - - *BufferPtr = 0; - return Index; -} - -/** - * Prints a Value as a decimal number in Buffer - * - * @param[in] Buffer Location to place ascii decimal number string of Value. - * @param[in] Value Decimal value to convert to a string in Buffer. - * @param[in] Flags Flags to use in printing decimal string, see file header for details. - * - * @retval Number of characters printed. - * -**/ - -STATIC UINTN -ValueToString ( - IN OUT CHAR8 *Buffer, - IN INT32 Value, - IN UINTN Flags - ) -{ - CHAR8 TempBuffer[30]; - CHAR8 *TempStr; - CHAR8 *BufferPtr; - UINTN Count; - UINTN Remainder; - - TempStr = TempBuffer; - BufferPtr = Buffer; - Count = 0; - - if (Value < 0) { - *(BufferPtr++) = '-'; - Value = - Value; - Count++; - } - - do { - Remainder = Value % 10; - Value /= 10; - *(TempStr++) = (CHAR8)(Remainder + '0'); - Count++; - if ((Flags & COMMA_TYPE) == COMMA_TYPE) { - if (Count % 3 == 0) { - *(TempStr++) = ','; - } - } - } while (Value != 0); - - // - // Reverse temp string into Buffer. - // - while (TempStr != TempBuffer) { - *(BufferPtr++) = *(--TempStr); - } - - *BufferPtr = 0; - return Count; -} - -/** - * Check if String contain the substring - * - * @param[in] String Pointer of string. - * @param[in] Substr Pointer of sub string. - * - * @retval TRUE S2 is substring of S1 - * @retval FALSE S2 isn't substring of S1 - * -**/ -STATIC BOOLEAN -AmdIdsSubStr ( - IN CHAR8 *String, - IN CHAR8 *Substr - ) -{ - UINT16 i; - UINT16 j; - - for (i = 0; String[i] != 0 ; i++) { - for (j = 0; (Substr[j] != 0) && (Substr[j] == String[i + j]); j++) { - } - if (Substr[j] == 0) { - return TRUE; - } - } - - return FALSE; -} - -/** - * IDS Backend Function for Memory timeout control - * - * This function is used to override Memory timeout control. - * - * @param[in,out] DataPtr The Pointer of UINT8. - * - **/ -VOID -IdsMemTimeOut ( - IN OUT VOID *DataPtr - ) -{ - UINT32 DR2reg; - - LibAmdReadCpuReg (DR2_REG, &DR2reg); - if (DR2reg == 0x99CC) { - // Turn timeout off if HDTout is on - *((UINT8 *)DataPtr) = (UINT8)0; - } -} - -/** - * - * IDS Debug Function to check the sentinels are intact - * - * This function complete heap walk and check to be performed at any time. - * - * @param[in] StdHeader Config handle for library and services. - * - * @retval TRUE No error - * - **/ -BOOLEAN -AmdHeapIntactCheck ( - IN AMD_CONFIG_PARAMS *StdHeader - ) -{ - UINT8 *HeapBufferPtr; - BUFFER_NODE *StartOfBufferPtr; - BUFFER_NODE *EndOfBufferPtr; - HEAP_MANAGER *HeapManagerPtr; - BUFFER_NODE *HeadNodePtr; - BUFFER_NODE *CurrentNodePtr; - UINT32 AmdHeapRamAddress; - UINT32 SentinelBefore; - UINT32 SentinelAfter; - - ASSERT (StdHeader != NULL); - - AmdHeapRamAddress = (UINT32)UserOptions.CfgHeapDramAddress; - - if (StdHeader->HeapStatus == HEAP_LOCAL_CACHE) { - HeapBufferPtr = (UINT8 *) HeapGetCurrentBase (StdHeader); - } else if (StdHeader->HeapStatus == HEAP_TEMP_MEM) { - HeapBufferPtr = (UINT8 *) AmdHeapRamAddress; - } else { - return TRUE; - } - - HeapManagerPtr = (HEAP_MANAGER *) HeapBufferPtr; - HeadNodePtr = (BUFFER_NODE *) (HeapBufferPtr + sizeof (HEAP_MANAGER)); - CurrentNodePtr = HeadNodePtr; - - if (HeapManagerPtr->AvailableSize != AMD_HEAP_SIZE_PER_CORE - sizeof (HEAP_MANAGER)) { - while (CurrentNodePtr != NULL) { - StartOfBufferPtr = (BUFFER_NODE *) ((UINT8 *) CurrentNodePtr + sizeof (BUFFER_NODE) + CurrentNodePtr->BufferSize + 2 * SIZE_OF_SENTINEL); - EndOfBufferPtr = (BUFFER_NODE *) ((UINT8 *) HeadNodePtr + AMD_HEAP_SIZE_PER_CORE); - if (CurrentNodePtr->NextNodePtr != NULL) { - ASSERT ((CurrentNodePtr->NextNodePtr >= StartOfBufferPtr) && (CurrentNodePtr->NextNodePtr < EndOfBufferPtr)); - SentinelBefore = *(UINT32 *) ((UINT8 *) CurrentNodePtr + sizeof (BUFFER_NODE)); - SentinelAfter = *(UINT32 *) ((UINT8 *) CurrentNodePtr + sizeof (BUFFER_NODE) + SIZE_OF_SENTINEL + CurrentNodePtr->BufferSize); - - ASSERT ((SentinelBefore == SENTINEL_BEFORE_VALUE) && (SentinelAfter == SENTINEL_AFTER_VALUE)); - } else { - ASSERT ((UINT8 *) StartOfBufferPtr == HeapBufferPtr + AMD_HEAP_SIZE_PER_CORE - HeapManagerPtr->AvailableSize); - SentinelBefore = *(UINT32 *) ((UINT8 *) CurrentNodePtr + sizeof (BUFFER_NODE)); - SentinelAfter = *(UINT32 *) ((UINT8 *) CurrentNodePtr + sizeof (BUFFER_NODE) + SIZE_OF_SENTINEL + CurrentNodePtr->BufferSize); - ASSERT ((SentinelBefore == SENTINEL_BEFORE_VALUE) && (SentinelAfter == SENTINEL_AFTER_VALUE)); - } - CurrentNodePtr = CurrentNodePtr->NextNodePtr; - } - } - return TRUE; -} - -/** - * Determine whether IDS console is enabled. - * - * @param[in,out] IdsConsole The Pointer of Ids console data - * - * @retval TRUE Ids console is enabled. - * @retval FALSE Ids console is disabled. - * - **/ -BOOLEAN -STATIC -IsIdsConsoleEnabled ( - IN OUT UINTN *IdsConsole - ) -{ - BOOLEAN Result; - UINT32 DR2reg; - - Result = FALSE; - - LibAmdReadCpuReg (DR2_REG, &DR2reg); - if (DR2reg == 0x99CC) { - Result = TRUE; - } - - return Result; -} - -/** - * Get IDS console. - * - * @param[in,out] IdsConsolePtr The Pointer of Ids console data - * - **/ -STATIC VOID -GetIdsConsole ( - IN OUT UINTN *IdsConsolePtr - ) -{ - UINT32 DR3Reg; - - LibAmdReadCpuReg (DR3_REG, &DR3Reg); - *IdsConsolePtr = (UINTN) DR3Reg; -} - -/** - * Get IDS console operations. - * - * @param[in,out] IdsConsoleOperations The Pointer of Ids console operations - * - **/ -STATIC VOID -GetIdsConsoleHeader ( - IN OUT UINTN *IdsConsoleHeader - ) -{ - IDS_CONSOLE_TYPE IdsConsoleType; - - IdsConsoleType = (IDS_CONSOLE_TYPE) OPTION_IDS_CONSOLE; - - if (IdsConsoleType == HDT_CONSOLE) { - *IdsConsoleHeader = (UINTN) OPTION_HDT_CONSOLE_HEADER; - } else { - ASSERT (FALSE); - } -} - -/** - * Get IDS console operations. - * - * @param[in,out] IdsConsoleOperations The Pointer of Ids console operations - * - **/ -STATIC VOID -GetIdsConsoleOperations ( - IN OUT UINTN *IdsConsoleOperations - ) -{ - IDS_CONSOLE_TYPE IdsConsoleType; - - IdsConsoleType = (IDS_CONSOLE_TYPE) OPTION_IDS_CONSOLE; - - if (IdsConsoleType == HDT_CONSOLE) { - *IdsConsoleOperations = (UINTN) OPTION_HDT_CONSOLE_OPERATIONS; - } else { - ASSERT (FALSE); - } -} - -/** - * Create IDS console. - * - * @param[in,out] IdsConsole The Pointer of Ids console data - * @param[in,out] StdHeader The Pointer of AGESA Header - **/ -STATIC VOID -NewIdsConsole ( - IN OUT IDS_CONSOLE *IdsConsole, - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - IDS_CONSOLE_HEADER *IdsConsoleHeader; - UINTN IdsConsoleHeaderPtr; - - GetIdsConsoleHeader (&IdsConsoleHeaderPtr); - IdsConsoleHeader = &(IdsConsole->Header); - - LibAmdMemCopy ((VOID *)IdsConsoleHeader, (VOID *) (IdsConsoleHeaderPtr), (UINT32) sizeof (IDS_CONSOLE_HEADER), StdHeader); -} - -/** - * Destroy IDS console. - * - * @param[in,out] IdsConsole The Pointer of Ids console data - * @param[in,out] StdHeader The Pointer of AGESA Header - **/ -STATIC VOID -DestroyIdsConsole ( - IN OUT IDS_CONSOLE *IdsConsole, - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - HeapDeallocateBuffer (IDS_HDT_OUT_BUFFER_HANDLE, StdHeader); -} - -/** - * Save IDS console Snapshot. - * - * @param[in,out] IdsConsole The Pointer of Ids console data - * @param[in,out] StdHeader The Pointer of AGESA Header - **/ -STATIC VOID -SaveIdsConsole ( - IN OUT IDS_CONSOLE *IdsConsole, - IN OUT IDS_CONSOLE_OPERATIONS *IdsConsoleOps, - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - ALLOCATE_HEAP_PARAMS AllocHeapParams; - - do { - AllocHeapParams.RequestedBufferSize = IdsConsole->Header.OutBufferSize + sizeof (IDS_CONSOLE) - 2; - AllocHeapParams.BufferHandle = IDS_HDT_OUT_BUFFER_HANDLE; - AllocHeapParams.Persist = HEAP_SYSTEM_MEM; - if (HeapAllocateBuffer (&AllocHeapParams, StdHeader) == AGESA_SUCCESS) { - break; - } else { - IdsConsole->Header.OutBufferSize -= 256; - IdsConsole->Header.Event = EVENT_FAIL_BUFFER_ALLOCATION; - IdsConsoleOps->Print (DEBUG_PRINT_EVENT, (UINT32)IdsConsole, 0, IdsConsole); - } - } while ((IdsConsole->Header.OutBufferSize & 0x8000) == 0); - - if ((IdsConsole->Header.OutBufferSize & 0x8000) == 0) { - LibAmdWriteCpuReg (DR3_REG, (UINT32)AllocHeapParams.BufferPtr); - LibAmdMemCopy (AllocHeapParams.BufferPtr, (VOID *) IdsConsole, (UINT32) sizeof (IDS_CONSOLE) - 2, StdHeader); - } -} - -/** - * - * Initial function for IDS console. - * - * Create IDS console context, let Ids console function to be ready. - * - * @param[in,out] StdHeader The Pointer of AGESA Header - * - **/ -VOID -AmdIdsConsoleInit ( - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - IDS_CONSOLE IdsConsole; - IDS_CONSOLE_OPERATIONS *IdsConsoleOps; - UINTN IdsConsolePtr; - UINTN IdsConsoleOpsPtr; - - if (IsIdsConsoleEnabled (&IdsConsolePtr)) { - GetIdsConsoleOperations (&IdsConsoleOpsPtr); - IdsConsoleOps = (IDS_CONSOLE_OPERATIONS *) IdsConsoleOpsPtr; - NewIdsConsole (&IdsConsole, StdHeader); - - IdsConsoleOps->CreateConsoleContext (&IdsConsole); - IdsConsoleOps->InitConsoleContext (&IdsConsole); - IdsConsoleOps->Print (DEBUG_PRINT_INIT, (UINT32)&IdsConsole, 0, &IdsConsole); - IdsConsoleOps->UpdateConsoleContext (&IdsConsole); - - SaveIdsConsole (&IdsConsole, IdsConsoleOps, StdHeader); - } -} - -/** - * Prints string to debug host like printf in C - * - * @param[in] Format of string - * @param[in] ... Variable parameter - * -**/ -VOID -AmdIdsConsolePrint ( - IN CHAR8 *Format, - IN ... - ) -{ - IDS_CONSOLE *IdsConsole; - UINTN IdsConsolePtr; - IDS_CONSOLE_OPERATIONS *IdsConsoleOps; - UINTN IdsConsoleOpsPtr; - VA_LIST Marker; - CHAR8 LocalBuffer[256]; - CHAR8 *ConsoleBuffer; - CHAR8 Null_Str[] = " < null string > "; - CHAR8 *AsciiStr; - UINTN Index; - UINTN Flags; - UINTN Width; - UINTN ConsoleBufferSize; - UINT64 Value; - UINT16 *Array; - UINT32 ArrayLength; - UINT32 ArrayIndex; - BOOLEAN SaveStatus; - UINT32 LastIndex; - UINT32 i; - UINT32 j; - UINT32 NumBpUnit; - BREAKPOINT_UNIT *Pbpunit; - CHAR8 *Pbpstr; - CHAR8 *PCmpStr; - CHAR8 *EventLevelStr; - BOOLEAN LastBpmatched; - BOOLEAN Bpmatched; - IDS_STATE_TYPE PrintCtrl; - - //Init the default Value - IdsConsole = NULL; - IdsConsolePtr = 0; - ConsoleBuffer = LocalBuffer; - Index = 0; - LastIndex = 0; - ConsoleBufferSize = 256; - NumBpUnit = 0; - PrintCtrl = IDS_STATE_ON; - - if (IsIdsConsoleEnabled (&IdsConsolePtr)) { - GetIdsConsole (&IdsConsolePtr); - IdsConsole = (IDS_CONSOLE *) IdsConsolePtr; - GetIdsConsoleOperations (&IdsConsoleOpsPtr); - IdsConsoleOps = (IDS_CONSOLE_OPERATIONS *) IdsConsoleOpsPtr; - - if (IdsConsole->Header.OutBufferMode == IDS_STATE_ON) { - ConsoleBuffer = IdsConsole->OutBuffer; - Index = IdsConsole->Header.OutBufferIndex; - ConsoleBufferSize = (UINTN) (IdsConsole->Header.OutBufferSize); - NumBpUnit = IdsConsole->Header.NumBreakpointUnit; - PrintCtrl = IdsConsole->Header.PrintState; - } - - if ((PrintCtrl != 0) || (NumBpUnit > 0)) { - VA_START(Marker,Format); //init marker to 1st dynamic parameters. - - LastIndex = (UINT32) Index; - - if (*Format != '@') { - if (*Format == '!') { - SaveStatus = TRUE; - Format++; - } else { - SaveStatus = FALSE; - } - - for (; *Format != '\0'; Format++) { - if (*Format != '%') { - ConsoleBuffer[Index++] = *Format; - } else { - Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker); - switch (*Format) { - // Using %[EventType] style to catch predefined event. - case '[': - EventLevelStr = Format; - EventLevelStr++; - if ((*EventLevelStr > EVENT_OFF) && (*EventLevelStr < EVENT_END)) { - EventLevelStr++; - if (*EventLevelStr == ']') { - EventLevelStr--; - IdsConsole->Header.Event = (UINT8) (CONSOLE_EVENT_TYPE) (*EventLevelStr); - } - } - break; - case 'X': - Flags |= PREFIX_ZERO; - Width = sizeof (UINT64) * 2; - // - // break skipped on purpose - // - case 'x': - if ((Flags & LONG_TYPE) == LONG_TYPE) { - Value = VA_ARG (Marker, UINT64); - } else { - Value = VA_ARG (Marker, UINTN); - } - Index += ValueTomHexStr (&ConsoleBuffer[Index], Value, Flags, Width); - break; - - case 'd': - Value = (UINTN)VA_ARG (Marker, UINT32); - Index += ValueToString (&ConsoleBuffer[Index], (UINT32)Value, Flags); - break; - - case 's': - case 'S': - AsciiStr = (CHAR8 *)VA_ARG (Marker, CHAR8 *); - if (AsciiStr == NULL) { - AsciiStr = Null_Str; //" < null string > "; - } - while (*AsciiStr != '\0') { - ConsoleBuffer[Index++] = *AsciiStr++; - } - break; - - case 'c': - ConsoleBuffer[Index++] = (CHAR8)VA_ARG (Marker, UINTN); - break; - - case 'a': - Array = (UINT16 *) VA_ARG (Marker, VOID *); - ArrayLength = (UINT32) VA_ARG (Marker, UINT32); - for (ArrayIndex = 0; ArrayIndex < ArrayLength; ArrayIndex++) { - // Only support hex format of an array of UINT16 for now. - Width = 2; - Flags = PREFIX_ZERO; - ConsoleBuffer[Index++] = ' '; - Index += ValueTomHexStr (&ConsoleBuffer[Index], Array[ArrayIndex] & 0xFF, Flags, Width); - - // If buffer is full - if (Index > (ConsoleBufferSize - 8)) { - if (IdsConsole != NULL) { - if (LastIndex != 0) { - // Stream all out except current string - if (PrintCtrl != 0) { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, LastIndex, IdsConsole); - } - Index = Index - LastIndex; - // Move current string too top - for (i = 0; i < Index; i++) { - ConsoleBuffer[i] = ConsoleBuffer[LastIndex + i]; - } - LastIndex = 0; - } else { - // Buffer size is too small - ASSERT (FALSE); - } - } else { - break; - } - } - } - break; - - case 'v': - ConsoleBuffer[Index++] = '%'; - ConsoleBuffer[Index++] = 'v'; - Format++; - ConsoleBuffer[Index++] = *Format; - if (*Format == 'h') { - Format++; - ConsoleBuffer[Index++] = *Format; - } - break; - - case '%': - ConsoleBuffer[Index++] = *Format; - break; - - default: - // - // if the type is unknown print it to the screen - // - ConsoleBuffer[Index++] = '%'; - ConsoleBuffer[Index++] = *Format; - } - } - - // If buffer is full - if (Index > (ConsoleBufferSize - 32)) { - if (IdsConsole != NULL) { - if (LastIndex != 0) { - // Stream all out except current string - if (PrintCtrl != IDS_STATE_OFF) { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, LastIndex, IdsConsole); - } - Index = Index - LastIndex; - // Move current string too top - for (i = 0; i < Index; i++) { - ConsoleBuffer[i] = ConsoleBuffer[LastIndex + i]; - } - LastIndex = 0; - } else { - // Buffer size is too small - ASSERT (FALSE); - } - } else { - break; - } - } - } - - if (IdsConsole->Header.OutBufferMode == IDS_STATE_OFF) { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, (UINT32) Index, IdsConsole); - Index = 0; - } - - if ((IdsConsole->Header.Event > EVENT_OFF) && (IdsConsole->Header.Event < EVENT_END) ) { - // if HdtOut Buffer is on, flush hdtout buffer contents out. - if (IdsConsole->Header.OutBufferMode == IDS_STATE_ON) { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, (UINT32) Index, IdsConsole); - Index = 0; - } - - IdsConsoleOps->Print (DEBUG_PRINT_EVENT, (UINT32)IdsConsole, 0, IdsConsole); - IdsConsole->Header.Event = EVENT_OFF; - } - - // - // Check breakpoint - // - if (NumBpUnit) { - Pbpunit = (BREAKPOINT_UNIT *) IdsConsole->BreakpointList; - LastBpmatched = TRUE; - Bpmatched = TRUE; - for (i = 0; i < NumBpUnit; i++) { - Pbpstr = IdsConsole->BreakpointList + Pbpunit[i].BpStrOffset; - if (Pbpunit[i].BpFlag == IDS_HDTOUT_BPFLAG_FORMAT_STR) { - PCmpStr = &ConsoleBuffer[LastIndex]; - ConsoleBuffer[Index] = 0; - } else { - PCmpStr = IdsConsole->StatusStr; - } - - if (LastBpmatched) { - Bpmatched = AmdIdsSubStr (PCmpStr, Pbpstr); - if (Bpmatched) { - if (Pbpunit[i].AndFlag == 0) { - // This is the last of matching string of an AND block, apply action here - switch (Pbpunit[i].Action) { - case HDTOUT_BP_ACTION_HALT: - IdsConsoleOps->Print (DEBUG_PRINT_BREAKPOINT, (UINT32)(ConsoleBuffer + LastIndex), ( i << 16) | (UINT32) Index, IdsConsole); - break; - case HDTOUT_BP_ACTION_PRINTON: - PrintCtrl = IDS_STATE_ON; - IdsConsole->Header.PrintState = IDS_STATE_ON; - break; - case HDTOUT_BP_ACTION_PRINTOFF: - if (IdsConsole->Header.PrintState != IDS_STATE_OFF) { - IdsConsole->Header.PrintState = IDS_STATE_OFF; - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, (UINT32)Index, IdsConsole); - } - break; - default: - ASSERT (FALSE); - } - break; - } - } - } - if (Pbpunit[i].AndFlag == 1) { - LastBpmatched = Bpmatched; - } else { - LastBpmatched = TRUE; - } - } - } - - // - // Store status fields - // - if (SaveStatus) { - // Look for the start of the first word - for (; LastIndex < Index; LastIndex++) { - if ((ConsoleBuffer[LastIndex] > 32) && (ConsoleBuffer[LastIndex] < 127)) { - break; - } - } - if (LastIndex < Index) { - // Match the first word in StatusStr - SaveStatus = FALSE; - j = LastIndex; - for (i = 0; !SaveStatus && (IdsConsole->StatusStr[i] != 0); i++) { - ArrayLength = 1; - for (j = LastIndex; ConsoleBuffer[j] == IdsConsole->StatusStr[i]; j++) { - i++; - ArrayLength++; - if ((j == (Index - 1)) || (ConsoleBuffer[j] == ' ')) { - // Find the length of this entry - ArrayIndex = i; - for (; IdsConsole->StatusStr[i] != '\n'; i++) { - ArrayLength++; - } - - // Remove old entry if it does not fit - if (ArrayLength != ((UINT32) Index - LastIndex)) { - for (i++; IdsConsole->StatusStr[i] != 0; i++) { - IdsConsole->StatusStr[i - ArrayLength] = IdsConsole->StatusStr[i]; - } - j = LastIndex; - i = i - ArrayLength - 1; - // Mark the end of string - IdsConsole->StatusStr[i + ((UINT32) Index - LastIndex) + 1] = 0; - } else { - i = ArrayIndex - 2; - } - - // Word match, exit for saving - SaveStatus = TRUE; - break; - } - } - } - - // Copy string to StatusStr - for (; j < Index; j++, i++) { - IdsConsole->StatusStr[i] = ConsoleBuffer[j]; - } - if (!SaveStatus) { - // Mark the end of string if not done so - IdsConsole->StatusStr[i] = 0; - } - } - } - - } - } - - if (IdsConsole != NULL) { - if (IdsConsole->Header.PrintState == IDS_STATE_OFF) { - Index = 0; // Clear buffer if the data will not be printed out. - } - IdsConsole->Header.OutBufferIndex = (UINT16) Index; - } else { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)ConsoleBuffer, (UINT32)Index, IdsConsole); - } - } -} - -/** - * - * Exit function for IDS console Function. - * - * Restore debug register and Deallocate heap. - * - * @param[in,out] StdHeader The Pointer of AGESA Header - * - **/ -VOID -AmdIdsConsoleExit ( - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - IDS_CONSOLE *IdsConsole; - UINTN IdsConsolePtr; - IDS_CONSOLE_OPERATIONS *IdsConsoleOps; - UINTN IdsConsoleOpsPtr; - - if (IsIdsConsoleEnabled (&IdsConsolePtr)) { - GetIdsConsole (&IdsConsolePtr); - IdsConsole = (IDS_CONSOLE *) IdsConsolePtr; - GetIdsConsoleOperations (&IdsConsoleOpsPtr); - IdsConsoleOps = (IDS_CONSOLE_OPERATIONS *) IdsConsoleOpsPtr; - - if (IdsConsole != NULL) { - if (IdsConsole->Header.PrintState != IDS_STATE_OFF) { - IdsConsoleOps->Print (DEBUG_PRINT_COMMAND, (UINT32)(IdsConsole->OutBuffer), IdsConsole->Header.OutBufferIndex, IdsConsole); - } - - IdsConsoleOps->Print (DEBUG_PRINT_EXIT, (UINT32)IdsConsole, 0, IdsConsole); - - IdsConsoleOps->DestroyConsoleContext (IdsConsole); - DestroyIdsConsole (IdsConsole, StdHeader); - - } - } -} -/** - * Check for CAR Corruption, the performance monitor number three programed to log the CAR Corruption. - * Check to see if control register is enabled and then check the preformance counter and stop the system by executing - * IDS_ERROR_TRAP if counter has any value other than zero. - * - * @param[in,out] StdHeader The Pointer of Standard Header. - * - * - **/ -VOID -IdsCarCorruptionCheck ( - IN OUT AMD_CONFIG_PARAMS *StdHeader - ) -{ - - UINT64 Perf_Msr; - - LibAmdMsrRead (MSR_PERF_CONTROL3, (UINT64*)&Perf_Msr, StdHeader); - if ((Perf_Msr & PERF_RESERVE_BIT_MASK) == PERF_CAR_CORRUPTION_EVENT) { - LibAmdMsrRead (MSR_PERF_COUNTER3, (UINT64*)&Perf_Msr, StdHeader); - if ((Perf_Msr != 0)) { - IDS_ERROR_TRAP; - } - } -} |