LCOV - code coverage report
Current view: top level - include/linux - kexec.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 1 3 33.3 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0 */
       2             : #ifndef LINUX_KEXEC_H
       3             : #define LINUX_KEXEC_H
       4             : 
       5             : #define IND_DESTINATION_BIT 0
       6             : #define IND_INDIRECTION_BIT 1
       7             : #define IND_DONE_BIT        2
       8             : #define IND_SOURCE_BIT      3
       9             : 
      10             : #define IND_DESTINATION  (1 << IND_DESTINATION_BIT)
      11             : #define IND_INDIRECTION  (1 << IND_INDIRECTION_BIT)
      12             : #define IND_DONE         (1 << IND_DONE_BIT)
      13             : #define IND_SOURCE       (1 << IND_SOURCE_BIT)
      14             : #define IND_FLAGS (IND_DESTINATION | IND_INDIRECTION | IND_DONE | IND_SOURCE)
      15             : 
      16             : #if !defined(__ASSEMBLY__)
      17             : 
      18             : #include <linux/crash_core.h>
      19             : #include <asm/io.h>
      20             : 
      21             : #include <uapi/linux/kexec.h>
      22             : 
      23             : #ifdef CONFIG_KEXEC_CORE
      24             : #include <linux/list.h>
      25             : #include <linux/compat.h>
      26             : #include <linux/ioport.h>
      27             : #include <linux/module.h>
      28             : #include <asm/kexec.h>
      29             : 
      30             : /* Verify architecture specific macros are defined */
      31             : 
      32             : #ifndef KEXEC_SOURCE_MEMORY_LIMIT
      33             : #error KEXEC_SOURCE_MEMORY_LIMIT not defined
      34             : #endif
      35             : 
      36             : #ifndef KEXEC_DESTINATION_MEMORY_LIMIT
      37             : #error KEXEC_DESTINATION_MEMORY_LIMIT not defined
      38             : #endif
      39             : 
      40             : #ifndef KEXEC_CONTROL_MEMORY_LIMIT
      41             : #error KEXEC_CONTROL_MEMORY_LIMIT not defined
      42             : #endif
      43             : 
      44             : #ifndef KEXEC_CONTROL_MEMORY_GFP
      45             : #define KEXEC_CONTROL_MEMORY_GFP (GFP_KERNEL | __GFP_NORETRY)
      46             : #endif
      47             : 
      48             : #ifndef KEXEC_CONTROL_PAGE_SIZE
      49             : #error KEXEC_CONTROL_PAGE_SIZE not defined
      50             : #endif
      51             : 
      52             : #ifndef KEXEC_ARCH
      53             : #error KEXEC_ARCH not defined
      54             : #endif
      55             : 
      56             : #ifndef KEXEC_CRASH_CONTROL_MEMORY_LIMIT
      57             : #define KEXEC_CRASH_CONTROL_MEMORY_LIMIT KEXEC_CONTROL_MEMORY_LIMIT
      58             : #endif
      59             : 
      60             : #ifndef KEXEC_CRASH_MEM_ALIGN
      61             : #define KEXEC_CRASH_MEM_ALIGN PAGE_SIZE
      62             : #endif
      63             : 
      64             : #define KEXEC_CORE_NOTE_NAME    CRASH_CORE_NOTE_NAME
      65             : 
      66             : /*
      67             :  * This structure is used to hold the arguments that are used when loading
      68             :  * kernel binaries.
      69             :  */
      70             : 
      71             : typedef unsigned long kimage_entry_t;
      72             : 
      73             : struct kexec_segment {
      74             :         /*
      75             :          * This pointer can point to user memory if kexec_load() system
      76             :          * call is used or will point to kernel memory if
      77             :          * kexec_file_load() system call is used.
      78             :          *
      79             :          * Use ->buf when expecting to deal with user memory and use ->kbuf
      80             :          * when expecting to deal with kernel memory.
      81             :          */
      82             :         union {
      83             :                 void __user *buf;
      84             :                 void *kbuf;
      85             :         };
      86             :         size_t bufsz;
      87             :         unsigned long mem;
      88             :         size_t memsz;
      89             : };
      90             : 
      91             : #ifdef CONFIG_COMPAT
      92             : struct compat_kexec_segment {
      93             :         compat_uptr_t buf;
      94             :         compat_size_t bufsz;
      95             :         compat_ulong_t mem;     /* User space sees this as a (void *) ... */
      96             :         compat_size_t memsz;
      97             : };
      98             : #endif
      99             : 
     100             : #ifdef CONFIG_KEXEC_FILE
     101             : struct purgatory_info {
     102             :         /*
     103             :          * Pointer to elf header at the beginning of kexec_purgatory.
     104             :          * Note: kexec_purgatory is read only
     105             :          */
     106             :         const Elf_Ehdr *ehdr;
     107             :         /*
     108             :          * Temporary, modifiable buffer for sechdrs used for relocation.
     109             :          * This memory can be freed post image load.
     110             :          */
     111             :         Elf_Shdr *sechdrs;
     112             :         /*
     113             :          * Temporary, modifiable buffer for stripped purgatory used for
     114             :          * relocation. This memory can be freed post image load.
     115             :          */
     116             :         void *purgatory_buf;
     117             : };
     118             : 
     119             : struct kimage;
     120             : 
     121             : typedef int (kexec_probe_t)(const char *kernel_buf, unsigned long kernel_size);
     122             : typedef void *(kexec_load_t)(struct kimage *image, char *kernel_buf,
     123             :                              unsigned long kernel_len, char *initrd,
     124             :                              unsigned long initrd_len, char *cmdline,
     125             :                              unsigned long cmdline_len);
     126             : typedef int (kexec_cleanup_t)(void *loader_data);
     127             : 
     128             : #ifdef CONFIG_KEXEC_SIG
     129             : typedef int (kexec_verify_sig_t)(const char *kernel_buf,
     130             :                                  unsigned long kernel_len);
     131             : #endif
     132             : 
     133             : struct kexec_file_ops {
     134             :         kexec_probe_t *probe;
     135             :         kexec_load_t *load;
     136             :         kexec_cleanup_t *cleanup;
     137             : #ifdef CONFIG_KEXEC_SIG
     138             :         kexec_verify_sig_t *verify_sig;
     139             : #endif
     140             : };
     141             : 
     142             : extern const struct kexec_file_ops * const kexec_file_loaders[];
     143             : 
     144             : int kexec_image_probe_default(struct kimage *image, void *buf,
     145             :                               unsigned long buf_len);
     146             : int kexec_image_post_load_cleanup_default(struct kimage *image);
     147             : 
     148             : /*
     149             :  * If kexec_buf.mem is set to this value, kexec_locate_mem_hole()
     150             :  * will try to allocate free memory. Arch may overwrite it.
     151             :  */
     152             : #ifndef KEXEC_BUF_MEM_UNKNOWN
     153             : #define KEXEC_BUF_MEM_UNKNOWN 0
     154             : #endif
     155             : 
     156             : /**
     157             :  * struct kexec_buf - parameters for finding a place for a buffer in memory
     158             :  * @image:      kexec image in which memory to search.
     159             :  * @buffer:     Contents which will be copied to the allocated memory.
     160             :  * @bufsz:      Size of @buffer.
     161             :  * @mem:        On return will have address of the buffer in memory.
     162             :  * @memsz:      Size for the buffer in memory.
     163             :  * @buf_align:  Minimum alignment needed.
     164             :  * @buf_min:    The buffer can't be placed below this address.
     165             :  * @buf_max:    The buffer can't be placed above this address.
     166             :  * @top_down:   Allocate from top of memory.
     167             :  */
     168             : struct kexec_buf {
     169             :         struct kimage *image;
     170             :         void *buffer;
     171             :         unsigned long bufsz;
     172             :         unsigned long mem;
     173             :         unsigned long memsz;
     174             :         unsigned long buf_align;
     175             :         unsigned long buf_min;
     176             :         unsigned long buf_max;
     177             :         bool top_down;
     178             : };
     179             : 
     180             : int kexec_load_purgatory(struct kimage *image, struct kexec_buf *kbuf);
     181             : int kexec_purgatory_get_set_symbol(struct kimage *image, const char *name,
     182             :                                    void *buf, unsigned int size,
     183             :                                    bool get_value);
     184             : void *kexec_purgatory_get_symbol_addr(struct kimage *image, const char *name);
     185             : 
     186             : /* Architectures may override the below functions */
     187             : int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
     188             :                                   unsigned long buf_len);
     189             : void *arch_kexec_kernel_image_load(struct kimage *image);
     190             : int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
     191             :                                      Elf_Shdr *section,
     192             :                                      const Elf_Shdr *relsec,
     193             :                                      const Elf_Shdr *symtab);
     194             : int arch_kexec_apply_relocations(struct purgatory_info *pi,
     195             :                                  Elf_Shdr *section,
     196             :                                  const Elf_Shdr *relsec,
     197             :                                  const Elf_Shdr *symtab);
     198             : int arch_kimage_file_post_load_cleanup(struct kimage *image);
     199             : #ifdef CONFIG_KEXEC_SIG
     200             : int arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
     201             :                                  unsigned long buf_len);
     202             : #endif
     203             : int arch_kexec_locate_mem_hole(struct kexec_buf *kbuf);
     204             : 
     205             : extern int kexec_add_buffer(struct kexec_buf *kbuf);
     206             : int kexec_locate_mem_hole(struct kexec_buf *kbuf);
     207             : 
     208             : /* Alignment required for elf header segment */
     209             : #define ELF_CORE_HEADER_ALIGN   4096
     210             : 
     211             : struct crash_mem_range {
     212             :         u64 start, end;
     213             : };
     214             : 
     215             : struct crash_mem {
     216             :         unsigned int max_nr_ranges;
     217             :         unsigned int nr_ranges;
     218             :         struct crash_mem_range ranges[];
     219             : };
     220             : 
     221             : extern int crash_exclude_mem_range(struct crash_mem *mem,
     222             :                                    unsigned long long mstart,
     223             :                                    unsigned long long mend);
     224             : extern int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
     225             :                                        void **addr, unsigned long *sz);
     226             : #endif /* CONFIG_KEXEC_FILE */
     227             : 
     228             : #ifdef CONFIG_KEXEC_ELF
     229             : struct kexec_elf_info {
     230             :         /*
     231             :          * Where the ELF binary contents are kept.
     232             :          * Memory managed by the user of the struct.
     233             :          */
     234             :         const char *buffer;
     235             : 
     236             :         const struct elfhdr *ehdr;
     237             :         const struct elf_phdr *proghdrs;
     238             : };
     239             : 
     240             : int kexec_build_elf_info(const char *buf, size_t len, struct elfhdr *ehdr,
     241             :                                struct kexec_elf_info *elf_info);
     242             : 
     243             : int kexec_elf_load(struct kimage *image, struct elfhdr *ehdr,
     244             :                          struct kexec_elf_info *elf_info,
     245             :                          struct kexec_buf *kbuf,
     246             :                          unsigned long *lowest_load_addr);
     247             : 
     248             : void kexec_free_elf_info(struct kexec_elf_info *elf_info);
     249             : int kexec_elf_probe(const char *buf, unsigned long len);
     250             : #endif
     251             : struct kimage {
     252             :         kimage_entry_t head;
     253             :         kimage_entry_t *entry;
     254             :         kimage_entry_t *last_entry;
     255             : 
     256             :         unsigned long start;
     257             :         struct page *control_code_page;
     258             :         struct page *swap_page;
     259             :         void *vmcoreinfo_data_copy; /* locates in the crash memory */
     260             : 
     261             :         unsigned long nr_segments;
     262             :         struct kexec_segment segment[KEXEC_SEGMENT_MAX];
     263             : 
     264             :         struct list_head control_pages;
     265             :         struct list_head dest_pages;
     266             :         struct list_head unusable_pages;
     267             : 
     268             :         /* Address of next control page to allocate for crash kernels. */
     269             :         unsigned long control_page;
     270             : 
     271             :         /* Flags to indicate special processing */
     272             :         unsigned int type : 1;
     273             : #define KEXEC_TYPE_DEFAULT 0
     274             : #define KEXEC_TYPE_CRASH   1
     275             :         unsigned int preserve_context : 1;
     276             :         /* If set, we are using file mode kexec syscall */
     277             :         unsigned int file_mode:1;
     278             : 
     279             : #ifdef ARCH_HAS_KIMAGE_ARCH
     280             :         struct kimage_arch arch;
     281             : #endif
     282             : 
     283             : #ifdef CONFIG_KEXEC_FILE
     284             :         /* Additional fields for file based kexec syscall */
     285             :         void *kernel_buf;
     286             :         unsigned long kernel_buf_len;
     287             : 
     288             :         void *initrd_buf;
     289             :         unsigned long initrd_buf_len;
     290             : 
     291             :         char *cmdline_buf;
     292             :         unsigned long cmdline_buf_len;
     293             : 
     294             :         /* File operations provided by image loader */
     295             :         const struct kexec_file_ops *fops;
     296             : 
     297             :         /* Image loader handling the kernel can store a pointer here */
     298             :         void *image_loader_data;
     299             : 
     300             :         /* Information for loading purgatory */
     301             :         struct purgatory_info purgatory_info;
     302             : #endif
     303             : 
     304             : #ifdef CONFIG_IMA_KEXEC
     305             :         /* Virtual address of IMA measurement buffer for kexec syscall */
     306             :         void *ima_buffer;
     307             : #endif
     308             : };
     309             : 
     310             : /* kexec interface functions */
     311             : extern void machine_kexec(struct kimage *image);
     312             : extern int machine_kexec_prepare(struct kimage *image);
     313             : extern void machine_kexec_cleanup(struct kimage *image);
     314             : extern int kernel_kexec(void);
     315             : extern struct page *kimage_alloc_control_pages(struct kimage *image,
     316             :                                                 unsigned int order);
     317             : int machine_kexec_post_load(struct kimage *image);
     318             : 
     319             : extern void __crash_kexec(struct pt_regs *);
     320             : extern void crash_kexec(struct pt_regs *);
     321             : int kexec_should_crash(struct task_struct *);
     322             : int kexec_crash_loaded(void);
     323             : void crash_save_cpu(struct pt_regs *regs, int cpu);
     324             : extern int kimage_crash_copy_vmcoreinfo(struct kimage *image);
     325             : 
     326             : extern struct kimage *kexec_image;
     327             : extern struct kimage *kexec_crash_image;
     328             : extern int kexec_load_disabled;
     329             : 
     330             : #ifndef kexec_flush_icache_page
     331             : #define kexec_flush_icache_page(page)
     332             : #endif
     333             : 
     334             : /* List of defined/legal kexec flags */
     335             : #ifndef CONFIG_KEXEC_JUMP
     336             : #define KEXEC_FLAGS    KEXEC_ON_CRASH
     337             : #else
     338             : #define KEXEC_FLAGS    (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)
     339             : #endif
     340             : 
     341             : /* List of defined/legal kexec file flags */
     342             : #define KEXEC_FILE_FLAGS        (KEXEC_FILE_UNLOAD | KEXEC_FILE_ON_CRASH | \
     343             :                                  KEXEC_FILE_NO_INITRAMFS)
     344             : 
     345             : /* Location of a reserved region to hold the crash kernel.
     346             :  */
     347             : extern struct resource crashk_res;
     348             : extern struct resource crashk_low_res;
     349             : extern note_buf_t __percpu *crash_notes;
     350             : 
     351             : /* flag to track if kexec reboot is in progress */
     352             : extern bool kexec_in_progress;
     353             : 
     354             : int crash_shrink_memory(unsigned long new_size);
     355             : size_t crash_get_memory_size(void);
     356             : void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
     357             : 
     358             : void arch_kexec_protect_crashkres(void);
     359             : void arch_kexec_unprotect_crashkres(void);
     360             : 
     361             : #ifndef page_to_boot_pfn
     362             : static inline unsigned long page_to_boot_pfn(struct page *page)
     363             : {
     364             :         return page_to_pfn(page);
     365             : }
     366             : #endif
     367             : 
     368             : #ifndef boot_pfn_to_page
     369             : static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
     370             : {
     371             :         return pfn_to_page(boot_pfn);
     372             : }
     373             : #endif
     374             : 
     375             : #ifndef phys_to_boot_phys
     376             : static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
     377             : {
     378             :         return phys;
     379             : }
     380             : #endif
     381             : 
     382             : #ifndef boot_phys_to_phys
     383             : static inline phys_addr_t boot_phys_to_phys(unsigned long boot_phys)
     384             : {
     385             :         return boot_phys;
     386             : }
     387             : #endif
     388             : 
     389             : static inline unsigned long virt_to_boot_phys(void *addr)
     390             : {
     391             :         return phys_to_boot_phys(__pa((unsigned long)addr));
     392             : }
     393             : 
     394             : static inline void *boot_phys_to_virt(unsigned long entry)
     395             : {
     396             :         return phys_to_virt(boot_phys_to_phys(entry));
     397             : }
     398             : 
     399             : #ifndef arch_kexec_post_alloc_pages
     400             : static inline int arch_kexec_post_alloc_pages(void *vaddr, unsigned int pages, gfp_t gfp) { return 0; }
     401             : #endif
     402             : 
     403             : #ifndef arch_kexec_pre_free_pages
     404             : static inline void arch_kexec_pre_free_pages(void *vaddr, unsigned int pages) { }
     405             : #endif
     406             : 
     407             : #else /* !CONFIG_KEXEC_CORE */
     408             : struct pt_regs;
     409             : struct task_struct;
     410           0 : static inline void __crash_kexec(struct pt_regs *regs) { }
     411             : static inline void crash_kexec(struct pt_regs *regs) { }
     412           0 : static inline int kexec_should_crash(struct task_struct *p) { return 0; }
     413           1 : static inline int kexec_crash_loaded(void) { return 0; }
     414             : #define kexec_in_progress false
     415             : #endif /* CONFIG_KEXEC_CORE */
     416             : 
     417             : #endif /* !defined(__ASSEBMLY__) */
     418             : 
     419             : #endif /* LINUX_KEXEC_H */

Generated by: LCOV version 1.14