1e66c3209SChristophe Leroy // SPDX-License-Identifier: GPL-2.0+ 2e66c3209SChristophe Leroy /* 3e66c3209SChristophe Leroy * Copyright 2018, Christophe Leroy CS S.I. 4e66c3209SChristophe Leroy * <christophe.leroy@c-s.fr> 5e66c3209SChristophe Leroy * 6e66c3209SChristophe Leroy * This dumps the content of Segment Registers 7e66c3209SChristophe Leroy */ 8e66c3209SChristophe Leroy 9dbf77fedSAneesh Kumar K.V #include <linux/debugfs.h> 10e66c3209SChristophe Leroy 11e66c3209SChristophe Leroy static void seg_show(struct seq_file *m, int i) 12e66c3209SChristophe Leroy { 13179ae57dSChristophe Leroy u32 val = mfsr(i << 28); 14e66c3209SChristophe Leroy 15e66c3209SChristophe Leroy seq_printf(m, "0x%01x0000000-0x%01xfffffff ", i, i); 16e66c3209SChristophe Leroy seq_printf(m, "Kern key %d ", (val >> 30) & 1); 17e66c3209SChristophe Leroy seq_printf(m, "User key %d ", (val >> 29) & 1); 18e66c3209SChristophe Leroy if (val & 0x80000000) { 19e66c3209SChristophe Leroy seq_printf(m, "Device 0x%03x", (val >> 20) & 0x1ff); 20e66c3209SChristophe Leroy seq_printf(m, "-0x%05x", val & 0xfffff); 21e66c3209SChristophe Leroy } else { 22e66c3209SChristophe Leroy if (val & 0x10000000) 23e66c3209SChristophe Leroy seq_puts(m, "No Exec "); 24e66c3209SChristophe Leroy seq_printf(m, "VSID 0x%06x", val & 0xffffff); 25e66c3209SChristophe Leroy } 26e66c3209SChristophe Leroy seq_puts(m, "\n"); 27e66c3209SChristophe Leroy } 28e66c3209SChristophe Leroy 29e66c3209SChristophe Leroy static int sr_show(struct seq_file *m, void *v) 30e66c3209SChristophe Leroy { 31e66c3209SChristophe Leroy int i; 32e66c3209SChristophe Leroy 33e66c3209SChristophe Leroy seq_puts(m, "---[ User Segments ]---\n"); 34e66c3209SChristophe Leroy for (i = 0; i < TASK_SIZE >> 28; i++) 35e66c3209SChristophe Leroy seg_show(m, i); 36e66c3209SChristophe Leroy 37e66c3209SChristophe Leroy seq_puts(m, "\n---[ Kernel Segments ]---\n"); 38e66c3209SChristophe Leroy for (; i < 16; i++) 39e66c3209SChristophe Leroy seg_show(m, i); 40e66c3209SChristophe Leroy 41e66c3209SChristophe Leroy return 0; 42e66c3209SChristophe Leroy } 43e66c3209SChristophe Leroy 44*11f27a7fSChristophe Leroy DEFINE_SHOW_ATTRIBUTE(sr); 45e66c3209SChristophe Leroy 46e66c3209SChristophe Leroy static int __init sr_init(void) 47e66c3209SChristophe Leroy { 48dbf77fedSAneesh Kumar K.V debugfs_create_file("segment_registers", 0400, arch_debugfs_dir, 49f3c05201SGreg Kroah-Hartman NULL, &sr_fops); 50f3c05201SGreg Kroah-Hartman return 0; 51e66c3209SChristophe Leroy } 52e66c3209SChristophe Leroy device_initcall(sr_init); 53