mirror of
https://github.com/reactos/reactos.git
synced 2025-02-25 01:39:30 +00:00
- Implement KeContextToTrapFrame.
- No, we don't sanitize anything right now. There's no user-mode at this point, so it doesn't matter. If you think we should sanitize right now, you need to get out and get laid. - So this brings us back to KiPrefetchAbortHandler's while (TRUE). - We have to make sure the funky PC modifications are going to work well, and after that, we can exit the trap. svn path=/trunk/; revision=34483
This commit is contained in:
parent
ed3125b4e0
commit
631d627fa7
2 changed files with 68 additions and 4 deletions
|
@ -29,8 +29,73 @@ KeContextToTrapFrame(IN PCONTEXT Context,
|
|||
IN ULONG ContextFlags,
|
||||
IN KPROCESSOR_MODE PreviousMode)
|
||||
{
|
||||
while (TRUE);
|
||||
return;
|
||||
KIRQL OldIrql;
|
||||
|
||||
//
|
||||
// Do this at APC_LEVEL
|
||||
//
|
||||
OldIrql = KeGetCurrentIrql();
|
||||
if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql);
|
||||
|
||||
//
|
||||
// Start with the Control flags
|
||||
//
|
||||
if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL)
|
||||
{
|
||||
//
|
||||
// So this basically means all the special stuff
|
||||
//
|
||||
if (PreviousMode == UserMode)
|
||||
{
|
||||
//
|
||||
// ARM has register banks
|
||||
//
|
||||
TrapFrame->UserSp = Context->Sp;
|
||||
TrapFrame->UserLr = Context->Lr;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// ARM has register banks
|
||||
//
|
||||
TrapFrame->SvcSp = Context->Sp;
|
||||
TrapFrame->SvcLr = Context->Lr;
|
||||
}
|
||||
|
||||
//
|
||||
// The rest is already in the right mode
|
||||
//
|
||||
TrapFrame->Pc = Context->Pc;
|
||||
TrapFrame->Spsr = Context->Psr;
|
||||
}
|
||||
|
||||
//
|
||||
// Now do the integers
|
||||
//
|
||||
if ((Context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER)
|
||||
{
|
||||
//
|
||||
// Basically everything else but FPU
|
||||
//
|
||||
TrapFrame->R0 = Context->R0;
|
||||
TrapFrame->R1 = Context->R1;
|
||||
TrapFrame->R2 = Context->R2;
|
||||
TrapFrame->R3 = Context->R3;
|
||||
TrapFrame->R4 = Context->R4;
|
||||
TrapFrame->R5 = Context->R5;
|
||||
TrapFrame->R6 = Context->R6;
|
||||
TrapFrame->R7 = Context->R7;
|
||||
TrapFrame->R8 = Context->R8;
|
||||
TrapFrame->R0 = Context->R9;
|
||||
TrapFrame->R10 = Context->R10;
|
||||
TrapFrame->R11 = Context->R11;
|
||||
TrapFrame->R12 = Context->R12;
|
||||
}
|
||||
|
||||
//
|
||||
// Restore IRQL
|
||||
//
|
||||
if (OldIrql < APC_LEVEL) KeLowerIrql(OldIrql);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -55,7 +120,7 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame,
|
|||
//
|
||||
// So this basically means all the special stuff
|
||||
//
|
||||
if (KiGetPreviousMode(TrapFrame))
|
||||
if (KiGetPreviousMode(TrapFrame) == UserMode)
|
||||
{
|
||||
//
|
||||
// ARM has register banks
|
||||
|
|
|
@ -491,7 +491,6 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame)
|
|||
TrapFrame,
|
||||
KiGetPreviousMode(TrapFrame),
|
||||
TRUE);
|
||||
|
||||
//
|
||||
// TODO
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue