audk/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdMemory.c

684 lines
13 KiB
C

/*++
Copyright (c) 2007, Intel Corporation
All rights reserved. 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.
Module Name:
EdbCmdMemory.c
Abstract:
--*/
#include "Edb.h"
UINTN
EdbDisplayMemoryUnit (
IN UINTN Address,
IN EDB_DATA_WIDTH Width
)
/*++
Routine Description:
Display memory unit
Arguments:
Address - Memory Address
Width - Memory Width
Returns:
Length of the memory unit
--*/
{
UINT8 Data8;
UINT16 Data16;
UINT32 Data32;
UINT64 Data64;
//
// Print accroding to width
//
switch (Width) {
case EdbWidthUint8:
CopyMem (&Data8, (VOID *)Address, sizeof(UINT8));
EDBPrint (L"%02x ", Data8);
return sizeof(UINT8);
case EdbWidthUint16:
CopyMem (&Data16, (VOID *)Address, sizeof(UINT16));
EDBPrint (L"%04x ", Data16);
return sizeof(UINT16);
case EdbWidthUint32:
CopyMem (&Data32, (VOID *)Address, sizeof(UINT32));
EDBPrint (L"%08x ", Data32);
return sizeof(UINT32);
case EdbWidthUint64:
CopyMem (&Data64, (VOID *)Address, sizeof(UINT64));
EDBPrint (L"%016lx ", Data64);
return sizeof(UINT64);
default:
ASSERT (FALSE);
break;
}
//
// something wrong
//
return 0;
}
VOID
EdbDisplayMemory (
IN UINTN Address,
IN UINTN Count,
IN EDB_DATA_WIDTH Width
)
/*++
Routine Description:
Display memory
Arguments:
Address - Memory Address
Count - Memory Count
Width - Memory Width
Returns:
None
--*/
{
UINTN LineNumber;
UINTN ByteNumber;
UINTN LineIndex;
UINTN ByteIndex;
UINTN NumberInLine;
if (Count == 0) {
return ;
}
//
// Get line number and byte number
//
switch (Width) {
case EdbWidthUint8:
NumberInLine = 16;
break;
case EdbWidthUint16:
NumberInLine = 8;
break;
case EdbWidthUint32:
NumberInLine = 4;
break;
case EdbWidthUint64:
NumberInLine = 2;
break;
default:
return;
}
LineNumber = Count / NumberInLine;
ByteNumber = Count % NumberInLine;
if (ByteNumber == 0) {
LineNumber -= 1;
ByteNumber = NumberInLine;
}
//
// Print each line
//
for (LineIndex = 0; LineIndex < LineNumber; LineIndex++) {
//
// Break check
//
if (((LineIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&
(LineIndex != 0)) {
if (SetPageBreak ()) {
break;
}
}
EDBPrint (EDB_PRINT_ADDRESS_FORMAT, (UINTN)Address);
for (ByteIndex = 0; ByteIndex < NumberInLine; ByteIndex++) {
Address += EdbDisplayMemoryUnit (Address, Width);
}
EDBPrint (L"\n");
}
//
// Break check
//
if (((LineIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&
(LineIndex != 0)) {
if (SetPageBreak ()) {
return;
}
}
//
// Print last line
//
EDBPrint (EDB_PRINT_ADDRESS_FORMAT, (UINTN)Address);
for (ByteIndex = 0; ByteIndex < ByteNumber; ByteIndex++) {
Address += EdbDisplayMemoryUnit (Address, Width);
}
return ;
}
VOID
EdbEnterMemory (
IN UINTN Address,
IN VOID *Value,
IN EDB_DATA_WIDTH Width
)
/*++
Routine Description:
Entry memory
Arguments:
Address - Memory Address
Value - Memory Value
Width - Memory Width
Returns:
None
--*/
{
switch (Width) {
case EdbWidthUint8:
CopyMem ((VOID *)Address, Value, sizeof(UINT8));
break;
case EdbWidthUint16:
CopyMem ((VOID *)Address, Value, sizeof(UINT16));
break;
case EdbWidthUint32:
CopyMem ((VOID *)Address, Value, sizeof(UINT32));
break;
case EdbWidthUint64:
CopyMem ((VOID *)Address, Value, sizeof(UINT64));
break;
default:
break;
}
return ;
}
EFI_STATUS
EdbGetMemoryAddressCount (
IN CHAR16 *CommandArg,
IN UINTN *Address,
IN UINTN *Count
)
/*++
Routine Description:
Get memory address and count
Arguments:
CommandArg - The argument for this command
Address - Memory Address
Count - Memory Count
Returns:
EFI_SUCCESS - memory address and count are got
EFI_INVALID_PARAMETER - something wrong
--*/
{
CHAR16 *CommandStr;
UINTN MemAddress;
EFI_STATUS Status;
//
// Get Address
//
CommandStr = CommandArg;
if (CommandStr == NULL) {
EDBPrint (L"Memory: Address error!\n");
return EFI_INVALID_PARAMETER;
}
Status = Symboltoi (CommandStr, &MemAddress);
if (EFI_ERROR (Status)) {
if (Status == EFI_NOT_FOUND) {
MemAddress = Xtoi(CommandStr);
} else {
//
// Something wrong, let Symboltoi print error info.
//
EDBPrint (L"Command Argument error!\n");
return EFI_INVALID_PARAMETER;
}
}
*Address = MemAddress;
//
// Get Count
//
CommandStr = StrGetNextTokenLine (L" ");
if (CommandStr == NULL) {
*Count = 1;
} else {
*Count = Xtoi(CommandStr);
}
//
// Done
//
return EFI_SUCCESS;
}
EFI_STATUS
EdbGetMemoryAddressValue (
IN CHAR16 *CommandArg,
IN UINTN *Address,
IN UINT64 *Value
)
/*++
Routine Description:
Get memory address and value
Arguments:
CommandArg - The argument for this command
Address - Memory Address
Value - Memory Value
Returns:
EFI_SUCCESS - memory address and value are got
EFI_INVALID_PARAMETER - something wrong
--*/
{
CHAR16 *CommandStr;
UINTN MemAddress;
EFI_STATUS Status;
//
// Get Address
//
CommandStr = CommandArg;
if (CommandStr == NULL) {
EDBPrint (L"Memory: Address error!\n");
return EFI_INVALID_PARAMETER;
}
Status = Symboltoi (CommandStr, &MemAddress);
if (EFI_ERROR (Status)) {
if (Status == EFI_NOT_FOUND) {
MemAddress = Xtoi(CommandStr);
} else {
//
// Something wrong, let Symboltoi print error info.
//
EDBPrint (L"Command Argument error!\n");
return EFI_INVALID_PARAMETER;
}
}
*Address = MemAddress;
//
// Get Value
//
CommandStr = StrGetNextTokenLine (L" ");
if (CommandStr == NULL) {
EDBPrint (L"Memory: Value error!\n");
return EFI_INVALID_PARAMETER;
}
*Value = LXtoi(CommandStr);
//
// Done
//
return EFI_SUCCESS;
}
EFI_DEBUG_STATUS
DebuggerMemoryDisplay (
IN CHAR16 *CommandArg,
IN EDB_DATA_WIDTH Width
)
/*++
Routine Description:
Display memory
Arguments:
CommandArg - The argument for this command
Width - Memory Width
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
EFI_STATUS Status;
UINTN Address;
UINTN Count;
//
// Get memory address and count
//
Status = EdbGetMemoryAddressCount (CommandArg, &Address, &Count);
if (EFI_ERROR(Status)) {
return EFI_DEBUG_CONTINUE;
}
//
// Display memory
//
EdbDisplayMemory (Address, Count, Width);
//
// Done
//
return EFI_DEBUG_CONTINUE;
}
EFI_DEBUG_STATUS
DebuggerMemoryEnter (
IN CHAR16 *CommandArg,
IN EDB_DATA_WIDTH Width
)
/*++
Routine Description:
Enter memory
Arguments:
CommandArg - The argument for this command
Width - Memory Width
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
EFI_STATUS Status;
UINTN Address;
UINT64 Value;
//
// Get memory address and value
//
Status = EdbGetMemoryAddressValue (CommandArg, &Address, &Value);
if (EFI_ERROR(Status)) {
return EFI_DEBUG_CONTINUE;
}
//
// Enter memory
//
EdbEnterMemory (Address, &Value, Width);
//
// Done
//
return EFI_DEBUG_CONTINUE;
}
EFI_DEBUG_STATUS
DebuggerMemoryDB (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - DB
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryDisplay (CommandArg, EdbWidthUint8);
}
EFI_DEBUG_STATUS
DebuggerMemoryDW (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - DW
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryDisplay (CommandArg, EdbWidthUint16);
}
EFI_DEBUG_STATUS
DebuggerMemoryDD (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - DD
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryDisplay (CommandArg, EdbWidthUint32);
}
EFI_DEBUG_STATUS
DebuggerMemoryDQ (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - DQ
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryDisplay (CommandArg, EdbWidthUint64);
}
EFI_DEBUG_STATUS
DebuggerMemoryEB (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - EB
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryEnter (CommandArg, EdbWidthUint8);
}
EFI_DEBUG_STATUS
DebuggerMemoryEW (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - EW
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryEnter (CommandArg, EdbWidthUint16);
}
EFI_DEBUG_STATUS
DebuggerMemoryED (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - ED
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryEnter (CommandArg, EdbWidthUint32);
}
EFI_DEBUG_STATUS
DebuggerMemoryEQ (
IN CHAR16 *CommandArg,
IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
IN EFI_EXCEPTION_TYPE ExceptionType,
IN OUT EFI_SYSTEM_CONTEXT SystemContext
)
/*++
Routine Description:
DebuggerCommand - EQ
Arguments:
CommandArg - The argument for this command
DebuggerPrivate - EBC Debugger private data structure
InterruptType - Interrupt type.
SystemContext - EBC system context.
Returns:
EFI_DEBUG_RETURN - formal return value
--*/
{
return DebuggerMemoryEnter (CommandArg, EdbWidthUint64);
}