diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index 4ea8304e8c..6d3a34c5db 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -426,6 +426,7 @@ extern void ktrace_vprintf(const char *format, va_list args); typedef struct { bigtime_t active_time; /* usec of doing useful work since boot */ bool enabled; + uint64 current_frequency; } cpu_info; typedef struct { @@ -537,8 +538,11 @@ typedef struct { extern status_t get_system_info(system_info* info); -extern status_t get_cpu_info(uint32 firstCPU, uint32 cpuCount, - cpu_info* info); +extern status_t _get_cpu_info_etc(uint32 firstCPU, uint32 cpuCount, + cpu_info* info, size_t size); +#define get_cpu_info(firstCPU, cpuCount, info) \ + _get_cpu_info_etc((firstCPU), (cpuCount), (info), sizeof(*(info))) + extern status_t get_cpu_topology_info(cpu_topology_node_info* topologyInfos, uint32* topologyInfoCount); diff --git a/headers/private/system/system_info.h b/headers/private/system/system_info.h index e04dd61f26..23b0ffee1c 100644 --- a/headers/private/system/system_info.h +++ b/headers/private/system/system_info.h @@ -49,7 +49,6 @@ extern "C" { status_t __get_system_info(system_info* info); -status_t __get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info); status_t __get_cpu_topology_info(cpu_topology_node_info* topologyInfos, uint32* topologyInfoCount); diff --git a/src/bin/sysinfo.cpp b/src/bin/sysinfo.cpp index 2897a2f489..aee0ffed42 100644 --- a/src/bin/sysinfo.cpp +++ b/src/bin/sysinfo.cpp @@ -581,6 +581,14 @@ dump_cpu(enum cpu_vendor vendor, uint32 model, int32 cpu) return; } + cpu_info frequencyInfo; + if (get_cpu_info(cpu, 1, &frequencyInfo) == B_OK + && frequencyInfo.current_frequency != 0) { + printf("\tFrequency: %" B_PRId32 ".%03" B_PRId32 "\n", + int32(frequencyInfo.current_frequency / 1000000), + int32((frequencyInfo.current_frequency % 1000000) / 1000)); + } + get_cpuid(&cpuInfo, 1, cpu); print_processor_signature(vendor, &cpuInfo); printf("\tFeatures: 0x%08" B_PRIx32 "\n", cpuInfo.eax_1.features); diff --git a/src/system/kernel/system_info.cpp b/src/system/kernel/system_info.cpp index 6b7ea50aeb..5403863fb0 100644 --- a/src/system/kernel/system_info.cpp +++ b/src/system/kernel/system_info.cpp @@ -490,11 +490,34 @@ get_system_info(system_info* info) } +typedef struct { + bigtime_t active_time; + bool enabled; +} beta2_cpu_info; + + +extern "C" status_t +__get_cpu_info(uint32 firstCPU, uint32 cpuCount, beta2_cpu_info* beta2_info) +{ + cpu_info info[cpuCount]; + status_t err = _get_cpu_info_etc(firstCPU, cpuCount, info, sizeof(cpu_info)); + if (err == B_OK) { + for (uint32 i = 0; i < cpuCount; i++) { + beta2_info[i].active_time = info[i].active_time; + beta2_info[i].enabled = info[i].enabled; + } + } + return err; +} + + status_t -get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info) +_get_cpu_info_etc(uint32 firstCPU, uint32 cpuCount, cpu_info* info, size_t size) { if (cpuCount == 0) return B_OK; + if (size != sizeof(cpu_info)) + return B_BAD_VALUE; if (firstCPU >= (uint32)smp_get_num_cpus()) return B_BAD_VALUE; @@ -516,6 +539,7 @@ get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info) for (uint32 i = 0; i < count; i++) { info[i].active_time = cpu_get_active_time(firstCPU + i); info[i].enabled = !gCPU[firstCPU + i].disabled; + info[i].current_frequency = cpu_frequency(i); } if (IS_USER_ADDRESS(info)) { @@ -578,7 +602,7 @@ _user_get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* userInfo) if (userInfo == NULL || !IS_USER_ADDRESS(userInfo)) return B_BAD_ADDRESS; - return get_cpu_info(firstCPU, cpuCount, userInfo); + return _get_cpu_info_etc(firstCPU, cpuCount, userInfo, sizeof(cpu_info)); } diff --git a/src/system/libroot/os/system_info.cpp b/src/system/libroot/os/system_info.cpp index 8654ddf5cc..83741ab612 100644 --- a/src/system/libroot/os/system_info.cpp +++ b/src/system/libroot/os/system_info.cpp @@ -153,9 +153,31 @@ __get_system_info(system_info* info) } -status_t -__get_cpu_info(uint32 firstCPU, uint32 cpuCount, cpu_info* info) +typedef struct { + bigtime_t active_time; + bool enabled; +} beta2_cpu_info; + + +extern "C" status_t +__get_cpu_info(uint32 firstCPU, uint32 cpuCount, beta2_cpu_info* beta2_info) { + cpu_info info; + status_t err = _get_cpu_info_etc(firstCPU, cpuCount, &info, sizeof(info)); + if (err == B_OK) { + beta2_info->active_time = info.active_time; + beta2_info->enabled = info.enabled; + } + return err; +} + + +status_t +_get_cpu_info_etc(uint32 firstCPU, uint32 cpuCount, cpu_info* info, + size_t size) +{ + if (info == NULL || size != sizeof(cpu_info)) + return B_BAD_VALUE; return _kern_get_cpu_info(firstCPU, cpuCount, info); }