diff options
Diffstat (limited to 'system/alpha/h/romhead.h')
-rw-r--r-- | system/alpha/h/romhead.h | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/system/alpha/h/romhead.h b/system/alpha/h/romhead.h new file mode 100644 index 000000000..5be8dd7d9 --- /dev/null +++ b/system/alpha/h/romhead.h @@ -0,0 +1,354 @@ +#ifndef __ROMHEAD_H_LOADED +#define __ROMHEAD_H_LOADED +/***************************************************************************** + + Copyright © 1993, 1994 Digital Equipment Corporation, + Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided +that the copyright notice and this permission notice appear in all copies +of software and supporting documentation, and that the name of Digital not +be used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. Digital grants this permission +provided that you prominently mark, as not part of the original, any +modifications made to this software or documentation. + +Digital Equipment Corporation disclaims all warranties and/or guarantees +with regard to this software, including all implied warranties of fitness for +a particular purpose and merchantability, and makes no representations +regarding the use of, or the results of the use of, the software and +documentation in terms of correctness, accuracy, reliability, currentness or +otherwise; and you rely on the software, documentation and results solely at +your own risk. + +******************************************************************************/ + +/* + * $Id: romhead.h,v 1.1.1.1 1997/10/30 23:27:17 verghese Exp $; + */ + +/* + * $Log: romhead.h,v $ + * Revision 1.1.1.1 1997/10/30 23:27:17 verghese + * current 10/29/97 + * + * Revision 1.16 1995/03/05 00:51:01 fdh + * Fixed up a couple of MACROS. + * + * Revision 1.15 1995/03/04 05:55:57 fdh + * Bracket COMPUTE_CHECKSUM Macro. + * + * Revision 1.14 1995/02/27 15:36:21 fdh + * Removed ul definitions. Replaced with structs of ui's. + * + * Revision 1.13 1995/02/16 22:06:06 fdh + * Changed Open VMS to OpenVMS because of some trademark junk. + * + * Revision 1.12 1995/02/14 21:19:33 cruz + * Fixed up header picture to match implementation. + * + * Revision 1.11 1995/02/10 02:19:03 fdh + * Created COMPUTE_CHECKSUM Macro. + * Corrected prototypes. + * + * Revision 1.10 1995/02/08 00:34:44 fdh + * Added ROMH_VERSION and ROTATE_RIGHT macros. + * + * Revision 1.9 1995/02/07 22:28:09 fdh + * Changed Windows NT alias from "WNT" to "NT". + * + * Revision 1.8 1995/02/07 04:54:33 fdh + * Added ostype definitions. + * Modified ROM_HEADER_CHECKSUM Macro. + * + * Revision 1.7 1995/02/06 02:47:40 fdh + * Added prototypes for romhead.c routines. + * + * Revision 1.6 1995/02/05 01:53:05 fdh + * Modified the definition for the ROM header. + * Added a MACRO that can be used to access the + * ROM header checksum which can be in different location + * for different versions of the header. + * + * Revision 1.5 1995/02/02 20:05:31 fdh + * Moved fwid_array[] initialization to header file. + * + * Revision 1.4 1995/01/31 23:44:00 fdh + * Added field for "OPTIONAL FW ID, continued" to make + * the optional field really 7 bytes. + * + * Revision 1.3 1995/01/31 23:21:25 fdh + * Updated... + * + * Revision 1.2 1995/01/23 22:34:32 fdh + * Extended the ROM header spec. This is now version one + * which is a super-set of the version 0 header. + * + * Revision 1.1 1994/11/19 03:47:29 fdh + * Initial revision + * + * + * + * Special ROM header + * ================== + * The System ROM can contain multiple ROM images, each with + * its own header. That header tells the SROM where to load + * the image and also if it has been compressed with the + * "makerom" tool. For System ROMs which contain a single + * image, the header is optional. If the header does not + * exist the complete System ROM is loaded and executed at + * physical address zero. + * + * 31 0 + * +---------------------------------------------+ + * | VALIDATION PATTERN 0x5A5AC3C3 | 0x00 + * +---------------------------------------------+ + * | INVERSE VALIDATION PATTERN 0xA5A53C3C | 0x04 + * +---------------------------------------------+ + * | HEADER SIZE (Bytes) | 0x08 + * +---------------------------------------------+ + * | IMAGE CHECKSUM | 0x0C + * +---------------------------------------------+ + * | IMAGE SIZE (Memory Footprint) | 0x10 + * +---------------------------------------------+ + * | DECOMPRESSION FLAG | 0x14 + * +---------------------------------------------+ + * | DESTINATION ADDRESS LOWER LONGWORD | 0x18 + * +---------------------------------------------+ + * | DESTINATION ADDRESS UPPER LONGWORD | 0x1C + * +---------------------------------------------+ + * | RSVD<31:16>| ID <15:8>| HEADER REV <7:0> | 0x20 \ + * +---------------------------------------------+ \ + * | ROM IMAGE SIZE | 0x24 | + * +---------------------------------------------+ | New for + * | OPTIONAL FIRMWARE ID <31:0> | 0x28 +- Rev 1 + * +---------------------------------------------+ | headers. + * | OPTIONAL FIRMWARE ID <63:32> | 0x2C | + * +---------------------------------------------+ / + * | HEADER CHECKSUM (excluding this field) | 0x30 / + * +---------------------------------------------+ + * + * VALIDATION PATTERN + * ------------------ + * The first quadword contains a special signature pattern + * that is used to verify that this "special" ROM header + * has been located. The pattern is 0x5A5AC3C3A5A53C3C. + * + * HEADER SIZE (Bytes) + * ------------------- + * The header size is the next longword. This is provided + * to allow for some backward compatibility in the event that + * the header is extended in the future. When the header + * is located, current versions of SROM code determine where + * the image begins based on the header size. Additional data + * added to the header in the future will simply be ignored + * by current SROM code. Additionally, the header size = 0x20 + * implies version 0 of this header spec. For any other size + * see HEADER REVISION to determine header version. + * + * + * IMAGE CHECKSUM + * -------------- + * The next longword contains the image checksum. This is + * used to verify the integrity of the ROM. Checksum is computed + * in the same fashion as the header checksum. + * + * IMAGE SIZE (Memory Footprint) + * ----------------------------- + * The image size reflects the size of the image after it has + * been loaded into memory from the ROM. See ROM IMAGE SIZE. + * + * DECOMPRESSION FLAG + * ------------------ + * The decompression flag tells the SROM code if the makerom + * tool was used to compress the ROM image with a "trivial + * repeating byte algorithm". The SROM code contains routines + * which perform this decompression algorithm. Other + * compression/decompression schemes may be employed which work + * independently from this one. + * + * DESTINATION ADDRESS + * ------------------- + * This quadword contains the destination address for the + * image. The SROM code will begin loading the image at this + * address and subsequently begin its execution there. + * + * HEADER REV + * ---------- + * The revision of the header specifications used in this + * header. This is necessary to provide compatibility to + * future changes to this header spec. Version 0 headers + * are identified by the size of the header. See HEADER + * SIZE. + * + * FIRMWARE ID + * ----------- + * The firmware ID is a byte that specifies the firmware type. + * This facilitates image boot options necessary to boot + * different operating systems. + * + * firmware + * firmware type + * -------- -------- + * DBM 0 Alpha Evaluation Boards Debug Monitor + * WNT 1 Windows NT Firmware + * SRM 2 Alpha System Reference Manual Console + * + * ROM IMAGE SIZE + * -------------- + * The ROM image size reflects the size of the image as it is + * contained in the ROM. See IMAGE SIZE. + * + * OPTIONAL FW ID + * -------------- + * This is an optional field that can be used to provide + * additional firmware information such as firmware revision + * or a character descriptive string up to 8 characters. + * + * HEADER CHECKSUM + * --------------- + * The checksum of the header. This is used to validate + * the presence of a header beyond the validation provided + * by the validation pattern. See VALIDATION PATTERN. + * The header checksum is computed from the beginning of + * the header up to but excluding the header checksum + * field itself. If there are future versions of this + * header the header checksum should always be the last + * field defined in the header. The checksum algorithm used + * is compatible with the standard BSD4.3 algorithm provided + * on most implementations of Unix. Algorithm: The checksum + * is rotated right by one bit around a 16 bit field before + * adding in the value of each byte. + * + */ + +#include "local.h" /* Include environment specific definitions */ + +#define ROM_H_SIGNATURE 0x5A5AC3C3 +#define ROM_H_REVISION 1 + + +typedef union { + struct { + /* + * Version 0 definition of the ROM header. + */ + struct { + ui signature; /* validation signature */ + ui csignature; /* inverse validation signature */ + ui hsize; /* header size */ + ui checksum; /* checksum */ + ui size; /* image size (Memory Footprint) */ + ui decomp; /* decompression algorithm */ + struct { + ui low; + ui high; + } destination; /* destination address */ + } V0; + + /* + * Version 1 extensions to the ROM header. + */ + struct { + char hversion; /* ROM header version (Byte 0) */ + char fw_id; /* Firmware ID (Byte 1) */ + char reserved[2]; /* Reserved (Bytes 3:2) */ + ui rimage_size; /* ROM image size */ + union { + char id[8]; /* Optional Firmware ID (character array) */ + struct { + ui low; + ui high; + } id_S; + } fwoptid; + } V1; + + /* + * Future extensions to the header should be included before + * this header checksum. (See HEADER CHECKSUM description) + */ + ui hchecksum; /* Header checksum, (Always last entry) */ + } romh; + ui romh_array[1]; /* To allow longword access to the data */ +} romheader_t; + +/* + * Registered Firmware types. + */ +#define FW_DBM 0 +#define FW_WNT 1 +#define FW_SRM 2 + +#define FW_DBM_STRINGS "Alpha Evaluation Board Debug Monitor", "DBM", "Debug Monitor", "Monitor", NULL +#define FW_WNT_STRINGS "Windows NT Firmware", "WNT", "NTFW", "ARC", "NT", NULL +#define FW_SRM_STRINGS "Alpha SRM Console", "SRM", "VMS", "OSF", NULL + +typedef struct fw_id { + int firmware_id; + char **id_string; +} fw_id_t; + +extern fw_id_t fwid_array[]; + +#define FW_OSTYPE_DBM 0 +#define FW_OSTYPE_WNT 1 +#define FW_OSTYPE_VMS 2 +#define FW_OSTYPE_OSF 3 + +#define OS_DBM_STRINGS "Alpha Evaluation Board Debug Monitor", "DBM" +#define OS_WNT_STRINGS "The Windows NT Operating System", "NT" +#define OS_VMS_STRINGS "OpenVMS", "VMS" +#define OS_OSF_STRINGS "DEC OSF/1", "OSF" + +typedef struct os_types { + int ostype; + int firmware_id; + char **id_string; +} ostype_t; + +extern ostype_t ostype_array[]; + +/* + * The ROM header checksum should always be assigned to the last + * field in the header. Therefore, when reading headers created + * by various versions of makerom the ROM header checksum can be + * in different locations. This macro can be used to access the + * ROM header checksum in the proper location. + */ +#define ROM_HEADER_CHECKSUM(x) \ + ((x)->romh_array[((x)->romh.V0.hsize - sizeof((x)->romh.hchecksum))/sizeof(ui)]) + +/* + * Macro to provide the header version number + */ +#define ROMH_VERSION(x) ((x)->romh.V0.hsize == 0x20 ? 0 : (x)->romh.V1.hversion) + +/* + * Macro to assist in computing the BSD4.3 style checksum. + */ +#define ROTATE_RIGHT(x) if ((x) & 1) (x) = ((x) >>1) + 0x8000; else (x) = (x) >>1; + +/* + * Macro used to increment the checksum + * by a new byte while keeping the total + * checksum within the 16 bit range. + */ +#define COMPUTE_CHECKSUM(c,k) \ + {ROTATE_RIGHT(k); k += (ub) c; k &= 0xffff;} + +/* + * romheader.c prototypes + */ +extern fw_id_t * fwid_match(char * arg); +extern fw_id_t * fwid_match_i(int fwid); +extern void fwid_dump(char * pre); +extern ostype_t * ostype_match(char * arg); +extern ostype_t * ostype_match_i(int ostype); +extern void ostype_dump(char * pre); +extern ui compute_romh_chksum(romheader_t * header); +extern int dumpHeader(romheader_t * header); + +#endif /* __ROMHEAD_H_LOADED */ |