Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 03 May 2011 22:11:45 +0200
From:      David Demelier <demelier.david@gmail.com>
To:        Roland Smith <rsmith@xs4all.nl>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Get the dev.cpu.0.temperature from sysctl(3)
Message-ID:  <4DC06181.1070500@gmail.com>
In-Reply-To: <20110503194009.GA63997@slackbox.erewhon.net>
References:  <4DBFB8F1.4050504@gmail.com> <20110503194009.GA63997@slackbox.erewhon.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On 03/05/2011 21:40, Roland Smith wrote:
> On Tue, May 03, 2011 at 10:12:33AM +0200, David Demelier wrote:
>> Hello,
>>
>> I would like to get the dev.cpu.0.temperature node from sysctlbyname().
>> It seems this node is an opaque type but how to check it and store it to
>> the appropriate variable type ?
>
> The best way to determine this is to read the source. I did that some time ago
> to fix the temperature display in sysutils/conky.
>
> The sysctl dev.cpu.0.temperature returns an integer, see
> /sys/dev/coretemp/coretemp.c (look for the string "temperature"), and you'll see:
>
>          /*
>           * Add the "temperature" MIB to dev.cpu.N.
>           */
>          sc->sc_oid = SYSCTL_ADD_PROC(device_get_sysctl_ctx(pdev),
>              SYSCTL_CHILDREN(device_get_sysctl_tree(pdev)),
>              OID_AUTO, "temperature",
>              CTLTYPE_INT | CTLFLAG_RD,
>              dev, 0, coretemp_get_temp_sysctl, "IK",
>              "Current temperature");
>
> If you look at the definition of coretemp_get_temp_sysctl in the same file:
>
> coretemp_get_temp_sysctl(SYSCTL_HANDLER_ARGS)
> {
>          device_t dev = (device_t) arg1;
>          int temp;
>
>          temp = coretemp_get_temp(dev) * 10 + TZ_ZEROC;
>
>          return (sysctl_handle_int(oidp,&temp, 0, req));
> }
>
> So the returned value is an 'int'. Note that TZ_ZEROC is #defined as 2732 at
> the beginning of the file. The returned value is therefore the temperature
> in Kelvin times ten.
>
> On my machine, it gives e.g.:
>
>      sysctl dev.cpu.0.temperature
> 	dev.cpu.0.temperature: 46.0C
>
> If we check the 'raw' return value;
>
>      sysctl -b dev.cpu.0.temperature|hd
>      00000000  78 0c 00 00                                       |x...|
>      00000004
>
> Running this value with the abovementioned algorithm in reverse through a
> calculator, we get
>
>     (0x0c78-2732)/10 = 46°C
>
> Hope this helps.
>
>
> Roland

Thanks a lot!

I had a look into the src and I saw the format "IK" used to register the 
sysctl node but I was also surprised that "IK" was not defined in man 
sysctl(9)

But I finally understood that K should means Kelvin :)

Cheers,

-- 
David Demelier



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4DC06181.1070500>