[FREELDR]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 8 Nov 2014 19:05:22 +0000 (19:05 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 8 Nov 2014 19:05:22 +0000 (19:05 +0000)
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

reactos/boot/freeldr/freeldr/arch/arm/macharm.c
reactos/boot/freeldr/freeldr/arch/i386/hardware.c
reactos/boot/freeldr/freeldr/freeldr.c
reactos/boot/freeldr/freeldr/include/freeldr.h

index c45bd0f..b59f58e 100644 (file)
@@ -60,6 +60,12 @@ ULONG LenBits[] =
 
 /* FUNCTIONS ******************************************************************/
 
 
 /* FUNCTIONS ******************************************************************/
 
+VOID
+FrLdrCheckCpuCompatiblity(VOID)
+{
+    /* Nothing for now */
+}
+
 VOID
 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
 {
 VOID
 ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext)
 {
index 6b6d759..b12de47 100644 (file)
@@ -1788,7 +1788,51 @@ PcHwIdle(VOID)
     /*
      * No futher processing here.
      * Optionally implement HLT instruction handling.
     /*
      * 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 */
 /* EOF */
index a425357..3aace8a 100644 (file)
@@ -37,6 +37,9 @@ VOID BootMain(LPSTR CmdLine)
 
     TRACE("BootMain() called.\n");
 
 
     TRACE("BootMain() called.\n");
 
+       /* Check if the CPU is new enough */
+       FrLdrCheckCpuCompatiblity();
+
     if (!UiInitialize(FALSE))
     {
         UiMessageBoxCritical("Unable to initialize UI.\n");
     if (!UiInitialize(FALSE))
     {
         UiMessageBoxCritical("Unable to initialize UI.\n");
@@ -50,10 +53,10 @@ VOID BootMain(LPSTR CmdLine)
     }
 
 #ifdef _M_IX86
     }
 
 #ifdef _M_IX86
-    HalpInitializePciStubs();
-    HalpInitBusHandler();
+       HalpInitializePciStubs();
+       HalpInitBusHandler();
 #endif
 #endif
-    RunLoader();
+       RunLoader();
 
 quit:
     /* If we reach this point, something went wrong before, therefore reboot */
 
 quit:
     /* If we reach this point, something went wrong before, therefore reboot */
index 0a0f1d5..0976bd6 100644 (file)
 VOID BootMain(LPSTR CmdLine);
 VOID LoadOperatingSystem(IN OperatingSystemItem* OperatingSystem);
 VOID RunLoader(VOID);
 VOID BootMain(LPSTR CmdLine);
 VOID LoadOperatingSystem(IN OperatingSystemItem* OperatingSystem);
 VOID RunLoader(VOID);
+VOID FrLdrCheckCpuCompatiblity(VOID);
 
 #endif  /* __FREELDR_H */
 
 #endif  /* __FREELDR_H */