diff options
Diffstat (limited to 'arch/x86/kernel/cpu/microcode/intel_lib.c')
| -rw-r--r-- | arch/x86/kernel/cpu/microcode/intel_lib.c | 184 | 
1 files changed, 0 insertions, 184 deletions
diff --git a/arch/x86/kernel/cpu/microcode/intel_lib.c b/arch/x86/kernel/cpu/microcode/intel_lib.c deleted file mode 100644 index 406cb6c0d9dd..000000000000 --- a/arch/x86/kernel/cpu/microcode/intel_lib.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - *	Intel CPU Microcode Update Driver for Linux - * - *	Copyright (C) 2012 Fenghua Yu <[email protected]> - *			   H Peter Anvin" <[email protected]> - * - *	This driver allows to upgrade microcode on Intel processors - *	belonging to IA-32 family - PentiumPro, Pentium II, - *	Pentium III, Xeon, Pentium 4, etc. - * - *	Reference: Section 8.11 of Volume 3a, IA-32 Intel? Architecture - *	Software Developer's Manual - *	Order Number 253668 or free download from: - * - *	http://developer.intel.com/Assets/PDF/manual/253668.pdf - * - *	For more information, go to http://www.urbanmyth.org/microcode - * - *	This program is free software; you can redistribute it and/or - *	modify it under the terms of the GNU General Public License - *	as published by the Free Software Foundation; either version - *	2 of the License, or (at your option) any later version. - * - */ -#include <linux/firmware.h> -#include <linux/uaccess.h> -#include <linux/kernel.h> - -#include <asm/microcode_intel.h> -#include <asm/processor.h> -#include <asm/msr.h> - -static inline bool cpu_signatures_match(unsigned int s1, unsigned int p1, -					unsigned int s2, unsigned int p2) -{ -	if (s1 != s2) -		return false; - -	/* Processor flags are either both 0 ... */ -	if (!p1 && !p2) -		return true; - -	/* ... or they intersect. */ -	return p1 & p2; -} - -int microcode_sanity_check(void *mc, int print_err) -{ -	unsigned long total_size, data_size, ext_table_size; -	struct microcode_header_intel *mc_header = mc; -	struct extended_sigtable *ext_header = NULL; -	u32 sum, orig_sum, ext_sigcount = 0, i; -	struct extended_signature *ext_sig; - -	total_size = get_totalsize(mc_header); -	data_size = get_datasize(mc_header); - -	if (data_size + MC_HEADER_SIZE > total_size) { -		if (print_err) -			pr_err("Error: bad microcode data file size.\n"); -		return -EINVAL; -	} - -	if (mc_header->ldrver != 1 || mc_header->hdrver != 1) { -		if (print_err) -			pr_err("Error: invalid/unknown microcode update format.\n"); -		return -EINVAL; -	} - -	ext_table_size = total_size - (MC_HEADER_SIZE + data_size); -	if (ext_table_size) { -		u32 ext_table_sum = 0; -		u32 *ext_tablep; - -		if ((ext_table_size < EXT_HEADER_SIZE) -		 || ((ext_table_size - EXT_HEADER_SIZE) % EXT_SIGNATURE_SIZE)) { -			if (print_err) -				pr_err("Error: truncated extended signature table.\n"); -			return -EINVAL; -		} - -		ext_header = mc + MC_HEADER_SIZE + data_size; -		if (ext_table_size != exttable_size(ext_header)) { -			if (print_err) -				pr_err("Error: extended signature table size mismatch.\n"); -			return -EFAULT; -		} - -		ext_sigcount = ext_header->count; - -		/* -		 * Check extended table checksum: the sum of all dwords that -		 * comprise a valid table must be 0. -		 */ -		ext_tablep = (u32 *)ext_header; - -		i = ext_table_size / sizeof(u32); -		while (i--) -			ext_table_sum += ext_tablep[i]; - -		if (ext_table_sum) { -			if (print_err) -				pr_warn("Bad extended signature table checksum, aborting.\n"); -			return -EINVAL; -		} -	} - -	/* -	 * Calculate the checksum of update data and header. The checksum of -	 * valid update data and header including the extended signature table -	 * must be 0. -	 */ -	orig_sum = 0; -	i = (MC_HEADER_SIZE + data_size) / sizeof(u32); -	while (i--) -		orig_sum += ((u32 *)mc)[i]; - -	if (orig_sum) { -		if (print_err) -			pr_err("Bad microcode data checksum, aborting.\n"); -		return -EINVAL; -	} - -	if (!ext_table_size) -		return 0; - -	/* -	 * Check extended signature checksum: 0 => valid. -	 */ -	for (i = 0; i < ext_sigcount; i++) { -		ext_sig = (void *)ext_header + EXT_HEADER_SIZE + -			  EXT_SIGNATURE_SIZE * i; - -		sum = (mc_header->sig + mc_header->pf + mc_header->cksum) - -		      (ext_sig->sig + ext_sig->pf + ext_sig->cksum); -		if (sum) { -			if (print_err) -				pr_err("Bad extended signature checksum, aborting.\n"); -			return -EINVAL; -		} -	} -	return 0; -} - -/* - * Returns 1 if update has been found, 0 otherwise. - */ -int find_matching_signature(void *mc, unsigned int csig, int cpf) -{ -	struct microcode_header_intel *mc_hdr = mc; -	struct extended_sigtable *ext_hdr; -	struct extended_signature *ext_sig; -	int i; - -	if (cpu_signatures_match(csig, cpf, mc_hdr->sig, mc_hdr->pf)) -		return 1; - -	/* Look for ext. headers: */ -	if (get_totalsize(mc_hdr) <= get_datasize(mc_hdr) + MC_HEADER_SIZE) -		return 0; - -	ext_hdr = mc + get_datasize(mc_hdr) + MC_HEADER_SIZE; -	ext_sig = (void *)ext_hdr + EXT_HEADER_SIZE; - -	for (i = 0; i < ext_hdr->count; i++) { -		if (cpu_signatures_match(csig, cpf, ext_sig->sig, ext_sig->pf)) -			return 1; -		ext_sig++; -	} -	return 0; -} - -/* - * Returns 1 if update has been found, 0 otherwise. - */ -int has_newer_microcode(void *mc, unsigned int csig, int cpf, int new_rev) -{ -	struct microcode_header_intel *mc_hdr = mc; - -	if (mc_hdr->rev <= new_rev) -		return 0; - -	return find_matching_signature(mc, csig, cpf); -}  |