Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenkdx64.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS Kernel 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: ntoskrnl/kd64/amd64/kdx64.c 00005 * PURPOSE: KD support routines for AMD64 00006 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) 00007 */ 00008 00009 /* INCLUDES *****************************************************************/ 00010 00011 #include <ntoskrnl.h> 00012 #define NDEBUG 00013 #include <debug.h> 00014 00015 #undef UNIMPLEMENTED 00016 #define UNIMPLEMENTED KdpDprintf("%s is unimplemented\n", __FUNCTION__) 00017 00018 /* FUNCTIONS *****************************************************************/ 00019 00020 VOID 00021 NTAPI 00022 KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State, 00023 IN PCONTEXT Context) 00024 { 00025 PKPRCB Prcb; 00026 ULONG i; 00027 00028 /* Check for success */ 00029 if (NT_SUCCESS(State->u.Continue2.ContinueStatus)) 00030 { 00031 /* Check if we're tracing */ 00032 if (State->u.Continue2.ControlSet.TraceFlag) 00033 { 00034 /* Enable TF */ 00035 Context->EFlags |= EFLAGS_TF; 00036 } 00037 else 00038 { 00039 /* Remove it */ 00040 Context->EFlags &= ~EFLAGS_TF; 00041 } 00042 00043 /* Loop all processors */ 00044 for (i = 0; i < KeNumberProcessors; i++) 00045 { 00046 /* Get the PRCB and update DR7 and DR6 */ 00047 Prcb = KiProcessorBlock[i]; 00048 Prcb->ProcessorState.SpecialRegisters.KernelDr7 = 00049 State->u.Continue2.ControlSet.Dr7; 00050 Prcb->ProcessorState.SpecialRegisters.KernelDr6 = 0; 00051 } 00052 00053 /* Check if we have new symbol information */ 00054 if (State->u.Continue2.ControlSet.CurrentSymbolStart != 1) 00055 { 00056 /* Update it */ 00057 KdpCurrentSymbolStart = 00058 State->u.Continue2.ControlSet.CurrentSymbolStart; 00059 KdpCurrentSymbolEnd= State->u.Continue2.ControlSet.CurrentSymbolEnd; 00060 } 00061 } 00062 } 00063 00064 VOID 00065 NTAPI 00066 KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange, 00067 IN PCONTEXT Context) 00068 { 00069 PKPRCB Prcb = KeGetCurrentPrcb(); 00070 00071 /* Copy i386 specific debug registers */ 00072 WaitStateChange->ControlReport.Dr6 = Prcb->ProcessorState.SpecialRegisters. 00073 KernelDr6; 00074 WaitStateChange->ControlReport.Dr7 = Prcb->ProcessorState.SpecialRegisters. 00075 KernelDr7; 00076 00077 /* Copy i386 specific segments */ 00078 WaitStateChange->ControlReport.SegCs = (USHORT)Context->SegCs; 00079 WaitStateChange->ControlReport.SegDs = (USHORT)Context->SegDs; 00080 WaitStateChange->ControlReport.SegEs = (USHORT)Context->SegEs; 00081 WaitStateChange->ControlReport.SegFs = (USHORT)Context->SegFs; 00082 00083 /* Copy EFlags */ 00084 WaitStateChange->ControlReport.EFlags = Context->EFlags; 00085 00086 /* Set Report Flags */ 00087 WaitStateChange->ControlReport.ReportFlags = REPORT_INCLUDES_SEGS; 00088 if (WaitStateChange->ControlReport.SegCs == KGDT64_R0_CODE) 00089 { 00090 WaitStateChange->ControlReport.ReportFlags |= REPORT_STANDARD_CS; 00091 } 00092 } 00093 00094 NTSTATUS 00095 NTAPI 00096 KdpSysReadMsr(IN ULONG Msr, 00097 OUT PLARGE_INTEGER MsrValue) 00098 { 00099 /* Use SEH to protect from invalid MSRs */ 00100 _SEH2_TRY 00101 { 00102 MsrValue->QuadPart = __readmsr(Msr); 00103 } 00104 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00105 { 00106 _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE); 00107 } 00108 _SEH2_END 00109 00110 return STATUS_SUCCESS; 00111 } 00112 00113 NTSTATUS 00114 NTAPI 00115 KdpSysWriteMsr(IN ULONG Msr, 00116 IN PLARGE_INTEGER MsrValue) 00117 { 00118 /* Use SEH to protect from invalid MSRs */ 00119 _SEH2_TRY 00120 { 00121 __writemsr(Msr, MsrValue->QuadPart); 00122 } 00123 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00124 { 00125 _SEH2_YIELD(return STATUS_NO_SUCH_DEVICE); 00126 } 00127 _SEH2_END 00128 00129 return STATUS_SUCCESS; 00130 } 00131 00132 NTSTATUS 00133 NTAPI 00134 KdpSysReadBusData(IN ULONG BusDataType, 00135 IN ULONG BusNumber, 00136 IN ULONG SlotNumber, 00137 IN ULONG Offset, 00138 IN PVOID Buffer, 00139 IN ULONG Length, 00140 OUT PULONG ActualLength) 00141 { 00142 UNIMPLEMENTED; 00143 while (TRUE); 00144 return STATUS_UNSUCCESSFUL; 00145 } 00146 00147 NTSTATUS 00148 NTAPI 00149 KdpSysWriteBusData(IN ULONG BusDataType, 00150 IN ULONG BusNumber, 00151 IN ULONG SlotNumber, 00152 IN ULONG Offset, 00153 IN PVOID Buffer, 00154 IN ULONG Length, 00155 OUT PULONG ActualLength) 00156 { 00157 UNIMPLEMENTED; 00158 while (TRUE); 00159 return STATUS_UNSUCCESSFUL; 00160 } 00161 00162 NTSTATUS 00163 NTAPI 00164 KdpSysReadControlSpace(IN ULONG Processor, 00165 IN ULONG64 BaseAddress, 00166 IN PVOID Buffer, 00167 IN ULONG Length, 00168 OUT PULONG ActualLength) 00169 { 00170 PVOID ControlStart; 00171 PKPRCB Prcb = KiProcessorBlock[Processor]; 00172 PKIPCR Pcr = CONTAINING_RECORD(Prcb, KIPCR, Prcb); 00173 00174 switch (BaseAddress) 00175 { 00176 case AMD64_DEBUG_CONTROL_SPACE_KPCR: 00177 /* Copy a pointer to the Pcr */ 00178 ControlStart = &Pcr; 00179 *ActualLength = sizeof(PVOID); 00180 break; 00181 00182 case AMD64_DEBUG_CONTROL_SPACE_KPRCB: 00183 /* Copy a pointer to the Prcb */ 00184 ControlStart = &Prcb; 00185 *ActualLength = sizeof(PVOID); 00186 break; 00187 00188 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL: 00189 /* Copy SpecialRegisters */ 00190 ControlStart = &Prcb->ProcessorState.SpecialRegisters; 00191 *ActualLength = sizeof(KSPECIAL_REGISTERS); 00192 break; 00193 00194 case AMD64_DEBUG_CONTROL_SPACE_KTHREAD: 00195 /* Copy a pointer to the current Thread */ 00196 ControlStart = &Prcb->CurrentThread; 00197 *ActualLength = sizeof(PVOID); 00198 break; 00199 00200 default: 00201 *ActualLength = 0; 00202 ASSERT(FALSE); 00203 return STATUS_UNSUCCESSFUL; 00204 } 00205 00206 /* Copy the memory */ 00207 RtlCopyMemory(Buffer, ControlStart, min(Length, *ActualLength)); 00208 00209 /* Finish up */ 00210 return STATUS_SUCCESS; 00211 } 00212 00213 NTSTATUS 00214 NTAPI 00215 KdpSysWriteControlSpace(IN ULONG Processor, 00216 IN ULONG64 BaseAddress, 00217 IN PVOID Buffer, 00218 IN ULONG Length, 00219 OUT PULONG ActualLength) 00220 { 00221 PVOID ControlStart; 00222 PKPRCB Prcb = KiProcessorBlock[Processor]; 00223 00224 switch (BaseAddress) 00225 { 00226 case AMD64_DEBUG_CONTROL_SPACE_KSPECIAL: 00227 /* Copy SpecialRegisters */ 00228 ControlStart = &Prcb->ProcessorState.SpecialRegisters; 00229 *ActualLength = sizeof(KSPECIAL_REGISTERS); 00230 break; 00231 00232 default: 00233 *ActualLength = 0; 00234 ASSERT(FALSE); 00235 return STATUS_UNSUCCESSFUL; 00236 } 00237 00238 /* Copy the memory */ 00239 RtlCopyMemory(ControlStart, Buffer, min(Length, *ActualLength)); 00240 00241 return STATUS_SUCCESS; 00242 } 00243 00244 NTSTATUS 00245 NTAPI 00246 KdpSysReadIoSpace(IN ULONG InterfaceType, 00247 IN ULONG BusNumber, 00248 IN ULONG AddressSpace, 00249 IN ULONG64 IoAddress, 00250 OUT PVOID DataValue, 00251 IN ULONG DataSize, 00252 OUT PULONG ActualDataSize) 00253 { 00254 /* Verify parameters */ 00255 if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1) 00256 { 00257 /* No data was read */ 00258 *ActualDataSize = 0; 00259 return STATUS_INVALID_PARAMETER; 00260 } 00261 00262 /* Check for correct alignment */ 00263 if ((IoAddress & (DataSize - 1))) 00264 { 00265 /* Invalid alignment */ 00266 *ActualDataSize = 0; 00267 return STATUS_DATATYPE_MISALIGNMENT; 00268 } 00269 00270 switch (DataSize) 00271 { 00272 case sizeof(UCHAR): 00273 /* Read one UCHAR */ 00274 *(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress); 00275 break; 00276 00277 case sizeof(USHORT): 00278 /* Read one USHORT */ 00279 *(PUSHORT)DataValue = READ_PORT_USHORT((PUSHORT)IoAddress); 00280 break; 00281 00282 case sizeof(ULONG): 00283 /* Read one ULONG */ 00284 *(PULONG)DataValue = READ_PORT_ULONG((PULONG)IoAddress); 00285 break; 00286 00287 default: 00288 /* Invalid data size */ 00289 *ActualDataSize = 0; 00290 return STATUS_INVALID_PARAMETER; 00291 } 00292 00293 /* Return the size of the data */ 00294 *ActualDataSize = DataSize; 00295 00296 /* Success! */ 00297 return STATUS_SUCCESS; 00298 } 00299 00300 NTSTATUS 00301 NTAPI 00302 KdpSysWriteIoSpace(IN ULONG InterfaceType, 00303 IN ULONG BusNumber, 00304 IN ULONG AddressSpace, 00305 IN ULONG64 IoAddress, 00306 IN PVOID DataValue, 00307 IN ULONG DataSize, 00308 OUT PULONG ActualDataSize) 00309 { 00310 /* Verify parameters */ 00311 if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1) 00312 { 00313 /* No data was written */ 00314 *ActualDataSize = 0; 00315 return STATUS_INVALID_PARAMETER; 00316 } 00317 00318 /* Check for correct alignment */ 00319 if ((IoAddress & (DataSize - 1))) 00320 { 00321 /* Invalid alignment */ 00322 *ActualDataSize = 0; 00323 return STATUS_DATATYPE_MISALIGNMENT; 00324 } 00325 00326 switch (DataSize) 00327 { 00328 case sizeof(UCHAR): 00329 /* Write one UCHAR */ 00330 WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue); 00331 break; 00332 00333 case sizeof(USHORT): 00334 /* Write one USHORT */ 00335 WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue); 00336 break; 00337 00338 case sizeof(ULONG): 00339 /* Write one ULONG */ 00340 WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue); 00341 break; 00342 00343 default: 00344 /* Invalid data size */ 00345 *ActualDataSize = 0; 00346 return STATUS_INVALID_PARAMETER; 00347 } 00348 00349 /* Return the size of the data */ 00350 *ActualDataSize = DataSize; 00351 00352 /* Success! */ 00353 return STATUS_SUCCESS; 00354 } 00355 00356 NTSTATUS 00357 NTAPI 00358 KdpSysCheckLowMemory(IN ULONG Flags) 00359 { 00360 UNIMPLEMENTED; 00361 while (TRUE); 00362 return STATUS_UNSUCCESSFUL; 00363 } 00364 00365 NTSTATUS 00366 NTAPI 00367 KdpAllowDisable(VOID) 00368 { 00369 UNIMPLEMENTED; 00370 while (TRUE); 00371 return STATUS_ACCESS_DENIED; 00372 } Generated on Sun May 27 2012 04:37:21 for ReactOS by
1.7.6.1
|