sysrq.c (1366B)
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);