]>
cvs.zerfleddert.de Git - ms2-kexec/blob - machine_kexec.c
598ca61e7bca8496a853128a433dc7d1dfba0edf
   2  * machine_kexec.c - handle transition of Linux booting another kernel 
   6 #include <linux/kexec.h> 
   7 #include <linux/delay.h> 
   8 #include <linux/reboot.h> 
  10 #include <asm/pgtable.h> 
  11 #include <asm/pgalloc.h> 
  12 #include <asm/mmu_context.h> 
  13 #include <asm/cacheflush.h> 
  14 #include <asm/mach-types.h> 
  16 extern const unsigned char relocate_new_kernel
[]; 
  17 extern const unsigned int relocate_new_kernel_size
; 
  19 extern void setup_mm_for_reboot(char mode
); 
  21 extern unsigned long kexec_start_address
; 
  22 extern unsigned long kexec_indirection_page
; 
  23 extern unsigned long kexec_mach_type
; 
  24 extern unsigned long kexec_boot_atags
; 
  27  * Provide a dummy crash_notes definition while crash dump arrives to arm. 
  28  * This prevents breakage of crash_notes attribute in kernel/ksysfs.c. 
  31 int machine_kexec_prepare(struct kimage 
*image
) 
  36 void machine_kexec_cleanup(struct kimage 
*image
) 
  40 void machine_shutdown(void) 
  44 void machine_crash_shutdown(struct pt_regs 
*regs
) 
  48 void machine_kexec(struct kimage 
*image
) 
  50         unsigned long page_list
; 
  51         unsigned long reboot_code_buffer_phys
; 
  52         void *reboot_code_buffer
; 
  55         page_list 
= image
->head 
& PAGE_MASK
; 
  57         /* we need both effective and real address here */ 
  58         reboot_code_buffer_phys 
= 
  59             page_to_pfn(image
->control_code_page
) << PAGE_SHIFT
; 
  60         reboot_code_buffer 
= page_address(image
->control_code_page
); 
  62         /* Prepare parameters for reboot_code_buffer*/ 
  63         kexec_start_address 
= image
->start
; 
  64         kexec_indirection_page 
= page_list
; 
  65         kexec_mach_type 
= machine_arch_type
; 
  66         kexec_boot_atags 
= image
->start 
- KEXEC_ARM_ZIMAGE_OFFSET 
+ KEXEC_ARM_ATAGS_OFFSET
; 
  68         /* copy our kernel relocation code to the control code page */ 
  69         memcpy(reboot_code_buffer
, 
  70                relocate_new_kernel
, relocate_new_kernel_size
); 
  73         flush_icache_range((unsigned long) reboot_code_buffer
, 
  74                            (unsigned long) reboot_code_buffer 
+ KEXEC_CONTROL_PAGE_SIZE
); 
  75         printk(KERN_INFO 
"Bye!\n"); 
  78         setup_mm_for_reboot(0); /* mode is not used, so just pass 0*/ 
  79         cpu_reset(reboot_code_buffer_phys
);