singrdk/base/boot/SingLdrPc/blkd.cpp

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;
}