From dc9b7a0dbe1df1f84d391185fb3d714d11133d1c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 8 Nov 2014 19:05:22 +0000 Subject: [PATCH] [FREELDR] Check for CPU compatibility early and bugcheck if the CPU is too old. Based on patch by winocm. CORE-6427 svn path=/trunk/; revision=65326 --- .../boot/freeldr/freeldr/arch/arm/macharm.c | 6 +++ .../boot/freeldr/freeldr/arch/i386/hardware.c | 46 ++++++++++++++++++- reactos/boot/freeldr/freeldr/freeldr.c | 9 ++-- .../boot/freeldr/freeldr/include/freeldr.h | 1 + 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c index c45bd0f6e93..b59f58e1969 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c @@ -60,6 +60,12 @@ ULONG LenBits[] = /* FUNCTIONS ******************************************************************/ +VOID +FrLdrCheckCpuCompatiblity(VOID) +{ + /* Nothing for now */ +} + VOID ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext) { diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 6b6d759a7b9..b12de47df99 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -1788,7 +1788,51 @@ PcHwIdle(VOID) /* * No futher processing here. * Optionally implement HLT instruction handling. - */ + */ } +VOID +FrLdrCheckCpuCompatiblity(VOID) +{ + INT CpuInformation[4] = {-1}; + ULONG NumberOfIds; + + /* Check if the processor first supports ID 1 */ + __cpuid(CpuInformation, 0); + + NumberOfIds = CpuInformation[0]; + + if (NumberOfIds == 0) + { + FrLdrBugCheckWithMessage(MISSING_HARDWARE_REQUIREMENTS, + __FILE__, + __LINE__, + "ReactOS requires the CPUID instruction to return " + "more than one supported ID.\n\n"); + } + + /* NumberOfIds will be greater than 1 if the processor is new enough. */ + if (NumberOfIds == 1) + { + INT ProcessorFamily; + + /* Get information. */ + __cpuid(CpuInformation, 1); + + ProcessorFamily = (CpuInformation[0] >> 8) & 0xF; + + /* If it's Family 4 or lower, bugcheck. */ + if(ProcessorFamily < 5) + { + FrLdrBugCheckWithMessage(MISSING_HARDWARE_REQUIREMENTS, + __FILE__, + __LINE__, + "Processor is too old (family %u < 5)\n" + "ReactOS requires a Pentium-level processor or newer.", + ProcessorFamily); + } + } +} + + /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/freeldr.c b/reactos/boot/freeldr/freeldr/freeldr.c index a425357e91a..3aace8ae8cc 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.c +++ b/reactos/boot/freeldr/freeldr/freeldr.c @@ -37,6 +37,9 @@ VOID BootMain(LPSTR CmdLine) TRACE("BootMain() called.\n"); + /* Check if the CPU is new enough */ + FrLdrCheckCpuCompatiblity(); + if (!UiInitialize(FALSE)) { UiMessageBoxCritical("Unable to initialize UI.\n"); @@ -50,10 +53,10 @@ VOID BootMain(LPSTR CmdLine) } #ifdef _M_IX86 - HalpInitializePciStubs(); - HalpInitBusHandler(); + HalpInitializePciStubs(); + HalpInitBusHandler(); #endif - RunLoader(); + RunLoader(); quit: /* If we reach this point, something went wrong before, therefore reboot */ diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h index 0a0f1d5898b..0976bd6bde0 100644 --- a/reactos/boot/freeldr/freeldr/include/freeldr.h +++ b/reactos/boot/freeldr/freeldr/include/freeldr.h @@ -121,5 +121,6 @@ VOID BootMain(LPSTR CmdLine); VOID LoadOperatingSystem(IN OperatingSystemItem* OperatingSystem); VOID RunLoader(VOID); +VOID FrLdrCheckCpuCompatiblity(VOID); #endif /* __FREELDR_H */