ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

kdx64.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.