I ported msr for kernel version 2.4.2 to devfs. It now creates
the /dev/cpu/%d/msr devices. The changes are straightforward.
Duncan Sands.
--- arch/i386/kernel/msr.c.orig Mon Mar 19 18:10:12 2001
+++ arch/i386/kernel/msr.c Mon Mar 19 16:13:17 2001
@@ -34,12 +34,15 @@
#include <linux/poll.h>
#include <linux/smp.h>
#include <linux/major.h>
+#include <linux/devfs_fs_kernel.h>
#include <asm/processor.h>
#include <asm/msr.h>
#include <asm/uaccess.h>
#include <asm/system.h>
+static devfs_handle_t dir_handle; /* For the directory */
+
/* Note: "err" is handled in a funny way below. Otherwise one version
of gcc or another breaks. */
@@ -250,18 +253,37 @@
int __init msr_init(void)
{
- if (register_chrdev(MSR_MAJOR, "cpu/msr", &msr_fops)) {
+ if (devfs_register_chrdev(MSR_MAJOR, "cpu/msr", &msr_fops)) {
printk(KERN_ERR "msr: unable to get major %d for msr\n",
MSR_MAJOR);
return -EBUSY;
}
+ dir_handle = devfs_mk_dir(NULL, "cpu", NULL);
+ devfs_register_series (dir_handle, "%u/msr", smp_num_cpus, DEVFS_FL_DEFAULT,
+ MSR_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR |
+ S_IRGRP | S_IROTH, &msr_fops, NULL);
+
return 0;
}
void __exit msr_exit(void)
{
- unregister_chrdev(MSR_MAJOR, "cpu/msr");
+ char devname[16];
+ devfs_handle_t handle;
+ unsigned int minor;
+
+#ifdef CONFIG_DEVFS_FS
+ for (minor=0; minor < smp_num_cpus; ++minor)
+ {
+ sprintf (devname, "%u/msr", minor);
+ handle = devfs_find_handle(dir_handle, devname, MSR_MAJOR, minor,
+ DEVFS_SPECIAL_CHR, 0);
+ devfs_unregister(handle);
+ }
+#endif /* CONFIG_DEVFS_FS */
+
+ devfs_unregister_chrdev(MSR_MAJOR, "cpu/msr");
}
module_init(msr_init);
|