1 // SPDX-License-Identifier: GPL-2.0-only
3 * Architecture specific debugfs files
5 * Copyright (C) 2007, Intel Corp.
6 * Huang Ying <ying.huang@intel.com>
8 #include <linux/debugfs.h>
9 #include <linux/uaccess.h>
10 #include <linux/export.h>
11 #include <linux/slab.h>
12 #include <linux/init.h>
13 #include <linux/stat.h>
17 #include <asm/setup.h>
19 struct dentry
*arch_debugfs_dir
;
20 EXPORT_SYMBOL(arch_debugfs_dir
);
22 #ifdef CONFIG_DEBUG_BOOT_PARAMS
23 struct setup_data_node
{
29 static ssize_t
setup_data_read(struct file
*file
, char __user
*user_buf
,
30 size_t count
, loff_t
*ppos
)
32 struct setup_data_node
*node
= file
->private_data
;
44 if (count
> node
->len
- pos
)
45 count
= node
->len
- pos
;
47 pa
= node
->paddr
+ pos
;
49 /* Is it direct data or invalid indirect one? */
50 if (!(node
->type
& SETUP_INDIRECT
) || node
->type
== SETUP_INDIRECT
)
51 pa
+= sizeof(struct setup_data
);
53 p
= memremap(pa
, count
, MEMREMAP_WB
);
57 remain
= copy_to_user(user_buf
, p
, count
);
69 static const struct file_operations fops_setup_data
= {
70 .read
= setup_data_read
,
72 .llseek
= default_llseek
,
76 create_setup_data_node(struct dentry
*parent
, int no
,
77 struct setup_data_node
*node
)
82 sprintf(buf
, "%d", no
);
83 d
= debugfs_create_dir(buf
, parent
);
85 debugfs_create_x32("type", S_IRUGO
, d
, &node
->type
);
86 debugfs_create_file("data", S_IRUGO
, d
, node
, &fops_setup_data
);
89 static int __init
create_setup_data_nodes(struct dentry
*parent
)
91 struct setup_data_node
*node
;
92 struct setup_data
*data
;
98 d
= debugfs_create_dir("setup_data", parent
);
100 pa_data
= boot_params
.hdr
.setup_data
;
103 node
= kmalloc(sizeof(*node
), GFP_KERNEL
);
109 data
= memremap(pa_data
, sizeof(*data
), MEMREMAP_WB
);
116 if (data
->type
== SETUP_INDIRECT
&&
117 ((struct setup_indirect
*)data
->data
)->type
!= SETUP_INDIRECT
) {
118 node
->paddr
= ((struct setup_indirect
*)data
->data
)->addr
;
119 node
->type
= ((struct setup_indirect
*)data
->data
)->type
;
120 node
->len
= ((struct setup_indirect
*)data
->data
)->len
;
122 node
->paddr
= pa_data
;
123 node
->type
= data
->type
;
124 node
->len
= data
->len
;
127 create_setup_data_node(d
, no
, node
);
128 pa_data
= data
->next
;
137 debugfs_remove_recursive(d
);
141 static struct debugfs_blob_wrapper boot_params_blob
= {
142 .data
= &boot_params
,
143 .size
= sizeof(boot_params
),
146 static int __init
boot_params_kdebugfs_init(void)
151 dbp
= debugfs_create_dir("boot_params", arch_debugfs_dir
);
153 debugfs_create_x16("version", S_IRUGO
, dbp
, &boot_params
.hdr
.version
);
154 debugfs_create_blob("data", S_IRUGO
, dbp
, &boot_params_blob
);
156 error
= create_setup_data_nodes(dbp
);
158 debugfs_remove_recursive(dbp
);
162 #endif /* CONFIG_DEBUG_BOOT_PARAMS */
164 static int __init
arch_kdebugfs_init(void)
168 arch_debugfs_dir
= debugfs_create_dir("x86", NULL
);
170 #ifdef CONFIG_DEBUG_BOOT_PARAMS
171 error
= boot_params_kdebugfs_init();
176 arch_initcall(arch_kdebugfs_init
);