[haiku-bugs] [Haiku] #5113: [PATCH] Warm boot for Bootloader

  • From: "Grey" <trac@xxxxxxxxxxxx>
  • Date: Sat, 12 Dec 2009 17:41:36 -0000

#5113: [PATCH] Warm boot for Bootloader
--------------------------------+-------------------------------------------
 Reporter:  Grey                |       Owner:  axeld    
     Type:  enhancement         |      Status:  new      
 Priority:  normal              |   Milestone:  R1       
Component:  System/Boot Loader  |     Version:  R1/alpha1
 Keywords:  Warm boot           |   Blockedby:           
 Platform:  x86                 |    Blocking:           
--------------------------------+-------------------------------------------
 This is small patch for bootloader. X86 only!
 Function war_boot() added to src/system/boot/platform/bios_ia32/bios.S
 Press 'W' or 'w' for warm boot.

 Index: src/system/boot/platform/bios_ia32/keyboard.h
 ===================================================================
 --- src/system/boot/platform/bios_ia32/keyboard.h       (revision 34640)
 +++ src/system/boot/platform/bios_ia32/keyboard.h       (working copy)
 @@ -29,6 +29,7 @@
  extern void clear_key_buffer(void);
  extern union key wait_for_key(void);
  extern uint32 check_for_boot_keys(void);
 +extern void warm_boot(void);

  #ifdef __cplusplus
  }
 Index: src/system/boot/platform/bios_ia32/bios.S
 ===================================================================
 --- src/system/boot/platform/bios_ia32/bios.S   (revision 34640)
 +++ src/system/boot/platform/bios_ia32/bios.S   (working copy)
 @@ -231,7 +231,49 @@
         ret

  //--------------------------------------------------------------
 +/** void warm_boot()
 + *     Warm booting computer via BIOS int 0x19. save_crx() have to be
 called before paging setup.
 + */
 +FUNCTION(warm_boot)
 +       cli
 +       movl    saved_cr0,%eax
 +       movl    %eax,%cr0
 +       movl    saved_cr3,%eax
 +       movl    %eax,%cr3
 +       movl    saved_cr4,%eax
 +       movl    %eax,%cr4
 +       lidt    saved_idt
 +       call    switch_to_real_mode
 +       .byte  0xCD
 +       .byte  0x19
 +       ret
 +//--------------------------------------------------------------
 +/** void save_crx()
 + *     Save CRx registers state. Required for warm_boot.
 + */
 +FUNCTION(save_crx)
 +       cli
 +       movl    %cr0,%eax
 +       movl    %eax,saved_cr0
 +       movl    %cr3,%eax
 +       movl    %eax,saved_cr3
 +       movl    %cr4,%eax
 +       movl    %eax,saved_cr4
 +       sidt    saved_idt
 +       ret
 +//--------------------------------------------------------------
 +       .p2align 4
 +saved_idt:
 +       .long   0x0
 +       .long   0x0
 +saved_cr0:
 +       .long   0x0
 +saved_cr3:
 +       .long   0x0
 +saved_cr4:
 +       .long   0x0

 +       .p2align 4
  .globl idt_descriptor
  idt_descriptor:
         .short  0x7ff                           // IDT at 0x0, default
 real mode location
 Index: src/system/boot/platform/bios_ia32/keyboard.cpp
 ===================================================================
 --- src/system/boot/platform/bios_ia32/keyboard.cpp     (revision 34640)
 +++ src/system/boot/platform/bios_ia32/keyboard.cpp     (working copy)
 @@ -69,6 +69,9 @@
                         case 0x1b:      // escape
                                 options |= BOOT_OPTION_DEBUG_OUTPUT;
                                 break;
 +                       case 'w':
 +                       case 'W':
 +                               warm_boot();
                         case 0:
                                 // evaluate BIOS scan codes
                                 // ...
 Index: src/system/boot/platform/bios_ia32/start.c
 ===================================================================
 --- src/system/boot/platform/bios_ia32/start.c  (revision 34640)
 +++ src/system/boot/platform/bios_ia32/start.c  (working copy)
 @@ -107,7 +107,6 @@
         out8(0xfe, 0x64);
  }

 -
  void
  _start(void)
  {
 @@ -126,6 +125,7 @@
         serial_init();
         console_init();
         cpu_init();
 +       save_crx();
         mmu_init();
         parse_multiboot_commandline(&args);

-- 
Ticket URL: <http://dev.haiku-os.org/ticket/5113>
Haiku <http://dev.haiku-os.org>
Haiku - the operating system.

Other related posts: