- Implement KdpWriteControlSpace.
authorAlex Ionescu <aionescu@gmail.com>
Tue, 20 Feb 2007 04:38:01 +0000 (04:38 +0000)
committerAlex Ionescu <aionescu@gmail.com>
Tue, 20 Feb 2007 04:38:01 +0000 (04:38 +0000)
- Fix a bug in KdpSetContext.
- Use DR_MASK and DR7_OVERRIDE_V in KiUpdateDr7, KiRecordDr7 instead of DR_ACTIVE_MASK.
- We now get DbgKdContinueApi2 from WinDBG meaning that the first phase of KD communication is almost over!

svn path=/branches/alex-kd-branch/; revision=25854

reactos/include/ndk/asm.h
reactos/ntoskrnl/kd64/kdapi.c
reactos/ntoskrnl/kd64/kdtrap.c
reactos/ntoskrnl/ke/i386/exp.c

index 55c96ea..8cfa597 100644 (file)
@@ -494,6 +494,7 @@ Author:
 #define DR6_LEGAL                               0xE00F
 #define DR7_LEGAL                               0xFFFF0155
 #define DR7_ACTIVE                              0x55
+#define DR7_OVERRIDE_V                          0x04
 #define DR7_RESERVED_MASK                       0xDC00
 #define DR7_OVERRIDE_MASK                       0xF0000
 
index 87945df..d69bb22 100644 (file)
@@ -240,6 +240,55 @@ KdpReadControlSpace(IN PDBGKD_MANIPULATE_STATE64 State,
                  &KdpContext);\r
 }\r
 \r
+VOID\r
+NTAPI\r
+KdpWriteControlSpace(IN PDBGKD_MANIPULATE_STATE64 State,\r
+                     IN PSTRING Data,\r
+                     IN PCONTEXT Context)\r
+{\r
+    PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;\r
+    STRING Header;\r
+    ULONG Length;\r
+    PVOID ControlStart;\r
+\r
+    /* Setup the header */\r
+    Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
+    Header.Buffer = (PCHAR)State;\r
+\r
+    /* Make sure that this is a valid request */\r
+    Length = WriteMemory->TransferCount;\r
+    if ((((ULONG)WriteMemory->TargetBaseAddress + Length) <=\r
+          sizeof(KPROCESSOR_STATE)) &&\r
+        (State->Processor < KeNumberProcessors))\r
+    {\r
+        /* Set the proper address */\r
+        ControlStart = (PVOID)((ULONG_PTR)WriteMemory->TargetBaseAddress +\r
+                               (ULONG_PTR)&KiProcessorBlock[State->Processor]->\r
+                                           ProcessorState);\r
+\r
+        /* Copy the memory */\r
+        RtlCopyMemory(ControlStart, Data->Buffer, Data->Length);\r
+        Length = Data->Length;\r
+\r
+        /* Finish up */\r
+        State->ReturnStatus = STATUS_SUCCESS;\r
+        WriteMemory->ActualBytesWritten = Length;\r
+    }\r
+    else\r
+    {\r
+        /* Invalid request */\r
+        Data->Length = 0;\r
+        State->ReturnStatus = STATUS_UNSUCCESSFUL;\r
+        WriteMemory->ActualBytesWritten = 0;\r
+    }\r
+\r
+    /* Send the reply */\r
+    KdSendPacket(PACKET_TYPE_KD_STATE_MANIPULATE,\r
+                 &Header,\r
+                 Data,\r
+                 &KdpContext);\r
+}\r
+\r
 VOID\r
 NTAPI\r
 KdpRestoreBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State,\r
@@ -335,7 +384,7 @@ KdpSetContext(IN PDBGKD_MANIPULATE_STATE64 State,
     /* Setup the header */\r
     Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);\r
     Header.Buffer = (PCHAR)State;\r
-    ASSERT(Data->Length == 0);\r
+    ASSERT(Data->Length == sizeof(CONTEXT));\r
 \r
     /* Make sure that this is a valid request */\r
     if (State->Processor < KeNumberProcessors)\r
@@ -472,8 +521,7 @@ SendPacket:
             case DbgKdWriteControlSpaceApi:\r
 \r
                 /* FIXME: TODO */\r
-                Ke386SetCr2(DbgKdWriteControlSpaceApi);\r
-                while (TRUE);\r
+                KdpWriteControlSpace(&ManipulateState, &Data, Context);\r
                 break;\r
 \r
             case DbgKdReadIoSpaceApi:\r
index e4502a6..51b090e 100644 (file)
@@ -49,7 +49,6 @@ KdpReport(IN PKTRAP_FRAME TrapFrame,
     }\r
 \r
     /* Enter the debugger */\r
-    while (TRUE);\r
     Entered = KdEnterDebugger(TrapFrame, ExceptionFrame);\r
 \r
     /*\r
@@ -63,6 +62,7 @@ KdpReport(IN PKTRAP_FRAME TrapFrame,
                   sizeof(CONTEXT));\r
 \r
     /* Report the new state */\r
+    Ke386SetCr2(TrapFrame->HardwareEsp);\r
 #if 0\r
     Status = KdpReportExceptionStateChange(ExceptionRecord,\r
                                            &Prcb->ProcessorState.\r
index bf10539..27bfb89 100644 (file)
@@ -90,7 +90,7 @@ KiUpdateDr7(IN ULONG Dr7)
     ULONG DebugMask = KeGetCurrentThread()->DispatcherHeader.DebugActive;
 
     /* Check if debugging is enabled */
-    if (DebugMask & DR_ACTIVE_MASK)
+    if (DebugMask & DR_MASK(DR7_OVERRIDE_V))
     {
         /* Sanity checks */
         ASSERT((DebugMask & DR_REG_MASK) != 0);
@@ -133,11 +133,11 @@ KiRecordDr7(OUT PULONG Dr7Ptr,
         Result = FALSE;
 
         /* Check the DR mask */
-        NewMask &= 0x7F;
+        NewMask &= ~(DR_MASK(7));
         if (NewMask & DR_REG_MASK)
         {
             /* Set the active mask */
-            NewMask |= DR_ACTIVE_MASK;
+            NewMask |= DR_MASK(DR7_OVERRIDE_V);
 
             /* Set DR7 override */
             *DrMask = DR7_OVERRIDE_MASK;
@@ -154,8 +154,8 @@ KiRecordDr7(OUT PULONG Dr7Ptr,
         Result = NewMask ? TRUE: FALSE;
 
         /* Update the mask to disable debugging */
-        NewMask &= ~DR_ACTIVE_MASK;
-        NewMask |= 0x80;
+        NewMask &= ~(DR_MASK(DR7_OVERRIDE_V));
+        NewMask |= DR_MASK(7);
     }
 
     /* Check if caller wants the new mask */