[haiku-commits] r36311 - haiku/trunk/src/system/boot/platform/bios_ia32

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 15 Apr 2010 20:10:00 +0200 (CEST)

Author: axeld
Date: 2010-04-15 20:10:00 +0200 (Thu, 15 Apr 2010)
New Revision: 36311
Changeset: http://dev.haiku-os.org/changeset/36311/haiku

Modified:
   haiku/trunk/src/system/boot/platform/bios_ia32/menu.cpp
Log:
* Added warm reboot functionality based on a patch by Grey, thanks! It can be
  invoked using the 'w' key.
* Checking allocations doesn't hurt.
* Minor cleanup.


Modified: haiku/trunk/src/system/boot/platform/bios_ia32/menu.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/bios_ia32/menu.cpp     2010-04-15 
18:07:40 UTC (rev 36310)
+++ haiku/trunk/src/system/boot/platform/bios_ia32/menu.cpp     2010-04-15 
18:10:00 UTC (rev 36311)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004-2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Copyright 2004-2010, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
  * Distributed under the terms of the MIT License.
  */
 
@@ -12,42 +12,84 @@
 #include <safemode.h>
 
 
+static void
+warm_reboot(char key)
+{
+       asm("   cli                                             ;"
+               "       movl    $0x11, %eax             ;"
+               "       movl    %eax, %cr0              ;"
+               "       movl    $0x0, %eax              ;"
+               "       movl    %eax, %cr3              ;"
+               "       movl    $0x200, %eax    ;"
+               "       movl    %eax, %cr4              ;"
+               "       lidt    saved_idt               ;"
+               "       call    switch_to_real_mode     ;"
+               "       int     $0x19                           ;"
+               "       .p2align 4                              ;"
+               "saved_idt:                                     ;"
+               "       .short  0x7ff                   ;"
+               "       .long   0x0                             ;"
+               "       .long   0x0                             ;");
+}
+
+
 void
-platform_add_menus(Menu *menu)
+platform_add_menus(Menu* menu)
 {
-       MenuItem *item;
+       MenuItem* item;
 
        switch (menu->Type()) {
                case MAIN_MENU:
-                       menu->AddItem(item = new(nothrow) MenuItem("Select 
fail-safe video mode", video_mode_menu()));
-                       item->SetTarget(video_mode_hook);
+                       item = new(std::nothrow) MenuItem("Select fail-safe 
video mode",
+                               video_mode_menu());
+                       if (item != NULL) {
+                               menu->AddItem(item);
+                               item->SetTarget(video_mode_hook);
+                               item->SetShortcut('v');
+                       }
+
+                       menu->AddShortcut('w', warm_reboot);
                        break;
+
                case SAFE_MODE_MENU:
-                       menu->AddItem(item = new(nothrow) MenuItem("Use 
fail-safe video mode"));
-                       item->SetType(MENU_ITEM_MARKABLE);
-                       item->SetData(B_SAFEMODE_FAIL_SAFE_VIDEO_MODE);
-                       item->SetHelpText("The system will use VESA mode "
-                               "and won't try to use any video graphics 
drivers.");
+                       item = new(std::nothrow) MenuItem("Use fail-safe video 
mode");
+                       if (item != NULL) {
+                               menu->AddItem(item);
+                               item->SetType(MENU_ITEM_MARKABLE);
+                               item->SetData(B_SAFEMODE_FAIL_SAFE_VIDEO_MODE);
+                               item->SetHelpText("The system will use VESA 
mode "
+                                       "and won't try to use any video 
graphics drivers.");
+                       }
 
                        smp_add_safemode_menus(menu);
 
-                       menu->AddItem(item = new(nothrow) MenuItem("Don't call 
the BIOS"));
-                       item->SetHelpText("Stops the system from calling BIOS 
functions.");
-                       item->SetType(MENU_ITEM_MARKABLE);
+                       item = new(std::nothrow) MenuItem("Don't call the 
BIOS");
+                       if (item != NULL) {
+                               menu->AddItem(item);
+                               item->SetHelpText("Stops the system from 
calling BIOS "
+                                       "functions.");
+                               item->SetType(MENU_ITEM_MARKABLE);
+                       }
 
-                       menu->AddItem(item = new(nothrow) MenuItem("Disable 
APM"));
-                       item->SetType(MENU_ITEM_MARKABLE);
-                       item->SetData(B_SAFEMODE_DISABLE_APM);
-                       item->SetHelpText("Disables Advanced Power Management 
hardware "
-                               "support, overriding the APM setting in the 
kernel settings "
-                               "file.");
+                       item = new(std::nothrow) MenuItem("Disable APM");
+                       if (item != NULL) {
+                               menu->AddItem(item);
+                               item->SetType(MENU_ITEM_MARKABLE);
+                               item->SetData(B_SAFEMODE_DISABLE_APM);
+                               item->SetHelpText("Disables Advanced Power 
Management hardware "
+                                       "support, overriding the APM setting in 
the kernel "
+                                       "settings file.");
+                       }
 
-                       menu->AddItem(item = new(nothrow) MenuItem("Disable 
ACPI"));
-                       item->SetType(MENU_ITEM_MARKABLE);
-                       item->SetData(B_SAFEMODE_DISABLE_ACPI);
-                       item->SetHelpText("Disables Advanced Configuration and 
Power "
-                               "Interface hardware support, overriding the 
ACPI setting "
-                               "in the kernel settings file.");
+                       item = new(std::nothrow) MenuItem("Disable ACPI");
+                       if (item != NULL) {
+                               menu->AddItem(item);
+                               item->SetType(MENU_ITEM_MARKABLE);
+                               item->SetData(B_SAFEMODE_DISABLE_ACPI);
+                               item->SetHelpText("Disables Advanced 
Configuration and Power "
+                                       "Interface hardware support, overriding 
the ACPI setting "
+                                       "in the kernel settings file.");
+                       }
                        break;
 
                default:
@@ -57,14 +99,14 @@
 
 
 void
-platform_update_menu_item(Menu *menu, MenuItem *item)
+platform_update_menu_item(Menu* menu, MenuItem* item)
 {
        platform_generic_update_text_menu_item(menu, item);
 }
 
 
 void
-platform_run_menu(Menu *menu)
+platform_run_menu(Menu* menu)
 {
        platform_generic_run_text_menu(menu);
 }


Other related posts:

  • » [haiku-commits] r36311 - haiku/trunk/src/system/boot/platform/bios_ia32 - axeld