--- arch/i386/kernel/microcode.c.0 2003-09-01 17:32:37.000000000 +0100 +++ arch/i386/kernel/microcode.c 2003-09-01 17:39:11.000000000 +0100 @@ -55,8 +55,10 @@ * Tigran Aivazian , * Serialize updates as required on HT processors due to speculative * nature of implementation. - * 1.11 22 Mar 2001 Tigran Aivazian + * 1.11 22 Mar 2002 Tigran Aivazian * Fix the panic when writing zero-length microcode chunk. + * 1.12 01 Sep 2003 Tigran Aivazian + * Remove read/ioctl support and other cleanup. */ #include @@ -75,7 +77,7 @@ static spinlock_t microcode_update_lock = SPIN_LOCK_UNLOCKED; -#define MICROCODE_VERSION "1.11" +#define MICROCODE_VERSION "1.12" MODULE_DESCRIPTION("Intel CPU (IA-32) microcode update driver"); MODULE_AUTHOR("Tigran Aivazian "); @@ -94,8 +96,6 @@ static struct microcode *microcode; /* array of 2048byte microcode blocks */ static unsigned int microcode_num; /* number of chunks in microcode */ -static char *mc_applied; /* array of applied microcode blocks */ -static unsigned int mc_fsize; /* file size of /dev/cpu/microcode */ static int microcode_open(struct inode *unused1, struct file *unused2) { @@ -215,6 +215,7 @@ return; } + req->err = 0; /* no suitable microcode data is not a fatal error */ printk(KERN_ERR "microcode: CPU%d no microcode found! (sig=%x, pflags=%d)\n", cpu_num, sig, pf); @@ -223,42 +224,17 @@ static int do_microcode_update(void) { - int i, error = 0, err; - struct microcode *m; + int i, error = 0; if (on_each_cpu(do_update_one, NULL, 1, 1) != 0) { printk(KERN_ERR "microcode: IPI timeout, giving up\n"); return -EIO; } - for (i=0; i= mc_fsize) - goto out; - if (*ppos + len > mc_fsize) - len = mc_fsize - *ppos; - ret = -EFAULT; - if (copy_to_user(buf, mc_applied + *ppos, len)) - goto out; - *ppos += len; - ret = len; -out: - up_read(µcode_rwsem); - return ret; + return error; } static ssize_t microcode_write(struct file *file, const char __user *buf, size_t len, loff_t *ppos) @@ -275,72 +251,35 @@ return -EINVAL; } down_write(µcode_rwsem); - if (!mc_applied) { - mc_applied = kmalloc(NR_CPUS*sizeof(struct microcode), - GFP_KERNEL); - if (!mc_applied) { - up_write(µcode_rwsem); - printk(KERN_ERR "microcode: out of memory for saved microcode\n"); - return -ENOMEM; - } - } - microcode_num = len/sizeof(struct microcode); microcode = vmalloc(len); if (!microcode) { ret = -ENOMEM; - goto out_unlock; + goto out_upsem; } if (copy_from_user(microcode, buf, len)) { ret = -EFAULT; - goto out_fsize; + goto out_vfree; } if(do_microcode_update()) { ret = -EIO; - goto out_fsize; - } else { - mc_fsize = NR_CPUS * sizeof(struct microcode); + goto out_vfree; + } else ret = (ssize_t)len; - } -out_fsize: + +out_vfree: vfree(microcode); -out_unlock: + +out_upsem: up_write(µcode_rwsem); return ret; } -static int microcode_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) -{ - switch(cmd) { - case MICROCODE_IOCFREE: - down_write(µcode_rwsem); - if (mc_applied) { - int bytes = NR_CPUS * sizeof(struct microcode); - - kfree(mc_applied); - mc_applied = NULL; - printk(KERN_INFO "microcode: freed %d bytes\n", bytes); - mc_fsize = 0; - up_write(µcode_rwsem); - return 0; - } - up_write(µcode_rwsem); - return -ENODATA; - - default: - return -EINVAL; - } - return -EINVAL; -} - static struct file_operations microcode_fops = { .owner = THIS_MODULE, - .read = microcode_read, .write = microcode_write, - .ioctl = microcode_ioctl, .open = microcode_open, }; @@ -368,11 +307,9 @@ static void __exit microcode_exit(void) { misc_deregister(µcode_dev); - kfree(mc_applied); printk(KERN_INFO "IA-32 Microcode Update Driver v%s unregistered\n", MICROCODE_VERSION); } module_init(microcode_init) module_exit(microcode_exit) -