Changeset 2292


Ignore:
Timestamp:
Aug 21, 2005, 5:17:31 AM (20 years ago)
Author:
bird
Message:

more...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/testcase/cpuid.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.2
    r2291 r2292  
    2626
    2727#include <stdio.h>
     28#include <stdint.h>
    2829
    29 #define BIT(n) (1 << n)
     30/**
     31 * Checks if the current CPU supports CPUID.
     32 *
     33 * @returns 1 if CPUID is supported, 0 if it doesn't.
     34 */
     35static inline int HasCpuId(void)
     36{
     37    int         fRet = 0;
     38    uint32_t    u1;
     39    uint32_t    u2;
     40    __asm__ ("pushf\n\t"
     41             "pop   %1\n\t"
     42             "mov   %1, %2\n\t"
     43             "xorl  $0x200000, %1\n\t"
     44             "push  %1\n\t"
     45             "popf\n\t"
     46             "pushf\n\t"
     47             "pop   %1\n\t"
     48             "cmpl  %1, %2\n\t"
     49             "setne %0\n\t"
     50             "push  %2\n\t"
     51             "popf\n\t"
     52             : "=m" (fRet), "=r" (u1), "=r" (u2));
     53    return fRet;
     54}
     55
     56
     57#define BIT(n)  (1 << n)
     58#define CPUID(n) do {   __asm__ __volatile__ ("cpuid" : "=a" (eax), "=d" (edx), "=c" (ecx), "=b" (ebx) : "0" (n)); \
     59                        printf("%#010x: edx=%08x ecx=%08x eax=%08x ebx=%08x\n", (n), edx, ecx, eax, ebx); } while (0)
     60#define CPUIDSZ(n, psz) \
     61    do {   __asm__ __volatile__ ("cpuid" : "=a" (eax), "=d" (edx), "=c" (ecx), "=b" (ebx) : "0" (n)); \
     62            ((uint32_t *)(psz))[0] = eax; ((uint32_t *)(psz))[1] = ebx; \
     63            ((uint32_t *)(psz))[2] = ecx; ((uint32_t *)(psz))[3] = edx; } while (0)
    3064int main()
    3165{
    32     unsigned  eax, edx, ecx, ebx;
    33     __asm__ ("cpuid" : "=a" (eax), "=d" (edx), "=c" (ecx), "=b" (ebx) : "0" (1));
    34     printf("1: edx=%#x ecx=%#x eax=%#x ebx=%#x\n", edx, ecx, eax, ebx);
    35     if (edx & BIT(0))   printf("FPU ");
    36     if (edx & BIT(1))   printf("VME ");
    37     if (edx & BIT(2))   printf("DE ");
    38     if (edx & BIT(3))   printf("PSE ");
    39     if (edx & BIT(4))   printf("TSC ");
    40     if (edx & BIT(5))   printf("MSR ");
    41     if (edx & BIT(6))   printf("PAE ");
    42     if (edx & BIT(7))   printf("MCE ");
    43     if (edx & BIT(8))   printf("CX8 ");
    44     if (edx & BIT(9))   printf("APIC ");
    45     if (edx & BIT(10))  printf("10 ");
    46     if (edx & BIT(11))  printf("SEP ");
    47     if (edx & BIT(12))  printf("MTRR ");
    48     if (edx & BIT(13))  printf("PGE ");
    49     if (edx & BIT(14))  printf("MCA ");
    50     if (edx & BIT(15))  printf("CMOV ");
    51     if (edx & BIT(16))  printf("PAT ");
    52     if (edx & BIT(17))  printf("PSE36 ");
    53     if (edx & BIT(18))  printf("PSN ");
    54     if (edx & BIT(19))  printf("CLFSH ");
    55     if (edx & BIT(20))  printf("20 ");
    56     if (edx & BIT(21))  printf("DS ");
    57     if (edx & BIT(22))  printf("ACPI ");
    58     if (edx & BIT(23))  printf("MMX ");
    59     if (edx & BIT(24))  printf("FXSR ");
    60     if (edx & BIT(25))  printf("SSE ");
    61     if (edx & BIT(26))  printf("SSE2 ");
    62     if (edx & BIT(27))  printf("SS ");
    63     if (edx & BIT(28))  printf("28 ");
    64     if (edx & BIT(29))  printf("29 ");
    65     if (edx & BIT(30))  printf("30 ");
    66     if (edx & BIT(31))  printf("31 ");
    67     printf("\n");
     66    enum {  MANU_AMD, MANU_INTEL, MANU_OTHER }
     67                enmManufacturer = MANU_OTHER;
     68    unsigned    c;
     69    uint32_t    eax, edx, ecx, ebx;
     70
     71    if (!HasCpuId())
     72    {
     73        printf("This processor doesn't support the CPUID instruction!\n");
     74        return 0;
     75    }
     76
     77    CPUID(0);
     78    c = eax;
     79    printf("Name:           %.4s%.4s%.4s\n"
     80           "Supports:       0-%u\n", &ebx, &edx, &ecx, eax);
     81    if (edx == 0x69746e65 && ecx == 0x444d4163 && ebx == 0x68747541)
     82        enmManufacturer = MANU_AMD;
     83    else if (edx == 0x6c65746e && ecx == 0x49656e69 && ebx == 0x756e6547)
     84        enmManufacturer = MANU_INTEL;
     85
     86    if (c >= 1)
     87    {
     88        CPUID(1);
     89        printf("Family:         %d\n"
     90               "Model:          %d\n"
     91               "Stepping:       %d\n",
     92               (eax >> 8) & 7, (eax >> 4) & 7, eax & 7);
     93        printf("Features:      ");
     94        if (edx & BIT(0))   printf(" FPU");
     95        if (edx & BIT(1))   printf(" VME");
     96        if (edx & BIT(2))   printf(" DE");
     97        if (edx & BIT(3))   printf(" PSE");
     98        if (edx & BIT(4))   printf(" TSC");
     99        if (edx & BIT(5))   printf(" MSR");
     100        if (edx & BIT(6))   printf(" PAE");
     101        if (edx & BIT(7))   printf(" MCE");
     102        if (edx & BIT(8))   printf(" CX8");
     103        if (edx & BIT(9))   printf(" APIC");
     104        if (edx & BIT(10))  printf(" 10");
     105        if (edx & BIT(11))  printf(" SEP");
     106        if (edx & BIT(12))  printf(" MTRR");
     107        if (edx & BIT(13))  printf(" PGE");
     108        if (edx & BIT(14))  printf(" MCA");
     109        if (edx & BIT(15))  printf(" CMOV");
     110        if (edx & BIT(16))  printf(" PAT");
     111        if (edx & BIT(17))  printf(" PSE36");
     112        if (edx & BIT(18))  printf(" PSN");
     113        if (edx & BIT(19))  printf(" CLFSH");
     114        if (edx & BIT(20))  printf(" 20");
     115        if (edx & BIT(21))  printf(" DS");
     116        if (edx & BIT(22))  printf(" ACPI");
     117        if (edx & BIT(23))  printf(" MMX");
     118        if (edx & BIT(24))  printf(" FXSR");
     119        if (edx & BIT(25))  printf(" SSE");
     120        if (edx & BIT(26))  printf(" SSE2");
     121        if (edx & BIT(27))  printf(" SS");
     122        if (edx & BIT(28))  printf(" 28");
     123        if (edx & BIT(29))  printf(" 29");
     124        if (edx & BIT(30))  printf(" 30");
     125        if (edx & BIT(31))  printf(" 31");
     126        printf("\n");
     127    }
     128
     129    //CPUID(2);
     130
     131    /*
     132     * AMD
     133     */
     134    if (enmManufacturer == MANU_AMD)
     135    {
     136        CPUID(0x80000000);
     137        c = eax;
     138        printf("AMD Name:       %.4s%.4s%.4s\n"
     139               "AMD Supports:   0x80000000-%#010x\n", &ebx, &edx, &ecx, eax);
     140
     141        if (c >= 0x80000001)
     142        {
     143            CPUID(0x80000001);
     144            printf("AMD Family:     %d\n"
     145                   "AMD Model:      %d\n"
     146                   "AMD Stepping:   %d\n",
     147                   (eax >> 8) & 7, (eax >> 4) & 7, eax & 7);
     148        }
     149
     150        char szString[4*4*3+1] = {0};
     151        if (c >= 0x80000002)
     152            CPUIDSZ(0x80000002, &szString[0]);
     153        if (c >= 0x80000003)
     154            CPUIDSZ(0x80000003, &szString[16]);
     155        if (c >= 0x80000004)
     156            CPUIDSZ(0x80000004, &szString[32]);
     157        if (c >= 0x80000002)
     158            printf("AMD Model:      %s\n", szString);
     159
     160        if (c >= 0x80000005)
     161        {
     162            CPUID(0x80000005);
     163        }
     164        if (c >= 0x80000006)
     165        {
     166            CPUID(0x80000006);
     167        }
     168        if (c >= 0x80000007)
     169        {
     170            CPUID(0x80000007);
     171        }
     172        if (c >= 0x80000008)
     173        {
     174            CPUID(0x80000008);
     175        }
     176    }
    68177
    69178    return 0;
Note: See TracChangeset for help on using the changeset viewer.