| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Copyright 2018, Christophe Leroy CS S.I. | |
| * <christophe.leroy@c-s.fr> | |
| * | |
| * This dumps the content of Segment Registers | |
| */ | |
| #include <linux/debugfs.h> | |
| static void seg_show(struct seq_file *m, int i) | |
| { | |
| u32 val = mfsr(i << 28); | |
| seq_printf(m, "0x%01x0000000-0x%01xfffffff ", i, i); | |
| seq_printf(m, "Kern key %d ", (val >> 30) & 1); | |
| seq_printf(m, "User key %d ", (val >> 29) & 1); | |
| if (val & 0x80000000) { | |
| seq_printf(m, "Device 0x%03x", (val >> 20) & 0x1ff); | |
| seq_printf(m, "-0x%05x", val & 0xfffff); | |
| } else { | |
| if (val & 0x10000000) | |
| seq_puts(m, "No Exec "); | |
| seq_printf(m, "VSID 0x%06x", val & 0xffffff); | |
| } | |
| seq_puts(m, "\n"); | |
| } | |
| static int sr_show(struct seq_file *m, void *v) | |
| { | |
| int i; | |
| seq_puts(m, "---[ User Segments ]---\n"); | |
| for (i = 0; i < TASK_SIZE >> 28; i++) | |
| seg_show(m, i); | |
| seq_puts(m, "\n---[ Kernel Segments ]---\n"); | |
| for (; i < 16; i++) | |
| seg_show(m, i); | |
| return 0; | |
| } | |
| DEFINE_SHOW_ATTRIBUTE(sr); | |
| static int __init sr_init(void) | |
| { | |
| debugfs_create_file("segment_registers", 0400, arch_debugfs_dir, | |
| NULL, &sr_fops); | |
| return 0; | |
| } | |
| device_initcall(sr_init); |