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
== KGDT_64_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
)
144 return STATUS_UNSUCCESSFUL
;
149 KdpSysWriteBusData(IN ULONG BusDataType
,
155 OUT PULONG ActualLength
)
159 return STATUS_UNSUCCESSFUL
;
164 KdpSysReadControlSpace(IN ULONG Processor
,
165 IN ULONG64 BaseAddress
,
168 OUT PULONG ActualLength
)
171 PKPRCB Prcb
= KiProcessorBlock
[Processor
];
172 PKIPCR Pcr
= CONTAINING_RECORD(Prcb
, KIPCR
, Prcb
);
176 case AMD64_DEBUG_CONTROL_SPACE_KPCR
:
177 /* Copy a pointer to the Pcr */
179 *ActualLength
= sizeof(PVOID
);
182 case AMD64_DEBUG_CONTROL_SPACE_KPRCB
:
183 /* Copy a pointer to the Prcb */
184 ControlStart
= &Prcb
;
185 *ActualLength
= sizeof(PVOID
);
188 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL
:
189 /* Copy SpecialRegisters */
190 ControlStart
= &Prcb
->ProcessorState
.SpecialRegisters
;
191 *ActualLength
= sizeof(KSPECIAL_REGISTERS
);
194 case AMD64_DEBUG_CONTROL_SPACE_KTHREAD
:
195 /* Copy a pointer to the current Thread */
196 ControlStart
= &Prcb
->CurrentThread
;
197 *ActualLength
= sizeof(PVOID
);
203 return STATUS_UNSUCCESSFUL
;
206 /* Copy the memory */
207 RtlCopyMemory(Buffer
, ControlStart
, min(Length
, *ActualLength
));
210 return STATUS_SUCCESS
;
215 KdpSysWriteControlSpace(IN ULONG Processor
,
216 IN ULONG64 BaseAddress
,
219 OUT PULONG ActualLength
)
222 PKPRCB Prcb
= KiProcessorBlock
[Processor
];
226 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL
:
227 /* Copy SpecialRegisters */
228 ControlStart
= &Prcb
->ProcessorState
.SpecialRegisters
;
229 *ActualLength
= sizeof(KSPECIAL_REGISTERS
);
235 return STATUS_UNSUCCESSFUL
;
238 /* Copy the memory */
239 RtlCopyMemory(ControlStart
, Buffer
, min(Length
, *ActualLength
));
241 return STATUS_SUCCESS
;
246 KdpSysReadIoSpace(IN ULONG InterfaceType
,
248 IN ULONG AddressSpace
,
249 IN ULONG64 IoAddress
,
252 OUT PULONG ActualDataSize
)
254 /* Verify parameters */
255 if (InterfaceType
!= Isa
|| BusNumber
!= 0 || AddressSpace
!= 1)
257 /* No data was read */
259 return STATUS_INVALID_PARAMETER
;
262 /* Check for correct alignment */
263 if ((IoAddress
& (DataSize
- 1)))
265 /* Invalid alignment */
267 return STATUS_DATATYPE_MISALIGNMENT
;
274 *(PUCHAR
)DataValue
= READ_PORT_UCHAR((PUCHAR
)IoAddress
);
278 /* Read one USHORT */
279 *(PUSHORT
)DataValue
= READ_PORT_USHORT((PUSHORT
)IoAddress
);
284 *(PULONG
)DataValue
= READ_PORT_ULONG((PULONG
)IoAddress
);
288 /* Invalid data size */
290 return STATUS_INVALID_PARAMETER
;
293 /* Return the size of the data */
294 *ActualDataSize
= DataSize
;
297 return STATUS_SUCCESS
;
302 KdpSysWriteIoSpace(IN ULONG InterfaceType
,
304 IN ULONG AddressSpace
,
305 IN ULONG64 IoAddress
,
308 OUT PULONG ActualDataSize
)
310 /* Verify parameters */
311 if (InterfaceType
!= Isa
|| BusNumber
!= 0 || AddressSpace
!= 1)
313 /* No data was written */
315 return STATUS_INVALID_PARAMETER
;
318 /* Check for correct alignment */
319 if ((IoAddress
& (DataSize
- 1)))
321 /* Invalid alignment */
323 return STATUS_DATATYPE_MISALIGNMENT
;
329 /* Write one UCHAR */
330 WRITE_PORT_UCHAR((PUCHAR
)IoAddress
, *(PUCHAR
)DataValue
);
334 /* Write one USHORT */
335 WRITE_PORT_USHORT((PUSHORT
)IoAddress
, *(PUSHORT
)DataValue
);
339 /* Write one ULONG */
340 WRITE_PORT_ULONG((PULONG
)IoAddress
, *(PULONG
)DataValue
);
344 /* Invalid data size */
346 return STATUS_INVALID_PARAMETER
;
349 /* Return the size of the data */
350 *ActualDataSize
= DataSize
;
353 return STATUS_SUCCESS
;
358 KdpSysCheckLowMemory(IN ULONG Flags
)
362 return STATUS_UNSUCCESSFUL
;
367 KdpAllowDisable(VOID
)
371 return STATUS_ACCESS_DENIED
;