372 lines
7.6 KiB
ArmAsm
372 lines
7.6 KiB
ArmAsm
/**
|
||
*** Copyright (C) 1996-97 Intel Corporation. All rights reserved.
|
||
***
|
||
*** The information and source code contained herein is the exclusive
|
||
*** property of Intel Corporation and may not be disclosed, examined
|
||
*** or reproduced in whole or in part without explicit written authorization
|
||
*** from the company.
|
||
**/
|
||
|
||
// TITLE("Debug Support Functions")
|
||
//++
|
||
//
|
||
// Module Name:
|
||
//
|
||
// debugstb.s
|
||
//
|
||
// Abstract:
|
||
//
|
||
// This module implements functions to support debugging NT. Each
|
||
// function executes a break instruction with a special immediate
|
||
// value.
|
||
//
|
||
// Author:
|
||
//
|
||
// William K. Cheung (wcheung) 17-Jan-1996
|
||
//
|
||
// Environment:
|
||
//
|
||
// Any mode.
|
||
//
|
||
// Revision History:
|
||
//
|
||
// 08-Feb-1996 Updated to EAS 2.1
|
||
//
|
||
//--
|
||
|
||
#include "ksia64.h"
|
||
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DbgBreakPoint()
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function executes a breakpoint instruction. Useful for entering
|
||
// the debugger under program control. This breakpoint will always go to
|
||
// the kernel debugger if one is installed, otherwise it will go to the
|
||
// debug subsystem.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// None.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DbgBreakPoint)
|
||
|
||
flushrs
|
||
;;
|
||
break.i BREAKPOINT_STOP
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DbgBreakPoint)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DbgBreakPointWithStatus(
|
||
// IN ULONG Status
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function executes a breakpoint instruction. Useful for entering
|
||
// the debugger under program control. This breakpoint will always go to
|
||
// the kernel debugger if one is installed, otherwise it will go to the
|
||
// debug subsystem. This function is identical to DbgBreakPoint, except
|
||
// that it takes an argument which the debugger can see.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// A status code.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DbgBreakPointWithStatus)
|
||
|
||
ALTERNATE_ENTRY(RtlpBreakWithStatusInstruction)
|
||
|
||
flushrs
|
||
;;
|
||
add t0 = zero, a0
|
||
break.i BREAKPOINT_STOP
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DbgBreakPointWithStatus)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DbgUserBreakPoint()
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function executes a breakpoint instruction. Useful for entering
|
||
// the debug subsystem under program control. The kernel debug will ignore
|
||
// this breakpoint since it will not find the instruction address in its
|
||
// breakpoint table.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// None.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DbgUserBreakPoint)
|
||
|
||
flushrs
|
||
;;
|
||
break.i BREAKPOINT_STOP
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DbgUserBreakPoint)
|
||
|
||
//++
|
||
//
|
||
// ULONG
|
||
// DebugPrompt(
|
||
// IN PSTRING Output,
|
||
// IN PSTRING Input
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function executes a debug prompt breakpoint.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Output (a0) - Supplies a pointer to the output string descriptor.
|
||
//
|
||
// Input (a1) - Supplies a pointer to the input string descriptor.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// The length of the input string is returned as the function value.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DebugPrompt)
|
||
|
||
flushrs
|
||
add a0 = StrBuffer, a0
|
||
add a1 = StrBuffer, a1
|
||
;;
|
||
|
||
//
|
||
// Set the following 4 arguments into scratch registers t0 - t3;
|
||
// they are passed to the KiDebugRoutine() via the context record.
|
||
//
|
||
// t0 - address of output string
|
||
// t1 - length of output string
|
||
// t2 - address of input string
|
||
// t3 - maximumm length of input string
|
||
//
|
||
|
||
LDPTRINC(t0, a0, StrLength - StrBuffer)
|
||
LDPTRINC(t2, a1, StrMaximumLength - StrBuffer)
|
||
nop.i 0
|
||
;;
|
||
|
||
ld2.nta t1 = [a0]
|
||
ld2.nta t3 = [a1]
|
||
break.i BREAKPOINT_PROMPT
|
||
|
||
nop.m 0
|
||
nop.m 0
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DebugPrompt)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DebugLoadImageSymbols(
|
||
// IN PSTRING ImagePathName,
|
||
// IN PKD_SYMBOLS_INFO SymbolInfo
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function calls the kernel debugger to load the symbol
|
||
// table for the specified image.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// ImagePathName - specifies the fully qualified path name of the image
|
||
// file that has been loaded into an NT address space.
|
||
//
|
||
// SymbolInfo - information captured from header of image file.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DebugLoadImageSymbols)
|
||
|
||
//
|
||
// Arguments are passed to the KiDebugRoutine via the context record
|
||
// in scratch registers t0 and t1.
|
||
//
|
||
|
||
flushrs
|
||
add t0 = zero, a0
|
||
add t1 = zero, a1
|
||
;;
|
||
|
||
nop.m 0
|
||
break.i BREAKPOINT_LOAD_SYMBOLS
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DebugLoadImageSymbols)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DebugUnLoadImageSymbols(
|
||
// IN PSTRING ImagePathName,
|
||
// IN PKD_SYMBOLS_INFO SymbolInfo
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function calls the kernel debugger to unload the symbol
|
||
// table for the specified image.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// ImagePathName - specifies the fully qualified path name of the image
|
||
// file that has been unloaded from an NT address space.
|
||
//
|
||
// SymbolInfo - information captured from header of image file.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DebugUnLoadImageSymbols)
|
||
|
||
//
|
||
// Arguments are passed to the KiDebugRoutine via the context record
|
||
// in scratch registers t0 and t1.
|
||
//
|
||
|
||
flushrs
|
||
add t0 = zero, a0
|
||
add t1 = zero, a1
|
||
;;
|
||
|
||
nop.m 0
|
||
break.i BREAKPOINT_UNLOAD_SYMBOLS
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DebugUnLoadImageSymbols)
|
||
|
||
//++
|
||
//
|
||
// NTSTATUS
|
||
// DebugPrint(
|
||
// IN PSTRING Output,
|
||
// IN ULONG ComponentId,
|
||
// IN ULONG Level
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function executes a debug print breakpoint.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Output (a0) - Supplies a pointer to the output string descriptor.
|
||
//
|
||
// ComponentId (a1) - Supplies the Id of the calling component.
|
||
//
|
||
// Level (a2) - Supplies the output importance level.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// Status code. STATUS_SUCCESS if debug print happened.
|
||
// STATUS_BREAKPOINT if user typed a Control-C during print.
|
||
// STATUS_DEVICE_NOT_CONNECTED if kernel debugger not present.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DebugPrint)
|
||
|
||
flushrs
|
||
add t5 = StrBuffer, a0
|
||
;;
|
||
|
||
LDPTRINC(t0, t5, StrLength-StrBuffer) // set address of output string
|
||
;;
|
||
ld2.nta t1 = [t5] // set length of output string
|
||
add t2 = zero, a1 // set component id
|
||
add t3 = zero, a2 // set importance level
|
||
break.i BREAKPOINT_PRINT // execute a debug print breakpoint
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DebugPrint)
|
||
|
||
//++
|
||
//
|
||
// VOID
|
||
// DebugCommandString(
|
||
// IN PSTRING Name,
|
||
// IN PSTRING Command
|
||
// )
|
||
//
|
||
// Routine Description:
|
||
//
|
||
// This function requests that the kernel debugger execute
|
||
// the given command string.
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Name - Command name to identify the source of the
|
||
// command to the kd user.
|
||
//
|
||
// Command - Command string.
|
||
//
|
||
// Return Value:
|
||
//
|
||
// None.
|
||
//
|
||
//--
|
||
|
||
LEAF_ENTRY(DebugCommandString)
|
||
|
||
//
|
||
// Arguments are passed to the KiDebugRoutine via the context record
|
||
// in scratch registers t0 and t1.
|
||
//
|
||
|
||
flushrs
|
||
add t0 = zero, a0
|
||
add t1 = zero, a1
|
||
;;
|
||
|
||
nop.m 0
|
||
break.i BREAKPOINT_COMMAND_STRING
|
||
br.ret.sptk.clr brp
|
||
|
||
LEAF_EXIT(DebugCommandString)
|
||
|