winamp/Src/libvpShared/corelibs/CpuID/Win32/cid.c

153 lines
4.5 KiB
C

//==========================================================================
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1999 - 2001 On2 Technologies Inc. All Rights Reserved.
//
//--------------------------------------------------------------------------
#include <windows.h>
#include <stdarg.h>
#include "cpuidlib.h"
#include "cidasm.h"
#include <process.h>
#include <stdio.h>
extern int WillametteNewInstructionOSSupport();
extern int WillametteNewInstructionHWSupport();
/*
* **-DoesOSSupportXMM
*
* This function will check to see if the operating supports the XMM (Pentium III) instructions
* The XMM functionality adds 8 128-bit registers to the pentium II register set. With the addition
* of the new registers the OS needs to preserve and restore the registers on task switches.
*
* Inputs:
* None
*
* Outputs:
* True returned if the OS supports the XMM instructions.
* False returned if the OS does not suppor the XMM instructions.
*/
int DoesOSSupportXMM( void )
{
OSVERSIONINFO OSInformation; // Data structure where OS version will be filled in
int ReturnValue = FALSE; // Preload to fail
// need to initilize size of OS info structure before calling GetVersionEx
OSInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if( !GetVersionEx( &OSInformation ) ) // Get OS information
{
/*
* having trouble getting OS information
* to be safe will return that we do not support XMM
* instructions
*/
// ReturnValue = FALSE;
}
if( OSInformation.dwPlatformId == VER_PLATFORM_WIN32_NT )
// if( 1 )
{
/*
* If we are on a windows NT system we cannot directly
* read the control registers to see if the OS supports
* the XMM instructions. We will just check to see if
* service pack 4 is installed.
*/
int ServicePackNumber;
if( strcmp(OSInformation.szCSDVersion, "" ) != 0 ) // is there a service pack installed?
{
// Yes, get service pack revision
char Junk[132], Junk2[132];
sscanf( OSInformation.szCSDVersion, "%s %s %d", Junk, Junk2, &ServicePackNumber );
}
else
{
ServicePackNumber = 0;
}
if( OSInformation.dwMajorVersion == 4 && // must be versio 4 or greater
ServicePackNumber >= 4 || // must have service pack 4 or greater
OSInformation.dwMajorVersion >=5)
{
ReturnValue = TRUE;
}
else
{
// ReturnValue = FALSE;
}
#if 0
// some handy debugging info if you are desperate
printf("OS Major Revision %d\n", OSInformation.dwMajorVersion );
printf("OS Minor REvision %d\n", OSInformation.dwMinorVersion );
printf("Service Pack Number %d\n", ServicePackNumber );
#endif
}
else
{
/*
* we are on a Windows 9x system.
*/
//if( Does9xOSSupportXMM()) // does the Windows 9x support the XMM instructions?
{
ReturnValue = TRUE; // yup
}
//else
//{
//ReturnValue = FALSE; // Nope, don't support XMM instructions
//}
}
return( ReturnValue );
}
/*
* **-findCPUId
*
* See cpuidlib.h for a detailed description of this function
*/
PROCTYPE findCPUId( void )
{
PROCTYPE CpuType;
// return 0;
// return (PII); // drop to next lowest type of CPU which should be the Pentium II processor
CpuType = getCPUType(); // Get version of processor
// The code to check whether willammete instructions are called attempts to run
// an illegal instruction. Under 98 mplayer crashes the os as soon as the illegal
// instruction is called, so I've disabled it.
if( CpuType == XMM ) // If the CPU supports XMM (Pentium III) instructions
{
// if( DoesOSSupportXMM()) // need to check to see if the OS supports the XMM instructions
{
if( WillametteNewInstructionHWSupport()&&
WillametteNewInstructionOSSupport())
{
CpuType = WMT;
}
}
// else
// {
// os does not support the XMM instructions
// CpuType = PII; // drop to next lowest type of CPU which should be the Pentium II processor
// }
}
return( CpuType );
}