linux/arch/mips/kernel/sysrq.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * MIPS specific sysrq operations.
   4 *
   5 * Copyright (C) 2015 Imagination Technologies Ltd.
   6 */
   7#include <linux/init.h>
   8#include <linux/smp.h>
   9#include <linux/spinlock.h>
  10#include <linux/sysrq.h>
  11#include <linux/workqueue.h>
  12
  13#include <asm/cpu-features.h>
  14#include <asm/mipsregs.h>
  15#include <asm/tlbdebug.h>
  16
  17/*
  18 * Dump TLB entries on all CPUs.
  19 */
  20
  21static DEFINE_SPINLOCK(show_lock);
  22
  23static void sysrq_tlbdump_single(void *dummy)
  24{
  25        unsigned long flags;
  26
  27        spin_lock_irqsave(&show_lock, flags);
  28
  29        pr_info("CPU%d:\n", smp_processor_id());
  30        dump_tlb_regs();
  31        pr_info("\n");
  32        dump_tlb_all();
  33        pr_info("\n");
  34
  35        spin_unlock_irqrestore(&show_lock, flags);
  36}
  37
  38#ifdef CONFIG_SMP
  39static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
  40{
  41        smp_call_function(sysrq_tlbdump_single, NULL, 0);
  42}
  43
  44static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
  45#endif
  46
  47static void sysrq_handle_tlbdump(int key)
  48{
  49        sysrq_tlbdump_single(NULL);
  50#ifdef CONFIG_SMP
  51        schedule_work(&sysrq_tlbdump);
  52#endif
  53}
  54
  55static const struct sysrq_key_op sysrq_tlbdump_op = {
  56        .handler        = sysrq_handle_tlbdump,
  57        .help_msg       = "show-tlbs(x)",
  58        .action_msg     = "Show TLB entries",
  59        .enable_mask    = SYSRQ_ENABLE_DUMP,
  60};
  61
  62static int __init mips_sysrq_init(void)
  63{
  64        return register_sysrq_key('x', &sysrq_tlbdump_op);
  65}
  66arch_initcall(mips_sysrq_init);
  67