From 2a81e344e646af63747ac62b205cc108e62d3504 Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Sat, 24 Mar 2018 18:18:31 +0100 Subject: [PATCH] Start support for second level --- 02h.c | 394 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 02h.h | 19 +++ main.c | 9 ++ 3 files changed, 422 insertions(+) create mode 100644 02h.c create mode 100644 02h.h create mode 100644 main.c diff --git a/02h.c b/02h.c new file mode 100644 index 0000000..ecb09ca --- /dev/null +++ b/02h.c @@ -0,0 +1,394 @@ +#include +#include +#include "02h.h" + +#define MASK1 0xFF; +#define MASK2 0xFF00; +#define MASK3 0xFF0000; +#define MASK4 0xFF000000; +#define INVALID -1 + +struct cache { + int L1d; + int L1i; + int L2; + int L3; +}; + +struct TLB { + int TLBd; + int TLBi; +}; + +//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) { + if(desc == 0x1) + { + data->tlb->TLBi = 4096; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x3) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x5) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x6) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x8) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0xA) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0xC) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0xD) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x21) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x22) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x23) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x25) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x29) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2C) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x30) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x39) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x3A) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x3C) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x3D) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x3E) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x40) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x41) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x42) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x43) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x44) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x45) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x46) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x47) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x48) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x49) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4A) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4B) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4C) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4D) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4E) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x4E) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else if (desc == 0x2) + { + data->tlb->TLBi = 4194304; + } + else + { + printf("ERROR: Invalid descriptor(0x%x)\n",desc); + } +} + +void fillData(unsigned int descriptors[16], struct level2* data) { + //Initialize structures + data->cache->L1d = INVALID; + data->cache->L1i = INVALID; + data->cache->L2 = INVALID; + data->cache->L3 = INVALID; + + data->tlb->TLBd = INVALID; + data->tlb->TLBi = INVALID; + + //Fill data for each descriptor + for(int i=0;i<16;i++) { + if(descriptors[i] != 0x0) + fillWithDescriptor(descriptors[i],data); + } +} + +struct level2* fillLevel2(struct level2* data) { + data = malloc(sizeof(struct level2)); + data->cache = malloc(sizeof(struct cache)); + data->tlb = malloc(sizeof(struct TLB)); + + unsigned eax, ebx, ecx, edx; + eax = 2; + native_cpuid(&eax, &ebx, &ecx, &edx); + + unsigned int desc[16]; + + /*** + + Aplying MASK to register will give us 8 bits which represent descriptors + + Byte1 Byte2 Byte3 Byte4 -> unsigned integer + + desc1 = Byte1 + desc2 = Byte2 + desc3 = Byte3 + desc4 = Byte4 + + ***/ + + desc[0] = eax & MASK1; + desc[1] = eax & MASK2; + desc[2] = eax & MASK3; + desc[3] = eax & MASK4; + + desc[4] = ebx & MASK1; + desc[5] = ebx & MASK2; + desc[6] = ebx & MASK3; + desc[7] = ebx & MASK4; + + desc[8] = ecx & MASK1; + desc[9] = ecx & MASK2; + desc[10] = ecx & MASK3; + desc[11] = ecx & MASK4; + + desc[12] = edx & MASK1; + desc[13] = edx & MASK2; + desc[14] = edx & MASK3; + desc[15] = edx & MASK4; + + fillData(desc, data); + + return data; +} + +void debugCache(struct cache* cach) { + printf("L1d=%d\n", cach->L1d); + printf("L1i=%d\n", cach->L1i); + printf("L2=%d\n", cach->L2); + printf("L3=%d\n", cach->L3); +} + +void debugTLB(struct TLB* tlb) { + printf("TLBd=%d\n", tlb->TLBd); + printf("TLBi=%d\n", tlb->TLBi); +} + +void debugLevel2(struct level2* data) { + debugCache(data->cache); + debugTLB(data->tlb); +} + +void freeLevel2(struct level2* data) { + free(data->cache); + free(data->tlb); + free(data); +} diff --git a/02h.h b/02h.h new file mode 100644 index 0000000..8ad103b --- /dev/null +++ b/02h.h @@ -0,0 +1,19 @@ +#ifndef __02h__ +#define __02h__ + +/*** + +Cache and TLB's characteristics + +***/ + +struct level2 { + struct cache* cache; + struct TLB* tlb; +}; + +struct level2* fillLevel2(struct level2* level2); +void debugLevel2(struct level2* level2); +void freeLevel2(struct level2* level2); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..69050a8 --- /dev/null +++ b/main.c @@ -0,0 +1,9 @@ +#include +#include +#include "02h.h" + +int main() { + struct level2* level2 = fillLevel2(level2); + debugLevel2(level2); + freeLevel2(level2); +}