[U-Boot] [PATCH 07/39] x86: Add processor functions for cpuid and stack pointer

Simon Glass sjg at chromium.org
Fri Nov 7 01:27:59 CET 2014


Hi Bin,

On 6 November 2014 17:14, Bin Meng <bmeng.cn at gmail.com> wrote:
> Hi Simon,
>
> On Fri, Nov 7, 2014 at 4:19 AM, Simon Glass <sjg at chromium.org> wrote:
>> Add some functions to access cpuid from C in various useful ways. Also
>> add a function to get the stack pointer and another to halt the CPU.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>
>>  arch/x86/include/asm/processor.h | 121 +++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 121 insertions(+)
>>
>> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
>> index bb3172f..30d7d48 100644
>> --- a/arch/x86/include/asm/processor.h
>> +++ b/arch/x86/include/asm/processor.h
>> @@ -30,4 +30,125 @@ enum {
>>
>>  #define X86_GDT_SIZE           (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
>>
>> +#ifndef __ASSEMBLY__
>> +
>> +static inline __attribute__((always_inline)) void cpu_hlt(void)
>> +{
>> +       asm("hlt");
>> +}
>> +
>> +struct cpuid_result {
>> +       uint32_t eax;
>> +       uint32_t ebx;
>> +       uint32_t ecx;
>> +       uint32_t edx;
>> +};
>> +
>> +/*
>> + * Generic CPUID function
>> + */
>> +static inline struct cpuid_result cpuid(int op)
>> +{
>> +       struct cpuid_result result;
>> +       asm volatile(
>> +               "mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%ebx, %%esi;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (result.eax),
>> +                 "=S" (result.ebx),
>> +                 "=c" (result.ecx),
>> +                 "=d" (result.edx)
>> +               : "0" (op)
>> +               : "edi");
>> +       return result;
>> +}
>> +
>> +/*
>> + * Generic Extended CPUID function
>> + */
>> +static inline struct cpuid_result cpuid_ext(int op, unsigned ecx)
>> +{
>> +       struct cpuid_result result;
>> +       asm volatile(
>> +               "mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%ebx, %%esi;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (result.eax),
>> +                 "=S" (result.ebx),
>> +                 "=c" (result.ecx),
>> +                 "=d" (result.edx)
>> +               : "0" (op), "2" (ecx)
>> +               : "edi");
>> +       return result;
>> +}
>> +
>> +static inline ulong cpu_get_sp(void)
>> +{
>> +       ulong result;
>> +
>> +       asm volatile(
>> +               "mov %%esp, %%eax"
>> +               : "=a" (result));
>> +       return result;
>> +}
>> +
>> +/*
>> + * CPUID functions returning a single datum
>> + */
>> +static inline unsigned int cpuid_eax(unsigned int op)
>> +{
>> +       unsigned int eax;
>> +
>> +       __asm__("mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (eax)
>> +               : "0" (op)
>> +               : "ecx", "edx", "edi");
>> +       return eax;
>> +}
>> +
>> +static inline unsigned int cpuid_ebx(unsigned int op)
>> +{
>> +       unsigned int eax, ebx;
>> +
>> +       __asm__("mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%ebx, %%esi;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (eax), "=S" (ebx)
>> +               : "0" (op)
>> +               : "ecx", "edx", "edi");
>> +       return ebx;
>> +}
>> +
>> +static inline unsigned int cpuid_ecx(unsigned int op)
>> +{
>> +       unsigned int eax, ecx;
>> +
>> +       __asm__("mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (eax), "=c" (ecx)
>> +               : "0" (op)
>> +               : "edx", "edi");
>> +       return ecx;
>> +}
>> +
>> +static inline unsigned int cpuid_edx(unsigned int op)
>> +{
>> +       unsigned int eax, edx;
>> +
>> +       __asm__("mov %%ebx, %%edi;"
>> +               "cpuid;"
>> +               "mov %%edi, %%ebx;"
>> +               : "=a" (eax), "=d" (edx)
>> +               : "0" (op)
>> +               : "ecx", "edi");
>> +       return edx;
>> +}
>> +#endif /* __ASSEMBLY__ */
>> +
>>  #endif
>
> My previous patch (http://patchwork.ozlabs.org/patch/406636/)
> introduced these cpuid_xxx functions already. Would you consider
> merging the two patches?

Yes I saw your patch, thank you. I will sort it out once I get a
chance to test your series. Have been travelling.

Regards,
Simon


More information about the U-Boot mailing list