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

sclp_quiesce.c (1310B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *     signal quiesce handler
      4 *
      5 *  Copyright IBM Corp. 1999, 2004
      6 *  Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
      7 *             Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
      8 */
      9
     10#include <linux/types.h>
     11#include <linux/cpumask.h>
     12#include <linux/smp.h>
     13#include <linux/init.h>
     14#include <linux/reboot.h>
     15#include <linux/atomic.h>
     16#include <asm/ptrace.h>
     17#include <asm/smp.h>
     18
     19#include "sclp.h"
     20
     21/* Shutdown handler. Signal completion of shutdown by loading special PSW. */
     22static void do_machine_quiesce(void)
     23{
     24	psw_t quiesce_psw;
     25
     26	smp_send_stop();
     27	quiesce_psw.mask =
     28		PSW_MASK_BASE | PSW_MASK_EA | PSW_MASK_BA | PSW_MASK_WAIT;
     29	quiesce_psw.addr = 0xfff;
     30	__load_psw(quiesce_psw);
     31}
     32
     33/* Handler for quiesce event. Start shutdown procedure. */
     34static void sclp_quiesce_handler(struct evbuf_header *evbuf)
     35{
     36	_machine_restart = (void *) do_machine_quiesce;
     37	_machine_halt = do_machine_quiesce;
     38	_machine_power_off = do_machine_quiesce;
     39	ctrl_alt_del();
     40}
     41
     42static struct sclp_register sclp_quiesce_event = {
     43	.receive_mask = EVTYP_SIGQUIESCE_MASK,
     44	.receiver_fn = sclp_quiesce_handler,
     45};
     46
     47/* Initialize quiesce driver. */
     48static int __init sclp_quiesce_init(void)
     49{
     50	return sclp_register(&sclp_quiesce_event);
     51}
     52device_initcall(sclp_quiesce_init);