On 09.12.2025 18:19, Teddy Astie wrote:
> --- a/tools/misc/xenpm.c
> +++ b/tools/misc/xenpm.c
> @@ -30,6 +30,7 @@
>  #include <inttypes.h>
>  #include <sys/time.h>
>  
> +#include <xen/asm/msr-index.h>

For this to not break non-x86 builds, don't you need to constrain the building
of the tool to CONFIG_X86? (I have no clue why it is being built for Arm as
well right now, as I don't see how it could provide any value there.)

> @@ -37,6 +38,7 @@
>  
>  static xc_interface *xc_handle;
>  static unsigned int max_cpu_nr;
> +static xc_physinfo_t physinfo;
>  
>  /* help message */
>  void show_help(void)
> @@ -93,6 +95,7 @@ void show_help(void)
>              "                                           units default to 
> \"us\" if unspecified.\n"
>              "                                           truncates 
> un-representable values.\n"
>              "                                           0 lets the hardware 
> decide.\n"
> +            " get-intel-temp        [cpuid]       get Intel CPU temperature 
> of <cpuid> or all\n"
>              " start [seconds]                     start collect Cx/Px 
> statistics,\n"
>              "                                     output after CTRL-C or 
> SIGINT or several seconds.\n"
>              " enable-turbo-mode     [cpuid]       enable Turbo Mode for 
> processors that support it.\n"
> @@ -1354,6 +1357,92 @@ void enable_turbo_mode(int argc, char *argv[])
>                  errno, strerror(errno));
>  }
>  
> +static int fetch_dts_temp(xc_interface *xch, uint32_t cpu, bool package, int 
> *temp)
> +{
> +    xc_resource_entry_t entries[2] = {

Is the 2 actually useful to have here?

> +        (xc_resource_entry_t){

Why these type specifiers? They shouldn't be needed in initializers (while they
would be needed in assignments)?

> +            .idx = package ? MSR_PACKAGE_THERM_STATUS : MSR_IA32_THERM_STATUS
> +        },
> +        (xc_resource_entry_t){ .idx = MSR_TEMPERATURE_TARGET },
> +    };
> +    struct xc_resource_op ops = {
> +        .cpu = cpu,
> +        .entries = entries,
> +        .nr_entries = 2,

ARRAY_SIZE() please.

> +    };
> +    int tjmax;
> +
> +    int ret = xc_resource_op(xch, 1, &ops);
> +
> +    if ( ret <= 0 )
> +        /* This CPU isn't online or can't query this MSR */
> +        return ret ?: -EOPNOTSUPP;

xc_resource_op() doesn't return errno values, so by using -EOPNOTSUPP here you
put the caller into a difficult position when actually looking at the return
value: Does -1 mean -1 or -EPERM?

> +    if ( ret == 2 )
> +        tjmax = (entries[1].val >> 16) & 0xff;
> +    else
> +    {
> +        /*
> +         * The CPU doesn't support MSR_IA32_TEMPERATURE_TARGET, we assume 
> it's 100 which
> +         * is correct aside a few selected Atom CPUs. Check coretemp source 
> code for more
> +         * information.
> +         */

What is "coretemp source code" in xen.git context? (I understand you mean the
Linux driver, but that also needs saying then.)

Further please respect line length limits, also ...

> +        fprintf(stderr, "[CPU%d] MSR_IA32_TEMPERATURE_TARGET is not 
> supported, assume "

... e.g. here.

Additionally there are still IA32 infixes here.

Finally, if this message triggers once on a system, it'll likely trigger once
per get_intel_temp()'s loop iteration. Feels like a lot of (potential) noise.

> +                "tjmax=100°C, readings may be incorrect\n", cpu);
> +        tjmax = 100;
> +    }
> +    
> +    *temp = tjmax - ((entries[0].val >> 16) & 0xff);
> +    return 0;
> +}
> +
> +
> +void get_intel_temp(int argc, char *argv[])

static?

> +{
> +    int temp, cpu = -1;
> +    unsigned int socket;
> +    bool has_data = false;
> +
> +    if ( argc > 0 )
> +        parse_cpuid(argv[0], &cpu);
> +
> +    if ( cpu != -1 )
> +    {
> +        if ( !fetch_dts_temp(xc_handle, cpu, false, &temp) )
> +            printf("CPU%d: %d°C\n", cpu, temp);
> +        else
> +            printf("No data\n");
> +        return;
> +    }
> +
> +    /* Per socket measurement */
> +    for ( socket = 0, cpu = 0; cpu < max_cpu_nr;
> +          socket++, cpu += physinfo.cores_per_socket * 
> physinfo.threads_per_core )
> +    {
> +        if ( !fetch_dts_temp(xc_handle, cpu, true, &temp) )
> +        {
> +            has_data = true;
> +            printf("Package%d: %d°C\n", socket, temp);

%u please for socket.

Jan

Reply via email to