230 lines
3.8 KiB
C++
230 lines
3.8 KiB
C++
|
//++
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation
|
||
|
//
|
||
|
// Module Name:
|
||
|
//
|
||
|
// blkd.cpp
|
||
|
//
|
||
|
// Abstract:
|
||
|
//
|
||
|
// This module implements KD support for the boot loader.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
#include "bl.h"
|
||
|
|
||
|
UINT32 BlKdNextPacketId;
|
||
|
|
||
|
VOID
|
||
|
BlKdSpin(
|
||
|
VOID
|
||
|
)
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// Provide user feedback that we are waiting on the kernel debugger.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
{
|
||
|
static UINT8 state = 0;
|
||
|
|
||
|
//
|
||
|
// Write the spinner character to the top left corner of the screen.
|
||
|
//
|
||
|
|
||
|
*((UINT16 *)(ULONG_PTR)0xb809e) = 0x2f00 + ("+-|*" [state++ & 0x3]);
|
||
|
}
|
||
|
|
||
|
UINT32
|
||
|
BlKdComputeChecksum(
|
||
|
PCVOID Buffer,
|
||
|
UINT32 Length
|
||
|
)
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This function computes the checksum of a KD buffer.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Buffer - Supplies a pointer to the buffer.
|
||
|
//
|
||
|
// Length - Supplies the length of the buffer.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Checksum value for the specified buffer.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
{
|
||
|
UINT32 Checksum;
|
||
|
UINT32 Index;
|
||
|
|
||
|
Checksum = 0;
|
||
|
|
||
|
for (Index = 0; Index < Length; Index += 1) {
|
||
|
|
||
|
Checksum += ((PCHAR)Buffer)[Index];
|
||
|
}
|
||
|
|
||
|
return Checksum;
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
BlKdPrintString(
|
||
|
PCSTR String
|
||
|
)
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This function prints the specified string to the KD.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// String - Supplies a pointer to the string to print.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// TRUE, if operation was successful.
|
||
|
// FALSE, otherwise.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
{
|
||
|
KD_DEBUG_IO Packet;
|
||
|
UINT32 StringLength;
|
||
|
|
||
|
StringLength = BlRtlStringLength(String);
|
||
|
|
||
|
if (StringLength >= 0xFFFF) {
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BlRtlZeroMemory(&Packet, sizeof(Packet));
|
||
|
|
||
|
Packet.ApiNumber = KD_API_PRINT_STRING;
|
||
|
Packet.u1.PrintString.LengthOfString = StringLength;
|
||
|
|
||
|
if (BlKdComPort != 0) {
|
||
|
|
||
|
return BlKdComSendPacket(KD_PACKET_TYPE_KD_DEBUG_IO,
|
||
|
&Packet,
|
||
|
sizeof(Packet),
|
||
|
String,
|
||
|
(UINT16) StringLength + 1);
|
||
|
|
||
|
}
|
||
|
else if (BlPciOhci1394BaseAddress != 0) {
|
||
|
|
||
|
return BlKd1394SendPacket(KD_PACKET_TYPE_KD_DEBUG_IO,
|
||
|
&Packet,
|
||
|
sizeof(Packet),
|
||
|
String,
|
||
|
(UINT16) StringLength + 1);
|
||
|
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
BlKdPrintf(
|
||
|
PCSTR Format,
|
||
|
...
|
||
|
)
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This function prints out a string to KD.
|
||
|
//
|
||
|
// Arguments:
|
||
|
//
|
||
|
// Format - Supplies the format string.
|
||
|
//
|
||
|
// ... - Supplies the input parameters.
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// TRUE, if operation was successful.
|
||
|
// FALSE, otherwise.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
{
|
||
|
va_list ArgumentList;
|
||
|
CHAR Buffer[4096];
|
||
|
|
||
|
va_start(ArgumentList, Format);
|
||
|
|
||
|
if (BlRtlFormatString(Buffer,
|
||
|
sizeof(Buffer),
|
||
|
Format,
|
||
|
ArgumentList) == FALSE) {
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
BlKdPrintString(Buffer);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
BlKdInitialize(
|
||
|
VOID
|
||
|
)
|
||
|
|
||
|
//++
|
||
|
//
|
||
|
// Routine Description:
|
||
|
//
|
||
|
// This function initializes KD support for the boot loader.
|
||
|
//
|
||
|
//--
|
||
|
|
||
|
{
|
||
|
//
|
||
|
// Try serial first.
|
||
|
//
|
||
|
|
||
|
if (BlKdComConnect() != FALSE) {
|
||
|
|
||
|
#if KD_VERBOSE
|
||
|
|
||
|
BlVideoPrintf("KD: Connected to COM%u\n", BlKdComPort);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Try the 1394 transport next.
|
||
|
//
|
||
|
|
||
|
if (BlKd1394Connect() != FALSE) {
|
||
|
|
||
|
#if KD_VERBOSE
|
||
|
|
||
|
BlVideoPrintf("KD: Connected to 1394:%u\n", 0);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|