https://git.reactos.org/?p=reactos.git;a=commitdiff;h=478348ead113ae5d5b5ea…
commit 478348ead113ae5d5b5eaf579b540f65339bebbd
Author: Alex Ionescu <aionescu(a)gmail.com>
AuthorDate: Sun Jan 28 16:29:43 2018 +0100
Commit: Alex Ionescu <aionescu(a)gmail.com>
CommitDate: Sun Jan 28 16:29:43 2018 +0100
[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.
---
boot/environ/app/rosload/rosload.c | 39 ++++++++++++++++++++------------------
boot/environ/include/bl.h | 2 +-
boot/environ/lib/misc/util.c | 30 ++++++++++++++---------------
boot/environ/lib/mm/i386/mmx86.c | 6 +++---
4 files changed, 40 insertions(+), 37 deletions(-)
diff --git a/boot/environ/app/rosload/rosload.c b/boot/environ/app/rosload/rosload.c
index 9120631a1f..3c51963251 100644
--- a/boot/environ/app/rosload/rosload.c
+++ b/boot/environ/app/rosload/rosload.c
@@ -9783,24 +9783,26 @@ OslpMain (
_Out_ PULONG ReturnFlags
)
{
- INT CpuInfo[4];
- BOOLEAN NxDisabled;
+ CPU_INFO CpuInfo;
+ BOOLEAN NxEnabled;
NTSTATUS Status;
BOOLEAN ExecuteJump;
+ LARGE_INTEGER miscMsr;
/* Check if the CPU supports NX */
- BlArchCpuId(0x80000001, 0, CpuInfo);
- if (!(CpuInfo[3] & 0x10000))
+ BlArchCpuId(0x80000001, 0, &CpuInfo);
+ if (!(CpuInfo.Edx & 0x10000))
{
/* It doesn't, check if this is Intel */
- EfiPrintf(L"NX disabled: %d\r\n");
+ EfiPrintf(L"NX disabled: %lx\r\n", CpuInfo.Edx);
if (BlArchGetCpuVendor() == CPU_INTEL)
{
- /* Then turn off the MSR feature for it */
- EfiPrintf(L"NX being turned off\r\n");
- __writemsr(MSR_IA32_MISC_ENABLE,
- __readmsr(MSR_IA32_MISC_ENABLE) & MSR_XD_ENABLE_MASK);
- NxDisabled = TRUE;
+ /* Then turn off the MSR disable feature for it, enabling NX */
+ EfiPrintf(L"NX being turned on\r\n");
+ miscMsr.QuadPart = __readmsr(MSR_IA32_MISC_ENABLE);
+ miscMsr.HighPart &= MSR_XD_ENABLE_MASK;
+ __writemsr(MSR_IA32_MISC_ENABLE, miscMsr.QuadPart);
+ NxEnabled = TRUE;
}
}
@@ -9818,12 +9820,13 @@ OslpMain (
/* Retore NX support */
__writemsr(MSR_EFER, __readmsr(MSR_EFER) ^ MSR_NXE);
- /* Did we disable NX? */
- if (NxDisabled)
+ /* Did we manually enable NX? */
+ if (NxEnabled)
{
- /* Turn it back on */
- __writemsr(MSR_IA32_MISC_ENABLE,
- __readmsr(MSR_IA32_MISC_ENABLE) | ~MSR_XD_ENABLE_MASK);
+ /* Turn it back off */
+ miscMsr.QuadPart = __readmsr(MSR_IA32_MISC_ENABLE);
+ miscMsr.HighPart |= ~MSR_XD_ENABLE_MASK;
+ __writemsr(MSR_IA32_MISC_ENABLE, miscMsr.QuadPart);
}
/* Go back */
@@ -9853,7 +9856,7 @@ OslMain (
NTSTATUS Status;
PBL_RETURN_ARGUMENTS ReturnArguments;
PBL_APPLICATION_ENTRY AppEntry;
- INT CpuInfo[4];
+ CPU_INFO CpuInfo;
ULONG Flags;
#ifdef DRAW_LOGO
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* gopBlt;
@@ -9887,10 +9890,10 @@ OslMain (
if (BlArchIsCpuIdFunctionSupported(1))
{
/* Query CPU features */
- BlArchCpuId(1, 0, CpuInfo);
+ BlArchCpuId(1, 0, &CpuInfo);
/* Check if PAE is supported */
- if (CpuInfo[4] & 0x40)
+ if (CpuInfo.Edx & 0x40)
{
EfiPrintf(L"PAE Supported, but won't be used\r\n");
}
diff --git a/boot/environ/include/bl.h b/boot/environ/include/bl.h
index 7fa6c9667e..023e676d75 100644
--- a/boot/environ/include/bl.h
+++ b/boot/environ/include/bl.h
@@ -1666,7 +1666,7 @@ VOID
BlArchCpuId (
_In_ ULONG Function,
_In_ ULONG SubFunction,
- _Out_ INT* Result
+ _Out_ PCPU_INFO Result
);
CPU_VENDORS
diff --git a/boot/environ/lib/misc/util.c b/boot/environ/lib/misc/util.c
index d6e5459882..18f21cc2e9 100644
--- a/boot/environ/lib/misc/util.c
+++ b/boot/environ/lib/misc/util.c
@@ -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;
}
diff --git a/boot/environ/lib/mm/i386/mmx86.c b/boot/environ/lib/mm/i386/mmx86.c
index 38e52df1fd..b72a8983ae 100644
--- a/boot/environ/lib/mm/i386/mmx86.c
+++ b/boot/environ/lib/mm/i386/mmx86.c
@@ -1101,7 +1101,7 @@ MmArchInitialize (
{
NTSTATUS Status;
ULONGLONG IncreaseUserVa, PerfCounter, CpuRandom;
- INT CpuInfo[4];
+ CPU_INFO CpuInfo;
/* For phase 2, just map deferred regions */
if (Phase != 1)
@@ -1157,10 +1157,10 @@ MmArchInitialize (
if (BlArchIsCpuIdFunctionSupported(1))
{
/* Call it */
- BlArchCpuId(1, 0, CpuInfo);
+ BlArchCpuId(1, 0, &CpuInfo);
/* Check if RDRAND is supported */
- if (CpuInfo[2] & 0x40000000)
+ if (CpuInfo.Ecx & 0x40000000)
{
EfiPrintf(L"Your CPU can do RDRAND! Good for you!\r\n");
CpuRandom = 0;