singrdk/base/boot/SingLdrPc/bltrap.cpp

201 lines
5.3 KiB
C++
Raw Normal View History

2008-11-17 18:29:00 -05:00
//++
//
// Copyright (c) Microsoft Corporation
//
// Module Name:
//
// bltrap.cpp
//
// Abstract:
//
// This module implements trap capture.
//
//--
#include "bl.h"
IDTR BlIdtr;
IDTE BlIdt[32];
VOID
BlTrapEnable(
VOID
)
//++
//
{
for (UINT32 i = 0; i < ARRAY_SIZE(BlIdt); i++) {
UINT64 Enter = ((UINT64)BlTrapEnter) + i * 8;
BlIdt[i].Offset0To15 =(UINT16)((Enter >> 0) & 0xffff);
BlIdt[i].Offset16To31 = (UINT16)((Enter >> 16) & 0xffff);
#if defined(BOOT_X64)
BlIdt[i].Selector = LM_CODE_SELECTOR;
#else
BlIdt[i].Selector = PM_CODE_SELECTOR;
#endif
BlIdt[i].Flags = 0;
BlIdt[i].Access = 0x8e;
#if defined(BOOT_X64)
BlIdt[i].Offset32To63 = (UINT32)((Enter >> 32) & 0xffffffff);
#endif
}
BlIdtr.Limit = 32 * 8;
BlIdtr.Base = (UINT64)BlIdt;
BlTrapSetIdtr(&BlIdtr);
}
VOID
BlTrapFatal(
ULONG_PTR Trap,
PBL_TRAP_CONTEXT Context
)
//++
//
// Routine Description:
//
// This function returns the specified memory type string.
//
// Arguments:
//
// Type - Supplies the memory type.
//
//--
{
BlVideoPrintf("\n*** Fatal Trap: 0x%2x:%p [err=%p]\n",
Trap, Context, Context->Err);
#if defined(BOOT_X86)
BlVideoPrintf(" eip=%p efl=%p cr2=%p cs=%2x num=%02x\n",
Context->Eip, Context->Efl, Context->Cr2,
(UINT32)Context->Cs0, (UINT32)Context->Num);
BlVideoPrintf(" eax=%p ebx=%p ecx=%p edx=%p\n",
Context->Eax, Context->Ebx, Context->Ecx, Context->Edx);
BlVideoPrintf(" esp=%p ebp=%p esi=%p edi=%p\n",
Context->Esp, Context->Ebp, Context->Esi, Context->Edi);
ULONG_PTR * ebp = (ULONG_PTR *)Context->Ebp;
BlVideoPrintf("\n");
BlVideoPrintf(" Frame: next return arg0 arg1 arg2 arg3\n");
for (int i = 0; i < 10; i++) {
if (ebp < (ULONG_PTR*)0x10000 || ebp > (ULONG_PTR*)0x7fffffff) {
BlVideoPrintf(" %8x:\n", (ULONG_PTR)ebp);
break;
}
ULONG_PTR *end = (ULONG_PTR *)ebp[0];
if (end < ebp) {
end = ebp + 6;
}
BlVideoPrintf(" %p: %p %p",
(ULONG_PTR)ebp, ebp[0], ebp[1]);
for (int i = 2; i < 6 && ebp + i < end; i++) {
BlVideoPrintf(" %p", ebp[i]);
}
BlVideoPrintf("\n");
ebp = (ULONG_PTR *)ebp[0];
}
BlVideoPrintf("\n");
ULONG_PTR * esp = (ULONG_PTR *)(Context->Esp);
for (int i = 0; i < 6; i++) {
BlVideoPrintf(" %p: %p %p %p %p\n", esp, esp[0], esp[1], esp[2], esp[3]);
esp += 4;
}
BlVideoPrintf("\n");
esp = (ULONG_PTR *)(Context);
for (int i = 0; i < 6; i++) {
BlVideoPrintf(" %p: %p %p %p\n", esp, esp[0], esp[1], esp[2], esp[3]);
esp += 4;
}
BlVideoPrintf("\n");
UINT8 * eip = (UINT8 *)Context->Eip;
BlVideoPrintf(" %p:", eip);
for (int i = 0; i < 12; i++) {
BlVideoPrintf(" %02x", eip[i]);
}
BlVideoPrintf("\n");
#elif defined(BOOT_X64)
BlVideoPrintf(" rip=%p rfl=%p cs=%2x num=%02x\n",
Context->Rip, Context->Rfl, (UINT32)Context->Cs0, (UINT32)Context->Num);
BlVideoPrintf(" rsp=%p rbp=%p cr2=%p\n",
Context->Rsp, Context->Rbp, Context->Cr2);
BlVideoPrintf(" rax=%p rbx=%p rcx=%p\n",
Context->Rax, Context->Rbx, Context->Rcx);
BlVideoPrintf(" rdx=%p rsi=%p rdi=%p\n",
Context->Rdx, Context->Rsi, Context->Rdi);
BlVideoPrintf(" r08=%p r09=%p r10=%p\n",
Context->R8, Context->R9, Context->R10);
BlVideoPrintf(" r11=%p r12=%p r13=%p\n",
Context->R11, Context->R12, Context->R13);
BlVideoPrintf(" r14=%p r15=%p\n",
Context->R14, Context->R15);
ULONG_PTR * rbp = (ULONG_PTR *)Context->Rbp;
BlVideoPrintf("\n");
BlVideoPrintf(" Frame: next return arg0\n");
for (int i = 0; i < 10; i++) {
if (rbp < (ULONG_PTR*)0x10000 || rbp > (ULONG_PTR*)0x7fffffff) {
BlVideoPrintf(" %p:\n", (ULONG_PTR)rbp);
break;
}
ULONG_PTR *end = (ULONG_PTR *)rbp[0];
if (end < rbp) {
end = rbp + 3;
}
BlVideoPrintf(" %p: %p %p",
(ULONG_PTR)rbp, rbp[0], rbp[1]);
for (int i = 2; i < 3 && rbp + i < end; i++) {
BlVideoPrintf(" %p", rbp[i]);
}
BlVideoPrintf("\n");
rbp = (ULONG_PTR *)rbp[0];
}
BlVideoPrintf("\n");
ULONG_PTR * rsp = (ULONG_PTR *)(Context->Rsp);
for (int i = 0; i < 6; i++) {
BlVideoPrintf(" %p: %p %p %p\n", rsp, rsp[0], rsp[1], rsp[2]);
rsp += 3;
}
BlVideoPrintf("\n");
rsp = (ULONG_PTR *)(Context);
for (int i = 0; i < 6; i++) {
BlVideoPrintf(" %p: %p %p %p\n", rsp, rsp[0], rsp[1], rsp[2]);
rsp += 3;
}
BlVideoPrintf("\n");
UINT8 * rip = (UINT8 *)Context->Rip;
BlVideoPrintf(" %p:", rip);
for (int i = 0; i < 12; i++) {
BlVideoPrintf(" %02x", rip[i]);
}
BlVideoPrintf("\n");
#endif
for (;;);
}