* Added code to detect amount of physical ram installed on the host computer.

* Added logging of host operating system and physical ram to startup.
 * Removed "PhysicalCores" stuff from both x86emitter and startup logs -- physical cores is losing its relevance with all the new AMD and Intel chip designs.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4048 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2010-11-23 21:32:52 +00:00
parent 9f52e30c06
commit 21f75b58db
9 changed files with 43 additions and 59 deletions

View File

@ -251,5 +251,6 @@ namespace HostSys
extern void InitCPUTicks();
extern u64 GetTickFrequency();
extern u64 GetCPUTicks();
extern u64 GetPhysicalMemory();
extern wxString GetOSVersionString();

View File

@ -31,8 +31,6 @@ class x86capabilities
{
public:
bool isIdentified;
u32 LogicalCoresPerPhysicalCPU;
u32 PhysicalCoresPerPhysicalCPU;
public:
x86VendorType VendorID;
@ -106,8 +104,6 @@ public:
{
isIdentified = false;
VendorID = x86Vendor_Unknown;
LogicalCoresPerPhysicalCPU = 1;
PhysicalCoresPerPhysicalCPU = 1;
}
void Identify();

View File

@ -20,11 +20,18 @@
#include <sys/time.h>
#include <wx/utils.h>
extern "C" __aligned16 u8 _xmm_backup[16*2];
extern "C" __aligned16 u8 _mmx_backup[8*4];
// Returns 0 on failure (not supported by the operating system).
u64 GetPhysicalMemory()
{
u64 pages = 0;
#ifdef _SC_PHYS_PAGES
pages = sysconf(_SC_PHYS_PAGES);
#endif
return pages * getpagesize();
}
u8 _xmm_backup[16*2];
u8 _mmx_backup[8*4];
void InitCPUTicks()
{

View File

@ -19,6 +19,7 @@
#include <winnt.h>
int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps )
{
if( eps->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION )

View File

@ -39,6 +39,14 @@ u64 GetCPUTicks()
return count.QuadPart;
}
u64 GetPhysicalMemory()
{
MEMORYSTATUSEX status;
status.dwLength = sizeof(status);
GlobalMemoryStatusEx(&status);
return status.ullTotalPhys;
}
// Windows SDK 7 provides this but previous ones do not, so roll our own in those cases:
#ifndef VER_SUITE_WH_SERVER
# define VER_SUITE_WH_SERVER 0x00008000

View File

@ -21,19 +21,10 @@
// FreeBSD/OsX need something far more complicated (apparently)
void x86capabilities::CountLogicalCores()
{
const uint numCPU = sysconf( _SC_NPROCESSORS_ONLN );
if( numCPU > 0 )
{
//isMultiCore = numCPU > 1;
LogicalCores = numCPU;
PhysicalCores = ( numCPU / LogicalCoresPerPhysicalCPU ) * PhysicalCoresPerPhysicalCPU;
}
else
{
// Indeterminate?
LogicalCores = 1;
PhysicalCores = 1;
}
// Note : GetCPUCount uses sysconf( _SC_NPROCESSORS_ONLN ) internally, which can return 1
// if sysconf info isn't available (a long standing linux bug). There are no fallbacks or
// alternatives, apparently.
LogicalCores = wxThread::GetCPUCount();
}
bool CanEmitShit()

View File

@ -37,10 +37,6 @@ void x86capabilities::CountLogicalCores()
}
LogicalCores = CPUs;
if( LogicalCoresPerPhysicalCPU > CPUs) // for 1-socket HTT-disabled machines
LogicalCoresPerPhysicalCPU = CPUs;
PhysicalCores = ( CPUs / LogicalCoresPerPhysicalCPU ) * PhysicalCoresPerPhysicalCPU;
}
bool _test_instruction( void* pfnCall )

View File

@ -133,23 +133,6 @@ void x86capabilities::CountCores()
s32 regs[ 4 ];
u32 cmds;
LogicalCoresPerPhysicalCPU = 0;
PhysicalCoresPerPhysicalCPU = 1;
// detect multicore for Intel cpu
__cpuid( regs, 0 );
cmds = regs[ 0 ];
if( cmds >= 0x00000001 )
LogicalCoresPerPhysicalCPU = ( regs[1] >> 16 ) & 0xff;
if ((cmds >= 0x00000004) && (VendorID == x86Vendor_Intel))
{
__cpuid( regs, 0x00000004 );
PhysicalCoresPerPhysicalCPU += ( regs[0] >> 26) & 0x3f;
}
__cpuid( regs, 0x80000000 );
cmds = regs[ 0 ];
@ -157,9 +140,6 @@ void x86capabilities::CountCores()
if ((cmds >= 0x80000008) && (VendorID == x86Vendor_AMD) )
{
__cpuid( regs, 0x80000008 );
PhysicalCoresPerPhysicalCPU += ( regs[2] ) & 0xff;
// AMD note: they don't support hyperthreading, but they like to flag this true
// anyway. Let's force-unflag it until we come up with a better solution.
// (note: seems to affect some Phenom II's only? -- Athlon X2's and PhenomI's do
@ -167,9 +147,6 @@ void x86capabilities::CountCores()
hasMultiThreading = 0;
}
if( !hasMultiThreading || LogicalCoresPerPhysicalCPU == 0 )
LogicalCoresPerPhysicalCPU = 1;
// This will assign values into LogicalCores and PhysicalCores
CountLogicalCores();
}

View File

@ -201,30 +201,37 @@ TraceLogFilters& SetTraceConfig()
// This function should be called once during program execution.
void SysLogMachineCaps()
{
Console.WriteLn( Color_StrongGreen, "PCSX2 %u.%u.%u.r%d %s - compiled on " __DATE__, PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo,
Console.WriteLn( Color_StrongGreen, "PCSX2 %u.%u.%u.r%d %s - compiled on " __DATE__,
PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo,
SVN_REV, SVN_MODS ? "(modded)" : ""
);
Console.WriteLn( "Savestate version: 0x%x", g_SaveVersion);
Console.Newline();
Console.WriteLn( Color_StrongBlack, "x86-32 Init:" );
Console.WriteLn( Color_StrongBlack, "Host Machine Init:" );
Console.Indent().WriteLn(
L"Operating System = %s\n"
L"Physical RAM = %u MB",
GetOSVersionString().c_str(),
(u32)(GetPhysicalMemory() / _1mb)
);
u32 speed = x86caps.CalculateMHz();
Console.Indent().WriteLn(
L"CPU vendor name = %s\n"
L"FamilyID = %x\n"
L"x86Family = %s\n"
L"CPU speed = %d.%03d ghz\n"
L"Cores = %d physical [%d logical]\n"
L"CPU name = %s\n"
L"Vendor/Model = %s - stepping=%02X\n"
L"CPU speed = %u.%03u ghz (%u logical thread%s)\n"
L"x86PType = %s\n"
L"x86Flags = %8.8x %8.8x\n"
L"x86EFlags = %8.8x",
fromUTF8( x86caps.VendorName ).c_str(), x86caps.StepID,
L"x86Flags = %08x %08x\n"
L"x86EFlags = %08x",
fromUTF8( x86caps.FamilyName ).Trim().Trim(false).c_str(),
fromUTF8( x86caps.VendorName ).c_str(), x86caps.StepID,
speed / 1000, speed % 1000,
x86caps.PhysicalCores, x86caps.LogicalCores,
x86caps.LogicalCores, (x86caps.LogicalCores==1) ? L"" : L"s",
x86caps.GetTypeName().c_str(),
x86caps.Flags, x86caps.Flags2,
x86caps.EFlags