Merge trunk head (r43756)
[reactos.git] / reactos / ntoskrnl / kd64 / amd64 / kdsup.c
index 2a3dcac..c8119d9 100644 (file)
@@ -71,7 +71,7 @@ KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State,
 
 VOID
 NTAPI
 
 VOID
 NTAPI
-KdpSetContextState(IN PDBGKD_WAIT_STATE_CHANGE64 WaitStateChange,
+KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
                    IN PCONTEXT Context)
 {
     PKPRCB Prcb = KeGetCurrentPrcb();
                    IN PCONTEXT Context)
 {
     PKPRCB Prcb = KeGetCurrentPrcb();
@@ -142,8 +142,8 @@ NTAPI
 KdpSysReadBusData(IN ULONG BusDataType,
                   IN ULONG BusNumber,
                   IN ULONG SlotNumber,
 KdpSysReadBusData(IN ULONG BusDataType,
                   IN ULONG BusNumber,
                   IN ULONG SlotNumber,
-                  IN PVOID Buffer,
                   IN ULONG Offset,
                   IN ULONG Offset,
+                  IN PVOID Buffer,
                   IN ULONG Length,
                   OUT PULONG ActualLength)
 {
                   IN ULONG Length,
                   OUT PULONG ActualLength)
 {
@@ -157,8 +157,8 @@ NTAPI
 KdpSysWriteBusData(IN ULONG BusDataType,
                    IN ULONG BusNumber,
                    IN ULONG SlotNumber,
 KdpSysWriteBusData(IN ULONG BusDataType,
                    IN ULONG BusNumber,
                    IN ULONG SlotNumber,
-                   IN PVOID Buffer,
                    IN ULONG Offset,
                    IN ULONG Offset,
+                   IN PVOID Buffer,
                    IN ULONG Length,
                    OUT PULONG ActualLength)
 {
                    IN ULONG Length,
                    OUT PULONG ActualLength)
 {
@@ -176,61 +176,46 @@ KdpSysReadControlSpace(IN ULONG Processor,
                        OUT PULONG ActualLength)
 {
     PVOID ControlStart;
                        OUT PULONG ActualLength)
 {
     PVOID ControlStart;
-    ULONG RealLength;
+    PKPRCB Prcb = KiProcessorBlock[Processor];
+    PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb);
 
 
-    if ((ULONG)BaseAddress <= 2)
+    switch (BaseAddress)
     {
     {
-        PKPRCB Prcb = KiProcessorBlock[Processor];
-        PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb);
+        case AMD64_DEBUG_CONTROL_SPACE_KPCR:
+            /* Copy a pointer to the Pcr */
+            ControlStart = &Pcr;
+            *ActualLength = sizeof(PVOID);
+            break;
 
 
-        switch ((ULONG_PTR)BaseAddress)
-        {
-            case AMD64_DEBUG_CONTROL_SPACE_KPCR:
-                /* Copy a pointer to the Pcr */
-                ControlStart = &Pcr;
-                RealLength = sizeof(PVOID);
-                break;
-
-            case AMD64_DEBUG_CONTROL_SPACE_KPRCB:
-                /* Copy a pointer to the Prcb */
-                ControlStart = &Prcb;
-                RealLength = sizeof(PVOID);
-                break;
-
-            case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL:
-                /* Copy SpecialRegisters */
-                ControlStart = &Prcb->ProcessorState.SpecialRegisters;
-                RealLength = sizeof(KSPECIAL_REGISTERS);
-                break;
-
-            case AMD64_DEBUG_CONTROL_SPACE_KTHREAD:
-                /* Copy a pointer to the current Thread */
-                ControlStart = &Prcb->CurrentThread;
-                RealLength = sizeof(PVOID);
-                break;
-
-            default:
-                RealLength = 0;
-                ControlStart = NULL;
-                ASSERT(FALSE);
-                return STATUS_UNSUCCESSFUL;
-        }
+        case AMD64_DEBUG_CONTROL_SPACE_KPRCB:
+            /* Copy a pointer to the Prcb */
+            ControlStart = &Prcb;
+            *ActualLength = sizeof(PVOID);
+            break;
 
 
-        if (RealLength < Length) Length = RealLength;
+        case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL:
+            /* Copy SpecialRegisters */
+            ControlStart = &Prcb->ProcessorState.SpecialRegisters;
+            *ActualLength = sizeof(KSPECIAL_REGISTERS);
+            break;
 
 
-        /* Copy the memory */
-        RtlCopyMemory(Buffer, ControlStart, Length);
-        *ActualLength = Length;
+        case AMD64_DEBUG_CONTROL_SPACE_KTHREAD:
+            /* Copy a pointer to the current Thread */
+            ControlStart = &Prcb->CurrentThread;
+            *ActualLength = sizeof(PVOID);
+            break;
 
 
-        /* Finish up */
-        return STATUS_SUCCESS;
-    }
-    else
-    {
-        /* Invalid request */
-        *ActualLength = 0;
-        return STATUS_UNSUCCESSFUL;
+        default:
+            *ActualLength = 0;
+            ASSERT(FALSE);
+            return STATUS_UNSUCCESSFUL;
     }
     }
+
+    /* Copy the memory */
+    RtlCopyMemory(Buffer, ControlStart, min(Length, *ActualLength));
+
+    /* Finish up */
+    return STATUS_SUCCESS;
 }
 
 NTSTATUS
 }
 
 NTSTATUS
@@ -264,10 +249,18 @@ KdpSysReadIoSpace(IN ULONG InterfaceType,
         return STATUS_INVALID_PARAMETER;
     }
 
         return STATUS_INVALID_PARAMETER;
     }
 
+    /* Check for correct alignment */
+    if ((IoAddress & (DataSize - 1)))
+    {
+        /* Invalid alignment */
+        *ActualDataSize = 0;
+        return STATUS_DATATYPE_MISALIGNMENT;
+    }
+
     switch (DataSize)
     {
         case sizeof(UCHAR):
     switch (DataSize)
     {
         case sizeof(UCHAR):
-            /* read one UCHAR */
+            /* Read one UCHAR */
             *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress);
             break;
 
             *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress);
             break;
 
@@ -284,7 +277,7 @@ KdpSysReadIoSpace(IN ULONG InterfaceType,
         default:
             /* Invalid data size */
              *ActualDataSize = 0;
         default:
             /* Invalid data size */
              *ActualDataSize = 0;
-            return STATUS_UNSUCCESSFUL;
+            return STATUS_INVALID_PARAMETER;
     }
 
     /* Return the size of the data */
     }
 
     /* Return the size of the data */
@@ -313,27 +306,35 @@ KdpSysWriteIoSpace(IN ULONG InterfaceType,
         return STATUS_INVALID_PARAMETER;
     }
 
         return STATUS_INVALID_PARAMETER;
     }
 
+    /* Check for correct alignment */
+    if ((IoAddress & (DataSize - 1)))
+    {
+        /* Invalid alignment */
+        *ActualDataSize = 0;
+        return STATUS_DATATYPE_MISALIGNMENT;
+    }
+
     switch (DataSize)
     {
         case sizeof(UCHAR):
     switch (DataSize)
     {
         case sizeof(UCHAR):
-            /* read one UCHAR */
+            /* Write one UCHAR */
             WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue);
             break;
 
         case sizeof(USHORT):
             WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue);
             break;
 
         case sizeof(USHORT):
-            /* Read one USHORT */
+            /* Write one USHORT */
             WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue);
             break;
 
         case sizeof(ULONG):
             WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue);
             break;
 
         case sizeof(ULONG):
-            /* Read one ULONG */
+            /* Write one ULONG */
             WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue);
             break;
 
         default:
             /* Invalid data size */
              *ActualDataSize = 0;
             WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue);
             break;
 
         default:
             /* Invalid data size */
              *ActualDataSize = 0;
-            return STATUS_UNSUCCESSFUL;
+            return STATUS_INVALID_PARAMETER;
     }
 
     /* Return the size of the data */
     }
 
     /* Return the size of the data */