mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
371 lines
7.6 KiB
371 lines
7.6 KiB
/**
|
|
*** 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)
|
|
|