forked from xt-sys/exectos
Partially implement ArpIdentifyProcessor()
This commit is contained in:
parent
e94cb2d3a7
commit
d72002187d
@ -85,7 +85,69 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
ArpIdentifyProcessor(VOID)
|
ArpIdentifyProcessor(VOID)
|
||||||
{
|
{
|
||||||
|
PKPROCESSOR_CONTROL_BLOCK Prcb;
|
||||||
|
CPUID_REGISTERS CpuRegisters;
|
||||||
|
CPUID_SIGNATURE CpuSignature;
|
||||||
|
|
||||||
|
/* Not fully implemented yet */
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
/* Get current processor control block */
|
||||||
|
Prcb = KeGetCurrentProcessorControlBlock();
|
||||||
|
|
||||||
|
/* Get CPU vendor by issueing CPUID instruction */
|
||||||
|
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||||
|
CpuRegisters.Leaf = CPUID_GET_VENDOR_STRING;
|
||||||
|
ArCpuId(&CpuRegisters);
|
||||||
|
|
||||||
|
/* Store CPU vendor in processor control block */
|
||||||
|
Prcb->CpuId.Vendor = CpuRegisters.Ebx;
|
||||||
|
Prcb->CpuId.VendorName[0] = CpuRegisters.Ebx;
|
||||||
|
Prcb->CpuId.VendorName[4] = CpuRegisters.Edx;
|
||||||
|
Prcb->CpuId.VendorName[8] = CpuRegisters.Ecx;
|
||||||
|
Prcb->CpuId.VendorName[12] = '\0';
|
||||||
|
|
||||||
|
/* Get CPU features */
|
||||||
|
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||||
|
CpuRegisters.Leaf = CPUID_GET_CPU_FEATURES;
|
||||||
|
ArCpuId(&CpuRegisters);
|
||||||
|
|
||||||
|
/* Store CPU signature in processor control block */
|
||||||
|
CpuSignature = *(PCPUID_SIGNATURE)&CpuRegisters.Eax;
|
||||||
|
Prcb->CpuId.Family = CpuSignature.Family;
|
||||||
|
Prcb->CpuId.Model = CpuSignature.Model;
|
||||||
|
Prcb->CpuId.Stepping = CpuSignature.Stepping;
|
||||||
|
|
||||||
|
/* CPU vendor specific quirks */
|
||||||
|
if(Prcb->CpuId.Vendor == CPU_VENDOR_AMD)
|
||||||
|
{
|
||||||
|
/* AMD CPU */
|
||||||
|
Prcb->CpuId.Family = Prcb->CpuId.Family + CpuSignature.ExtendedFamily;
|
||||||
|
if(Prcb->CpuId.Model == 0xF)
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Model = Prcb->CpuId.Model + (CpuSignature.ExtendedModel << 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(Prcb->CpuId.Vendor == CPU_VENDOR_INTEL)
|
||||||
|
{
|
||||||
|
/* Intel CPU */
|
||||||
|
if(Prcb->CpuId.Family == 0xF)
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Family = Prcb->CpuId.Family + CpuSignature.ExtendedFamily;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Prcb->CpuId.Family == 0xF) || (Prcb->CpuId.Family == 0x6))
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Model = Prcb->CpuId.Model + (CpuSignature.ExtendedModel << 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Unknown CPU vendor */
|
||||||
|
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Store a list of CPU features in processor control block */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,7 +83,69 @@ XTAPI
|
|||||||
VOID
|
VOID
|
||||||
ArpIdentifyProcessor(VOID)
|
ArpIdentifyProcessor(VOID)
|
||||||
{
|
{
|
||||||
|
PKPROCESSOR_CONTROL_BLOCK Prcb;
|
||||||
|
CPUID_REGISTERS CpuRegisters;
|
||||||
|
CPUID_SIGNATURE CpuSignature;
|
||||||
|
|
||||||
|
/* Not fully implemented yet */
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
|
|
||||||
|
/* Get current processor control block */
|
||||||
|
Prcb = KeGetCurrentProcessorControlBlock();
|
||||||
|
|
||||||
|
/* Get CPU vendor by issueing CPUID instruction */
|
||||||
|
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||||
|
CpuRegisters.Leaf = CPUID_GET_VENDOR_STRING;
|
||||||
|
ArCpuId(&CpuRegisters);
|
||||||
|
|
||||||
|
/* Store CPU vendor in processor control block */
|
||||||
|
Prcb->CpuId.Vendor = CpuRegisters.Ebx;
|
||||||
|
Prcb->CpuId.VendorName[0] = CpuRegisters.Ebx;
|
||||||
|
Prcb->CpuId.VendorName[4] = CpuRegisters.Edx;
|
||||||
|
Prcb->CpuId.VendorName[8] = CpuRegisters.Ecx;
|
||||||
|
Prcb->CpuId.VendorName[12] = '\0';
|
||||||
|
|
||||||
|
/* Get CPU features */
|
||||||
|
RtlZeroMemory(&CpuRegisters, sizeof(CPUID_REGISTERS));
|
||||||
|
CpuRegisters.Leaf = CPUID_GET_CPU_FEATURES;
|
||||||
|
ArCpuId(&CpuRegisters);
|
||||||
|
|
||||||
|
/* Store CPU signature in processor control block */
|
||||||
|
CpuSignature = *(PCPUID_SIGNATURE)&CpuRegisters.Eax;
|
||||||
|
Prcb->CpuId.Family = CpuSignature.Family;
|
||||||
|
Prcb->CpuId.Model = CpuSignature.Model;
|
||||||
|
Prcb->CpuId.Stepping = CpuSignature.Stepping;
|
||||||
|
|
||||||
|
/* CPU vendor specific quirks */
|
||||||
|
if(Prcb->CpuId.Vendor == CPU_VENDOR_AMD)
|
||||||
|
{
|
||||||
|
/* AMD CPU */
|
||||||
|
Prcb->CpuId.Family = Prcb->CpuId.Family + CpuSignature.ExtendedFamily;
|
||||||
|
if(Prcb->CpuId.Model == 0xF)
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Model = Prcb->CpuId.Model + (CpuSignature.ExtendedModel << 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(Prcb->CpuId.Vendor == CPU_VENDOR_INTEL)
|
||||||
|
{
|
||||||
|
/* Intel CPU */
|
||||||
|
if(Prcb->CpuId.Family == 0xF)
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Family = Prcb->CpuId.Family + CpuSignature.ExtendedFamily;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((Prcb->CpuId.Family == 0xF) || (Prcb->CpuId.Family == 0x6))
|
||||||
|
{
|
||||||
|
Prcb->CpuId.Model = Prcb->CpuId.Model + (CpuSignature.ExtendedModel << 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Unknown CPU vendor */
|
||||||
|
Prcb->CpuId.Vendor = CPU_VENDOR_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Store a list of CPU features in processor control block */
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user