- use SEH in KdpSysReadMsr
- use constants for KdpSysReadControlSpace cases (DEBUG_CONTROL_SPACE_KSPECIAL taken from singularity)
- implement case DEBUG_CONTROL_SPACE_KTHREAD returning a pointer to the current thread
- Implement KdpSysReadIoSpace, KdpSysWriteIoSpace for amd64, can be used for x86, too

svn path=/branches/ros-amd64-bringup/; revision=43448
This commit is contained in:
Timo Kreuzer
2009-10-14 11:39:59 +00:00
parent 3c1b6d34c0
commit b29a47bfdf
3 changed files with 119 additions and 15 deletions
+10
View File
@@ -194,6 +194,16 @@
#define DBGKD_PARTITION_DEFAULT 0x00
#define DBGKD_PARTITION_ALTERNATE 0x01
//
// Control Space types
//
#define DEBUG_CONTROL_SPACE_KPCR 0
#define DEBUG_CONTROL_SPACE_KPRCB 1
#define DEBUG_CONTROL_SPACE_KSPECIAL 2
#define DEBUG_CONTROL_SPACE_KTHREAD 3
#define X86_DEBUG_CONTROL_SPACE_KSPECIAL 716
//
// KD Packet Structure
//
+2 -2
View File
@@ -374,7 +374,7 @@ KdpSysReadIoSpace(
IN ULONG BusNumber,
IN ULONG AddressSpace,
IN ULONG64 IoAddress,
IN PULONG DataValue,
IN PVOID DataValue,
IN ULONG DataSize,
OUT PULONG ActualDataSize
);
@@ -386,7 +386,7 @@ KdpSysWriteIoSpace(
IN ULONG BusNumber,
IN ULONG AddressSpace,
IN ULONG64 IoAddress,
IN PULONG DataValue,
IN PVOID DataValue,
IN ULONG DataSize,
OUT PULONG ActualDataSize
);
+107 -13
View File
@@ -104,7 +104,17 @@ NTAPI
KdpSysReadMsr(IN ULONG Msr,
OUT PLARGE_INTEGER MsrValue)
{
MsrValue->QuadPart = __readmsr(Msr);
/* Use SEH to protect from invalid MSRs */
_SEH2_TRY
{
MsrValue->QuadPart = __readmsr(Msr);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
_SEH2_YIELD(return STATUS_NO_SUCH_DEVICE);
}
_SEH2_END
return STATUS_SUCCESS;
}
@@ -113,7 +123,17 @@ NTAPI
KdpSysWriteMsr(IN ULONG Msr,
IN PLARGE_INTEGER MsrValue)
{
__writemsr(Msr, MsrValue->QuadPart);
/* Use SEH to protect from invalid MSRs */
_SEH2_TRY
{
__writemsr(Msr, MsrValue->QuadPart);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
_SEH2_YIELD(return STATUS_NO_SUCH_DEVICE);
}
_SEH2_END
return STATUS_SUCCESS;
}
@@ -165,28 +185,35 @@ KdpSysReadControlSpace(IN ULONG Processor,
switch ((ULONG_PTR)BaseAddress)
{
case 0:
case DEBUG_CONTROL_SPACE_KPCR:
/* Copy a pointer to the Pcr */
ControlStart = &Pcr;
RealLength = sizeof(PVOID);
break;
case 1:
case DEBUG_CONTROL_SPACE_KPRCB:
/* Copy a pointer to the Prcb */
ControlStart = &Prcb;
RealLength = sizeof(PVOID);
break;
case 2:
case DEBUG_CONTROL_SPACE_KSPECIAL:
/* Copy SpecialRegisters */
ControlStart = &Prcb->ProcessorState.SpecialRegisters;
RealLength = sizeof(KSPECIAL_REGISTERS);
break;
case DEBUG_CONTROL_SPACE_KTHREAD:
/* Copy a pointer to the current Thread */
ControlStart = &Prcb->CurrentThread;
RealLength = sizeof(PVOID);
break;
default:
RealLength = 0;
ControlStart = NULL;
ASSERT(FALSE);
return STATUS_UNSUCCESSFUL;
}
if (RealLength < Length) Length = RealLength;
@@ -225,28 +252,95 @@ KdpSysReadIoSpace(IN ULONG InterfaceType,
IN ULONG BusNumber,
IN ULONG AddressSpace,
IN ULONG64 IoAddress,
IN PULONG DataValue,
OUT PVOID DataValue,
IN ULONG DataSize,
OUT PULONG ActualDataSize)
{
UNIMPLEMENTED;
while (TRUE);
return STATUS_UNSUCCESSFUL;
/* Verify parameters */
if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1)
{
/* No data was read */
*ActualDataSize = 0;
return STATUS_INVALID_PARAMETER;
}
switch (DataSize)
{
case sizeof(UCHAR):
/* read one UCHAR */
*(PUCHAR)DataValue = READ_PORT_UCHAR((PUCHAR)IoAddress);
break;
case sizeof(USHORT):
/* Read one USHORT */
*(PUSHORT)DataValue = READ_PORT_USHORT((PUSHORT)IoAddress);
break;
case sizeof(ULONG):
/* Read one ULONG */
*(PULONG)DataValue = READ_PORT_ULONG((PULONG)IoAddress);
break;
default:
/* Invalid data size */
*ActualDataSize = 0;
return STATUS_UNSUCCESSFUL;
}
/* Return the size of the data */
*ActualDataSize = DataSize;
/* Success! */
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
KdpSysWriteIoSpace(IN ULONG InterfaceType,
IN ULONG BusNumber,
IN ULONG AddressSpace,
IN ULONG64 IoAddress,
IN PULONG DataValue,
IN PVOID DataValue,
IN ULONG DataSize,
OUT PULONG ActualDataSize)
{
UNIMPLEMENTED;
while (TRUE);
return STATUS_UNSUCCESSFUL;
/* Verify parameters */
if (InterfaceType != Isa || BusNumber != 0 || AddressSpace != 1)
{
/* No data was written */
*ActualDataSize = 0;
return STATUS_INVALID_PARAMETER;
}
switch (DataSize)
{
case sizeof(UCHAR):
/* read one UCHAR */
WRITE_PORT_UCHAR((PUCHAR)IoAddress, *(PUCHAR)DataValue);
break;
case sizeof(USHORT):
/* Read one USHORT */
WRITE_PORT_USHORT((PUSHORT)IoAddress, *(PUSHORT)DataValue);
break;
case sizeof(ULONG):
/* Read one ULONG */
WRITE_PORT_ULONG((PULONG)IoAddress, *(PULONG)DataValue);
break;
default:
/* Invalid data size */
*ActualDataSize = 0;
return STATUS_UNSUCCESSFUL;
}
/* Return the size of the data */
*ActualDataSize = DataSize;
/* Success! */
return STATUS_SUCCESS;
}
NTSTATUS