ReactOS 0.4.15-dev-7953-g1f49173
kdx86.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for kdx86.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI KdpGetStateChange (IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
 
VOID NTAPI KdpSetContextState (IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange, IN PCONTEXT Context)
 
NTSTATUS NTAPI KdpSysReadMsr (IN ULONG Msr, OUT PLARGE_INTEGER MsrValue)
 
NTSTATUS NTAPI KdpSysWriteMsr (IN ULONG Msr, IN PLARGE_INTEGER MsrValue)
 
NTSTATUS NTAPI KdpSysReadBusData (IN ULONG BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length, OUT PULONG ActualLength)
 
NTSTATUS NTAPI KdpSysWriteBusData (IN ULONG BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN ULONG Offset, IN PVOID Buffer, IN ULONG Length, OUT PULONG ActualLength)
 
NTSTATUS NTAPI KdpSysReadControlSpace (IN ULONG Processor, IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Length, OUT PULONG ActualLength)
 
NTSTATUS NTAPI KdpSysWriteControlSpace (IN ULONG Processor, IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Length, OUT PULONG ActualLength)
 
NTSTATUS NTAPI KdpSysReadIoSpace (IN ULONG InterfaceType, IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, IN PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize)
 
NTSTATUS NTAPI KdpSysWriteIoSpace (IN ULONG InterfaceType, IN ULONG BusNumber, IN ULONG AddressSpace, IN ULONG64 IoAddress, IN PVOID DataValue, IN ULONG DataSize, OUT PULONG ActualDataSize)
 
NTSTATUS NTAPI KdpSysCheckLowMemory (IN ULONG Flags)
 
NTSTATUS NTAPI KdpAllowDisable (VOID)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file kdx86.c.

Function Documentation

◆ KdpAllowDisable()

NTSTATUS NTAPI KdpAllowDisable ( VOID  )

Definition at line 427 of file kdx86.c.

428{
429 LONG i;
430 ULONG Dr7;
431
432 /* Loop every processor */
433 for (i = 0; i < KeNumberProcessors; i++)
434 {
435 /* Get its DR7 */
437
438 /* Check if any processor breakpoints are active */
439 if (Dr7 != 0)
440 {
441 /* We can't allow running without a debugger then */
443 }
444 }
445
446 /* No processor breakpoints; allow disabling the debugger */
447 return STATUS_SUCCESS;
448}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
CCHAR KeNumberProcessors
Definition: krnlinit.c:35
PKPRCB KiProcessorBlock[]
Definition: krnlinit.c:32
long LONG
Definition: pedump.c:60
#define STATUS_SUCCESS
Definition: shellext.h:65
KPROCESSOR_STATE ProcessorState
Definition: ketypes.h:663
KSPECIAL_REGISTERS SpecialRegisters
Definition: ketypes.h:615
ULONG64 KernelDr7
Definition: ketypes.h:590
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145

Referenced by KdDisableDebuggerWithLock().

◆ KdpGetStateChange()

VOID NTAPI KdpGetStateChange ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PCONTEXT  Context 
)

Definition at line 20 of file kdx86.c.

22{
23 PKPRCB Prcb;
24 ULONG i;
25
26 /* Check for success */
27 if (NT_SUCCESS(State->u.Continue2.ContinueStatus))
28 {
29 /* Check if we're tracing */
30 if (State->u.Continue2.ControlSet.TraceFlag)
31 {
32 /* Enable TF */
33 Context->EFlags |= EFLAGS_TF;
34 }
35 else
36 {
37 /* Remove it */
38 Context->EFlags &= ~EFLAGS_TF;
39 }
40
41 /* Loop all processors */
42 for (i = 0; i < KeNumberProcessors; i++)
43 {
44 /* Get the PRCB and update DR7 and DR6 */
45 Prcb = KiProcessorBlock[i];
47 State->u.Continue2.ControlSet.Dr7;
49 }
50
51 /* Check if we have new symbol information */
52 if (State->u.Continue2.ControlSet.CurrentSymbolStart != 1)
53 {
54 /* Update it */
56 State->u.Continue2.ControlSet.CurrentSymbolStart;
57 KdpCurrentSymbolEnd= State->u.Continue2.ControlSet.CurrentSymbolEnd;
58 }
59 }
60}
#define EFLAGS_TF
Definition: SystemCall.c:10
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
ULONG_PTR KdpCurrentSymbolEnd
Definition: kd64.h:568
ULONG_PTR KdpCurrentSymbolStart
Definition: kddata.c:104
ULONG64 KernelDr6
Definition: ketypes.h:589

Referenced by KdpSendWaitContinue().

◆ KdpSetContextState()

VOID NTAPI KdpSetContextState ( IN PDBGKD_ANY_WAIT_STATE_CHANGE  WaitStateChange,
IN PCONTEXT  Context 
)

Definition at line 64 of file kdx86.c.

66{
67 PKPRCB Prcb = KeGetCurrentPrcb();
68
69 /* Copy i386 specific debug registers */
70 WaitStateChange->ControlReport.Dr6 = Prcb->ProcessorState.SpecialRegisters.
71 KernelDr6;
72 WaitStateChange->ControlReport.Dr7 = Prcb->ProcessorState.SpecialRegisters.
73 KernelDr7;
74
75 /* Copy i386 specific segments */
76 WaitStateChange->ControlReport.SegCs = (USHORT)Context->SegCs;
77 WaitStateChange->ControlReport.SegDs = (USHORT)Context->SegDs;
78 WaitStateChange->ControlReport.SegEs = (USHORT)Context->SegEs;
79 WaitStateChange->ControlReport.SegFs = (USHORT)Context->SegFs;
80
81 /* Copy EFlags */
82 WaitStateChange->ControlReport.EFlags = Context->EFlags;
83
84 /* Set Report Flags */
85 WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS;
86 if (WaitStateChange->ControlReport.SegCs == KGDT_R0_CODE)
87 {
88 WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS;
89 }
90}
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1161
#define KGDT_R0_CODE
Definition: ketypes.h:123
unsigned short USHORT
Definition: pedump.c:61
#define REPORT_INCLUDES_SEGS
Definition: windbgkd.h:147
#define REPORT_STANDARD_CS
Definition: windbgkd.h:148

Referenced by KdpReportCommandStringStateChange(), KdpReportExceptionStateChange(), and KdpReportLoadSymbolsStateChange().

◆ KdpSysCheckLowMemory()

NTSTATUS NTAPI KdpSysCheckLowMemory ( IN ULONG  Flags)

Definition at line 419 of file kdx86.c.

420{
421 /* Stubbed as we don't support PAE */
422 return STATUS_UNSUCCESSFUL;
423}
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by KdpCheckLowMemory().

◆ KdpSysReadBusData()

NTSTATUS NTAPI KdpSysReadBusData ( IN ULONG  BusDataType,
IN ULONG  BusNumber,
IN ULONG  SlotNumber,
IN ULONG  Offset,
IN PVOID  Buffer,
IN ULONG  Length,
OUT PULONG  ActualLength 
)

Definition at line 138 of file kdx86.c.

145{
146 /* Just forward to HAL */
147 *ActualLength = HalGetBusDataByOffset(BusDataType,
148 BusNumber,
150 Buffer,
151 Offset,
152 Length);
153
154 /* Return status */
155 return *ActualLength != 0 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
156}
Definition: bufpool.h:45
ULONG NTAPI HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:73
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_In_ WDFIORESREQLIST _In_ ULONG SlotNumber
Definition: wdfresource.h:68
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
Definition: halfuncs.h:160

Referenced by KdpGetBusData().

◆ KdpSysReadControlSpace()

NTSTATUS NTAPI KdpSysReadControlSpace ( IN ULONG  Processor,
IN ULONG64  BaseAddress,
IN PVOID  Buffer,
IN ULONG  Length,
OUT PULONG  ActualLength 
)

Definition at line 182 of file kdx86.c.

187{
188 PVOID ControlStart;
189 ULONG RealLength;
190
191 /* Make sure that this is a valid request */
192 if ((BaseAddress < sizeof(KPROCESSOR_STATE)) &&
194 {
195 /* Get the actual length */
196 RealLength = sizeof(KPROCESSOR_STATE) - (ULONG_PTR)BaseAddress;
197 if (RealLength < Length) Length = RealLength;
198
199 /* Set the proper address */
200 ControlStart = (PVOID)((ULONG_PTR)BaseAddress +
202 ProcessorState);
203
204 /* Read the control state safely */
206 ControlStart,
207 Length,
208 0,
210 ActualLength);
211 }
212 else
213 {
214 /* Invalid request */
215 *ActualLength = 0;
216 return STATUS_UNSUCCESSFUL;
217 }
218}
#define ULONG_PTR
Definition: config.h:101
NTSTATUS NTAPI KdpCopyMemoryChunks(_In_ ULONG64 Address, _In_ PVOID Buffer, _In_ ULONG TotalSize, _In_ ULONG ChunkSize, _In_ ULONG Flags, _Out_opt_ PULONG ActualSize)
Definition: kdapi.c:55
struct _KPROCESSOR_STATE KPROCESSOR_STATE
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define MMDBG_COPY_UNSAFE
Definition: mm.h:77
#define MMDBG_COPY_WRITE
Definition: mm.h:75
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ UCHAR Processor
Definition: kefuncs.h:670

Referenced by KdpReadControlSpace().

◆ KdpSysReadIoSpace()

NTSTATUS NTAPI KdpSysReadIoSpace ( IN ULONG  InterfaceType,
IN ULONG  BusNumber,
IN ULONG  AddressSpace,
IN ULONG64  IoAddress,
IN PVOID  DataValue,
IN ULONG  DataSize,
OUT PULONG  ActualDataSize 
)

Definition at line 257 of file kdx86.c.

264{
266
267 /* Verify parameters */
268 if ((InterfaceType != Isa) ||
269 (BusNumber != 0) ||
270 (AddressSpace != 1))
271 {
272 /* Fail, we don't support this */
273 *ActualDataSize = 0;
274 return STATUS_UNSUCCESSFUL;
275 }
276
277 /* Check the size */
278 switch (DataSize)
279 {
280 case sizeof(UCHAR):
281
282 /* Read 1 byte */
283 *(PUCHAR)DataValue =
284 READ_PORT_UCHAR((PUCHAR)(ULONG_PTR)IoAddress);
285 *ActualDataSize = sizeof(UCHAR);
287 break;
288
289 case sizeof(USHORT):
290
291 /* Make sure the address is aligned */
292 if ((IoAddress & (sizeof(USHORT) - 1)) != 0)
293 {
294 /* It isn't, bail out */
295 *ActualDataSize = 0;
297 break;
298 }
299
300 /* Read 2 bytes */
301 *(PUSHORT)DataValue =
303 *ActualDataSize = sizeof(USHORT);
305 break;
306
307 case sizeof(ULONG):
308
309 /* Make sure the address is aligned */
310 if ((IoAddress & (sizeof(ULONG) - 1)) != 0)
311 {
312 /* It isn't, bail out */
313 *ActualDataSize = 0;
315 break;
316 }
317
318 /* Read 4 bytes */
319 *(PULONG)DataValue =
320 READ_PORT_ULONG((PULONG)(ULONG_PTR)IoAddress);
321 *ActualDataSize = sizeof(ULONG);
323 break;
324
325 default:
326
327 /* Invalid size, fail */
328 *ActualDataSize = 0;
330 }
331
332 /* Return status */
333 return Status;
334}
LONG NTSTATUS
Definition: precomp.h:26
Status
Definition: gdiplustypes.h:25
ULONG NTAPI READ_PORT_ULONG(IN PULONG Port)
Definition: portio.c:70
USHORT NTAPI READ_PORT_USHORT(IN PUSHORT Port)
Definition: portio.c:63
@ Isa
Definition: hwresource.cpp:138
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
#define STATUS_DATATYPE_MISALIGNMENT
Definition: ntstatus.h:183
#define READ_PORT_UCHAR(p)
Definition: pc98vid.h:22
uint32_t * PULONG
Definition: typedefs.h:59
uint16_t * PUSHORT
Definition: typedefs.h:56
unsigned char * PUCHAR
Definition: typedefs.h:53
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
Definition: wdffdo.h:463
_In_ ULONG _In_ PHYSICAL_ADDRESS _Inout_ PULONG AddressSpace
Definition: iofuncs.h:2274
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by KdpReadIoSpace(), and KdpReadIoSpaceExtended().

◆ KdpSysReadMsr()

NTSTATUS NTAPI KdpSysReadMsr ( IN ULONG  Msr,
OUT PLARGE_INTEGER  MsrValue 
)

Definition at line 94 of file kdx86.c.

96{
97 /* Wrap this in SEH in case the MSR doesn't exist */
99 {
100 /* Read from the MSR */
101 MsrValue->QuadPart = __readmsr(Msr);
102 }
104 {
105 /* Invalid MSR */
107 }
108 _SEH2_END;
109
110 /* Success */
111 return STATUS_SUCCESS;
112}
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:34
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:162
#define STATUS_NO_SUCH_DEVICE
Definition: udferr_usr.h:136

Referenced by KdpReadMachineSpecificRegister().

◆ KdpSysWriteBusData()

NTSTATUS NTAPI KdpSysWriteBusData ( IN ULONG  BusDataType,
IN ULONG  BusNumber,
IN ULONG  SlotNumber,
IN ULONG  Offset,
IN PVOID  Buffer,
IN ULONG  Length,
OUT PULONG  ActualLength 
)

Definition at line 160 of file kdx86.c.

167{
168 /* Just forward to HAL */
169 *ActualLength = HalSetBusDataByOffset(BusDataType,
170 BusNumber,
172 Buffer,
173 Offset,
174 Length);
175
176 /* Return status */
177 return *ActualLength != 0 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
178}
ULONG NTAPI HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length)
Definition: bus.c:123

Referenced by KdpSetBusData().

◆ KdpSysWriteControlSpace()

NTSTATUS NTAPI KdpSysWriteControlSpace ( IN ULONG  Processor,
IN ULONG64  BaseAddress,
IN PVOID  Buffer,
IN ULONG  Length,
OUT PULONG  ActualLength 
)

Definition at line 222 of file kdx86.c.

227{
228 PVOID ControlStart;
229
230 /* Make sure that this is a valid request */
231 if (((BaseAddress + Length) <= sizeof(KPROCESSOR_STATE)) &&
233 {
234 /* Set the proper address */
235 ControlStart = (PVOID)((ULONG_PTR)BaseAddress +
237 ProcessorState);
238
239 /* Write the control state safely */
241 ControlStart,
242 Length,
243 0,
245 ActualLength);
246 }
247 else
248 {
249 /* Invalid request */
250 *ActualLength = 0;
251 return STATUS_UNSUCCESSFUL;
252 }
253}

Referenced by KdpWriteControlSpace().

◆ KdpSysWriteIoSpace()

NTSTATUS NTAPI KdpSysWriteIoSpace ( IN ULONG  InterfaceType,
IN ULONG  BusNumber,
IN ULONG  AddressSpace,
IN ULONG64  IoAddress,
IN PVOID  DataValue,
IN ULONG  DataSize,
OUT PULONG  ActualDataSize 
)

Definition at line 338 of file kdx86.c.

345{
347
348 /* Verify parameters */
349 if ((InterfaceType != Isa) ||
350 (BusNumber != 0) ||
351 (AddressSpace != 1))
352 {
353 /* Fail, we don't support this */
354 *ActualDataSize = 0;
355 return STATUS_UNSUCCESSFUL;
356 }
357
358 /* Check the size */
359 switch (DataSize)
360 {
361 case sizeof(UCHAR):
362
363 /* Write 1 byte */
365 *(PUCHAR)DataValue);
366 *ActualDataSize = sizeof(UCHAR);
368 break;
369
370 case sizeof(USHORT):
371
372 /* Make sure the address is aligned */
373 if ((IoAddress & (sizeof(USHORT) - 1)) != 0)
374 {
375 /* It isn't, bail out */
376 *ActualDataSize = 0;
378 break;
379 }
380
381 /* Write 2 bytes */
383 *(PUSHORT)DataValue);
384 *ActualDataSize = sizeof(USHORT);
386 break;
387
388 case sizeof(ULONG):
389
390 /* Make sure the address is aligned */
391 if ((IoAddress & (sizeof(ULONG) - 1)) != 0)
392 {
393 /* It isn't, bail out */
394 *ActualDataSize = 0;
396 break;
397 }
398
399 /* Write 4 bytes */
401 *(PULONG)DataValue);
402 *ActualDataSize = sizeof(ULONG);
404 break;
405
406 default:
407
408 /* Invalid size, fail */
409 *ActualDataSize = 0;
411 }
412
413 /* Return status */
414 return Status;
415}
VOID NTAPI WRITE_PORT_USHORT(IN PUSHORT Port, IN USHORT Value)
Definition: portio.c:115
VOID NTAPI WRITE_PORT_ULONG(IN PULONG Port, IN ULONG Value)
Definition: portio.c:123
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21

Referenced by KdpWriteIoSpace(), and KdpWriteIoSpaceExtended().

◆ KdpSysWriteMsr()

NTSTATUS NTAPI KdpSysWriteMsr ( IN ULONG  Msr,
IN PLARGE_INTEGER  MsrValue 
)

Definition at line 116 of file kdx86.c.

118{
119 /* Wrap this in SEH in case the MSR doesn't exist */
121 {
122 /* Write to the MSR */
123 __writemsr(Msr, MsrValue->QuadPart);
124 }
126 {
127 /* Invalid MSR */
129 }
130 _SEH2_END;
131
132 /* Success */
133 return STATUS_SUCCESS;
134}
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748

Referenced by KdpWriteMachineSpecificRegister().