#include #include #include #include //#include #include #include #include typedef unsigned long long uint64; typedef unsigned int uint32; int main(int argc,char **argv) { int i,j; //int ncpus=sysconf(_SC_NPROCESSORS_ONLN); char filename[1024]; int fd[4][1024]; int msrfd[1024]; uint32 value; uint64_t value64; int bus[2]={0x7f,0xff}; ssize_t rs; off_t addr; for(i=0;i<2;i++) { sprintf(filename,"/proc/bus/pci/%x/14.0",bus[i]); fd[0][i]=open(filename,O_RDWR); sprintf(filename,"/proc/bus/pci/%x/14.1",bus[i]); fd[1][i]=open(filename,O_RDWR); sprintf(filename,"/proc/bus/pci/%x/17.0",bus[i]); fd[2][i]=open(filename,O_RDWR); sprintf(filename,"/proc/bus/pci/%x/17.1",bus[i]); fd[3][i]=open(filename,O_RDWR); } sprintf(filename,"/dev/cpu/0/msr"); msrfd[0]=open(filename,O_RDWR); /*=== START TO SET BITS ===*/ // a) step value64=0x1<<31ULL&0x0FFFFFFFF; rs=pwrite(msrfd[0],(void*)&value64,sizeof(value64),0x0700); // U_MSR_PMON_GLOBAL_CTL for(i=0;i<4;i++) { for(j=0;j<2;j++) { // or a) step value64=0x1<<8ULL|0x1<<16|0x1<<17; rs=pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xF4); // b) step value64=0x1<<22ULL; pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xE0); // c) step value64=0x04|0x300|0x1<<22ULL; // RD pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xE0); // b) step value64=0x1<<22ULL; pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xE4); // c) step value64=0x04|0xC00|0x1<<22ULL; // WR pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xE4); // d) step value64=0x1|0x1<<1ULL|0x1<<8ULL|0x1<<16|0x1<<17; pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xF4); } } #if 0 // e) step value64=0x03FFFF; rs=pwrite(msrfd[0],(void*)&value64,sizeof(value64),0x0700); // U_MSR_PMON_GLOBAL_CTL #endif // f) step value64=(0x1<<29ULL|0x03FFFF)&0x0FFFFFFFF; rs=pwrite(msrfd[0],(void*)&value64,sizeof(value64),0x0700); // U_MSR_PMON_GLOBAL_CTL // or f) step for(i=0;i<4;i++) { for(j=0;j<2;j++) { value64=0x1<<1ULL; pwrite(fd[i][j],(void*)&value64,sizeof(value64),0xF4); } } /*=== END TO SET BITS ===*/ uint64 val1,val2,val3,val4; while(1) { for(i=0;i<4;i++) { for(j=0;j<2;j++) { pread(fd[i][j],(void*)&val1,sizeof(uint64),0xB4); pread(fd[i][j],(void*)&val2,sizeof(uint64),0xB0); pread(fd[i][j],(void*)&val3,sizeof(uint64),0xBC); pread(fd[i][j],(void*)&val4,sizeof(uint64),0xB8); printf("[%d][%d] B4=%ld B0=%ld BC=%ld B8=%ld\n",i,j,val1,val2,val3,val4); } } sleep(1); } for(i=0;i<4;i++) { for(j=0;j<2;j++) { close(fd[i][j]); } } return 0; }