hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/x86/kernel/kdebugfs.c
....@@ -1,10 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Architecture specific debugfs files
34 *
45 * Copyright (C) 2007, Intel Corp.
56 * Huang Ying <ying.huang@intel.com>
6
- *
7
- * This file is released under the GPLv2.
87 */
98 #include <linux/debugfs.h>
109 #include <linux/uaccess.h>
....@@ -45,7 +44,12 @@
4544 if (count > node->len - pos)
4645 count = node->len - pos;
4746
48
- pa = node->paddr + sizeof(struct setup_data) + pos;
47
+ pa = node->paddr + pos;
48
+
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);
52
+
4953 p = memremap(pa, count, MEMREMAP_WB);
5054 if (!p)
5155 return -ENOMEM;
....@@ -68,47 +72,32 @@
6872 .llseek = default_llseek,
6973 };
7074
71
-static int __init
75
+static void __init
7276 create_setup_data_node(struct dentry *parent, int no,
7377 struct setup_data_node *node)
7478 {
75
- struct dentry *d, *type, *data;
79
+ struct dentry *d;
7680 char buf[16];
7781
7882 sprintf(buf, "%d", no);
7983 d = debugfs_create_dir(buf, parent);
80
- if (!d)
81
- return -ENOMEM;
8284
83
- type = debugfs_create_x32("type", S_IRUGO, d, &node->type);
84
- if (!type)
85
- goto err_dir;
86
-
87
- data = debugfs_create_file("data", S_IRUGO, d, node, &fops_setup_data);
88
- if (!data)
89
- goto err_type;
90
-
91
- return 0;
92
-
93
-err_type:
94
- debugfs_remove(type);
95
-err_dir:
96
- debugfs_remove(d);
97
- return -ENOMEM;
85
+ debugfs_create_x32("type", S_IRUGO, d, &node->type);
86
+ debugfs_create_file("data", S_IRUGO, d, node, &fops_setup_data);
9887 }
9988
10089 static int __init create_setup_data_nodes(struct dentry *parent)
10190 {
91
+ struct setup_indirect *indirect;
10292 struct setup_data_node *node;
10393 struct setup_data *data;
104
- int error;
94
+ u64 pa_data, pa_next;
10595 struct dentry *d;
106
- u64 pa_data;
96
+ int error;
97
+ u32 len;
10798 int no = 0;
10899
109100 d = debugfs_create_dir("setup_data", parent);
110
- if (!d)
111
- return -ENOMEM;
112101
113102 pa_data = boot_params.hdr.setup_data;
114103
....@@ -125,23 +114,46 @@
125114 error = -ENOMEM;
126115 goto err_dir;
127116 }
117
+ pa_next = data->next;
128118
129
- node->paddr = pa_data;
130
- node->type = data->type;
131
- node->len = data->len;
132
- error = create_setup_data_node(d, no, node);
133
- pa_data = data->next;
119
+ if (data->type == SETUP_INDIRECT) {
120
+ len = sizeof(*data) + data->len;
121
+ memunmap(data);
122
+ data = memremap(pa_data, len, MEMREMAP_WB);
123
+ if (!data) {
124
+ kfree(node);
125
+ error = -ENOMEM;
126
+ goto err_dir;
127
+ }
128
+
129
+ indirect = (struct setup_indirect *)data->data;
130
+
131
+ if (indirect->type != SETUP_INDIRECT) {
132
+ node->paddr = indirect->addr;
133
+ node->type = indirect->type;
134
+ node->len = indirect->len;
135
+ } else {
136
+ node->paddr = pa_data;
137
+ node->type = data->type;
138
+ node->len = data->len;
139
+ }
140
+ } else {
141
+ node->paddr = pa_data;
142
+ node->type = data->type;
143
+ node->len = data->len;
144
+ }
145
+
146
+ create_setup_data_node(d, no, node);
147
+ pa_data = pa_next;
134148
135149 memunmap(data);
136
- if (error)
137
- goto err_dir;
138150 no++;
139151 }
140152
141153 return 0;
142154
143155 err_dir:
144
- debugfs_remove(d);
156
+ debugfs_remove_recursive(d);
145157 return error;
146158 }
147159
....@@ -152,35 +164,18 @@
152164
153165 static int __init boot_params_kdebugfs_init(void)
154166 {
155
- struct dentry *dbp, *version, *data;
156
- int error = -ENOMEM;
167
+ struct dentry *dbp;
168
+ int error;
157169
158170 dbp = debugfs_create_dir("boot_params", arch_debugfs_dir);
159
- if (!dbp)
160
- return -ENOMEM;
161171
162
- version = debugfs_create_x16("version", S_IRUGO, dbp,
163
- &boot_params.hdr.version);
164
- if (!version)
165
- goto err_dir;
166
-
167
- data = debugfs_create_blob("data", S_IRUGO, dbp,
168
- &boot_params_blob);
169
- if (!data)
170
- goto err_version;
172
+ debugfs_create_x16("version", S_IRUGO, dbp, &boot_params.hdr.version);
173
+ debugfs_create_blob("data", S_IRUGO, dbp, &boot_params_blob);
171174
172175 error = create_setup_data_nodes(dbp);
173176 if (error)
174
- goto err_data;
177
+ debugfs_remove_recursive(dbp);
175178
176
- return 0;
177
-
178
-err_data:
179
- debugfs_remove(data);
180
-err_version:
181
- debugfs_remove(version);
182
-err_dir:
183
- debugfs_remove(dbp);
184179 return error;
185180 }
186181 #endif /* CONFIG_DEBUG_BOOT_PARAMS */
....@@ -190,8 +185,6 @@
190185 int error = 0;
191186
192187 arch_debugfs_dir = debugfs_create_dir("x86", NULL);
193
- if (!arch_debugfs_dir)
194
- return -ENOMEM;
195188
196189 #ifdef CONFIG_DEBUG_BOOT_PARAMS
197190 error = boot_params_kdebugfs_init();