cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kexec.h (12431B)


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