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

reset.c (1766B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
      4 */
      5#include <linux/kernel.h>
      6#include <linux/acpi.h>
      7#include <linux/efi.h>
      8#include <linux/export.h>
      9#include <linux/pm.h>
     10#include <linux/types.h>
     11#include <linux/reboot.h>
     12#include <linux/delay.h>
     13#include <linux/console.h>
     14
     15#include <acpi/reboot.h>
     16#include <asm/compiler.h>
     17#include <asm/idle.h>
     18#include <asm/loongarch.h>
     19#include <asm/reboot.h>
     20
     21static void default_halt(void)
     22{
     23	local_irq_disable();
     24	clear_csr_ecfg(ECFG0_IM);
     25
     26	pr_notice("\n\n** You can safely turn off the power now **\n\n");
     27	console_flush_on_panic(CONSOLE_FLUSH_PENDING);
     28
     29	while (true) {
     30		__arch_cpu_idle();
     31	}
     32}
     33
     34static void default_poweroff(void)
     35{
     36#ifdef CONFIG_EFI
     37	efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
     38#endif
     39	while (true) {
     40		__arch_cpu_idle();
     41	}
     42}
     43
     44static void default_restart(void)
     45{
     46#ifdef CONFIG_EFI
     47	if (efi_capsule_pending(NULL))
     48		efi_reboot(REBOOT_WARM, NULL);
     49	else
     50		efi_reboot(REBOOT_COLD, NULL);
     51#endif
     52	if (!acpi_disabled)
     53		acpi_reboot();
     54
     55	while (true) {
     56		__arch_cpu_idle();
     57	}
     58}
     59
     60void (*pm_restart)(void);
     61EXPORT_SYMBOL(pm_restart);
     62
     63void (*pm_power_off)(void);
     64EXPORT_SYMBOL(pm_power_off);
     65
     66void machine_halt(void)
     67{
     68#ifdef CONFIG_SMP
     69	preempt_disable();
     70	smp_send_stop();
     71#endif
     72	default_halt();
     73}
     74
     75void machine_power_off(void)
     76{
     77#ifdef CONFIG_SMP
     78	preempt_disable();
     79	smp_send_stop();
     80#endif
     81	pm_power_off();
     82}
     83
     84void machine_restart(char *command)
     85{
     86#ifdef CONFIG_SMP
     87	preempt_disable();
     88	smp_send_stop();
     89#endif
     90	do_kernel_restart(command);
     91	pm_restart();
     92}
     93
     94static int __init loongarch_reboot_setup(void)
     95{
     96	pm_restart = default_restart;
     97	pm_power_off = default_poweroff;
     98
     99	return 0;
    100}
    101
    102arch_initcall(loongarch_reboot_setup);