mirror of
https://github.com/anrieff/libcpuid
synced 2024-11-10 22:59:13 +00:00
Added cpu_msrinfo() function and implemented a few test info entries
git-svn-id: https://svn.code.sf.net/p/libcpuid/code/HEAD/libcpuid@71 3b4be424-7ac5-41d7-8526-f4ddcb85d872
This commit is contained in:
parent
0bd7a6d83f
commit
e4920d79b0
3 changed files with 72 additions and 28 deletions
|
@ -317,7 +317,6 @@ static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct msr_driver_t* handle;
|
struct msr_driver_t* handle;
|
||||||
uint64_t value;
|
|
||||||
switch (query) {
|
switch (query) {
|
||||||
case NEED_CPUID_PRESENT:
|
case NEED_CPUID_PRESENT:
|
||||||
fprintf(fout, "%d\n", cpuid_present());
|
fprintf(fout, "%d\n", cpuid_present());
|
||||||
|
@ -410,8 +409,9 @@ static void print_info(output_data_switch query, struct cpu_raw_data_t* raw,
|
||||||
if ((handle = cpu_msr_driver_open()) == NULL) {
|
if ((handle = cpu_msr_driver_open()) == NULL) {
|
||||||
fprintf(fout, "Cannot open MSR driver: %s\n", cpuid_error());
|
fprintf(fout, "Cannot open MSR driver: %s\n", cpuid_error());
|
||||||
} else {
|
} else {
|
||||||
cpu_rdmsr(handle, 0x10, &value);
|
fprintf(fout, "mperf = %d\n", cpu_msrinfo(handle, INFO_MPERF));
|
||||||
fprintf(fout, "%I64d\n", value);
|
fprintf(fout, "aperf = %d\n", cpu_msrinfo(handle, INFO_APERF));
|
||||||
|
fprintf(fout, "cpu:fsb = %.1f\n", cpu_msrinfo(handle, INFO_CUR_MULTIPLIER) / 100.0f);
|
||||||
cpu_msr_driver_close(handle);
|
cpu_msr_driver_close(handle);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -741,6 +741,38 @@ struct msr_driver_t* cpu_msr_driver_open(void);
|
||||||
*/
|
*/
|
||||||
int cpu_rdmsr(struct msr_driver_t* handle, int msr_index, uint64_t* result);
|
int cpu_rdmsr(struct msr_driver_t* handle, int msr_index, uint64_t* result);
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
INFO_MPERF, /*!< Maximum performance frequency clock. This
|
||||||
|
is a counter, which increments as a
|
||||||
|
proportion of the actual processor speed */
|
||||||
|
INFO_APERF, /*!< Actual performance frequency clock. This
|
||||||
|
accumulates the core clock counts when the
|
||||||
|
core is active. */
|
||||||
|
INFO_CUR_MULTIPLIER, /*!< Current CPU:FSB ratio, multiplied by 100.
|
||||||
|
e.g., a CPU:FSB value of 18.5 reads as
|
||||||
|
1850. */
|
||||||
|
INFO_MAX_MULTIPLIER, /*!< Maxumum CPU:FSB ratio for this CPU,
|
||||||
|
multiplied by 100 */
|
||||||
|
INFO_TEMPERATURE, /*!< The current core temperature in Celsius */
|
||||||
|
INFO_THROTTLING, /*!< 1 if the current logical processor is
|
||||||
|
throttling. 0 if it is running normally. */
|
||||||
|
} cpu_msrinfo_request_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads extended CPU information from Model-Specific Registers.
|
||||||
|
* @param handle - a handle to an open MSR driver, @see cpu_msr_driver_open
|
||||||
|
* @param which - which info field should be returned. A list of
|
||||||
|
* available information entities is listed in the
|
||||||
|
* cpu_msrinfo_request_t enum.
|
||||||
|
* @retval - if the requested information is available for the current
|
||||||
|
* processor model, the respective value is returned.
|
||||||
|
* if no information is available, or the CPU doesn't support
|
||||||
|
* the query, the special value CPU_INVALID_VALUE is returned
|
||||||
|
*/
|
||||||
|
int cpu_msrinfo(struct msr_driver_t* handle, cpu_msrinfo_request_t which);
|
||||||
|
#define CPU_INVALID_VALUE 0x3fffffff
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Closes an open MSR driver
|
* @brief Closes an open MSR driver
|
||||||
*
|
*
|
||||||
|
|
|
@ -215,31 +215,7 @@ static int load_driver(struct msr_driver_t* drv)
|
||||||
debugf(1, "Create driver service failed: %d\n", dwLastError);
|
debugf(1, "Create driver service failed: %d\n", dwLastError);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} /*else {
|
}
|
||||||
switch(getImageType(lpszDriverFilePath)){
|
|
||||||
case IMAGE_FILE_MACHINE_AMD64:
|
|
||||||
if(!isRunning_x64()){
|
|
||||||
if(!DeleteFile(lpszDriverFilePath)){
|
|
||||||
addLastErrorMessageMsgEx(g_hLogEdit, __TEXT("Error deleting driver file(due to binary incompatibility):"), GetLastError());
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
if(!extractDriver(lpszDriverFilePath))
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IMAGE_FILE_MACHINE_I386:
|
|
||||||
if(isRunning_x64()){
|
|
||||||
if(!DeleteFile(lpszDriverFilePath)){
|
|
||||||
addLastErrorMessageMsgEx(g_hLogEdit, __TEXT("Error deleting driver file(due to binary incompatibility):"), GetLastError());
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
if(!extractDriver(lpszDriverFilePath))
|
|
||||||
goto clean_up;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(drv->scDriver != NULL){
|
if(drv->scDriver != NULL){
|
||||||
if(StartService(drv->scDriver, 0, NULL)){
|
if(StartService(drv->scDriver, 0, NULL)){
|
||||||
if(!wait_for_service_state(drv->scDriver, SERVICE_RUNNING, &srvStatus)){
|
if(!wait_for_service_state(drv->scDriver, SERVICE_RUNNING, &srvStatus)){
|
||||||
|
@ -312,6 +288,7 @@ int cpu_rdmsr(struct msr_driver_t* driver, int msr_index, uint64_t* result)
|
||||||
int cpu_msr_driver_close(struct msr_driver_t* drv)
|
int cpu_msr_driver_close(struct msr_driver_t* drv)
|
||||||
{
|
{
|
||||||
SERVICE_STATUS srvStatus = {0};
|
SERVICE_STATUS srvStatus = {0};
|
||||||
|
if (drv == NULL) return 0;
|
||||||
if(drv->scDriver != NULL){
|
if(drv->scDriver != NULL){
|
||||||
if (drv->hhDriver) CancelIo(drv->hhDriver);
|
if (drv->hhDriver) CancelIo(drv->hhDriver);
|
||||||
if(drv->ovl.hEvent != NULL)
|
if(drv->ovl.hEvent != NULL)
|
||||||
|
@ -328,4 +305,39 @@ int cpu_msr_driver_close(struct msr_driver_t* drv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cpu_msrinfo(struct msr_driver_t* handle, cpu_msrinfo_request_t which)
|
||||||
|
{
|
||||||
|
uint64_t r;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (handle == NULL)
|
||||||
|
return set_error(ERR_HANDLE);
|
||||||
|
switch (which) {
|
||||||
|
case INFO_MPERF:
|
||||||
|
{
|
||||||
|
err = cpu_rdmsr(handle, 0xe7, &r);
|
||||||
|
if (err) return CPU_INVALID_VALUE;
|
||||||
|
return (int) (r & 0x7fffffff);
|
||||||
|
}
|
||||||
|
case INFO_APERF:
|
||||||
|
{
|
||||||
|
err = cpu_rdmsr(handle, 0xe8, &r);
|
||||||
|
if (err) return CPU_INVALID_VALUE;
|
||||||
|
return (int) (r & 0x7fffffff);
|
||||||
|
}
|
||||||
|
case INFO_CUR_MULTIPLIER:
|
||||||
|
{
|
||||||
|
err = cpu_rdmsr(handle, 0x2a, &r);
|
||||||
|
if (err) return CPU_INVALID_VALUE;
|
||||||
|
return (int) ((r >> 22) & 0x3f) * 100;
|
||||||
|
}
|
||||||
|
case INFO_MAX_MULTIPLIER:
|
||||||
|
case INFO_TEMPERATURE:
|
||||||
|
case INFO_THROTTLING:
|
||||||
|
default:
|
||||||
|
return CPU_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
Loading…
Reference in a new issue