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

machine_kexec.c (1293B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * machine_kexec.c - handle transition of Linux booting another kernel
      4 */
      5#include <linux/compiler.h>
      6#include <linux/kexec.h>
      7#include <linux/mm.h>
      8#include <linux/delay.h>
      9
     10#include <asm/cacheflush.h>
     11#include <asm/page.h>
     12#include <asm/setup.h>
     13
     14extern const unsigned char relocate_new_kernel[];
     15extern const size_t relocate_new_kernel_size;
     16
     17int machine_kexec_prepare(struct kimage *kimage)
     18{
     19	return 0;
     20}
     21
     22void machine_kexec_cleanup(struct kimage *kimage)
     23{
     24}
     25
     26void machine_shutdown(void)
     27{
     28}
     29
     30void machine_crash_shutdown(struct pt_regs *regs)
     31{
     32}
     33
     34typedef void (*relocate_kernel_t)(unsigned long ptr,
     35				  unsigned long start,
     36				  unsigned long cpu_mmu_flags) __noreturn;
     37
     38void machine_kexec(struct kimage *image)
     39{
     40	void *reboot_code_buffer;
     41	unsigned long cpu_mmu_flags;
     42
     43	reboot_code_buffer = page_address(image->control_code_page);
     44
     45	memcpy(reboot_code_buffer, relocate_new_kernel,
     46	       relocate_new_kernel_size);
     47
     48	/*
     49	 * we do not want to be bothered.
     50	 */
     51	local_irq_disable();
     52
     53	pr_info("Will call new kernel at 0x%08lx. Bye...\n", image->start);
     54	__flush_cache_all();
     55	cpu_mmu_flags = m68k_cputype | m68k_mmutype << 8;
     56	((relocate_kernel_t) reboot_code_buffer)(image->head & PAGE_MASK,
     57						 image->start,
     58						 cpu_mmu_flags);
     59}