[ROSLOAD]: Fix NX enabling

[ROSLOAD]: The IA32_MISC_ENABLE MSR bit actually _disables_ NX, so
diabling the bit _enables_ NX.
[ROSLOAD]: The MSR_XD_ENABLE_MASK is for the _high_ DWORD of the MSR
(bit 34), not the low.
[ROSLOAD]: Fix printf.
[ENVIRON/ROSLOAD]: Switch to CPU_INFO structure instead of blindly using
INT[4]. Revealed a bug in the PAE detection which was reading out of
bounds.
This commit is contained in:
Alex Ionescu 2018-01-28 16:29:43 +01:00
parent e836d0b56e
commit 478348ead1
4 changed files with 40 additions and 37 deletions

View file

@ -904,12 +904,12 @@ BlArchGetPerformanceCounter (
)
{
#if defined(_M_IX86) || defined(_M_X64)
INT CpuInfo[4];
CPU_INFO CpuInfo;
/* Serialize with CPUID, if it exists */
if (Archx86IsCpuidSupported())
{
BlArchCpuId(0, 0, CpuInfo);
BlArchCpuId(0, 0, &CpuInfo);
}
/* Read the TSC */
@ -924,12 +924,12 @@ VOID
BlArchCpuId (
_In_ ULONG Function,
_In_ ULONG SubFunction,
_Out_ INT* Result
_Out_ PCPU_INFO Result
)
{
#if defined(_M_IX86) || defined(_M_X64)
/* Use the intrinsic */
__cpuidex(Result, Function, SubFunction);
__cpuidex((INT*)Result->AsUINT32, Function, SubFunction);
#endif
}
@ -938,37 +938,37 @@ BlArchGetCpuVendor (
VOID
)
{
INT CpuInfo[4];
CPU_INFO CpuInfo;
INT Temp;
/* Get the CPU Vendor */
BlArchCpuId(0, 0, CpuInfo);
Temp = CpuInfo[2];
CpuInfo[2] = CpuInfo[3];
CpuInfo[3] = Temp;
BlArchCpuId(0, 0, &CpuInfo);
Temp = CpuInfo.Ecx;
CpuInfo.Ecx = CpuInfo.Edx;
CpuInfo.Edx = Temp;
/* Check against supported values */
if (!strncmp((PCHAR)&CpuInfo[1], "GenuineIntel", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineIntel", 12))
{
return CPU_INTEL;
}
if (!strncmp((PCHAR)&CpuInfo[1], "AuthenticAMD", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "AuthenticAMD", 12))
{
return CPU_AMD;
}
if (!strncmp((PCHAR)&CpuInfo[1], "CentaurHauls", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "CentaurHauls", 12))
{
return CPU_VIA;
}
if (!strncmp((PCHAR)&CpuInfo[1], "CyrixInstead", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "CyrixInstead", 12))
{
return CPU_CYRIX;
}
if (!strncmp((PCHAR)&CpuInfo[1], "GenuineTMx86", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "GenuineTMx86", 12))
{
return CPU_TRANSMETA;
}
if (!strncmp((PCHAR)&CpuInfo[1], "RiseRiseRise", 12))
if (!strncmp((PCHAR)&CpuInfo.Ebx, "RiseRiseRise", 12))
{
return CPU_RISE;
}