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

Bin Meng bmeng.cn at gmail.com
Fri Nov 7 01:14:15 CET 2014


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?

Regards,
Bin


More information about the U-Boot mailing list