--- kqemu/kqemu.h 2005-02-12 07:37:04.000000000 -0700 +++ qemu/kqemu/kqemu.h 2005-02-13 19:06:12.000000000 -0700 @@ -1,8 +1,6 @@ #ifndef KQEMU_H #define KQEMU_H -#define KQEMU_MAJOR 250 - #define KQEMU_VERSION 0x010000 struct kqemu_segment_cache { --- kqemu/kmod.c 2005-02-10 15:09:09.000000000 -0700 +++ qemu/kqemu/kmod.c 2005-02-13 20:03:52.000000000 -0700 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,13 @@ int page_alloc_count; #endif +struct class_simple *kqemu_class; +static int major = 0; +int kqemu_major; + +MODULE_PARM(major, "i"); +MODULE_PARM_DESC(major, "Major device number (1-255 or 0 for autodetect)"); + /* lock the page at virtual address 'user_addr' and return its page index. Return -1 if error */ unsigned long CDECL kqemu_lock_user_page(unsigned long user_addr) @@ -295,18 +303,33 @@ if (max_locked_pages > 32768) max_locked_pages = 32768; - ret = register_chrdev(KQEMU_MAJOR, "kqemu", &kqemu_fops); + ret = register_chrdev(major, "kqemu", &kqemu_fops); if (ret < 0) { - printk("kqemu: could not get major %d\n", KQEMU_MAJOR); + if (major == 0) + printk("kqemu: could not get dynamic major\n"); + else + printk("kqemu: could not get requested major %d\n", major); + return ret; } - printk("KQEMU installed, max_instances=%d max_locked_mem=%dkB.\n", + + if (major == 0) + kqemu_major = ret; + else + kqemu_major = major; + + kqemu_class = class_simple_create(THIS_MODULE, "kqemu"); + class_simple_device_add(kqemu_class, MKDEV(kqemu_major,0), NULL, "kqemu"); + printk("KQEMU installed, max_instances=%d max_locked_mem=%dkB major=%d.\n", KQEMU_MAX_INSTANCES, - max_locked_pages * 4); + max_locked_pages * 4, + kqemu_major); return 0; } void cleanup_module(void) { - unregister_chrdev(KQEMU_MAJOR, "kqemu"); + class_simple_device_remove(MKDEV(kqemu_major,0)); + class_simple_destroy(kqemu_class); + unregister_chrdev(kqemu_major, "kqemu"); }