Ticket #5312: boot_menu.patch

File boot_menu.patch, 3.8 KB (added by Grey, 12 years ago)
  • src/system/boot/platform/bios_ia32/start.c

     
    101101
    102102
    103103void
     104platform_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
     126void
     127platform_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
     183void
    104184platform_exit(void)
    105185{
    106186    // reset the system using the keyboard controller
  • src/system/boot/loader/menu.cpp

     
    522522}
    523523
    524524
     525static bool
     526user_menu_warm_boot(Menu *menu, MenuItem *item)
     527{
     528    platform_warm_boot();
     529    return false;
     530}
     531
     532
     533static bool
     534user_menu_shutdown(Menu *menu, MenuItem *item)
     535{
     536    platform_shutdown();
     537    return false;
     538}
     539
     540
    525541status_t
    526542user_menu(Directory **_bootVolume)
    527543{
     
    542558    // Add platform dependent menus
    543559    platform_add_menus(menu);
    544560
    545     menu->AddSeparatorItem();
    546     if (*_bootVolume == NULL) {
    547         menu->AddItem(item = new(nothrow) MenuItem("Reboot"));
    548         item->SetTarget(user_menu_reboot);
    549     }
    550 
    551561    menu->AddItem(item = new(nothrow) MenuItem("Continue booting"));
    552562    if (*_bootVolume == NULL) {
    553563        item->SetEnabled(false);
    554564        menu->ItemAt(0)->Select(true);
    555565    }
    556566
     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
    557577    menu->Run();
    558578
    559579    // See if a new boot device has been selected, and propagate that back
  • headers/private/kernel/boot/platform.h

     
    4141extern void platform_switch_to_text_mode(void);
    4242extern void platform_start_kernel(void);
    4343extern void platform_exit(void);
     44extern void platform_shutdown(void);
     45extern void platform_warm_boot(void);
    4446
    4547#ifdef __cplusplus
    4648}