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 9e66c3209SChristophe Leroy #include <asm/debugfs.h> 10e66c3209SChristophe Leroy 11e66c3209SChristophe Leroy static void seg_show(struct seq_file *m, int i) 12e66c3209SChristophe Leroy { 13*179ae57dSChristophe 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 44e66c3209SChristophe Leroy static int sr_open(struct inode *inode, struct file *file) 45e66c3209SChristophe Leroy { 46e66c3209SChristophe Leroy return single_open(file, sr_show, NULL); 47e66c3209SChristophe Leroy } 48e66c3209SChristophe Leroy 49e66c3209SChristophe Leroy static const struct file_operations sr_fops = { 50e66c3209SChristophe Leroy .open = sr_open, 51e66c3209SChristophe Leroy .read = seq_read, 52e66c3209SChristophe Leroy .llseek = seq_lseek, 53e66c3209SChristophe Leroy .release = single_release, 54e66c3209SChristophe Leroy }; 55e66c3209SChristophe Leroy 56e66c3209SChristophe Leroy static int __init sr_init(void) 57e66c3209SChristophe Leroy { 58f3c05201SGreg Kroah-Hartman debugfs_create_file("segment_registers", 0400, powerpc_debugfs_root, 59f3c05201SGreg Kroah-Hartman NULL, &sr_fops); 60f3c05201SGreg Kroah-Hartman return 0; 61e66c3209SChristophe Leroy } 62e66c3209SChristophe Leroy device_initcall(sr_init); 63