2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/kd64/amd64/kdx64.c
5 * PURPOSE: KD support routines for AMD64
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
9 /* INCLUDES *****************************************************************/
16 #define UNIMPLEMENTED KdpDprintf("%s is unimplemented\n", __FUNCTION__)
18 /* FUNCTIONS *****************************************************************/
22 KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State
,
28 /* Check for success */
29 if (NT_SUCCESS(State
->u
.Continue2
.ContinueStatus
))
31 /* Check if we're tracing */
32 if (State
->u
.Continue2
.ControlSet
.TraceFlag
)
35 Context
->EFlags
|= EFLAGS_TF
;
40 Context
->EFlags
&= ~EFLAGS_TF
;
43 /* Loop all processors */
44 for (i
= 0; i
< KeNumberProcessors
; i
++)
46 /* Get the PRCB and update DR7 and DR6 */
47 Prcb
= KiProcessorBlock
[i
];
48 Prcb
->ProcessorState
.SpecialRegisters
.KernelDr7
=
49 State
->u
.Continue2
.ControlSet
.Dr7
;
50 Prcb
->ProcessorState
.SpecialRegisters
.KernelDr6
= 0;
53 /* Check if we have new symbol information */
54 if (State
->u
.Continue2
.ControlSet
.CurrentSymbolStart
!= 1)
57 KdpCurrentSymbolStart
=
58 State
->u
.Continue2
.ControlSet
.CurrentSymbolStart
;
59 KdpCurrentSymbolEnd
= State
->u
.Continue2
.ControlSet
.CurrentSymbolEnd
;
66 KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange
,
69 PKPRCB Prcb
= KeGetCurrentPrcb();
71 /* Copy i386 specific debug registers */
72 WaitStateChange
->ControlReport
.Dr6
= Prcb
->ProcessorState
.SpecialRegisters
.
74 WaitStateChange
->ControlReport
.Dr7
= Prcb
->ProcessorState
.SpecialRegisters
.
77 /* Copy i386 specific segments */
78 WaitStateChange
->ControlReport
.SegCs
= (USHORT
)Context
->SegCs
;
79 WaitStateChange
->ControlReport
.SegDs
= (USHORT
)Context
->SegDs
;
80 WaitStateChange
->ControlReport
.SegEs
= (USHORT
)Context
->SegEs
;
81 WaitStateChange
->ControlReport
.SegFs
= (USHORT
)Context
->SegFs
;
84 WaitStateChange
->ControlReport
.EFlags
= Context
->EFlags
;
86 /* Set Report Flags */
87 WaitStateChange
->ControlReport
.ReportFlags
= REPORT_INCLUDES_SEGS
;
88 if (WaitStateChange
->ControlReport
.SegCs
== KGDT64_R0_CODE
)
90 WaitStateChange
->ControlReport
.ReportFlags
|= REPORT_STANDARD_CS
;
96 KdpSysReadMsr(IN ULONG Msr
,
97 OUT PLARGE_INTEGER MsrValue
)
99 /* Use SEH to protect from invalid MSRs */
102 MsrValue
->QuadPart
= __readmsr(Msr
);
104 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
106 _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE
);
110 return STATUS_SUCCESS
;
115 KdpSysWriteMsr(IN ULONG Msr
,
116 IN PLARGE_INTEGER MsrValue
)
118 /* Use SEH to protect from invalid MSRs */
121 __writemsr(Msr
, MsrValue
->QuadPart
);
123 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
125 _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE
);
129 return STATUS_SUCCESS
;
134 KdpSysReadBusData(IN ULONG BusDataType
,
140 OUT PULONG ActualLength
)
142 UNIMPLEMENTED_DBGBREAK();
143 return STATUS_UNSUCCESSFUL
;
148 KdpSysWriteBusData(IN ULONG BusDataType
,
154 OUT PULONG ActualLength
)
156 UNIMPLEMENTED_DBGBREAK();
157 return STATUS_UNSUCCESSFUL
;
162 KdpSysReadControlSpace(IN ULONG Processor
,
163 IN ULONG64 BaseAddress
,
166 OUT PULONG ActualLength
)
169 PKPRCB Prcb
= KiProcessorBlock
[Processor
];
170 PKIPCR Pcr
= CONTAINING_RECORD(Prcb
, KIPCR
, Prcb
);
174 case AMD64_DEBUG_CONTROL_SPACE_KPCR
:
175 /* Copy a pointer to the Pcr */
177 *ActualLength
= sizeof(PVOID
);
180 case AMD64_DEBUG_CONTROL_SPACE_KPRCB
:
181 /* Copy a pointer to the Prcb */
182 ControlStart
= &Prcb
;
183 *ActualLength
= sizeof(PVOID
);
186 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL
:
187 /* Copy SpecialRegisters */
188 ControlStart
= &Prcb
->ProcessorState
.SpecialRegisters
;
189 *ActualLength
= sizeof(KSPECIAL_REGISTERS
);
192 case AMD64_DEBUG_CONTROL_SPACE_KTHREAD
:
193 /* Copy a pointer to the current Thread */
194 ControlStart
= &Prcb
->CurrentThread
;
195 *ActualLength
= sizeof(PVOID
);
201 return STATUS_UNSUCCESSFUL
;
204 /* Copy the memory */
205 RtlCopyMemory(Buffer
, ControlStart
, min(Length
, *ActualLength
));
208 return STATUS_SUCCESS
;
213 KdpSysWriteControlSpace(IN ULONG Processor
,
214 IN ULONG64 BaseAddress
,
217 OUT PULONG ActualLength
)
220 PKPRCB Prcb
= KiProcessorBlock
[Processor
];
224 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL
:
225 /* Copy SpecialRegisters */
226 ControlStart
= &Prcb
->ProcessorState
.SpecialRegisters
;
227 *ActualLength
= sizeof(KSPECIAL_REGISTERS
);
233 return STATUS_UNSUCCESSFUL
;
236 /* Copy the memory */
237 RtlCopyMemory(ControlStart
, Buffer
, min(Length
, *ActualLength
));
239 return STATUS_SUCCESS
;
244 KdpSysReadIoSpace(IN ULONG InterfaceType
,
246 IN ULONG AddressSpace
,
247 IN ULONG64 IoAddress
,
250 OUT PULONG ActualDataSize
)
252 /* Verify parameters */
253 if (InterfaceType
!= Isa
|| BusNumber
!= 0 || AddressSpace
!= 1)
255 /* No data was read */
257 return STATUS_INVALID_PARAMETER
;
260 /* Check for correct alignment */
261 if ((IoAddress
& (DataSize
- 1)))
263 /* Invalid alignment */
265 return STATUS_DATATYPE_MISALIGNMENT
;
272 *(PUCHAR
)DataValue
= READ_PORT_UCHAR((PUCHAR
)IoAddress
);
276 /* Read one USHORT */
277 *(PUSHORT
)DataValue
= READ_PORT_USHORT((PUSHORT
)IoAddress
);
282 *(PULONG
)DataValue
= READ_PORT_ULONG((PULONG
)IoAddress
);
286 /* Invalid data size */
288 return STATUS_INVALID_PARAMETER
;
291 /* Return the size of the data */
292 *ActualDataSize
= DataSize
;
295 return STATUS_SUCCESS
;
300 KdpSysWriteIoSpace(IN ULONG InterfaceType
,
302 IN ULONG AddressSpace
,
303 IN ULONG64 IoAddress
,
306 OUT PULONG ActualDataSize
)
308 /* Verify parameters */
309 if (InterfaceType
!= Isa
|| BusNumber
!= 0 || AddressSpace
!= 1)
311 /* No data was written */
313 return STATUS_INVALID_PARAMETER
;
316 /* Check for correct alignment */
317 if ((IoAddress
& (DataSize
- 1)))
319 /* Invalid alignment */
321 return STATUS_DATATYPE_MISALIGNMENT
;
327 /* Write one UCHAR */
328 WRITE_PORT_UCHAR((PUCHAR
)IoAddress
, *(PUCHAR
)DataValue
);
332 /* Write one USHORT */
333 WRITE_PORT_USHORT((PUSHORT
)IoAddress
, *(PUSHORT
)DataValue
);
337 /* Write one ULONG */
338 WRITE_PORT_ULONG((PULONG
)IoAddress
, *(PULONG
)DataValue
);
342 /* Invalid data size */
344 return STATUS_INVALID_PARAMETER
;
347 /* Return the size of the data */
348 *ActualDataSize
= DataSize
;
351 return STATUS_SUCCESS
;
356 KdpSysCheckLowMemory(IN ULONG Flags
)
358 UNIMPLEMENTED_DBGBREAK();
359 return STATUS_UNSUCCESSFUL
;
364 KdpAllowDisable(VOID
)
366 UNIMPLEMENTED_DBGBREAK();
367 return STATUS_ACCESS_DENIED
;