linux/arch/arm/include/asm/kexec.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ARM_KEXEC_H
   3#define _ARM_KEXEC_H
   4
   5#ifdef CONFIG_KEXEC
   6
   7/* Maximum physical address we can use pages from */
   8#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
   9/* Maximum address we can reach in physical address mode */
  10#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
  11/* Maximum address we can use for the control code buffer */
  12#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
  13
  14#define KEXEC_CONTROL_PAGE_SIZE 4096
  15
  16#define KEXEC_ARCH KEXEC_ARCH_ARM
  17
  18#define KEXEC_ARM_ATAGS_OFFSET  0x1000
  19#define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
  20
  21#ifndef __ASSEMBLY__
  22
  23#define ARCH_HAS_KIMAGE_ARCH
  24struct kimage_arch {
  25        u32 kernel_r2;
  26};
  27
  28/**
  29 * crash_setup_regs() - save registers for the panic kernel
  30 * @newregs: registers are saved here
  31 * @oldregs: registers to be saved (may be %NULL)
  32 *
  33 * Function copies machine registers from @oldregs to @newregs. If @oldregs is
  34 * %NULL then current registers are stored there.
  35 */
  36static inline void crash_setup_regs(struct pt_regs *newregs,
  37                                    struct pt_regs *oldregs)
  38{
  39        if (oldregs) {
  40                memcpy(newregs, oldregs, sizeof(*newregs));
  41        } else {
  42                __asm__ __volatile__ (
  43                        "stmia  %[regs_base], {r0-r12}\n\t"
  44                        "mov    %[_ARM_sp], sp\n\t"
  45                        "str    lr, %[_ARM_lr]\n\t"
  46                        "adr    %[_ARM_pc], 1f\n\t"
  47                        "mrs    %[_ARM_cpsr], cpsr\n\t"
  48                "1:"
  49                        : [_ARM_pc] "=r" (newregs->ARM_pc),
  50                          [_ARM_cpsr] "=r" (newregs->ARM_cpsr),
  51                          [_ARM_sp] "=r" (newregs->ARM_sp),
  52                          [_ARM_lr] "=o" (newregs->ARM_lr)
  53                        : [regs_base] "r" (&newregs->ARM_r0)
  54                        : "memory"
  55                );
  56        }
  57}
  58
  59/* Function pointer to optional machine-specific reinitialization */
  60extern void (*kexec_reinit)(void);
  61
  62static inline unsigned long phys_to_boot_phys(phys_addr_t phys)
  63{
  64        return phys_to_idmap(phys);
  65}
  66#define phys_to_boot_phys phys_to_boot_phys
  67
  68static inline phys_addr_t boot_phys_to_phys(unsigned long entry)
  69{
  70        return idmap_to_phys(entry);
  71}
  72#define boot_phys_to_phys boot_phys_to_phys
  73
  74static inline unsigned long page_to_boot_pfn(struct page *page)
  75{
  76        return page_to_pfn(page) + (arch_phys_to_idmap_offset >> PAGE_SHIFT);
  77}
  78#define page_to_boot_pfn page_to_boot_pfn
  79
  80static inline struct page *boot_pfn_to_page(unsigned long boot_pfn)
  81{
  82        return pfn_to_page(boot_pfn - (arch_phys_to_idmap_offset >> PAGE_SHIFT));
  83}
  84#define boot_pfn_to_page boot_pfn_to_page
  85
  86#endif /* __ASSEMBLY__ */
  87
  88#endif /* CONFIG_KEXEC */
  89
  90#endif /* _ARM_KEXEC_H */
  91