d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/*
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * CDDL HEADER START
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * The contents of this file are subject to the terms of the
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * Common Development and Distribution License (the "License").
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * You may not use this file except in compliance with the License.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * or http://www.opensolaris.org/os/licensing.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * See the License for the specific language governing permissions
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * and limitations under the License.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * When distributing Covered Code, include this CDDL HEADER in each
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * If applicable, add the following below this CDDL HEADER, with the
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * fields enclosed by brackets "[]" replaced with your own identifying
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * information: Portions Copyright [yyyy] [name of copyright owner]
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * CDDL HEADER END
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/*
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * Use is subject to license terms.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <stdio.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <stdlib.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <unistd.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <sys/types.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <sys/sysmacros.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <fcntl.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <sys/condvar.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <string.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <strings.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <sys/byteorder.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <libintl.h> /* for gettext(3c) */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#include <fwflash/fwflash.h>
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChenchar vendor[] = "GENERIC \0";
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/* MAXIMGSIZE = 1.4 * 1024 * 1024 bytes */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/* Currently the largest firmware image size is 1.4 MB */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/* 1468006 = 1.4 * 1024 * 1024 */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen#define MAXIMGSIZE ((unsigned int)(1468006))
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChenextern struct vrfyplugin *verifier;
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/* required functions for this plugin */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChenint vendorvrfy(struct devicelist *devicenode);
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen/*
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * Important information about how this verification plugin works
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * Direct-attached disks (sd instances) which support firmware
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * download accept image files up to 1.4 * 1024 * 1024 bytes in
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * size, and do their own verification of the image, rejecting the
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * file if it is not appropriate for them.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen *
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * All that we need to do here is set the various verifier fields
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * correctly, and check that the filesize as read from the filesystem
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen * is less than 1.4 * 1024 * 1024 bytes.
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen */
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChenint
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChenvendorvrfy(struct devicelist *devicenode)
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen{
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen if (verifier->imgsize > MAXIMGSIZE) {
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen logmsg(MSG_ERROR,
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen gettext("\nsd-GENERIC firmware image verifier: "
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen "supplied filename %s exceeds maximum allowable "
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen "size of %d bytes\n"),
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen verifier->imgfile, MAXIMGSIZE);
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen return (FWFLASH_FAILURE);
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen }
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen logmsg(MSG_INFO,
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen "sd-GENERIC verifier for device\n"
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen "vid %s, pid %s, rev %s\npath %s\n",
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen devicenode->ident->vid,
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen devicenode->ident->pid,
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen devicenode->ident->revid,
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen devicenode->addresses[0]);
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen verifier->flashbuf = 0;
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen return (FWFLASH_SUCCESS);
d65b419ea7828ceaecc8f2ed7188237add6b14dcXinChen}