|
@@ -156,59 +156,6 @@ static inline fastcall void native_cpuid(unsigned int *eax, unsigned int *ebx,
|
|
|
: "0" (*eax), "2" (*ecx));
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Generic CPUID function
|
|
|
- * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
|
|
|
- * resulting in stale register contents being returned.
|
|
|
- */
|
|
|
-static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
|
|
|
-{
|
|
|
- *eax = op;
|
|
|
- *ecx = 0;
|
|
|
- __cpuid(eax, ebx, ecx, edx);
|
|
|
-}
|
|
|
-
|
|
|
-/* Some CPUID calls want 'count' to be placed in ecx */
|
|
|
-static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
|
|
|
- int *edx)
|
|
|
-{
|
|
|
- *eax = op;
|
|
|
- *ecx = count;
|
|
|
- __cpuid(eax, ebx, ecx, edx);
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
- * CPUID functions returning a single datum
|
|
|
- */
|
|
|
-static inline unsigned int cpuid_eax(unsigned int op)
|
|
|
-{
|
|
|
- unsigned int eax, ebx, ecx, edx;
|
|
|
-
|
|
|
- cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
- return eax;
|
|
|
-}
|
|
|
-static inline unsigned int cpuid_ebx(unsigned int op)
|
|
|
-{
|
|
|
- unsigned int eax, ebx, ecx, edx;
|
|
|
-
|
|
|
- cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
- return ebx;
|
|
|
-}
|
|
|
-static inline unsigned int cpuid_ecx(unsigned int op)
|
|
|
-{
|
|
|
- unsigned int eax, ebx, ecx, edx;
|
|
|
-
|
|
|
- cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
- return ecx;
|
|
|
-}
|
|
|
-static inline unsigned int cpuid_edx(unsigned int op)
|
|
|
-{
|
|
|
- unsigned int eax, ebx, ecx, edx;
|
|
|
-
|
|
|
- cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
- return edx;
|
|
|
-}
|
|
|
-
|
|
|
#define load_cr3(pgdir) write_cr3(__pa(pgdir))
|
|
|
|
|
|
/*
|
|
@@ -491,22 +438,6 @@ struct thread_struct {
|
|
|
.io_bitmap = { [ 0 ... IO_BITMAP_LONGS] = ~0 }, \
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_PARAVIRT
|
|
|
-#include <asm/paravirt.h>
|
|
|
-#else
|
|
|
-#define paravirt_enabled() 0
|
|
|
-#define __cpuid native_cpuid
|
|
|
-
|
|
|
-static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
|
|
|
-{
|
|
|
- tss->esp0 = thread->esp0;
|
|
|
- /* This can only happen when SEP is enabled, no need to test "SEP"arately */
|
|
|
- if (unlikely(tss->ss1 != thread->sysenter_cs)) {
|
|
|
- tss->ss1 = thread->sysenter_cs;
|
|
|
- wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
#define start_thread(regs, new_eip, new_esp) do { \
|
|
|
__asm__("movl %0,%%fs": :"r" (0)); \
|
|
|
regs->xgs = 0; \
|
|
@@ -519,36 +450,6 @@ static inline void load_esp0(struct tss_struct *tss, struct thread_struct *threa
|
|
|
regs->esp = new_esp; \
|
|
|
} while (0)
|
|
|
|
|
|
-/*
|
|
|
- * These special macros can be used to get or set a debugging register
|
|
|
- */
|
|
|
-#define get_debugreg(var, register) \
|
|
|
- __asm__("movl %%db" #register ", %0" \
|
|
|
- :"=r" (var))
|
|
|
-#define set_debugreg(value, register) \
|
|
|
- __asm__("movl %0,%%db" #register \
|
|
|
- : /* no output */ \
|
|
|
- :"r" (value))
|
|
|
-
|
|
|
-#define set_iopl_mask native_set_iopl_mask
|
|
|
-#endif /* CONFIG_PARAVIRT */
|
|
|
-
|
|
|
-/*
|
|
|
- * Set IOPL bits in EFLAGS from given mask
|
|
|
- */
|
|
|
-static fastcall inline void native_set_iopl_mask(unsigned mask)
|
|
|
-{
|
|
|
- unsigned int reg;
|
|
|
- __asm__ __volatile__ ("pushfl;"
|
|
|
- "popl %0;"
|
|
|
- "andl %1, %0;"
|
|
|
- "orl %2, %0;"
|
|
|
- "pushl %0;"
|
|
|
- "popfl"
|
|
|
- : "=&r" (reg)
|
|
|
- : "i" (~X86_EFLAGS_IOPL), "r" (mask));
|
|
|
-}
|
|
|
-
|
|
|
/* Forward declaration, a strange C thing */
|
|
|
struct task_struct;
|
|
|
struct mm_struct;
|
|
@@ -640,6 +541,105 @@ static inline void rep_nop(void)
|
|
|
|
|
|
#define cpu_relax() rep_nop()
|
|
|
|
|
|
+#ifdef CONFIG_PARAVIRT
|
|
|
+#include <asm/paravirt.h>
|
|
|
+#else
|
|
|
+#define paravirt_enabled() 0
|
|
|
+#define __cpuid native_cpuid
|
|
|
+
|
|
|
+static inline void load_esp0(struct tss_struct *tss, struct thread_struct *thread)
|
|
|
+{
|
|
|
+ tss->esp0 = thread->esp0;
|
|
|
+ /* This can only happen when SEP is enabled, no need to test "SEP"arately */
|
|
|
+ if (unlikely(tss->ss1 != thread->sysenter_cs)) {
|
|
|
+ tss->ss1 = thread->sysenter_cs;
|
|
|
+ wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * These special macros can be used to get or set a debugging register
|
|
|
+ */
|
|
|
+#define get_debugreg(var, register) \
|
|
|
+ __asm__("movl %%db" #register ", %0" \
|
|
|
+ :"=r" (var))
|
|
|
+#define set_debugreg(value, register) \
|
|
|
+ __asm__("movl %0,%%db" #register \
|
|
|
+ : /* no output */ \
|
|
|
+ :"r" (value))
|
|
|
+
|
|
|
+#define set_iopl_mask native_set_iopl_mask
|
|
|
+#endif /* CONFIG_PARAVIRT */
|
|
|
+
|
|
|
+/*
|
|
|
+ * Set IOPL bits in EFLAGS from given mask
|
|
|
+ */
|
|
|
+static fastcall inline void native_set_iopl_mask(unsigned mask)
|
|
|
+{
|
|
|
+ unsigned int reg;
|
|
|
+ __asm__ __volatile__ ("pushfl;"
|
|
|
+ "popl %0;"
|
|
|
+ "andl %1, %0;"
|
|
|
+ "orl %2, %0;"
|
|
|
+ "pushl %0;"
|
|
|
+ "popfl"
|
|
|
+ : "=&r" (reg)
|
|
|
+ : "i" (~X86_EFLAGS_IOPL), "r" (mask));
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Generic CPUID function
|
|
|
+ * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
|
|
|
+ * resulting in stale register contents being returned.
|
|
|
+ */
|
|
|
+static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
|
|
|
+{
|
|
|
+ *eax = op;
|
|
|
+ *ecx = 0;
|
|
|
+ __cpuid(eax, ebx, ecx, edx);
|
|
|
+}
|
|
|
+
|
|
|
+/* Some CPUID calls want 'count' to be placed in ecx */
|
|
|
+static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
|
|
|
+ int *edx)
|
|
|
+{
|
|
|
+ *eax = op;
|
|
|
+ *ecx = count;
|
|
|
+ __cpuid(eax, ebx, ecx, edx);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * CPUID functions returning a single datum
|
|
|
+ */
|
|
|
+static inline unsigned int cpuid_eax(unsigned int op)
|
|
|
+{
|
|
|
+ unsigned int eax, ebx, ecx, edx;
|
|
|
+
|
|
|
+ cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
+ return eax;
|
|
|
+}
|
|
|
+static inline unsigned int cpuid_ebx(unsigned int op)
|
|
|
+{
|
|
|
+ unsigned int eax, ebx, ecx, edx;
|
|
|
+
|
|
|
+ cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
+ return ebx;
|
|
|
+}
|
|
|
+static inline unsigned int cpuid_ecx(unsigned int op)
|
|
|
+{
|
|
|
+ unsigned int eax, ebx, ecx, edx;
|
|
|
+
|
|
|
+ cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
+ return ecx;
|
|
|
+}
|
|
|
+static inline unsigned int cpuid_edx(unsigned int op)
|
|
|
+{
|
|
|
+ unsigned int eax, ebx, ecx, edx;
|
|
|
+
|
|
|
+ cpuid(op, &eax, &ebx, &ecx, &edx);
|
|
|
+ return edx;
|
|
|
+}
|
|
|
+
|
|
|
/* generic versions from gas */
|
|
|
#define GENERIC_NOP1 ".byte 0x90\n"
|
|
|
#define GENERIC_NOP2 ".byte 0x89,0xf6\n"
|