General cleanup and bugfixes
[tpg/acess2.git] / Usermode / Applications / cpuid_src / main.c
1 /*
2  * Acess2 - CPUID Parser
3  */
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <stdint.h>
7
8 // === PROTOTYPES ===
9  int    main(int argc, char *argv[]);
10 void    cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);
11
12 // === CODE ===
13 int main(int argc, char *argv[])
14 {
15         char    sVendorId[13];
16          int    iMaxBasic = 0;
17         uint32_t        eax, ebx, edx, ecx;
18         
19         // -- Get Vendor ID and maximum ID
20         cpuid(0,
21                 (uint32_t*)&iMaxBasic, (uint32_t*)&sVendorId[0],
22                 (uint32_t*)&sVendorId[4], (uint32_t*)&sVendorId[8]);
23         sVendorId[12] = '\0';
24         printf("Vendor:        %s\n", sVendorId);
25         printf("Maximum CPUID: %i\n", iMaxBasic);
26         
27         // -- Get Processor Information
28         if( iMaxBasic == 0 )    return 0;
29         /*
30 # 3:0 - Stepping
31 # 7:4 - Model
32 # 11:8 - Family
33 # 13:12 - Processor Type
34 # 19:16 - Extended Model
35 # 27:20 - Extended Famil
36         */
37         cpuid(1, &eax, &ebx, &edx, &ecx);
38         printf("Model:         Family %i, Model %i, Stepping %i\n", (eax>>8)&7, (eax>>4)&7, eax&7);
39         printf("Type:          %i\n", (eax>>12)&7);
40         printf("EDX Features:  ");
41         if(edx & 1 << 0)        printf("FPU ");
42         if(edx & 1 << 1)        printf("VME ");
43         if(edx & 1 << 2)        printf("DE ");
44         if(edx & 1 << 3)        printf("PSE ");
45         if(edx & 1 << 4)        printf("TSC ");
46         if(edx & 1 << 5)        printf("MSR ");
47         if(edx & 1 << 6)        printf("PAE ");
48         if(edx & 1 << 7)        printf("MCE ");
49         if(edx & 1 << 8)        printf("CX8 ");
50         if(edx & 1 << 9)        printf("APIC ");
51         // -- 1 << 10
52         if(edx & 1 << 11)       printf("SEP ");
53         if(edx & 1 << 12)       printf("MTRR ");
54         if(edx & 1 << 13)       printf("PGE ");
55         if(edx & 1 << 14)       printf("MCA ");
56         if(edx & 1 << 15)       printf("CMOV ");
57         if(edx & 1 << 16)       printf("PAT ");
58         if(edx & 1 << 17)       printf("PSE36 ");
59         if(edx & 1 << 18)       printf("PSN ");
60         if(edx & 1 << 19)       printf("CLF ");
61         // -- 1 << 20
62         if(edx & 1 << 21)       printf("DTES ");
63         if(edx & 1 << 22)       printf("ACPI ");
64         if(edx & 1 << 23)       printf("MMX ");
65         if(edx & 1 << 25)       printf("SSE ");
66         if(edx & 1 << 26)       printf("SSE2 ");
67         if(edx & 1 << 27)       printf("SS ");
68         if(edx & 1 << 28)       printf("HTT ");
69         if(edx & 1 << 29)       printf("TM1 ");
70         if(edx & 1 << 30)       printf("IA64 ");
71         if(edx & 1 << 31)       printf("PBE ");
72         printf("\n");
73
74         printf("ECX Features:  ");
75         if(ecx & 1 << 0)        printf("SSE3 ");
76         if(ecx & 1 << 1)        printf("PCLMUL ");
77         if(ecx & 1 << 4)        printf("DTES64 ");
78         if(ecx & 1 << 5)        printf("VMX ");
79         if(ecx & 1 << 6)        printf("SMX ");
80         if(ecx & 1 << 7)        printf("EST ");
81         if(ecx & 1 << 8)        printf("TM2 ");
82         if(ecx & 1 << 9)        printf("SSSE3 ");
83         if(ecx & 1 << 10)       printf("CID ");
84         // -- 1 << 11
85         if(ecx & 1 << 12)       printf("FMA ");
86         if(ecx & 1 << 13)       printf("CX16 ");
87         if(ecx & 1 << 14)       printf("ETPRD ");
88         if(ecx & 1 << 15)       printf("PDCM ");
89         // -- 1 << 16
90         // -- 1 << 17
91         if(ecx & 1 << 18)       printf("DCA ");
92         if(ecx & 1 << 19)       printf("SSE4.1");
93         if(ecx & 1 << 20)       printf("SSE4.2");
94         if(ecx & 1 << 21)       printf("x2APIC ");
95         if(ecx & 1 << 22)       printf("MOVBE ");
96         if(ecx & 1 << 23)       printf("POPCNT ");
97         // -- 1 << 24
98         // -- 1 << 25
99         if(ecx & 1 << 26)       printf("XSAVE ");
100         if(ecx & 1 << 27)       printf("OSXSAVE ");
101         if(ecx & 1 << 28)       printf("AVX ");
102         printf("\n");
103         
104         return 0;
105 }
106
107 /**
108  * \brief Call the CPUID opcode
109  */
110 void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX)
111 {
112         uint32_t        eax, ebx, edx, ecx;
113         
114         __asm__ __volatile__ (
115                 "cpuid"
116                 : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
117                 : "a"(Num)
118                 );
119         
120         if(EAX) *EAX = eax;
121         if(EBX) *EBX = ebx;
122         if(EDX) *EDX = edx;
123         if(ECX) *ECX = ecx;
124 }

UCC git Repository :: git.ucc.asn.au