372 lines
7.3 KiB
C
372 lines
7.3 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995 Intel Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
i64kd copied from simkd.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Kernel debug com support.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
14-Apr-1995
|
|||
|
|
|||
|
Bernard Lint, M. Jayakumar
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
#include "halp.h"
|
|||
|
#include "stdio.h"
|
|||
|
|
|||
|
//
|
|||
|
// Timeout_count 1024 * 200
|
|||
|
//
|
|||
|
#define TIMEOUT_COUNT 2
|
|||
|
|
|||
|
#define GET_RETRY_COUNT 1024
|
|||
|
#define IA64_MSG_DEBUG_ENABLE "Kernel Debugger Using: COM%x (Port 0x%x, Baud Rate %d)\n"
|
|||
|
#define IA64_MSG2_DEBUG_ENABLE "Kernel Debugger Using named pipe: COM%x (Port 0x%x, Baud Rate %d)\n"
|
|||
|
|
|||
|
PUCHAR KdComPortInUse=NULL;
|
|||
|
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
KdPortInitialize(
|
|||
|
PDEBUG_PARAMETERS DebugParameters,
|
|||
|
PLOADER_PARAMETER_BLOCK LoaderBlock,
|
|||
|
BOOLEAN Initialize
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine initialize a com port to support kernel debug.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
DebugParameters - Supplies a pointer a structure which optionally
|
|||
|
sepcified the debugging port information.
|
|||
|
|
|||
|
LoaderBlock - supplies a pointer to the loader parameter block.
|
|||
|
|
|||
|
Initialize - Specifies a boolean value that determines whether the
|
|||
|
debug port is initialized or just the debug port parameters
|
|||
|
are captured.
|
|||
|
|
|||
|
Returned Value:
|
|||
|
|
|||
|
TRUE - If a debug port is found.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PUCHAR PortAddress = NULL;
|
|||
|
ULONG Com = 0;
|
|||
|
UCHAR DebugMessage[80];
|
|||
|
PHYSICAL_ADDRESS LPDebugParameters;
|
|||
|
|
|||
|
|
|||
|
if (Initialize) {
|
|||
|
LPDebugParameters = MmGetPhysicalAddress (DebugParameters);
|
|||
|
if ( !SscKdInitialize((PVOID) LPDebugParameters.QuadPart, (SSC_BOOL)Initialize )) {
|
|||
|
|
|||
|
// SscKd initialized sucessfully
|
|||
|
|
|||
|
Com = DebugParameters->CommunicationPort;
|
|||
|
|
|||
|
//
|
|||
|
// initialize port struct. if not named-pipe
|
|||
|
//
|
|||
|
if ( Com != 0 ) {
|
|||
|
|
|||
|
//
|
|||
|
// set port address to default value.
|
|||
|
//
|
|||
|
|
|||
|
if (PortAddress == NULL) {
|
|||
|
switch (Com) {
|
|||
|
case 1:
|
|||
|
PortAddress = (PUCHAR)0x3f8;
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
PortAddress = (PUCHAR)0x2f8;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
PortAddress = (PUCHAR)0x3e8;
|
|||
|
break;
|
|||
|
case 4:
|
|||
|
PortAddress = (PUCHAR)0x2e8;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
KdComPortInUse= PortAddress;
|
|||
|
|
|||
|
sprintf(
|
|||
|
DebugMessage,
|
|||
|
IA64_MSG_DEBUG_ENABLE,
|
|||
|
Com,
|
|||
|
PtrToUlong(PortAddress),
|
|||
|
DebugParameters->BaudRate
|
|||
|
);
|
|||
|
|
|||
|
HalDisplayString("\n");
|
|||
|
HalDisplayString(DebugMessage);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// port = 0, named-pipe
|
|||
|
//
|
|||
|
|
|||
|
else {
|
|||
|
sprintf(
|
|||
|
DebugMessage,
|
|||
|
IA64_MSG2_DEBUG_ENABLE,
|
|||
|
Com,
|
|||
|
PtrToUlong(PortAddress),
|
|||
|
DebugParameters->BaudRate
|
|||
|
);
|
|||
|
HalDisplayString("\n");
|
|||
|
HalDisplayString(DebugMessage);
|
|||
|
}
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
//
|
|||
|
// SscKdinitialize() failed.
|
|||
|
//
|
|||
|
|
|||
|
else {
|
|||
|
|
|||
|
return(FALSE);
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// By pass. do not initialize
|
|||
|
//
|
|||
|
else {
|
|||
|
return(FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ULONG
|
|||
|
KdPortGetByte (
|
|||
|
OUT PUCHAR Input
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Fetch a byte from the debug port and return it.
|
|||
|
|
|||
|
This routine does nothing in the simulation environment.
|
|||
|
|
|||
|
N.B. It is assumed that the IRQL has been raised to the highest level, and
|
|||
|
necessary multiprocessor synchronization has been performed before this
|
|||
|
routine is called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Input - Returns the data byte.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
CP_GET_SUCCESS is returned if a byte is successfully read from the
|
|||
|
kernel debugger line.
|
|||
|
CP_GET_ERROR is returned if error encountered during reading.
|
|||
|
CP_GET_NODATA is returned if timeout.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PHYSICAL_ADDRESS LPInput;
|
|||
|
UCHAR DebugMessage[80];
|
|||
|
ULONG limitcount, status;
|
|||
|
|
|||
|
LPInput = MmGetPhysicalAddress (Input);
|
|||
|
limitcount = GET_RETRY_COUNT;
|
|||
|
|
|||
|
while (limitcount != 0) {
|
|||
|
limitcount--;
|
|||
|
|
|||
|
status = SscKdPortGetByte((PVOID)LPInput.QuadPart);
|
|||
|
if (status == CP_GET_SUCCESS) {
|
|||
|
#ifdef KDDBG
|
|||
|
sprintf(DebugMessage,"%02x ", *Input);
|
|||
|
HalDisplayString(DebugMessage);
|
|||
|
#endif
|
|||
|
return(CP_GET_SUCCESS);
|
|||
|
}
|
|||
|
#ifdef KDDBG
|
|||
|
else {
|
|||
|
HalDisplayString(".");
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
ULONG
|
|||
|
KdPortPollByte (
|
|||
|
OUT PUCHAR Input
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Fetch a byte from the debug port and return it if one is available.
|
|||
|
|
|||
|
This routine does nothing in the simulation environment.
|
|||
|
|
|||
|
N.B. It is assumed that the IRQL has been raised to the highest level, and
|
|||
|
necessary multiprocessor synchronization has been performed before this
|
|||
|
routine is called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Input - Returns the data byte.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
CP_GET_SUCCESS is returned if a byte is successfully read from the
|
|||
|
kernel debugger line.
|
|||
|
CP_GET_ERROR is returned if error encountered during reading.
|
|||
|
CP_GET_NODATA is returned if timeout.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PHYSICAL_ADDRESS LPInput;
|
|||
|
UCHAR DebugMessage[80];
|
|||
|
ULONG limitcount, status;
|
|||
|
|
|||
|
LPInput = MmGetPhysicalAddress (Input);
|
|||
|
limitcount = TIMEOUT_COUNT;
|
|||
|
|
|||
|
while (limitcount != 0) {
|
|||
|
limitcount--;
|
|||
|
|
|||
|
status = SscKdPortGetByte((PVOID)LPInput.QuadPart);
|
|||
|
if (status == CP_GET_ERROR)
|
|||
|
return(CP_GET_ERROR);
|
|||
|
if (status == CP_GET_SUCCESS) {
|
|||
|
#ifdef KDDBG
|
|||
|
sprintf(DebugMessage, "%02x ", *Input);
|
|||
|
HalDisplayString(DebugMessage);
|
|||
|
#endif
|
|||
|
return(CP_GET_SUCCESS);
|
|||
|
}
|
|||
|
#ifdef KDDBG
|
|||
|
HalDisplayString(".");
|
|||
|
#endif
|
|||
|
}
|
|||
|
return (CP_GET_NODATA);
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
KdPortPutByte (
|
|||
|
IN UCHAR Output
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Write a byte to the debug port.
|
|||
|
|
|||
|
This routine does nothing in the simulation environment.
|
|||
|
|
|||
|
N.B. It is assumed that the IRQL has been raised to the highest level, and
|
|||
|
necessary multiprocessor synchronization has been performed before this
|
|||
|
routine is called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Output - Supplies the output data byte.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
#ifdef KDDBG
|
|||
|
UCHAR DebugMessage[80];
|
|||
|
|
|||
|
sprintf(DebugMessage, "%02x-", Output);
|
|||
|
HalDisplayString(DebugMessage);
|
|||
|
#endif
|
|||
|
SscKdPortPutByte(Output);
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
KdPortRestore (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine does nothing in the simulation environment.
|
|||
|
|
|||
|
N.B. It is assumed that the IRQL has been raised to the highest level, and
|
|||
|
necessary multiprocessor synchronization has been performed before this
|
|||
|
routine is called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
KdPortSave (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine does nothing in the simulation environment.
|
|||
|
|
|||
|
N.B. It is assumed that the IRQL has been raised to the highest level, and
|
|||
|
necessary multiprocessor synchronization has been performed before this
|
|||
|
routine is called.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
}
|