Ticket #5312: boot_menu.patch
File boot_menu.patch, 3.8 KB (added by , 13 years ago) |
---|
-
src/system/boot/platform/bios_ia32/start.c
101 101 102 102 103 103 void 104 platform_warm_boot(void) 105 { 106 asm( 107 " cli ;" 108 " movl $0x11, %eax ;" 109 " movl %eax, %cr0 ;" 110 " movl $0x0, %eax ;" 111 " movl %eax, %cr3 ;" 112 " movl $0x200, %eax ;" 113 " movl %eax, %cr4 ;" 114 " lidt saved_idt ;" 115 " call switch_to_real_mode ;" 116 " int $0x19 ;" 117 " .p2align 4 ;" 118 "saved_idt: ;" 119 " .short 0x7ff ;" 120 " .long 0x0 ;" 121 " .long 0x0 ;" 122 ); 123 } 124 125 126 void 127 platform_shutdown(void) 128 { 129 asm( 130 " cli ;" 131 " movl $0x11, %eax ;" 132 " movl %eax, %cr0 ;" 133 " movl $0x0, %eax ;" 134 " movl %eax, %cr3 ;" 135 " movl $0x200, %eax ;" 136 " movl %eax, %cr4 ;" 137 " lidt saved_idt ;" 138 " call switch_to_real_mode ;" 139 ".code16 ;" 140 //APM power off: 141 " mov $0x5304, %ax ;" //DISCONNECT INTERFACE 142 " xor %bx, %bx ;" 143 " int $0x15 ;" 144 145 " mov $0x5300, %ax ;" //INSTALLATION CHECK 146 " xor %bx, %bx ;" 147 " int $0x15 ;" 148 " push %ax ;" //save driver version 149 150 " mov $0x5301, %ax ;" //CONNECT REAL-MODE INTERFACE 151 " xor %bx, %bx ;" 152 " int $0x15 ;" 153 154 " mov $0x5308, %ax ;" //ENABLE POWER MANAGEMENT 155 " mov $1, %bx ;" 156 " mov $1, %cx ;" 157 " int $0x15 ;" 158 159 " mov $0x530E, %ax ;" //DRIVER VERSION 160 " xor %bx, %bx ;" 161 " pop %cx ;" 162 " int $0x15 ;" 163 164 " mov $0x530D, %ax ;" //ENABLE DEVICE POWER MANAGEMENT 165 " mov $1, %bx ;" 166 " mov $1, %cx ;" 167 " int $0x15 ;" 168 169 " mov $0x530F, %ax ;" //ENGAGE POWER MANAGEMENT 170 " mov $1, %bx ;" 171 " mov $1, %cx ;" 172 " int $0x15 ;" 173 174 " mov $0x5307,%ax ;" //TURN OFF SYSTEM 175 " mov $1, %bx ;" 176 " mov $3, %cx ;" 177 " int $0x15 ;" 178 ".code32 ;" 179 ); 180 } 181 182 183 void 104 184 platform_exit(void) 105 185 { 106 186 // reset the system using the keyboard controller -
src/system/boot/loader/menu.cpp
522 522 } 523 523 524 524 525 static bool 526 user_menu_warm_boot(Menu *menu, MenuItem *item) 527 { 528 platform_warm_boot(); 529 return false; 530 } 531 532 533 static bool 534 user_menu_shutdown(Menu *menu, MenuItem *item) 535 { 536 platform_shutdown(); 537 return false; 538 } 539 540 525 541 status_t 526 542 user_menu(Directory **_bootVolume) 527 543 { … … 542 558 // Add platform dependent menus 543 559 platform_add_menus(menu); 544 560 545 menu->AddSeparatorItem();546 if (*_bootVolume == NULL) {547 menu->AddItem(item = new(nothrow) MenuItem("Reboot"));548 item->SetTarget(user_menu_reboot);549 }550 551 561 menu->AddItem(item = new(nothrow) MenuItem("Continue booting")); 552 562 if (*_bootVolume == NULL) { 553 563 item->SetEnabled(false); 554 564 menu->ItemAt(0)->Select(true); 555 565 } 556 566 567 menu->AddSeparatorItem(); 568 menu->AddItem(item = new(nothrow) MenuItem("Reboot")); 569 item->SetTarget(user_menu_reboot); 570 571 menu->AddItem(item = new(nothrow) MenuItem("Fast Reboot")); 572 item->SetTarget(user_menu_warm_boot); 573 574 menu->AddItem(item = new(nothrow) MenuItem("Shutdown")); 575 item->SetTarget(user_menu_shutdown); 576 557 577 menu->Run(); 558 578 559 579 // See if a new boot device has been selected, and propagate that back -
headers/private/kernel/boot/platform.h
41 41 extern void platform_switch_to_text_mode(void); 42 42 extern void platform_start_kernel(void); 43 43 extern void platform_exit(void); 44 extern void platform_shutdown(void); 45 extern void platform_warm_boot(void); 44 46 45 47 #ifdef __cplusplus 46 48 }