From 97e21a64badfbbaa634e52660366145b5ae48406 Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Sat, 24 Mar 2018 23:57:49 +0100 Subject: [PATCH] Moved to asm cpuid call. Support for CPU name string. Output skecth on main --- 02h.c | 15 ++--------- Makefile | 7 ++--- cpuid.c | 12 +++++++++ cpuid.h | 6 +++++ extended.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ extended.h | 10 +++++++ main.c | 21 +++++++++++++++ 7 files changed, 132 insertions(+), 16 deletions(-) create mode 100644 cpuid.c create mode 100644 cpuid.h create mode 100644 extended.c create mode 100644 extended.h diff --git a/02h.c b/02h.c index ecb09ca..4c9a265 100644 --- a/02h.c +++ b/02h.c @@ -1,6 +1,7 @@ #include #include #include "02h.h" +#include "cpuid.h" #define MASK1 0xFF; #define MASK2 0xFF00; @@ -23,18 +24,6 @@ struct TLB { //http://www.sandpile.org/x86/cpuid.htm //http://www.hugi.scene.org/online/coding/hugi%2016%20-%20corawhd4.htm -/*** EXEC CPUID INSTRUCTION ***/ -static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, - unsigned int *ecx, unsigned int *edx) -{ - asm volatile("cpuid" - : "=a" (*eax), - "=b" (*ebx), - "=c" (*ecx), - "=d" (*edx) - : "0" (*eax), "2" (*ecx)); -} - /*** ACCORDING TO CPUID TABLE ***/ //TO BE IMPLEMENTED void fillWithDescriptor(unsigned int desc, struct level2* data) { @@ -328,7 +317,7 @@ struct level2* fillLevel2(struct level2* data) { unsigned eax, ebx, ecx, edx; eax = 2; - native_cpuid(&eax, &ebx, &ecx, &edx); + cpuid(&eax, &ebx, &ecx, &edx); unsigned int desc[16]; diff --git a/Makefile b/Makefile index c80251d..e95737a 100644 --- a/Makefile +++ b/Makefile @@ -2,12 +2,13 @@ CXX=gcc CXXFLAGS=-g -MAIN=main.c +SOURCE=main.c 02h.c extended.c cpuid.c +HEADERS=02h.h extended.h cpuid.h OUTPUT=cpufetch -$(OUTPUT): Makefile $(MAIN) 02h.c 02h.h - $(CXX) $(CXXFLAGS) $(MAIN) 02h.c -o $(OUTPUT) +$(OUTPUT): Makefile $(SOURCE) $(HEADERS) + $(CXX) $(CXXFLAGS) $(SOURCE) -o $(OUTPUT) clean: @rm $(OUTPUT1) $(OUTPUT2) diff --git a/cpuid.c b/cpuid.c new file mode 100644 index 0000000..f013397 --- /dev/null +++ b/cpuid.c @@ -0,0 +1,12 @@ +#include "cpuid.h" + +void cpuid(unsigned int *eax, unsigned int *ebx, + unsigned int *ecx, unsigned int *edx) +{ + asm volatile("cpuid" + : "=a" (*eax), + "=b" (*ebx), + "=c" (*ecx), + "=d" (*edx) + : "0" (*eax), "2" (*ecx)); +} diff --git a/cpuid.h b/cpuid.h new file mode 100644 index 0000000..c3467ae --- /dev/null +++ b/cpuid.h @@ -0,0 +1,6 @@ +#ifndef __CPUID__ +#define __CPUID__ + +void cpuid(unsigned int *eax, unsigned int *ebx,unsigned int *ecx, unsigned int *edx); + +#endif diff --git a/extended.c b/extended.c new file mode 100644 index 0000000..46c9fed --- /dev/null +++ b/extended.c @@ -0,0 +1,77 @@ +#include "extended.h" + +char* getCPUName() { + unsigned eax, ebx, ecx, edx; + + //First, check we can use extended + eax = 0x80000000; + cpuid(&eax, &ebx, &ecx, &edx); + if(eax < 0x80000001) + return NULL; + + //We can, fetch name + char* name = malloc(sizeof(char)*64); + + eax = 0x80000002; + cpuid(&eax, &ebx, &ecx, &edx); + + name[__COUNTER__] = eax & MASK; + name[__COUNTER__] = (eax>>8) & MASK; + name[__COUNTER__] = (eax>>16) & MASK; + name[__COUNTER__] = (eax>>24) & MASK; + name[__COUNTER__] = ebx & MASK; + name[__COUNTER__] = (ebx>>8) & MASK; + name[__COUNTER__] = (ebx>>16) & MASK; + name[__COUNTER__] = (ebx>>24) & MASK; + name[__COUNTER__] = ecx & MASK; + name[__COUNTER__] = (ecx>>8) & MASK; + name[__COUNTER__] = (ecx>>16) & MASK; + name[__COUNTER__] = (ecx>>24) & MASK; + name[__COUNTER__] = edx & MASK; + name[__COUNTER__] = (edx>>8) & MASK; + name[__COUNTER__] = (edx>>16) & MASK; + name[__COUNTER__] = (edx>>24) & MASK; + + eax = 0x80000003; + cpuid(&eax, &ebx, &ecx, &edx); + + name[__COUNTER__] = eax & MASK; + name[__COUNTER__] = (eax>>8) & MASK; + name[__COUNTER__] = (eax>>16) & MASK; + name[__COUNTER__] = (eax>>24) & MASK; + name[__COUNTER__] = ebx & MASK; + name[__COUNTER__] = (ebx>>8) & MASK; + name[__COUNTER__] = (ebx>>16) & MASK; + name[__COUNTER__] = (ebx>>24) & MASK; + name[__COUNTER__] = ecx & MASK; + name[__COUNTER__] = (ecx>>8) & MASK; + name[__COUNTER__] = (ecx>>16) & MASK; + name[__COUNTER__] = (ecx>>24) & MASK; + name[__COUNTER__] = edx & MASK; + name[__COUNTER__] = (edx>>8) & MASK; + name[__COUNTER__] = (edx>>16) & MASK; + name[__COUNTER__] = (edx>>24) & MASK; + + eax = 0x80000004; + cpuid(&eax, &ebx, &ecx, &edx); + + name[__COUNTER__] = eax & MASK; + name[__COUNTER__] = (eax>>8) & MASK; + name[__COUNTER__] = (eax>>16) & MASK; + name[__COUNTER__] = (eax>>24) & MASK; + name[__COUNTER__] = ebx & MASK; + name[__COUNTER__] = (ebx>>8) & MASK; + name[__COUNTER__] = (ebx>>16) & MASK; + name[__COUNTER__] = (ebx>>24) & MASK; + name[__COUNTER__] = ecx & MASK; + name[__COUNTER__] = (ecx>>8) & MASK; + name[__COUNTER__] = (ecx>>16) & MASK; + name[__COUNTER__] = (ecx>>24) & MASK; + name[__COUNTER__] = edx & MASK; + name[__COUNTER__] = (edx>>8) & MASK; + name[__COUNTER__] = (edx>>16) & MASK; + name[__COUNTER__] = (edx>>24) & MASK; + + name[__COUNTER__] = '\0'; + return name; +} diff --git a/extended.h b/extended.h new file mode 100644 index 0000000..8beda2f --- /dev/null +++ b/extended.h @@ -0,0 +1,10 @@ +#ifndef __EXTENDED__ +#define __EXTENDED__ + +#define MASK 0xFF +#include "cpuid.h" +#include + +char* getCPUName(); + +#endif diff --git a/main.c b/main.c index 69050a8..7f542c6 100644 --- a/main.c +++ b/main.c @@ -1,9 +1,30 @@ #include #include #include "02h.h" +#include "extended.h" + +/*** +SAMPLE OUTPUT + +Name: Intel Core i7-4790K +Arch: 64 Bits +Frecuency: 4.0 GHz +NÂșCores: 4 cores(8 threads) +AXV: AVX,AVX2 +SSE: SSE,SSE2,SSE4.1,SSE4.2 +FMA: FMA3 +AES: Yes +SHA: No +L1 Size: 32KB(Data)32KB(Instructions) +L2 Size: 512KB +L3 Size: 8MB +Peak FLOPS: 512 GFLOP/s(in simple precision) + +***/ int main() { struct level2* level2 = fillLevel2(level2); debugLevel2(level2); freeLevel2(level2); + printf("%s\n",getCPUName()); }