Merge series "regulator: fix deadlock vs memory reclaim" from Michał Mirosław <mirq...
[linux-2.6-microblaze.git] / arch / x86 / kernel / msr.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* ----------------------------------------------------------------------- *
3  *
4  *   Copyright 2000-2008 H. Peter Anvin - All Rights Reserved
5  *   Copyright 2009 Intel Corporation; author: H. Peter Anvin
6  *
7  * ----------------------------------------------------------------------- */
8
9 /*
10  * x86 MSR access device
11  *
12  * This device is accessed by lseek() to the appropriate register number
13  * and then read/write in chunks of 8 bytes.  A larger size means multiple
14  * reads or writes of the same register.
15  *
16  * This driver uses /dev/cpu/%d/msr where %d is the minor number, and on
17  * an SMP box will direct the access to CPU %d.
18  */
19
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21
22 #include <linux/module.h>
23
24 #include <linux/types.h>
25 #include <linux/errno.h>
26 #include <linux/fcntl.h>
27 #include <linux/init.h>
28 #include <linux/poll.h>
29 #include <linux/smp.h>
30 #include <linux/major.h>
31 #include <linux/fs.h>
32 #include <linux/device.h>
33 #include <linux/cpu.h>
34 #include <linux/notifier.h>
35 #include <linux/uaccess.h>
36 #include <linux/gfp.h>
37 #include <linux/security.h>
38
39 #include <asm/cpufeature.h>
40 #include <asm/msr.h>
41
42 static struct class *msr_class;
43 static enum cpuhp_state cpuhp_msr_state;
44
45 enum allow_write_msrs {
46         MSR_WRITES_ON,
47         MSR_WRITES_OFF,
48         MSR_WRITES_DEFAULT,
49 };
50
51 static enum allow_write_msrs allow_writes = MSR_WRITES_DEFAULT;
52
53 static ssize_t msr_read(struct file *file, char __user *buf,
54                         size_t count, loff_t *ppos)
55 {
56         u32 __user *tmp = (u32 __user *) buf;
57         u32 data[2];
58         u32 reg = *ppos;
59         int cpu = iminor(file_inode(file));
60         int err = 0;
61         ssize_t bytes = 0;
62
63         if (count % 8)
64                 return -EINVAL; /* Invalid chunk size */
65
66         for (; count; count -= 8) {
67                 err = rdmsr_safe_on_cpu(cpu, reg, &data[0], &data[1]);
68                 if (err)
69                         break;
70                 if (copy_to_user(tmp, &data, 8)) {
71                         err = -EFAULT;
72                         break;
73                 }
74                 tmp += 2;
75                 bytes += 8;
76         }
77
78         return bytes ? bytes : err;
79 }
80
81 static int filter_write(u32 reg)
82 {
83         switch (allow_writes) {
84         case MSR_WRITES_ON:  return 0;
85         case MSR_WRITES_OFF: return -EPERM;
86         default: break;
87         }
88
89         if (reg == MSR_IA32_ENERGY_PERF_BIAS)
90                 return 0;
91
92         pr_err_ratelimited("Write to unrecognized MSR 0x%x by %s\n"
93                            "Please report to x86@kernel.org\n",
94                            reg, current->comm);
95
96         return 0;
97 }
98
99 static ssize_t msr_write(struct file *file, const char __user *buf,
100                          size_t count, loff_t *ppos)
101 {
102         const u32 __user *tmp = (const u32 __user *)buf;
103         u32 data[2];
104         u32 reg = *ppos;
105         int cpu = iminor(file_inode(file));
106         int err = 0;
107         ssize_t bytes = 0;
108
109         err = security_locked_down(LOCKDOWN_MSR);
110         if (err)
111                 return err;
112
113         err = filter_write(reg);
114         if (err)
115                 return err;
116
117         if (count % 8)
118                 return -EINVAL; /* Invalid chunk size */
119
120         for (; count; count -= 8) {
121                 if (copy_from_user(&data, tmp, 8)) {
122                         err = -EFAULT;
123                         break;
124                 }
125
126                 add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK);
127
128                 err = wrmsr_safe_on_cpu(cpu, reg, data[0], data[1]);
129                 if (err)
130                         break;
131
132                 tmp += 2;
133                 bytes += 8;
134         }
135
136         return bytes ? bytes : err;
137 }
138
139 static long msr_ioctl(struct file *file, unsigned int ioc, unsigned long arg)
140 {
141         u32 __user *uregs = (u32 __user *)arg;
142         u32 regs[8];
143         int cpu = iminor(file_inode(file));
144         int err;
145
146         switch (ioc) {
147         case X86_IOC_RDMSR_REGS:
148                 if (!(file->f_mode & FMODE_READ)) {
149                         err = -EBADF;
150                         break;
151                 }
152                 if (copy_from_user(&regs, uregs, sizeof(regs))) {
153                         err = -EFAULT;
154                         break;
155                 }
156                 err = rdmsr_safe_regs_on_cpu(cpu, regs);
157                 if (err)
158                         break;
159                 if (copy_to_user(uregs, &regs, sizeof(regs)))
160                         err = -EFAULT;
161                 break;
162
163         case X86_IOC_WRMSR_REGS:
164                 if (!(file->f_mode & FMODE_WRITE)) {
165                         err = -EBADF;
166                         break;
167                 }
168                 if (copy_from_user(&regs, uregs, sizeof(regs))) {
169                         err = -EFAULT;
170                         break;
171                 }
172                 err = security_locked_down(LOCKDOWN_MSR);
173                 if (err)
174                         break;
175                 err = wrmsr_safe_regs_on_cpu(cpu, regs);
176                 if (err)
177                         break;
178                 if (copy_to_user(uregs, &regs, sizeof(regs)))
179                         err = -EFAULT;
180                 break;
181
182         default:
183                 err = -ENOTTY;
184                 break;
185         }
186
187         return err;
188 }
189
190 static int msr_open(struct inode *inode, struct file *file)
191 {
192         unsigned int cpu = iminor(file_inode(file));
193         struct cpuinfo_x86 *c;
194
195         if (!capable(CAP_SYS_RAWIO))
196                 return -EPERM;
197
198         if (cpu >= nr_cpu_ids || !cpu_online(cpu))
199                 return -ENXIO;  /* No such CPU */
200
201         c = &cpu_data(cpu);
202         if (!cpu_has(c, X86_FEATURE_MSR))
203                 return -EIO;    /* MSR not supported */
204
205         return 0;
206 }
207
208 /*
209  * File operations we support
210  */
211 static const struct file_operations msr_fops = {
212         .owner = THIS_MODULE,
213         .llseek = no_seek_end_llseek,
214         .read = msr_read,
215         .write = msr_write,
216         .open = msr_open,
217         .unlocked_ioctl = msr_ioctl,
218         .compat_ioctl = msr_ioctl,
219 };
220
221 static int msr_device_create(unsigned int cpu)
222 {
223         struct device *dev;
224
225         dev = device_create(msr_class, NULL, MKDEV(MSR_MAJOR, cpu), NULL,
226                             "msr%d", cpu);
227         return PTR_ERR_OR_ZERO(dev);
228 }
229
230 static int msr_device_destroy(unsigned int cpu)
231 {
232         device_destroy(msr_class, MKDEV(MSR_MAJOR, cpu));
233         return 0;
234 }
235
236 static char *msr_devnode(struct device *dev, umode_t *mode)
237 {
238         return kasprintf(GFP_KERNEL, "cpu/%u/msr", MINOR(dev->devt));
239 }
240
241 static int __init msr_init(void)
242 {
243         int err;
244
245         if (__register_chrdev(MSR_MAJOR, 0, NR_CPUS, "cpu/msr", &msr_fops)) {
246                 pr_err("unable to get major %d for msr\n", MSR_MAJOR);
247                 return -EBUSY;
248         }
249         msr_class = class_create(THIS_MODULE, "msr");
250         if (IS_ERR(msr_class)) {
251                 err = PTR_ERR(msr_class);
252                 goto out_chrdev;
253         }
254         msr_class->devnode = msr_devnode;
255
256         err  = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/msr:online",
257                                  msr_device_create, msr_device_destroy);
258         if (err < 0)
259                 goto out_class;
260         cpuhp_msr_state = err;
261         return 0;
262
263 out_class:
264         class_destroy(msr_class);
265 out_chrdev:
266         __unregister_chrdev(MSR_MAJOR, 0, NR_CPUS, "cpu/msr");
267         return err;
268 }
269 module_init(msr_init);
270
271 static void __exit msr_exit(void)
272 {
273         cpuhp_remove_state(cpuhp_msr_state);
274         class_destroy(msr_class);
275         __unregister_chrdev(MSR_MAJOR, 0, NR_CPUS, "cpu/msr");
276 }
277 module_exit(msr_exit)
278
279 static int set_allow_writes(const char *val, const struct kernel_param *cp)
280 {
281         /* val is NUL-terminated, see kernfs_fop_write() */
282         char *s = strstrip((char *)val);
283
284         if (!strcmp(s, "on"))
285                 allow_writes = MSR_WRITES_ON;
286         else if (!strcmp(s, "off"))
287                 allow_writes = MSR_WRITES_OFF;
288         else
289                 allow_writes = MSR_WRITES_DEFAULT;
290
291         return 0;
292 }
293
294 static int get_allow_writes(char *buf, const struct kernel_param *kp)
295 {
296         const char *res;
297
298         switch (allow_writes) {
299         case MSR_WRITES_ON:  res = "on"; break;
300         case MSR_WRITES_OFF: res = "off"; break;
301         default: res = "default"; break;
302         }
303
304         return sprintf(buf, "%s\n", res);
305 }
306
307 static const struct kernel_param_ops allow_writes_ops = {
308         .set = set_allow_writes,
309         .get = get_allow_writes
310 };
311
312 module_param_cb(allow_writes, &allow_writes_ops, NULL, 0600);
313
314 MODULE_AUTHOR("H. Peter Anvin <hpa@zytor.com>");
315 MODULE_DESCRIPTION("x86 generic MSR driver");
316 MODULE_LICENSE("GPL");