segment_regs.c 1.1 KB

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