Author: tkreuzer
Date: Tue Aug 30 14:43:11 2011
New Revision: 53498
URL:
http://svn.reactos.org/svn/reactos?rev=53498&view=rev
Log:
[NTOSKRNL]
Update amd64 kd64 from ros-amd64-bringup
Modified:
trunk/reactos/include/reactos/windbgkd.h
trunk/reactos/ntoskrnl/kd64/amd64/kdx64.c
Modified: trunk/reactos/include/reactos/windbgkd.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/windbgkd.h…
==============================================================================
--- trunk/reactos/include/reactos/windbgkd.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/windbgkd.h [iso-8859-1] Tue Aug 30 14:43:11 2011
@@ -195,6 +195,15 @@
#define DBGKD_PARTITION_ALTERNATE 0x01
//
+// AMD64 Control Space types
+//
+#define AMD64_DEBUG_CONTROL_SPACE_KPCR 0
+#define AMD64_DEBUG_CONTROL_SPACE_KPRCB 1
+#define AMD64_DEBUG_CONTROL_SPACE_KSPECIAL 2
+#define AMD64_DEBUG_CONTROL_SPACE_KTHREAD 3
+
+
+//
// KD Packet Structure
//
typedef struct _KD_PACKET
Modified: trunk/reactos/ntoskrnl/kd64/amd64/kdx64.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kd64/amd64/kdx64.…
==============================================================================
--- trunk/reactos/ntoskrnl/kd64/amd64/kdx64.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kd64/amd64/kdx64.c [iso-8859-1] Tue Aug 30 14:43:11 2011
@@ -22,8 +22,43 @@
KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State,
IN PCONTEXT Context)
{
- UNIMPLEMENTED;
- while (TRUE);
+ PKPRCB Prcb;
+ ULONG i;
+
+ /* Check for success */
+ if (NT_SUCCESS(State->u.Continue2.ContinueStatus))
+ {
+ /* Check if we're tracing */
+ if (State->u.Continue2.ControlSet.TraceFlag)
+ {
+ /* Enable TF */
+ Context->EFlags |= EFLAGS_TF;
+ }
+ else
+ {
+ /* Remove it */
+ Context->EFlags &= ~EFLAGS_TF;
+ }
+
+ /* Loop all processors */
+ for (i = 0; i < KeNumberProcessors; i++)
+ {
+ /* Get the PRCB and update DR7 and DR6 */
+ Prcb = KiProcessorBlock[i];
+ Prcb->ProcessorState.SpecialRegisters.KernelDr7 =
+ State->u.Continue2.ControlSet.Dr7;
+ Prcb->ProcessorState.SpecialRegisters.KernelDr6 = 0;
+ }
+
+ /* Check if we have new symbol information */
+ if (State->u.Continue2.ControlSet.CurrentSymbolStart != 1)
+ {
+ /* Update it */
+ KdpCurrentSymbolStart =
+ State->u.Continue2.ControlSet.CurrentSymbolStart;
+ KdpCurrentSymbolEnd= State->u.Continue2.ControlSet.CurrentSymbolEnd;
+ }
+ }
}
VOID
@@ -31,8 +66,29 @@
KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
IN PCONTEXT Context)
{
- UNIMPLEMENTED;
- while (TRUE);
+ PKPRCB Prcb = KeGetCurrentPrcb();
+
+ /* Copy i386 specific debug registers */
+ WaitStateChange->ControlReport.Dr6 = Prcb->ProcessorState.SpecialRegisters.
+ KernelDr6;
+ WaitStateChange->ControlReport.Dr7 = Prcb->ProcessorState.SpecialRegisters.
+ KernelDr7;
+
+ /* Copy i386 specific segments */
+ WaitStateChange->ControlReport.SegCs = (USHORT)Context->SegCs;
+ WaitStateChange->ControlReport.SegDs = (USHORT)Context->SegDs;
+ WaitStateChange->ControlReport.SegEs = (USHORT)Context->SegEs;
+ WaitStateChange->ControlReport.SegFs = (USHORT)Context->SegFs;
+
+ /* Copy EFlags */
+ WaitStateChange->ControlReport.EFlags = Context->EFlags;
+
+ /* Set Report Flags */
+ WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS;
+ if (WaitStateChange->ControlReport.SegCs == KGDT64_R0_CODE)
+ {
+ WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS;
+ }
}
NTSTATUS
@@ -40,9 +96,18 @@
KdpSysReadMsr(IN ULONG Msr,
OUT PLARGE_INTEGER MsrValue)
{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
+ /* Use SEH to protect from invalid MSRs */
+ _SEH2_TRY
+ {
+ MsrValue->QuadPart = __readmsr(Msr);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE);
+ }
+ _SEH2_END
+
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -50,9 +115,18 @@
KdpSysWriteMsr(IN ULONG Msr,
IN PLARGE_INTEGER MsrValue)
{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
+ /* Use SEH to protect from invalid MSRs */
+ _SEH2_TRY
+ {
+ __writemsr(Msr, MsrValue->QuadPart);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE);
+ }
+ _SEH2_END
+
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -93,9 +167,47 @@
IN ULONG Length,
OUT PULONG ActualLength)
{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
+ PVOID ControlStart;
+ PKPRCB Prcb = KiProcessorBlock[Processor];
+ PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb);
+
+ switch (BaseAddress)
+ {
+ case AMD64_DEBUG_CONTROL_SPACE_KPCR:
+ /* Copy a pointer to the Pcr */
+ ControlStart = &Pcr;
+ *ActualLength = sizeof(PVOID);
+ break;
+
+ case AMD64_DEBUG_CONTROL_SPACE_KPRCB:
+ /* Copy a pointer to the Prcb */
+ ControlStart = &Prcb;
+ *ActualLength = sizeof(PVOID);
+ break;
+
+ case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL:
+ /* Copy SpecialRegisters */
+ ControlStart = &Prcb->ProcessorState.SpecialRegisters;
+ *ActualLength = sizeof(KSPECIAL_REGISTERS);
+ break;
+
+ case AMD64_DEBUG_CONTROL_SPACE_KTHREAD:
+ /* Copy a pointer to the current Thread */
+ ControlStart = &Prcb->CurrentThread;
+ *ActualLength = sizeof(PVOID);
+ break;
+
+ default:
+ *ActualLength = 0;
+ ASSERT(FALSE);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Copy the memory */
+ RtlCopyMemory(Buffer, ControlStart, min(Length, *ActualLength));
+
+ /* Finish up */
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -106,9 +218,27 @@
IN ULONG Length,
OUT PULONG ActualLength)
{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
+ PVOID ControlStart;
+ PKPRCB Prcb = KiProcessorBlock[Processor];
+
+ switch (BaseAddress)
+ {
+ case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL:
+ /* Copy SpecialRegisters */
+ ControlStart = &Prcb->ProcessorState.SpecialRegisters;
+ *ActualLength = sizeof(KSPECIAL_REGISTERS);
+ break;
+
+ default:
+ *ActualLength = 0;
+ ASSERT(FALSE);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Copy the memory */
+ RtlCopyMemory(ControlStart, Buffer, min(Length, *ActualLength));
+
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -117,13 +247,54 @@
IN ULONG BusNumber,
IN ULONG AddressSpace,
IN ULONG64 IoAddress,
- IN PVOID DataValue,
+ OUT PVOID DataValue,
IN ULONG DataSize,
OUT PULONG ActualDataSize)
{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
+ /* Verify parameters */
+ if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1)
+ {
+ /* No data was read */
+ *ActualDataSize = 0;
+ 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):
+ /* Read one UCHAR */
+ *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress);
+ break;
+
+ case sizeof(USHORT):
+ /* Read one USHORT */
+ *(PUSHORT)DataValue = READ_PORT_USHORT((PUSHORT)IoAddress);
+ break;
+
+ case sizeof(ULONG):
+ /* Read one ULONG */
+ *(PULONG)DataValue = READ_PORT_ULONG((PULONG)IoAddress);
+ break;
+
+ default:
+ /* Invalid data size */
+ *ActualDataSize = 0;
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Return the size of the data */
+ *ActualDataSize = DataSize;
+
+ /* Success! */
+ return STATUS_SUCCESS;
}
NTSTATUS
@@ -136,6 +307,56 @@
IN ULONG DataSize,
OUT PULONG ActualDataSize)
{
+ /* Verify parameters */
+ if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1)
+ {
+ /* No data was written */
+ *ActualDataSize = 0;
+ 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):
+ /* Write one UCHAR */
+ WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue);
+ break;
+
+ case sizeof(USHORT):
+ /* Write one USHORT */
+ WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue);
+ break;
+
+ case sizeof(ULONG):
+ /* Write one ULONG */
+ WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue);
+ break;
+
+ default:
+ /* Invalid data size */
+ *ActualDataSize = 0;
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Return the size of the data */
+ *ActualDataSize = DataSize;
+
+ /* Success! */
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+KdpSysCheckLowMemory(IN ULONG Flags)
+{
UNIMPLEMENTED;
while (TRUE);
return STATUS_UNSUCCESSFUL;
@@ -143,15 +364,6 @@
NTSTATUS
NTAPI
-KdpSysCheckLowMemory(IN ULONG Flags)
-{
- UNIMPLEMENTED;
- while (TRUE);
- return STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS
-NTAPI
KdpAllowDisable(VOID)
{
UNIMPLEMENTED;