ucode_utils.c revision 5e53ed34920bc03b619b50f459f2475e7bf80b6f
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * CDDL HEADER START
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * The contents of this file are subject to the terms of the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Common Development and Distribution License (the "License").
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * You may not use this file except in compliance with the License.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * See the License for the specific language governing permissions
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * and limitations under the License.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * When distributing Covered Code, include this CDDL HEADER in each
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * If applicable, add the following below this CDDL HEADER, with the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * fields enclosed by brackets "[]" replaced with your own identifying
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * information: Portions Copyright [yyyy] [name of copyright owner]
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * CDDL HEADER END
489b7c4ab76ae8df137fbfcc2214f7baa52883a0Raymond Chen * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Use is subject to license terms.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Refer to
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Intel 64 and IA-32 Architectures Software Developers's Manual
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Chapter 9.11 Microcode Update Facilities
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * for details.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Validates the microcode header.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Returns EM_OK on success, EM_HEADER on failure.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * The only header version number supported is 1.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * The body size field of the microcode code header specifies the size
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * of the encrypted data section, its value must be a multiple of the
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * size of DWORD. The total size field must be in multiples of 1K
c77a61a72b5ecdc507d6cf104142edd371a16c84yz if ((body_size % sizeof (int)) ||
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Sanity check to avoid reading bogus files
7014882c6a3672fd0e5d60200af8643ae53c5928Richard Lowe if (total_size < UCODE_MIN_SIZE || total_size > UCODE_MAX_SIZE)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * If there is extended signature table, total_size is the sum of
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * header_size
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * body_size
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * sizeof (struct ucode_ext_table)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * n * sizeof (struct ucode_ext_sig)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * where n is indicated by uet_count in struct ucode_ext_table.
c77a61a72b5ecdc507d6cf104142edd371a16c84yz UCODE_EXT_TABLE_SIZE_INTEL) % UCODE_EXT_SIG_SIZE_INTEL) {
c77a61a72b5ecdc507d6cf104142edd371a16c84yz * Returns checksum.
c77a61a72b5ecdc507d6cf104142edd371a16c84yzucode_checksum_intel(uint32_t sum, uint32_t size, uint8_t *code)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz while (i--)
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* LINTED: pointer alignment */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* Magic Number: "AMD\0" */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* equivalence table */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* LINTED: pointer alignment */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* microcode patch */
c77a61a72b5ecdc507d6cf104142edd371a16c84yz /* LINTED: pointer alignment */
if (size)
return (EM_FILEFORMAT);
return (EM_OK);
int remaining;
return (EM_INVALIDARG);
return (rc);
return (EM_CHECKSUM);
if (ext_size > 0) {
uint32_t i;
return (EM_CHECKSUM);
if (ucode_checksum_intel(0,
i * UCODE_EXT_SIG_SIZE_INTEL])) {
return (EM_CHECKSUM);
return (EM_OK);