|
@@ -237,113 +237,3 @@ void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
|
|
|
if (!user_mode(regs))
|
|
|
show_stacktrace(current, regs);
|
|
|
}
|
|
|
-
|
|
|
-#ifdef CONFIG_DEBUG_FS
|
|
|
-
|
|
|
-#include <linux/module.h>
|
|
|
-#include <linux/fs.h>
|
|
|
-#include <linux/mount.h>
|
|
|
-#include <linux/pagemap.h>
|
|
|
-#include <linux/init.h>
|
|
|
-#include <linux/namei.h>
|
|
|
-#include <linux/debugfs.h>
|
|
|
-
|
|
|
-static struct dentry *test_dentry;
|
|
|
-static struct dentry *test_dir;
|
|
|
-static struct dentry *test_u32_dentry;
|
|
|
-
|
|
|
-static u32 clr_on_read = 1;
|
|
|
-
|
|
|
-#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
|
-u32 numitlb, numdtlb, num_pte_not_present;
|
|
|
-
|
|
|
-static int fill_display_data(char *kbuf)
|
|
|
-{
|
|
|
- size_t num = 0;
|
|
|
- num += sprintf(kbuf + num, "I-TLB Miss %x\n", numitlb);
|
|
|
- num += sprintf(kbuf + num, "D-TLB Miss %x\n", numdtlb);
|
|
|
- num += sprintf(kbuf + num, "PTE not present %x\n", num_pte_not_present);
|
|
|
-
|
|
|
- if (clr_on_read)
|
|
|
- numitlb = numdtlb = num_pte_not_present = 0;
|
|
|
-
|
|
|
- return num;
|
|
|
-}
|
|
|
-
|
|
|
-static int tlb_stats_open(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- file->private_data = (void *)__get_free_page(GFP_KERNEL);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-/* called on user read(): display the counters */
|
|
|
-static ssize_t tlb_stats_output(struct file *file, /* file descriptor */
|
|
|
- char __user *user_buf, /* user buffer */
|
|
|
- size_t len, /* length of buffer */
|
|
|
- loff_t *offset) /* offset in the file */
|
|
|
-{
|
|
|
- size_t num;
|
|
|
- char *kbuf = (char *)file->private_data;
|
|
|
-
|
|
|
- /* All of the data can he shoved in one iteration */
|
|
|
- if (*offset != 0)
|
|
|
- return 0;
|
|
|
-
|
|
|
- num = fill_display_data(kbuf);
|
|
|
-
|
|
|
- /* simple_read_from_buffer() is helper for copy to user space
|
|
|
- It copies up to @2 (num) bytes from kernel buffer @4 (kbuf) at offset
|
|
|
- @3 (offset) into the user space address starting at @1 (user_buf).
|
|
|
- @5 (len) is max size of user buffer
|
|
|
- */
|
|
|
- return simple_read_from_buffer(user_buf, num, offset, kbuf, len);
|
|
|
-}
|
|
|
-
|
|
|
-/* called on user write : clears the counters */
|
|
|
-static ssize_t tlb_stats_clear(struct file *file, const char __user *user_buf,
|
|
|
- size_t length, loff_t *offset)
|
|
|
-{
|
|
|
- numitlb = numdtlb = num_pte_not_present = 0;
|
|
|
- return length;
|
|
|
-}
|
|
|
-
|
|
|
-static int tlb_stats_close(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- free_page((unsigned long)(file->private_data));
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static const struct file_operations tlb_stats_file_ops = {
|
|
|
- .read = tlb_stats_output,
|
|
|
- .write = tlb_stats_clear,
|
|
|
- .open = tlb_stats_open,
|
|
|
- .release = tlb_stats_close
|
|
|
-};
|
|
|
-#endif
|
|
|
-
|
|
|
-static int __init arc_debugfs_init(void)
|
|
|
-{
|
|
|
- test_dir = debugfs_create_dir("arc", NULL);
|
|
|
-
|
|
|
-#ifdef CONFIG_ARC_DBG_TLB_MISS_COUNT
|
|
|
- test_dentry = debugfs_create_file("tlb_stats", 0444, test_dir, NULL,
|
|
|
- &tlb_stats_file_ops);
|
|
|
-#endif
|
|
|
-
|
|
|
- test_u32_dentry =
|
|
|
- debugfs_create_u32("clr_on_read", 0444, test_dir, &clr_on_read);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-module_init(arc_debugfs_init);
|
|
|
-
|
|
|
-static void __exit arc_debugfs_exit(void)
|
|
|
-{
|
|
|
- debugfs_remove(test_u32_dentry);
|
|
|
- debugfs_remove(test_dentry);
|
|
|
- debugfs_remove(test_dir);
|
|
|
-}
|
|
|
-module_exit(arc_debugfs_exit);
|
|
|
-
|
|
|
-#endif
|