434 lines
10 KiB
C
434 lines
10 KiB
C
/*
|
|
* Copyright (c) 1995,1996 FirePower Systems, Inc.
|
|
* DO NOT DISTRIBUTE without permission
|
|
*
|
|
* $RCSfile: phvrsion.c $
|
|
* $Revision: 1.47 $
|
|
* $Date: 1996/06/25 16:06:34 $
|
|
* $Locker: $
|
|
*/
|
|
|
|
#include "halp.h"
|
|
#include "phsystem.h"
|
|
#include "fparch.h"
|
|
#include "ntverp.h"
|
|
#include "string.h"
|
|
|
|
typedef CHAR Names[20];
|
|
|
|
LONG i=0;
|
|
Names ScopeList[] = {
|
|
"Engineering",
|
|
"Manufacturing",
|
|
"Testing",
|
|
"Customer",
|
|
};
|
|
Names RelList[] = {
|
|
"General",
|
|
"OfficiaL",
|
|
"Testing",
|
|
"Controlled",
|
|
"Lab use"
|
|
};
|
|
|
|
//
|
|
// to avoid cascading headers
|
|
//
|
|
NTSYSAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
RtlCharToInteger (
|
|
PCSZ String,
|
|
ULONG Base,
|
|
PULONG Value
|
|
);
|
|
|
|
#define HAL_DISPLAY_DEFINES(a) \
|
|
if (state == 3) { \
|
|
HalDisplayString("\n"); \
|
|
state = 0; \
|
|
} \
|
|
HalDisplayString(" "); \
|
|
HalDisplayString(a); \
|
|
state++;
|
|
|
|
#define ORG IQUOTE(BUILTBY)
|
|
// #define REVIEW __FILE__ "(" IQUOTE(__LINE__) ") : REVIEW -> "
|
|
|
|
ULONG
|
|
HalpVersionSystem(
|
|
SYSTEM_TYPE
|
|
) ;
|
|
VOID
|
|
HalpVersionExternal(
|
|
IN RelInfo *,
|
|
IN PLOADER_PARAMETER_BLOCK
|
|
) ;
|
|
PCHAR
|
|
HalpGetVersionData(
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|
) ;
|
|
VOID
|
|
HalpDisplayVersionData(
|
|
IN PCHAR VersionData
|
|
) ;
|
|
BOOLEAN
|
|
HalpSetRevs(
|
|
RelInfo *
|
|
) ;
|
|
|
|
// int HalpProcessorCount();
|
|
|
|
#pragma alloc_text(INIT,HalpVersionSystem)
|
|
#pragma alloc_text(INIT,HalpVersionExternal)
|
|
#pragma alloc_text(INIT,HalpGetVersionData)
|
|
#pragma alloc_text(INIT,HalpDisplayVersionData)
|
|
#pragma alloc_text(INIT,HalpSetRevs)
|
|
|
|
extern ULONG HalpGetCycleTime(VOID);
|
|
extern ULONG HalpGetInstructionTimes( VOID );
|
|
extern ULONG HalpPerformanceFrequency;
|
|
|
|
|
|
#if DBG == 1
|
|
VOID
|
|
HalpVersionInternal( VOID )
|
|
{
|
|
|
|
int state = 0;
|
|
|
|
HalpDebugPrint("\nWelcome to the %s (%s) Party\n",
|
|
SystemDescription[SystemType].SystemName,
|
|
ProcessorDescription[ProcessorType].ProcessorName);
|
|
HalpDebugPrint("HalpVersionInternal: Raw Processor Value (0x%x)\n",
|
|
HalpGetProcessorVersion());
|
|
HalpDebugPrint("Hal compiled on %s at %s with the following defines:\n",
|
|
__DATE__, __TIME__);
|
|
|
|
HalDisplayString("\n");
|
|
HalpDebugPrint(" Hal Build Base: %d \n",VER_PRODUCTBUILD);
|
|
HalpVersionSystem(SystemType);
|
|
}
|
|
#endif // DBG
|
|
|
|
/*
|
|
* Routine Description: ULONG HalpVersionSystem(SYSTEM_TYPE System)
|
|
*
|
|
* Extract as much version information out of the mother board as possible:
|
|
*
|
|
*/
|
|
|
|
ULONG
|
|
HalpVersionSystem(SYSTEM_TYPE System)
|
|
{
|
|
ULONG TscVersion=0;
|
|
ULONG PciVersion=0;
|
|
|
|
TscVersion = rTscRevision;
|
|
PciVersion = rPCIRevisionID;
|
|
|
|
switch(System) {
|
|
|
|
case SYS_POWERSLICE:
|
|
HalpDebugPrint("TSC version: 0x%x \n", TscVersion );
|
|
break;
|
|
|
|
case SYS_POWERTOP : HalpDebugPrint("TSC version: 0x%x \n", TscVersion );
|
|
break;
|
|
|
|
case SYS_POWERPRO : HalpDebugPrint("Escc version: IS NOT DESIGNED IN!@!");
|
|
break;
|
|
|
|
case SYS_POWERSERVE : HalpDebugPrint("WHOOOAA pahdna, just what are you trying to pull here?\n");
|
|
break;
|
|
|
|
case SYS_UNKNOWN : HalpDebugPrint("Unknown system type \n");
|
|
|
|
default: // unknown stuff? should never get here
|
|
break;
|
|
}
|
|
HalpDebugPrint("\n===========================================================================\n");
|
|
HalpDebugPrint("PCI revision id: 0x%x \n", PciVersion );
|
|
HalpDebugPrint("TSC Control register: 0x%08x\n",rTscControl);
|
|
HalpDebugPrint("PioPending count: 0x%08x\n",rPIOPendingCount);
|
|
HalpDebugPrint("\n===========================================================================\n");
|
|
|
|
return(1); // success, true, good, ...
|
|
}
|
|
static PCHAR
|
|
gettoken(PCHAR token, PCHAR buf, CHAR delim)
|
|
{
|
|
CHAR c;
|
|
while (c = *buf) {
|
|
if (c == delim) {
|
|
buf++;
|
|
break;
|
|
} else {
|
|
*token++ = c;
|
|
buf++;
|
|
}
|
|
}
|
|
*token = '\0';
|
|
return buf;
|
|
}
|
|
|
|
VOID
|
|
HalpDisplayVersionData( IN PCHAR VersionData )
|
|
{
|
|
|
|
while (*VersionData) {
|
|
enum {Firmware = 0, Veneer = 1, Nada};
|
|
ULONG type;
|
|
PCHAR typeStr[2] = {"Firmware", "Veneer"};
|
|
CHAR token[64];
|
|
PCHAR tok = VersionData;
|
|
VersionData += strlen(VersionData)+1;
|
|
|
|
if (strstr(tok, typeStr[Firmware])) {
|
|
type = Firmware;
|
|
} else if (strstr(tok, typeStr[Veneer])) {
|
|
type = Veneer;
|
|
} else {
|
|
type = Nada;
|
|
}
|
|
if (Nada != type) {
|
|
CHAR buf[80];
|
|
strcpy(buf, typeStr[type]);
|
|
strcat(buf, ":");
|
|
if (strlen(buf) < 10) {
|
|
HalpDebugPrint("%-10s", buf);
|
|
} else {
|
|
HalpDebugPrint("%s: ", buf);
|
|
}
|
|
if (*VersionData) {
|
|
LONG n;
|
|
|
|
tok = VersionData;
|
|
VersionData += strlen(VersionData)+1;
|
|
n = 0;
|
|
tok = gettoken(token, tok, ',');
|
|
while (token[0]) {
|
|
switch (n++) {
|
|
case 2:
|
|
strcpy(buf, token);
|
|
strcat(buf, ",");
|
|
if (strlen(buf) < 7) {
|
|
HalpDebugPrint("%-7s", buf);
|
|
} else {
|
|
HalpDebugPrint("%s ", buf);
|
|
}
|
|
break;
|
|
case 3:
|
|
//
|
|
// Put date in Mmm dd yyyy format if in yyyy-mm-dd
|
|
// No unicode here :-).
|
|
// isdigit() causes too many link hassles.
|
|
//
|
|
if (type == Firmware && *token >= '0' && *token <= '9') {
|
|
PCHAR day;
|
|
PCHAR month;
|
|
PCHAR year;
|
|
PCHAR Mmm[12] = {
|
|
"Jan", "Feb", "Mar", "Apr",
|
|
"May", "Jun", "Jul", "Aug",
|
|
"Sep", "Oct", "Nov", "Dec",
|
|
};
|
|
|
|
strcpy(buf, token);
|
|
if (day = strrchr(buf, '-')) {
|
|
*day++ = '\0';
|
|
if (month = strrchr(buf, '-')) {
|
|
ULONG i;
|
|
*month++ = '\0';
|
|
RtlCharToInteger(month, 10, &i);
|
|
if (i > 12 || i < 1) {
|
|
HalpDebugPrint("%s, ", token);
|
|
} else {
|
|
year = buf;
|
|
//
|
|
// Decrement the month by one to align with
|
|
// zero based nature of the Mmm array.
|
|
//
|
|
HalpDebugPrint("%s %s %s, ", Mmm[i-1], day, year);
|
|
}
|
|
}
|
|
} else {
|
|
HalpDebugPrint("%s, ", token);
|
|
}
|
|
} else {
|
|
HalpDebugPrint("%s, ", token);
|
|
}
|
|
break;
|
|
case 4:
|
|
HalpDebugPrint("%s", token);
|
|
break;
|
|
}
|
|
tok = gettoken(token, tok, ',');
|
|
}
|
|
HalpDebugPrint("\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PCHAR
|
|
HalpGetVersionData( IN PLOADER_PARAMETER_BLOCK LoaderBlock )
|
|
{
|
|
PCHAR versionData = NULL;
|
|
|
|
//
|
|
// Read the Registry entry to get the Firmware and Veneer version info.
|
|
//
|
|
|
|
if (LoaderBlock) {
|
|
PCONFIGURATION_COMPONENT_DATA ConfigurationEntry;
|
|
|
|
ConfigurationEntry = KeFindConfigurationEntry (
|
|
LoaderBlock->ConfigurationRoot,
|
|
SystemClass,
|
|
ArcSystem,
|
|
NULL
|
|
);
|
|
|
|
if (ConfigurationEntry) {
|
|
if (ConfigurationEntry->ComponentEntry.ConfigurationDataLength) {
|
|
PCM_PARTIAL_RESOURCE_LIST List;
|
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
|
|
LONG count;
|
|
|
|
List = (PCM_PARTIAL_RESOURCE_LIST) ConfigurationEntry->ConfigurationData;
|
|
Descriptor = List->PartialDescriptors;
|
|
for (count = List->Count; count > 0; count--) {
|
|
if (CmResourceTypeDeviceSpecific == Descriptor->Type) {
|
|
if (Descriptor->u.DeviceSpecificData.DataSize) {
|
|
//
|
|
// Finally, got the device specific data!
|
|
//
|
|
|
|
versionData = (PCHAR) Descriptor + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return versionData;
|
|
}
|
|
|
|
VOID
|
|
HalpVersionExternal( IN RelInfo *yahoo, IN PLOADER_PARAMETER_BLOCK LoaderBlock )
|
|
{
|
|
PCHAR versionData;
|
|
CHAR debugStr[50];
|
|
CHAR buf[BUFSIZ];
|
|
|
|
|
|
// --> Make it look like this <--
|
|
//
|
|
// FirePower (TM) Systems, Inc. Powerized (TM) MX4100/2
|
|
// Copyright (C) 1994-1996 FirePower Systems, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// Firmware: 00.23, Apr 27 1995, 14:42:21
|
|
// Veneer: 1.0, May 13 1995, 18:59:56
|
|
// Hal: 0,0, May 16 1995, 18:00:42
|
|
|
|
//
|
|
// Display the Model Number and our company name
|
|
//
|
|
HalpDebugPrint("\nFirePower (TM) Systems, Inc. Powerized_%s\n",
|
|
SystemDescription[SystemType].SystemName);
|
|
HalpDebugPrint("Copyright (C) 1994-1996 FirePower Systems, Inc.\n");
|
|
HalpDebugPrint("All rights reserved.\n\n");
|
|
|
|
//
|
|
// Display Version Data from firmware/veneer
|
|
//
|
|
|
|
if ( versionData = HalpGetVersionData(LoaderBlock) ) {
|
|
HalpDisplayVersionData(versionData);
|
|
}
|
|
|
|
//
|
|
// Display HAL Version Data
|
|
//
|
|
|
|
sprintf(buf, "%d.%d,", yahoo->Major, yahoo->Minor);
|
|
#if DBG
|
|
#if HALFIRE_EVAL
|
|
sprintf(debugStr, "DEBUG %s", HALFIRE_EVAL);
|
|
#else
|
|
strcpy(debugStr, "DEBUG");
|
|
#endif
|
|
#else
|
|
#if HALFIRE_EVAL
|
|
sprintf(debugStr, "%s", HALFIRE_EVAL);
|
|
#else
|
|
strcpy(debugStr, "");
|
|
#endif
|
|
#endif
|
|
if (strlen(buf) < 7) {
|
|
HalpDebugPrint("HAL: %-7s%s, %s %s\n\n", buf,
|
|
yahoo->BuildDate, yahoo->BuildTime, debugStr);
|
|
} else {
|
|
HalpDebugPrint("HAL: %s %s, %s %s\n\n", buf,
|
|
yahoo->BuildDate, yahoo->BuildTime, debugStr);
|
|
}
|
|
}
|
|
|
|
/*
|
|
*/
|
|
BOOLEAN
|
|
HalpSetRevs( RelInfo *yahoo )
|
|
{
|
|
CHAR *ads;
|
|
LONG i=0;
|
|
|
|
ads = ORG;
|
|
while( *ads ) {
|
|
yahoo->Org[i] = *ads++;
|
|
i++;
|
|
}
|
|
yahoo->Scope = ENG;
|
|
i=0;
|
|
ads=__DATE__;
|
|
while( *ads ) {
|
|
yahoo->BuildDate[i] = *ads++;
|
|
i++;
|
|
}
|
|
i=0;
|
|
ads=__TIME__;
|
|
while( *ads ) {
|
|
yahoo->BuildTime[i] = *ads++;
|
|
i++;
|
|
}
|
|
yahoo->Major = HAL_MAJOR;
|
|
yahoo->Minor = HAL_MINOR;
|
|
yahoo->State = LAB;
|
|
return TRUE;
|
|
}
|
|
|
|
#if DBG
|
|
/*
|
|
* Routine Description: BOOLEAN HalpPrintRevs()
|
|
*
|
|
* args:
|
|
* RelInfo
|
|
*/
|
|
|
|
BOOLEAN
|
|
HalpPrintRevs( RelInfo *yahoo )
|
|
{
|
|
|
|
HalpDebugPrint("Hal version-[%x.%x] \n",yahoo->Major, yahoo->Minor);
|
|
HalpDebugPrint("%s: ", yahoo->Org );
|
|
HalpDebugPrint("%s: ", ScopeList[yahoo->Scope]);
|
|
HalpDebugPrint("%s: ",yahoo->BuildDate);
|
|
HalpDebugPrint("%s: ",yahoo->BuildTime);
|
|
HalpDebugPrint("%s: ", RelList[yahoo->State]);
|
|
|
|
return TRUE;
|
|
}
|
|
#endif // DBG
|