kexec.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/kernel.h>
  3. #include <linux/console.h>
  4. #include <linux/kexec.h>
  5. #include <linux/delay.h>
  6. #include <linux/reboot.h>
  7. #include <asm/cacheflush.h>
  8. #include <asm/sections.h>
  9. extern void relocate_new_kernel(unsigned long head,
  10. unsigned long start,
  11. unsigned long phys);
  12. extern const unsigned int relocate_new_kernel_size;
  13. extern unsigned int kexec_initrd_start_offset;
  14. extern unsigned int kexec_initrd_end_offset;
  15. extern unsigned int kexec_cmdline_offset;
  16. extern unsigned int kexec_free_mem_offset;
  17. static void kexec_show_segment_info(const struct kimage *kimage,
  18. unsigned long n)
  19. {
  20. pr_debug(" segment[%lu]: %016lx - %016lx, 0x%lx bytes, %lu pages\n",
  21. n,
  22. kimage->segment[n].mem,
  23. kimage->segment[n].mem + kimage->segment[n].memsz,
  24. (unsigned long)kimage->segment[n].memsz,
  25. (unsigned long)kimage->segment[n].memsz / PAGE_SIZE);
  26. }
  27. static void kexec_image_info(const struct kimage *kimage)
  28. {
  29. unsigned long i;
  30. pr_debug("kexec kimage info:\n");
  31. pr_debug(" type: %d\n", kimage->type);
  32. pr_debug(" start: %lx\n", kimage->start);
  33. pr_debug(" head: %lx\n", kimage->head);
  34. pr_debug(" nr_segments: %lu\n", kimage->nr_segments);
  35. for (i = 0; i < kimage->nr_segments; i++)
  36. kexec_show_segment_info(kimage, i);
  37. #ifdef CONFIG_KEXEC_FILE
  38. if (kimage->file_mode) {
  39. pr_debug("cmdline: %.*s\n", (int)kimage->cmdline_buf_len,
  40. kimage->cmdline_buf);
  41. }
  42. #endif
  43. }
  44. void machine_kexec_cleanup(struct kimage *kimage)
  45. {
  46. }
  47. void machine_crash_shutdown(struct pt_regs *regs)
  48. {
  49. }
  50. void machine_shutdown(void)
  51. {
  52. smp_send_stop();
  53. while (num_online_cpus() > 1) {
  54. cpu_relax();
  55. mdelay(1);
  56. }
  57. }
  58. void machine_kexec(struct kimage *image)
  59. {
  60. #ifdef CONFIG_64BIT
  61. Elf64_Fdesc desc;
  62. #endif
  63. void (*reloc)(unsigned long head,
  64. unsigned long start,
  65. unsigned long phys);
  66. unsigned long phys = page_to_phys(image->control_code_page);
  67. void *virt = (void *)__fix_to_virt(FIX_TEXT_KEXEC);
  68. struct kimage_arch *arch = &image->arch;
  69. set_fixmap(FIX_TEXT_KEXEC, phys);
  70. flush_cache_all();
  71. #ifdef CONFIG_64BIT
  72. reloc = (void *)&desc;
  73. desc.addr = (long long)virt;
  74. #else
  75. reloc = (void *)virt;
  76. #endif
  77. memcpy(virt, dereference_function_descriptor(relocate_new_kernel),
  78. relocate_new_kernel_size);
  79. *(unsigned long *)(virt + kexec_cmdline_offset) = arch->cmdline;
  80. *(unsigned long *)(virt + kexec_initrd_start_offset) = arch->initrd_start;
  81. *(unsigned long *)(virt + kexec_initrd_end_offset) = arch->initrd_end;
  82. *(unsigned long *)(virt + kexec_free_mem_offset) = PAGE0->mem_free;
  83. flush_cache_all();
  84. flush_tlb_all();
  85. local_irq_disable();
  86. reloc(image->head & PAGE_MASK, image->start, phys);
  87. }
  88. int machine_kexec_prepare(struct kimage *image)
  89. {
  90. kexec_image_info(image);
  91. return 0;
  92. }