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

2014-11-06 Thread Simon Glass
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 s...@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
-- 
2.1.0.rc2.206.gedb03e5

___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


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

2014-11-06 Thread Bin Meng
Hi Simon,

On Fri, Nov 7, 2014 at 4:19 AM, Simon Glass s...@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 s...@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
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


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

2014-11-06 Thread Simon Glass
Hi Bin,

On 6 November 2014 17:14, Bin Meng bmeng...@gmail.com wrote:
 Hi Simon,

 On Fri, Nov 7, 2014 at 4:19 AM, Simon Glass s...@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 s...@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
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot