Skip to content

Commit dea2df3

Browse files
committed
LoongArch: Add SysRq-x (TLB Dump) support
Add SysRq-x (TLB Dump) support for LoongArch, which is useful for debugging. Signed-off-by: Huacai Chen <[email protected]>
1 parent b37042b commit dea2df3

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

arch/loongarch/kernel/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ obj-$(CONFIG_SMP) += smp.o
2323

2424
obj-$(CONFIG_NUMA) += numa.o
2525

26+
obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o
27+
2628
obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
2729
obj-$(CONFIG_UNWINDER_PROLOGUE) += unwind_prologue.o
2830

arch/loongarch/kernel/sysrq.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* LoongArch specific sysrq operations.
4+
*
5+
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
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/tlb.h>
15+
16+
/*
17+
* Dump TLB entries on all CPUs.
18+
*/
19+
20+
static DEFINE_SPINLOCK(show_lock);
21+
22+
static void sysrq_tlbdump_single(void *dummy)
23+
{
24+
unsigned long flags;
25+
26+
spin_lock_irqsave(&show_lock, flags);
27+
28+
pr_info("CPU%d:\n", smp_processor_id());
29+
dump_tlb_regs();
30+
pr_info("\n");
31+
dump_tlb_all();
32+
pr_info("\n");
33+
34+
spin_unlock_irqrestore(&show_lock, flags);
35+
}
36+
37+
#ifdef CONFIG_SMP
38+
static void sysrq_tlbdump_othercpus(struct work_struct *dummy)
39+
{
40+
smp_call_function(sysrq_tlbdump_single, NULL, 0);
41+
}
42+
43+
static DECLARE_WORK(sysrq_tlbdump, sysrq_tlbdump_othercpus);
44+
#endif
45+
46+
static void sysrq_handle_tlbdump(int key)
47+
{
48+
sysrq_tlbdump_single(NULL);
49+
#ifdef CONFIG_SMP
50+
schedule_work(&sysrq_tlbdump);
51+
#endif
52+
}
53+
54+
static struct sysrq_key_op sysrq_tlbdump_op = {
55+
.handler = sysrq_handle_tlbdump,
56+
.help_msg = "show-tlbs(x)",
57+
.action_msg = "Show TLB entries",
58+
.enable_mask = SYSRQ_ENABLE_DUMP,
59+
};
60+
61+
static int __init loongarch_sysrq_init(void)
62+
{
63+
return register_sysrq_key('x', &sysrq_tlbdump_op);
64+
}
65+
arch_initcall(loongarch_sysrq_init);

0 commit comments

Comments
 (0)