mirror of
https://github.com/mpv-player/mpv
synced 2025-04-07 01:53:06 +00:00
Retrieve CPU built-in namestring, and if it exists, print it during cpu detection; t it doesn't exist, fallback to the cpu table. Patch by Zuxy Meng
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@18539 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
a49659bead
commit
c9ad9700c3
30
cpudetect.c
30
cpudetect.c
@ -118,12 +118,13 @@ void GetCpuCaps( CpuCaps *caps)
|
|||||||
(char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]);
|
(char*) (regs+1),(char*) (regs+3),(char*) (regs+2), regs[0]);
|
||||||
if (regs[0]>=0x00000001)
|
if (regs[0]>=0x00000001)
|
||||||
{
|
{
|
||||||
char *tmpstr;
|
char *tmpstr, *ptmpstr;
|
||||||
unsigned cl_size;
|
unsigned cl_size;
|
||||||
|
|
||||||
do_cpuid(0x00000001, regs2);
|
do_cpuid(0x00000001, regs2);
|
||||||
|
|
||||||
caps->cpuType=(regs2[0] >> 8)&0xf;
|
caps->cpuType=(regs2[0] >> 8)&0xf;
|
||||||
|
caps->cpuModel=(regs2[0] >> 4)&0xf;
|
||||||
|
|
||||||
// see AMD64 Architecture Programmer's Manual, Volume 3: General-purpose and
|
// see AMD64 Architecture Programmer's Manual, Volume 3: General-purpose and
|
||||||
// System Instructions, Table 3-2: Effective family computation, page 120.
|
// System Instructions, Table 3-2: Effective family computation, page 120.
|
||||||
@ -131,6 +132,9 @@ void GetCpuCaps( CpuCaps *caps)
|
|||||||
// use extended family (P4, IA64, K8)
|
// use extended family (P4, IA64, K8)
|
||||||
caps->cpuType=0xf+((regs2[0]>>20)&255);
|
caps->cpuType=0xf+((regs2[0]>>20)&255);
|
||||||
}
|
}
|
||||||
|
if(caps->cpuType==0xf || caps->cpuType==6)
|
||||||
|
caps->cpuModel |= ((regs2[0]>>16)&0xf) << 4;
|
||||||
|
|
||||||
caps->cpuStepping=regs2[0] & 0xf;
|
caps->cpuStepping=regs2[0] & 0xf;
|
||||||
|
|
||||||
// general feature flags:
|
// general feature flags:
|
||||||
@ -142,11 +146,13 @@ void GetCpuCaps( CpuCaps *caps)
|
|||||||
cl_size = ((regs2[1] >> 8) & 0xFF)*8;
|
cl_size = ((regs2[1] >> 8) & 0xFF)*8;
|
||||||
if(cl_size) caps->cl_size = cl_size;
|
if(cl_size) caps->cl_size = cl_size;
|
||||||
|
|
||||||
tmpstr=GetCpuFriendlyName(regs, regs2);
|
ptmpstr=tmpstr=GetCpuFriendlyName(regs, regs2);
|
||||||
|
while(*ptmpstr == ' ')
|
||||||
|
ptmpstr++;
|
||||||
mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
|
mp_msg(MSGT_CPUDETECT,MSGL_INFO,"CPU: %s ",tmpstr);
|
||||||
free(tmpstr);
|
free(tmpstr);
|
||||||
mp_msg(MSGT_CPUDETECT,MSGL_INFO,"(Family: %d, Stepping: %d)\n",
|
mp_msg(MSGT_CPUDETECT,MSGL_INFO,"(Family: %d, Model: %d, Stepping: %d)\n",
|
||||||
caps->cpuType, caps->cpuStepping);
|
caps->cpuType, caps->cpuModel, caps->cpuStepping);
|
||||||
|
|
||||||
}
|
}
|
||||||
do_cpuid(0x80000000, regs);
|
do_cpuid(0x80000000, regs);
|
||||||
@ -225,7 +231,7 @@ void GetCpuCaps( CpuCaps *caps)
|
|||||||
|
|
||||||
char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
|
char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
|
||||||
#include "cputable.h" /* get cpuname and cpuvendors */
|
#include "cputable.h" /* get cpuname and cpuvendors */
|
||||||
char vendor[17];
|
char vendor[13];
|
||||||
char *retname;
|
char *retname;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -236,6 +242,19 @@ char *GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]){
|
|||||||
|
|
||||||
sprintf(vendor,"%.4s%.4s%.4s",(char*)(regs+1),(char*)(regs+3),(char*)(regs+2));
|
sprintf(vendor,"%.4s%.4s%.4s",(char*)(regs+1),(char*)(regs+3),(char*)(regs+2));
|
||||||
|
|
||||||
|
do_cpuid(0x80000000,regs);
|
||||||
|
if (regs[0] >= 0x80000004)
|
||||||
|
{
|
||||||
|
// CPU has built-in namestring
|
||||||
|
retname[0] = '\0';
|
||||||
|
for (i = 0x80000002; i <= 0x80000004; i++)
|
||||||
|
{
|
||||||
|
do_cpuid(i, regs);
|
||||||
|
strncat(retname, (char*)regs, 16);
|
||||||
|
}
|
||||||
|
return retname;
|
||||||
|
}
|
||||||
|
|
||||||
for(i=0; i<MAX_VENDORS; i++){
|
for(i=0; i<MAX_VENDORS; i++){
|
||||||
if(!strcmp(cpuvendors[i].string,vendor)){
|
if(!strcmp(cpuvendors[i].string,vendor)){
|
||||||
if(cpuname[i][CPUID_FAMILY][CPUID_MODEL]){
|
if(cpuname[i][CPUID_FAMILY][CPUID_MODEL]){
|
||||||
@ -495,6 +514,7 @@ static void sigill_handler (int sig)
|
|||||||
void GetCpuCaps( CpuCaps *caps)
|
void GetCpuCaps( CpuCaps *caps)
|
||||||
{
|
{
|
||||||
caps->cpuType=0;
|
caps->cpuType=0;
|
||||||
|
caps->cpuModel=0;
|
||||||
caps->cpuStepping=0;
|
caps->cpuStepping=0;
|
||||||
caps->hasMMX=0;
|
caps->hasMMX=0;
|
||||||
caps->hasMMX2=0;
|
caps->hasMMX2=0;
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
typedef struct cpucaps_s {
|
typedef struct cpucaps_s {
|
||||||
int cpuType;
|
int cpuType;
|
||||||
|
int cpuModel;
|
||||||
int cpuStepping;
|
int cpuStepping;
|
||||||
int hasMMX;
|
int hasMMX;
|
||||||
int hasMMX2;
|
int hasMMX2;
|
||||||
|
Loading…
Reference in New Issue
Block a user