1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/*
2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *
4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  Use of this source code is governed by a BSD-style license
5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  that can be found in the LICENSE file in the root of the source
6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  tree. An additional intellectual property rights grant can be found
7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  in the file PATENTS.  All contributing project authors may
8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */
10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include <string.h>
12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "x86.h"
13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
14538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstruct cpuid_vendors
15538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    char vendor_string[12];
17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    vpx_cpu_t vendor_id;
18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberstatic struct cpuid_vendors cpuid_vendor_list[VPX_CPU_LAST] =
21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "AuthenticAMD", VPX_CPU_AMD           },
23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "AMDisbetter!", VPX_CPU_AMD_OLD       },
24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "CentaurHauls", VPX_CPU_CENTAUR       },
25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "CyrixInstead", VPX_CPU_CYRIX         },
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "GenuineIntel", VPX_CPU_INTEL         },
27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "NexGenDriven", VPX_CPU_NEXGEN        },
28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "Geode by NSC", VPX_CPU_NSC           },
29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "RiseRiseRise", VPX_CPU_RISE          },
30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "SiS SiS SiS ", VPX_CPU_SIS           },
31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "GenuineTMx86", VPX_CPU_TRANSMETA     },
32538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "TransmetaCPU", VPX_CPU_TRANSMETA_OLD },
33538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "UMC UMC UMC ", VPX_CPU_UMC           },
34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    { "VIA VIA VIA ", VPX_CPU_VIA           },
35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber};
36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervpx_cpu_t vpx_x86_vendor(void)
38538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{
39538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned int reg_eax;
40538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    unsigned int vs[3];
41538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    int i;
42538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* Get the Vendor String from the CPU */
44538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    cpuid(0, reg_eax, vs[0], vs[2], vs[1]);
45538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
46538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    for (i = 0; i < VPX_CPU_LAST; i++)
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    {
48538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        if (strncmp ((const char *)vs, cpuid_vendor_list[i].vendor_string, 12) == 0)
49538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber           return (cpuid_vendor_list[i].vendor_id);
50538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    }
51538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber
52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    return VPX_CPU_UNKNOWN;
53538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber}
54