CoreMod
From Wiki.cyring.fr
(Difference between revisions)
Line 1: | Line 1: | ||
- | ===== | + | === How To === |
+ | ==== Requirements ==== | ||
+ | Mandatory, | ||
+ | * The GNU/Linux x86_64 3.x : [http://www.kernel.org/ linux]<br /> | ||
+ | * The GNU Compiler Collection: [http://gcc.gnu.org gcc] - or - The C language family frontend for LLVM: [http://clang.llvm.org/ clang]<br /> | ||
+ | * Being root ! | ||
+ | * The Intel(R) Core(TM) i7, i5 Processors<br /> | ||
+ | <br /> | ||
+ | Optionally, | ||
+ | * The GNU Debugger: [http://www.gnu.org/software/gdb/ gdb]<br /> | ||
+ | * and a graphical front-end for gdb: [http://www.gnu.org/software/ddd/ ddd]<br /> | ||
+ | * The [http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-3b-system-programming-manual.html Intel 64 and IA-32 Architectures Software Developer’s Manual] Volume 3<br /> | ||
+ | * The [http://www.dmtf.org/standards/smbios SMBIOS Reference Specification] (C) Distributed Management Task Force<br /> | ||
+ | <br /> | ||
+ | ==== Compiling ==== | ||
+ | <syntaxhighlight lang="c"> | ||
+ | $ gcc coremod.c -o coremod | ||
+ | </syntaxhighlight> | ||
+ | - or - | ||
+ | <syntaxhighlight lang="c"> | ||
+ | $ clang coremod.c -o coremod | ||
+ | </syntaxhighlight> | ||
+ | <br /> | ||
+ | ==== Debugging ==== | ||
+ | First of all, compile sources with the -g switch then launch the debugger<br /> | ||
+ | <syntaxhighlight lang="c"> | ||
+ | $ kdesu ddd ./coremod | ||
+ | </syntaxhighlight> | ||
+ | <br /> | ||
+ | ==== Usage ==== | ||
+ | Two kernel modules must be loaded | ||
+ | # msr | ||
+ | # dmi-sysfs | ||
+ | <br /> | ||
+ | Execute CoreMod as root | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | # ./coremod | ||
+ | </syntaxhighlight> | ||
+ | <br /> | ||
+ | Usage is straightforward. Just enter the corresponding initial character to the function you want to execute. | ||
+ | Thus to show the core temperature, press the following keys:<br /> | ||
+ | * [s] | ||
+ | * [Enter] | ||
+ | * [c] | ||
+ | * [Enter] | ||
+ | And for instance to go back to previous menu level:<br /> | ||
+ | * [<] | ||
+ | * [Enter] | ||
+ | <br /> | ||
+ | Discover the other functions to dump your components ! | ||
+ | <br /> | ||
+ | ==== Contact ==== | ||
+ | === Releases === | ||
+ | ==== Release 2012-0.1.2 ==== | ||
+ | ===== coremod.h ===== | ||
+ | ===== coremod.c ===== | ||
+ | ==== Release 2012-0.1.1 ==== | ||
+ | ===== coremod.c ===== | ||
<syntaxhighlight lang="c" line start="1"> | <syntaxhighlight lang="c" line start="1"> | ||
// coremod.c - CyrIng 2012 | // coremod.c - CyrIng 2012 | ||
Line 88: | Line 145: | ||
return(rc); | return(rc); | ||
} | } | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
</syntaxhighlight> | </syntaxhighlight> |
Revision as of 20:51, 9 July 2012
Contents |
How To
Requirements
Mandatory,
- The GNU/Linux x86_64 3.x : linux
- The GNU Compiler Collection: gcc - or - The C language family frontend for LLVM: clang
- Being root !
- The Intel(R) Core(TM) i7, i5 Processors
Optionally,
- The GNU Debugger: gdb
- and a graphical front-end for gdb: ddd
- The Intel 64 and IA-32 Architectures Software Developer’s Manual Volume 3
- The SMBIOS Reference Specification (C) Distributed Management Task Force
Compiling
$ gcc coremod.c -o coremod
- or -
$ clang coremod.c -o coremod
Debugging
First of all, compile sources with the -g switch then launch the debugger
$ kdesu ddd ./coremod
Usage
Two kernel modules must be loaded
- msr
- dmi-sysfs
Execute CoreMod as root
# ./coremod
Usage is straightforward. Just enter the corresponding initial character to the function you want to execute.
Thus to show the core temperature, press the following keys:
- [s]
- [Enter]
- [c]
- [Enter]
And for instance to go back to previous menu level:
- [<]
- [Enter]
Discover the other functions to dump your components !
Contact
Releases
Release 2012-0.1.2
coremod.h
coremod.c
Release 2012-0.1.1
coremod.c
// coremod.c - CyrIng 2012
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
// Intel® 64 and IA-32 Architectures Software Developer’s Manual
// Vol. 3C § 34-1
// Table 34-2. IA-32 Architectural MSRs
#define IA32_PERF_STATUS 0x198
// System Management BIOS (SMBIOS) Reference Specification
// Version: 2.7.1 § 7.5
// Table 20 – Processor Information (Type 4) Structure
#define SMBIOS_PROCINFO_STRUCTURE 4
#define SMBIOS_PROCINFO_INSTANCE 0
#define SMBIOS_PROCINFO_EXTCLK 0x12
int Read_MSR(int cpu, off_t offset, unsigned long long *msr) {
ssize_t retval=0;
char pathname[32]="";
int fd=0, rc=-1;
sprintf(pathname, "/dev/cpu/%d/msr", cpu);
if( (fd=open(pathname, O_RDONLY)) != -1 ) {
retval=pread(fd, msr, sizeof *msr, offset);
close(fd);
rc=(retval != sizeof *msr) ? -1 : 0;
}
return(rc);
}
int Read_SMBIOS(int structure, int instance, off_t offset, void *buf, size_t nbyte) {
ssize_t retval=0;
char pathname[]="/sys/firmware/dmi/entries/999-99/raw";
int fd=0, rc=-1;
sprintf(pathname, "/sys/firmware/dmi/entries/%d-%d/raw", structure, instance);
if( (fd=open(pathname, O_RDONLY)) != -1 ) {
retval=pread(fd, buf, nbyte, offset);
close(fd);
rc=(retval != nbyte) ? -1 : 0;
}
return(rc);
}
int Get_Ratio(int target) {
unsigned long long msr=0;
if( Read_MSR(target, IA32_PERF_STATUS, &msr) != -1)
return((int) msr);
else
return(0);
}
int External_Clock() {
int clock=0;
if( Read_SMBIOS(SMBIOS_PROCINFO_STRUCTURE, SMBIOS_PROCINFO_INSTANCE, SMBIOS_PROCINFO_EXTCLK, &clock, 1) != -1)
return(clock);
else
return(0);
}
int main(int argc, char *argv[]) {
int target=0, first=0, last=0, clock=0, ratio=0, rc=0;
switch(argc) {
case 2: first = atoi(argv[1]);
last = first;
break;
case 3: first = atoi(argv[1]);
last = atoi(argv[2]);
break;
}
if((clock=External_Clock())!=0)
for(target=first; target<=last && (ratio=Get_Ratio(target)) != 0; target++)
printf("Processor#%d : Ratio[%d] x Clock[%d] = %d Mhz\n", target, ratio, clock, ratio*clock);
else
rc=-1;
return(rc);
}