xref: /haiku/src/system/boot/platform/bios_ia32/menu.cpp (revision 32753ae9b5e96d3b5abb4cc4b9927eb6d3cb5d84)
1 /*
2  * Copyright 2004-2010, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "smp.h"
8 #include "video.h"
9 
10 #include <boot/menu.h>
11 #include <boot/platform/generic/text_menu.h>
12 #include <safemode.h>
13 
14 
15 static void
16 warm_reboot(char key)
17 {
18 	asm("	cli						;"
19 		"	movl	$0x11, %eax		;"
20 		"	movl	%eax, %cr0		;"
21 		"	movl	$0x0, %eax		;"
22 		"	movl	%eax, %cr3		;"
23 		"	movl	$0x200, %eax	;"
24 		"	movl	%eax, %cr4		;"
25 		"	lidt	saved_idt		;"
26 		"	call	switch_to_real_mode	;"
27 		"	int	$0x19				;"
28 		"	.p2align 4				;"
29 		"saved_idt:					;"
30 		"	.short	0x7ff			;"
31 		"	.long	0x0				;"
32 		"	.long	0x0				;");
33 }
34 
35 
36 void
37 platform_add_menus(Menu* menu)
38 {
39 	MenuItem* item;
40 
41 	switch (menu->Type()) {
42 		case MAIN_MENU:
43 			item = new(std::nothrow) MenuItem("Select fail-safe video mode",
44 				video_mode_menu());
45 			if (item != NULL) {
46 				menu->AddItem(item);
47 				item->SetTarget(video_mode_hook);
48 				item->SetShortcut('v');
49 			}
50 
51 			menu->AddShortcut('w', warm_reboot);
52 			break;
53 
54 		case SAFE_MODE_MENU:
55 			item = new(std::nothrow) MenuItem("Use fail-safe video mode");
56 			if (item != NULL) {
57 				menu->AddItem(item);
58 				item->SetType(MENU_ITEM_MARKABLE);
59 				item->SetData(B_SAFEMODE_FAIL_SAFE_VIDEO_MODE);
60 				item->SetHelpText("The system will use VESA mode "
61 					"and won't try to use any video graphics drivers.");
62 			}
63 
64 			smp_add_safemode_menus(menu);
65 
66 			item = new(std::nothrow) MenuItem("Don't call the BIOS");
67 			if (item != NULL) {
68 				menu->AddItem(item);
69 				item->SetHelpText("Stops the system from calling BIOS "
70 					"functions.");
71 				item->SetType(MENU_ITEM_MARKABLE);
72 			}
73 
74 			item = new(std::nothrow) MenuItem("Disable APM");
75 			if (item != NULL) {
76 				menu->AddItem(item);
77 				item->SetType(MENU_ITEM_MARKABLE);
78 				item->SetData(B_SAFEMODE_DISABLE_APM);
79 				item->SetHelpText("Disables Advanced Power Management hardware "
80 					"support, overriding the APM setting in the kernel "
81 					"settings file.");
82 			}
83 
84 			item = new(std::nothrow) MenuItem("Disable ACPI");
85 			if (item != NULL) {
86 				menu->AddItem(item);
87 				item->SetType(MENU_ITEM_MARKABLE);
88 				item->SetData(B_SAFEMODE_DISABLE_ACPI);
89 				item->SetHelpText("Disables Advanced Configuration and Power "
90 					"Interface hardware support, overriding the ACPI setting "
91 					"in the kernel settings file.");
92 			}
93 			break;
94 
95 		default:
96 			break;
97 	}
98 }
99 
100 
101 void
102 platform_update_menu_item(Menu* menu, MenuItem* item)
103 {
104 	platform_generic_update_text_menu_item(menu, item);
105 }
106 
107 
108 void
109 platform_run_menu(Menu* menu)
110 {
111 	platform_generic_run_text_menu(menu);
112 }
113 
114