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 21 static DEFINE_SPINLOCK(show_lock); 22 23 static 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 39 static void sysrq_tlbdump_othercpus(struct work_struct *dummy) 40 { 41 smp_call_function(sysrq_tlbdump_single, NULL, 0); 42 } 43 44 static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus); 45 #endif 46 47 static 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 55 static 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 62 static int __init mips_sysrq_init(void) 63 { 64 return register_sysrq_key('x', &sysrq_tlbdump_op); 65 } 66 arch_initcall(mips_sysrq_init); 67