mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 16:51:22 +00:00
- Start implementing KiPrefetchAbortHandler for BKPT instructions.
- We pretty much try to duplicate what happens on x86, and build an exception record with the right information. - We are seeing the debug string in R1 and its length in R2, so we're on the right track. - We call KiDispatchException now, which isn't yet implemented. - Yup, all this work just to see a damn debug string the "*proper* NT way". Thanks, asshole. svn path=/trunk/; revision=34480
This commit is contained in:
parent
64d7b1337b
commit
784b0af4cd
1 changed files with 74 additions and 1 deletions
|
@ -434,8 +434,78 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame,
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame)
|
KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame)
|
||||||
{
|
{
|
||||||
|
PVOID Address = (PVOID)KeArmFaultAddressRegisterGet();
|
||||||
ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
|
ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00);
|
||||||
|
ULONG Instruction = *(PULONG)TrapFrame->Pc;
|
||||||
|
ULONG DebugType, Parameter0;
|
||||||
|
EXCEPTION_RECORD ExceptionRecord;
|
||||||
|
|
||||||
|
//
|
||||||
|
// What we *SHOULD* do is look at the instruction fault status register
|
||||||
|
// and see if it's equal to 2 (debug trap). Unfortunately QEMU doesn't seem
|
||||||
|
// to emulate this behaviour properly, so we use a workaround.
|
||||||
|
//
|
||||||
|
//if (KeArmInstructionFaultStatusRegisterGet() == 2)
|
||||||
|
if (Instruction & 0xE1200070) // BKPT
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Okay, we know this is a breakpoint, extract the index
|
||||||
|
//
|
||||||
|
DebugType = Instruction & 0xF;
|
||||||
|
if (DebugType == BREAKPOINT_PRINT)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Debug Service
|
||||||
|
//
|
||||||
|
Parameter0 = TrapFrame->R0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Standard INT3 (emulate x86 behavior)
|
||||||
|
//
|
||||||
|
Parameter0 = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Build the exception record
|
||||||
|
//
|
||||||
|
ExceptionRecord.ExceptionCode = STATUS_BREAKPOINT;
|
||||||
|
ExceptionRecord.ExceptionFlags = 0;
|
||||||
|
ExceptionRecord.ExceptionRecord = NULL;
|
||||||
|
ExceptionRecord.ExceptionAddress = (PVOID)TrapFrame->Pc;
|
||||||
|
ExceptionRecord.NumberParameters = 3;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Build the parameters
|
||||||
|
//
|
||||||
|
ExceptionRecord.ExceptionInformation[0] = Parameter0;
|
||||||
|
ExceptionRecord.ExceptionInformation[1] = TrapFrame->R1;
|
||||||
|
ExceptionRecord.ExceptionInformation[2] = TrapFrame->R2;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Dispatch the exception
|
||||||
|
//
|
||||||
|
KiDispatchException(&ExceptionRecord,
|
||||||
|
NULL,
|
||||||
|
TrapFrame,
|
||||||
|
KiGetPreviousMode(TrapFrame),
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
//
|
||||||
|
// TODO
|
||||||
|
//
|
||||||
while (TRUE);
|
while (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Unhandled
|
||||||
|
//
|
||||||
|
while (TRUE);
|
||||||
|
DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n",
|
||||||
|
KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
ASSERT(FALSE);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -453,11 +523,14 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame)
|
||||||
{
|
{
|
||||||
Status = MmAccessFault(FALSE,
|
Status = MmAccessFault(FALSE,
|
||||||
Address,
|
Address,
|
||||||
KernelMode,
|
KiGetPreviousMode(TrapFrame),
|
||||||
TrapFrame);
|
TrapFrame);
|
||||||
if (Status == STATUS_SUCCESS) return Status;
|
if (Status == STATUS_SUCCESS) return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Unhandled
|
||||||
|
//
|
||||||
DPRINT1("[ABORT] (%x) @ %p/%p/%p\n",
|
DPRINT1("[ABORT] (%x) @ %p/%p/%p\n",
|
||||||
KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
|
KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc);
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue