[FREELDR]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 29 Mar 2012 08:25:20 +0000 (08:25 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 29 Mar 2012 08:25:20 +0000 (08:25 +0000)
- Implement HwIdle() function to put cpu in idle mode, when waiting for keyboard input.
- Patch by Carlo Bramini (carlo dot bramix at libero.it)
See issue #6453 for more details.

svn path=/trunk/; revision=56270

12 files changed:
reactos/boot/freeldr/freeldr/arch/arm/macharm.c
reactos/boot/freeldr/freeldr/arch/i386/hardware.c
reactos/boot/freeldr/freeldr/arch/i386/machpc.c
reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c
reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
reactos/boot/freeldr/freeldr/arch/powerpc/prep.c
reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
reactos/boot/freeldr/freeldr/include/arch/pc/machpc.h
reactos/boot/freeldr/freeldr/include/machine.h
reactos/boot/freeldr/freeldr/ui/tui.c
reactos/boot/freeldr/freeldr/ui/tuimenu.c

index 6df6dbd..81c2ab5 100644 (file)
@@ -164,6 +164,12 @@ ArmMemGetMemoryMap(OUT ULONG *MemoryMapSize)
     return ArmBoardBlock->MemoryMapEntryCount;
 }
 
+VOID
+ArmHwIdle(VOID)
+{
+    /* UNIMPLEMENTED */
+}
+
 VOID
 MachInit(IN PCCH CommandLine)
 {
@@ -217,4 +223,5 @@ MachInit(IN PCCH CommandLine)
     MachVtbl.GetMemoryMap = ArmMemGetMemoryMap;
     MachVtbl.HwDetect = ArmHwDetect;
     MachVtbl.DiskGetBootPath = ArmDiskGetBootPath;
+    MachVtbl.HwIdle = ArmHwIdle;
 }
index 58298cf..279f1a4 100644 (file)
@@ -1731,4 +1731,28 @@ PcHwDetect(VOID)
   return SystemKey;
 }
 
+VOID
+PcHwIdle(VOID)
+{
+  REGS Regs;
+
+  /* Select APM 1.0+ function */
+  Regs.b.ah = 0x53;
+
+  /* Function 05h: CPU idle */
+  Regs.b.al = 0x05;
+
+  /* Call INT 15h */
+  Int386(0x15, &Regs, &Regs);
+
+  /* Check if successfull (CF set on error) */
+  if (INT386_SUCCESS(Regs))
+    return;
+
+  /*
+   * No futher processing here.
+   * Optionally implement HLT instruction handling.
+   */
+}
+
 /* EOF */
index 42d9232..9cbd719 100644 (file)
@@ -47,6 +47,7 @@ PcMachInit(const char *CmdLine)
     MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount;
     MachVtbl.GetTime = PcGetTime;
     MachVtbl.HwDetect = PcHwDetect;
+    MachVtbl.HwIdle = PcHwIdle;
 }
 
 VOID
index 704a7ae..dccd9a5 100644 (file)
@@ -53,6 +53,7 @@ XboxMachInit(const char *CmdLine)
   MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount;
   MachVtbl.GetTime = XboxGetTime;
   MachVtbl.HwDetect = XboxHwDetect;
+  MachVtbl.HwIdle = XboxHwIdle;
 
   /* Set LEDs to orange after init */
   XboxSetLED("oooo");
index 3fda993..4b8597f 100644 (file)
@@ -512,4 +512,9 @@ XboxHwDetect(VOID)
   return SystemKey;
 }
 
+VOID XboxHwIdle(VOID)
+{
+    /* UNIMPLEMENTED */
+}
+
 /* EOF */
index 9abd56b..fcf7208 100644 (file)
@@ -414,6 +414,12 @@ PCONFIGURATION_COMPONENT_DATA PpcHwDetect() {
     return RootKey;
 }
 
+VOID
+PpcHwIdle(VOID)
+{
+    /* UNIMPLEMENTED */
+}
+
 /* Compatibility functions that don't do much */
 VOID PpcVideoPrepareForReactOS(BOOLEAN Setup) {
 }
@@ -448,6 +454,7 @@ void PpcDefaultMachVtbl()
     MachVtbl.GetTime = PpcGetTime;
 
     MachVtbl.HwDetect = PpcHwDetect;
+    MachVtbl.HwIdle = PpcHwIdle;
 }
 
 void PpcOfwInit()
index 0491ff4..da37665 100644 (file)
@@ -118,6 +118,12 @@ PCONFIGURATION_COMPONENT_DATA PpcPrepHwDetect() {
   return SystemKey;
 }
 
+VOID
+PpcPrepHwIdle(VOID)
+{
+    /* UNIMPLEMENTED */
+}
+
 void PpcPrepInit()
 {
     MachVtbl.ConsPutChar = PpcPrepPutChar;
@@ -139,6 +145,7 @@ void PpcPrepInit()
 
     MachVtbl.GetMemoryMap = PpcPrepGetMemoryMap;
     MachVtbl.HwDetect = PpcPrepHwDetect;
+    MachVtbl.HwIdle = PcPrepHwIdle;
 
     printf( "FreeLDR version [%s]\n", GetFreeLoaderVersionString() );
 
index 8ce967d..26523ef 100644 (file)
@@ -59,6 +59,7 @@ ULONG XboxDiskGetCacheableBlockCount(UCHAR DriveNumber);
 TIMEINFO* XboxGetTime(VOID);
 
 PCONFIGURATION_COMPONENT_DATA XboxHwDetect(VOID);
+VOID XboxHwIdle(VOID);
 
 VOID XboxSetLED(PCSTR Pattern);
 
index 9fc3966..01adfec 100644 (file)
@@ -57,6 +57,7 @@ ULONG PcDiskGetCacheableBlockCount(UCHAR DriveNumber);
 TIMEINFO* PcGetTime(VOID);
 
 PCONFIGURATION_COMPONENT_DATA PcHwDetect(VOID);
+VOID PcHwIdle(VOID);
 
 extern BIOS_MEMORY_MAP PcBiosMemoryMap[];
 extern ULONG PcBiosMapCount;
index 9c3bfdc..ade4a21 100644 (file)
@@ -69,6 +69,7 @@ typedef struct tagMACHVTBL
   ULONG (*GetRelativeTime)(VOID);
 
   PCONFIGURATION_COMPONENT_DATA (*HwDetect)(VOID);
+  VOID (*HwIdle)(VOID);
 } MACHVTBL, *PMACHVTBL;
 
 VOID MachInit(const char *CmdLine);
@@ -97,6 +98,7 @@ BOOLEAN MachDiskReadLogicalSectors(UCHAR DriveNumber, ULONGLONG SectorNumber, UL
 BOOLEAN MachDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY DriveGeometry);
 ULONG MachDiskGetCacheableBlockCount(UCHAR DriveNumber);
 VOID MachPrepareForReactOS(IN BOOLEAN Setup);
+VOID MachHwIdle(VOID);
 
 #define MachConsPutChar(Ch)                    MachVtbl.ConsPutChar(Ch)
 #define MachConsKbHit()                                MachVtbl.ConsKbHit()
@@ -121,5 +123,6 @@ VOID MachPrepareForReactOS(IN BOOLEAN Setup);
 #define MachDiskGetDriveGeometry(Drive, Geom)  MachVtbl.DiskGetDriveGeometry((Drive), (Geom))
 #define MachDiskGetCacheableBlockCount(Drive)  MachVtbl.DiskGetCacheableBlockCount(Drive)
 #define MachHwDetect()                         MachVtbl.HwDetect()
+#define MachHwIdle()                           MachVtbl.HwIdle()
 
 /* EOF */
index 1dfb615..bb4f9e3 100644 (file)
@@ -624,6 +624,8 @@ VOID TuiMessageBoxCritical(PCSTR MessageText)
                TuiUpdateDateTime();
 
                VideoCopyOffScreenBufferToVRAM();
+
+               MachHwIdle();
        }
 
 }
@@ -944,6 +946,8 @@ BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
                TuiUpdateDateTime();
 
                VideoCopyOffScreenBufferToVRAM();
+
+               MachHwIdle();
        }
 
        // Hide the cursor again
index 00402df..4ade923 100644 (file)
@@ -119,6 +119,8 @@ TuiDisplayMenu(PCSTR MenuItemList[],
             //
             break;
         }
+
+        MachHwIdle();
     }
 
     //