
Hi Bin,
On 6 November 2014 17:14, Bin Meng bmeng.cn@gmail.com wrote:
Hi Simon,
On Fri, Nov 7, 2014 at 4:19 AM, Simon Glass sjg@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@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