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