[Libva] [PATCH 1/2] Use the inline CPUID assembly to obtain CPUID string instead of /proc/cpuinfo
Sean V Kelley
sean.v.kelley at intel.com
Wed Sep 24 08:22:29 PDT 2014
Hi,
On Wed, Sep 24, 2014 at 2:10 AM, Gwenole Beauchesne <gb.devel at gmail.com> wrote:
> Hi,
>
> Great to see that finally fixed.
>
> 2014-09-24 9:13 GMT+02:00 Zhao Yakui <yakui.zhao at intel.com>:
>> On some systems there is no access to /proc/cpuinfo. So the inline assembly
>> is used directly to detect the CPUID string.
>>
>> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
>> ---
>> src/i965_device_info.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 46 insertions(+)
>>
>> diff --git a/src/i965_device_info.c b/src/i965_device_info.c
>> index 5ebea2a..4ffba61 100755
>> --- a/src/i965_device_info.c
>> +++ b/src/i965_device_info.c
>> @@ -378,6 +378,7 @@ i965_get_device_info(int devid)
>> }
>> }
>>
>> +#if 0
>> static int intel_driver_detect_cpustring(char *model_id)
>> {
>> FILE *fp;
>> @@ -416,7 +417,52 @@ static int intel_driver_detect_cpustring(char *model_id)
>> else
>> return -EINVAL;
>> }
>> +#else
>> +static inline void cpuid(unsigned int op,
>> + unsigned int *eax, unsigned int *ebx,
>> + unsigned int *ecx, unsigned int *edx)
>
> Use uint32_t so that to not make the code below confusing when
> different 32-bit/64-bit asm is involved and you are sure the operands
> are 32-bits, just say so.
Agree.
>
>> +{
>> + *eax = op;
>> + *ecx = 0;
>> + /* ecx is often an input as well as an output. */
>> + asm volatile("cpuid"
>> + : "=a" (*eax),
>> + "=b" (*ebx),
>> + "=c" (*ecx),
>> + "=d" (*edx)
>> + : "0" (*eax), "2" (*ecx)
>> + :"memory");
>> +}
>
> This will likely fail in 32-bit mode. %ebx is the PIC register there.
> e.g. use %edi as a temporary in this case. And split into two
> versions.
>
> Besides, choose between in/out operands (+) and keep *eax/*ecx
> initializations, or use separate outputs and inputs and initialize
> eax/ecx there, e.g. "a" (op), "c" (0) and drop the *eax/*ecx lines.
> Don't mix both.
Agree and it raises the point this should also be tested against 32bit mode.
Sean
>
>> +
>> +/*
>> + * This function doesn't check the length. And the caller should
>> + * assure that the length of input string should be greater than 48.
>> + */
>> +static int intel_driver_detect_cpustring(char *model_id)
>
> This is totally useless then, worded as is, and doesn't bring in more
> robustness. Use dynamic allocation, or model_id + length of model_id.
>
>> +{
>> + unsigned int *rdata;
>>
>> + if (model_id == NULL)
>> + return -EINVAL;
>> +
>> + rdata = (unsigned int *)model_id;
>> +
>> + /* obtain the max supported extended CPUID info */
>> + cpuid(0x80000000, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
>> +
>> + /* If the max extended CPUID info is less than 0x80000004, fail */
>> + if (rdata[0] < 0x80000004)
>> + return -EINVAL;
>> +
>> + /* obtain the CPUID string */
>> + cpuid(0x80000002, &rdata[0], &rdata[1], &rdata[2], &rdata[3]);
>> + cpuid(0x80000003, &rdata[4], &rdata[5], &rdata[6], &rdata[7]);
>> + cpuid(0x80000004, &rdata[8], &rdata[9], &rdata[10], &rdata[11]);
>> +
>> + *(model_id + 48) = '\0';
>
> That's model_id[48] = '\0'; much simpler to read.
>
>> + return 0;
>> +}
>> +#endif
>> /*
>> * the hook_list for HSW.
>> * It is captured by /proc/cpuinfo and the space character is stripped.
>> --
>> 1.7.10.1
>>
>> _______________________________________________
>> Libva mailing list
>> Libva at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/libva
>
> Regards,
> --
> Gwenole Beauchesne
> Intel Corporation SAS / 2 rue de Paris, 92196 Meudon Cedex, France
> Registration Number (RCS): Nanterre B 302 456 199
> _______________________________________________
> Libva mailing list
> Libva at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libva
--
Sean V. Kelley <sean.v.kelley at intel.com>
Open Source Technology Center / SSG
Intel Corp.
More information about the Libva
mailing list