- /* Copy the TrapFrame only up to Eflags and zero the rest*/
- RtlCopyMemory(&KdbTrapFrame->Tf, TrapFrame, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
- RtlZeroMemory((PVOID)((ULONG_PTR)&KdbTrapFrame->Tf + FIELD_OFFSET(KTRAP_FRAME, HardwareEsp)),
- sizeof(KTRAP_FRAME) - FIELD_OFFSET(KTRAP_FRAME, HardwareEsp));
-
- KdbTrapFrame->Cr0 = __readcr0();
- KdbTrapFrame->Cr2 = __readcr2();
- KdbTrapFrame->Cr3 = __readcr3();
- KdbTrapFrame->Cr4 = __readcr4();
-
- KdbTrapFrame->Tf.HardwareEsp = KiEspFromTrapFrame(TrapFrame);
- KdbTrapFrame->Tf.HardwareSegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
-
-
- /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+ if (Context)
+ {
+ KdbTrapFrame->Tf = *Context;
+ }
+ else
+ {
+ ASSERT(TrapFrame);
+
+ RtlZeroMemory(KdbTrapFrame, sizeof(KDB_KTRAP_FRAME));
+ KdbTrapFrame->Tf.Dr0 = TrapFrame->Dr0;
+ KdbTrapFrame->Tf.Dr1 = TrapFrame->Dr1;
+ KdbTrapFrame->Tf.Dr2 = TrapFrame->Dr2;
+ KdbTrapFrame->Tf.Dr3 = TrapFrame->Dr3;
+ KdbTrapFrame->Tf.Dr6 = TrapFrame->Dr6;
+ KdbTrapFrame->Tf.Dr7 = TrapFrame->Dr7;
+ KdbTrapFrame->Tf.SegGs = TrapFrame->SegGs;
+ KdbTrapFrame->Tf.SegEs = TrapFrame->SegEs;
+ KdbTrapFrame->Tf.SegDs = TrapFrame->SegDs;
+ KdbTrapFrame->Tf.Edx = TrapFrame->Edx;
+ KdbTrapFrame->Tf.Ecx = TrapFrame->Ecx;
+ KdbTrapFrame->Tf.Eax = TrapFrame->Eax;
+ KdbTrapFrame->Tf.SegFs = TrapFrame->SegFs;
+ KdbTrapFrame->Tf.Edi = TrapFrame->Edi;
+ KdbTrapFrame->Tf.Esi = TrapFrame->Esi;
+ KdbTrapFrame->Tf.Ebx = TrapFrame->Ebx;
+ KdbTrapFrame->Tf.Ebp = TrapFrame->Ebp;
+ KdbTrapFrame->Tf.Eip = TrapFrame->Eip;
+ KdbTrapFrame->Tf.SegCs = TrapFrame->SegCs;
+ KdbTrapFrame->Tf.EFlags = TrapFrame->EFlags;
+ KdbTrapFrame->Tf.Esp = KiEspFromTrapFrame(TrapFrame);
+ KdbTrapFrame->Tf.SegSs = (USHORT)(KiSsFromTrapFrame(TrapFrame) & 0xFFFF);
+
+ KdbTrapFrame->Cr0 = __readcr0();
+ KdbTrapFrame->Cr2 = __readcr2();
+ KdbTrapFrame->Cr3 = __readcr3();
+ KdbTrapFrame->Cr4 = __readcr4();
+
+ /* FIXME: copy v86 registers if TrapFrame is a V86 trapframe */
+ }