summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halx86/i386/ncrdetct.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nthals/halx86/i386/ncrdetct.c
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/ntos/nthals/halx86/i386/ncrdetct.c')
-rw-r--r--private/ntos/nthals/halx86/i386/ncrdetct.c253
1 files changed, 253 insertions, 0 deletions
diff --git a/private/ntos/nthals/halx86/i386/ncrdetct.c b/private/ntos/nthals/halx86/i386/ncrdetct.c
new file mode 100644
index 000000000..2baf83ffa
--- /dev/null
+++ b/private/ntos/nthals/halx86/i386/ncrdetct.c
@@ -0,0 +1,253 @@
+/*++
+
+Copyright (c) 1992 NCR Corporation
+
+Module Name:
+
+ ncrdetect.c
+
+Abstract:
+
+Authors:
+
+ Richard Barton (o-richb) 24-Jan-1992
+ Brian Weischedel 30-Nov-1992
+
+Environment:
+
+ Kernel mode only.
+
+Revision History:
+
+--*/
+
+#ifndef _NTOS_
+#include "nthal.h"
+#endif
+
+PVOID
+HalpMapPhysicalMemory(
+ IN PVOID PhysicalAddress,
+ IN ULONG NumberPages
+ );
+
+VOID
+ReadCMOS(
+ IN ULONG StartingOffset,
+ IN ULONG Count,
+ IN PUCHAR ReturnValuePtr);
+
+ULONG NCRPlatform;
+
+#define NCR3450 0x35333433 // Copied here to build standalone
+#define NCR3550 0x30353834
+#define NCR3360 0x33333630
+
+// WPD definitions:
+
+PUCHAR WPDStringID = "NCR Voyager-1";
+PUCHAR WPDPlatformName = "System 3360";
+#define WPDStringIDLength 13
+#define WPDStringIDRangeStart (0xE000 << 4) // physical address
+#define WPDStringIDRangeSize 0x10000 // 1 segment (64k)
+
+// MSBU definitions:
+
+PUCHAR MSBUCopyrightString = "Copyright (C) ???? NCR\0";
+#define MSBUCopyrightStringLen 23
+#define MSBUCopyrightPhysicalPtr ((0xF000 << 4) + (0xE020))
+typedef struct {
+ ULONG ClassFromFirmware;
+ PUCHAR PlatformName;
+} MSBUPlatformMapEntry;
+MSBUPlatformMapEntry MSBUPlatformMap[] = {{NCR3450, "System 3450"},
+ {NCR3550, "System 3550"},
+ {0, 0}};
+
+PUCHAR
+NCRDeterminePlatform(
+ OUT PBOOLEAN IsConfiguredMp
+)
+/*++
+
+Routine Description:
+ Determine on which NCR platform we are running. For now just display
+ a message. Later we may not continue the boot if we're on an
+ unrecognized platform.
+
+Arguments:
+ none.
+
+Return Value:
+ Pointer to character string identifying which NCR platform. NULL means
+ it is unrecognized, and we shouldn't continue.
+
+--*/
+{
+ BOOLEAN Matchfound;
+ MSBUPlatformMapEntry *MSBUPlatformMapPtr;
+ PVOID BIOSPagePtr;
+ PUCHAR StringPtr;
+ PUCHAR CopyrightPtr;
+ PUCHAR SearchPtr;
+ UCHAR CpuFlags;
+
+
+ // first check for a WPD platform by searching the 0xE000 BIOS segment
+ // for a ROM string that identifies this system as a 3360
+
+
+ // get virtual address to the BIOS region (assuming region is both
+ // page aligned and multiple pages in size)
+
+ BIOSPagePtr = HalpMapPhysicalMemory((PVOID) WPDStringIDRangeStart,
+ (WPDStringIDRangeSize >> 12));
+
+ if (BIOSPagePtr != NULL) {
+
+ SearchPtr = BIOSPagePtr; // begin search at start of region
+ Matchfound = FALSE;
+
+ // search until string is found or we are beyond the region
+
+ while (!Matchfound && (SearchPtr <= (PUCHAR)((ULONG)BIOSPagePtr +
+ WPDStringIDRangeSize -
+ WPDStringIDLength))) {
+
+ // see if SearchPtr points to the desired string
+
+ StringPtr = (PUCHAR)((ULONG)SearchPtr++);
+ CopyrightPtr = WPDStringID;
+
+ // continue compare as long as characters compare
+ // and not at end of string
+
+ while ((Matchfound = (*CopyrightPtr++ == *StringPtr++)) &&
+ (CopyrightPtr < WPDStringID + WPDStringIDLength));
+ }
+
+ // see if string was found (i.e., if this is a 3360)
+
+ if (Matchfound) {
+
+ // store system identifier ("3360") for later HAL use
+
+ NCRPlatform = NCR3360;
+
+ // read CPU good flags from CMOS and determine if MP
+
+ ReadCMOS(0x88A, 1, &CpuFlags);
+ // *IsConfiguredMp = (CpuFlags & (CpuFlags-1)) ? TRUE : FALSE;
+
+ // This is an MP hal
+ *IsConfiguredMp = TRUE;
+
+ return(WPDPlatformName);
+ }
+
+ }
+
+
+ // now check for an MSBU platform
+
+
+ /*
+ * Map in the BIOS text so we can look for our copyright string.
+ */
+ BIOSPagePtr = (PVOID)((ULONG)MSBUCopyrightPhysicalPtr &
+ ~(PAGE_SIZE - 1));
+ BIOSPagePtr = HalpMapPhysicalMemory(BIOSPagePtr, 2);
+ if (BIOSPagePtr == NULL)
+ return(NULL);
+
+ StringPtr = (PUCHAR)((ULONG)BIOSPagePtr +
+ ((ULONG)MSBUCopyrightPhysicalPtr & (PAGE_SIZE - 1)))
+ + (MSBUCopyrightStringLen - 1);
+ CopyrightPtr = MSBUCopyrightString + (MSBUCopyrightStringLen - 1);
+ do {
+ Matchfound = ((*CopyrightPtr == '?') ||
+ (*CopyrightPtr == *StringPtr));
+ --CopyrightPtr;
+ --StringPtr;
+ } while (Matchfound && (CopyrightPtr >= MSBUCopyrightString));
+
+ //
+ // /*
+ // * Clear the mapping to BIOS. We mapped in two pages.
+ // */
+ // BIOSPagePtr = MiGetPteAddress(BIOSPagePtr);
+ // *(PULONG)BIOSPagePtr = 0;
+ // *(((PULONG)BIOSPagePtr)+1) = 0;
+ // /*
+ // * Flush the TLB.
+ // */
+ // _asm {
+ // mov eax, cr3
+ // mov cr3, eax
+ // }
+ //
+
+ if (Matchfound) {
+ /*
+ * must be an MSBU machine..determine which.
+ */
+ ReadCMOS(0xB16, 4, (PUCHAR)&NCRPlatform);
+ for (MSBUPlatformMapPtr = MSBUPlatformMap;
+ (MSBUPlatformMapPtr->ClassFromFirmware != 0);
+ ++MSBUPlatformMapPtr) {
+ if (MSBUPlatformMapPtr->ClassFromFirmware ==
+ NCRPlatform) {
+
+ *IsConfiguredMp = TRUE;
+ return(MSBUPlatformMapPtr->PlatformName);
+ }
+ }
+
+ /*
+ * prerelease version of firmware had this machine class
+ * at the wrong offset into CMOS. until all those versions
+ * of firmware are extinguished from the face of the earth
+ * we should recognize them with this:
+ */
+ ReadCMOS(0xAB3, 4, (PUCHAR)&NCRPlatform);
+ for (MSBUPlatformMapPtr = MSBUPlatformMap;
+ (MSBUPlatformMapPtr->ClassFromFirmware != 0);
+ ++MSBUPlatformMapPtr) {
+ if (MSBUPlatformMapPtr->ClassFromFirmware ==
+ NCRPlatform) {
+ *IsConfiguredMp = TRUE;
+ return(MSBUPlatformMapPtr->PlatformName);
+ }
+ }
+ }
+
+ return(NULL);
+}
+
+
+#ifndef SETUP // if built with Hal, must provide ReadCMOS routine
+
+ULONG
+HalpGetCmosData (
+ IN ULONG SourceLocation,
+ IN ULONG SourceAddress,
+ IN PUCHAR Buffer,
+ IN ULONG Length);
+
+VOID
+ReadCMOS(
+ IN ULONG StartingOffset,
+ IN ULONG Count,
+ IN PUCHAR ReturnValuePtr
+)
+/*++
+
+Routine Description:
+ This routine simply converts a ReadCMOS call (a routine in setup) to
+ the corresponding routine provided in the Hal (HalpGetCmosData).
+
+--*/
+{
+ HalpGetCmosData(1, StartingOffset, ReturnValuePtr, Count);
+}
+#endif