mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/idle: Move monitor()/mwait() wrappers into cpu-idle.c
They're not used by any other translation unit, so shouldn't live in
asm/processor.h, which is included almost everywhere.
Our new toolchain baseline knows the MONITOR/MWAIT instructions, so use them
directly rather than using raw hex.
Change the hint/extention parameters from long to int. They're specified to
remain 32bit operands even 64-bit mode.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
(cherry picked from commit 61e10fc28c)
This commit is contained in:
1 parent
460ece3bd9
commit
e9d112ea10
2 files changed
+17
-21
No files matched your search
@@ -59,6 +59,19 @@
|
||||
|
||||
/*#define DEBUG_PM_CX*/
|
||||
|
||||
static always_inline void monitor(
|
||||
const void *addr, unsigned int ecx, unsigned int edx)
|
||||
{
|
||||
asm volatile ( "monitor"
|
||||
:: "a" (addr), "c" (ecx), "d" (edx) );
|
||||
}
|
||||
|
||||
static always_inline void mwait(unsigned int eax, unsigned int ecx)
|
||||
{
|
||||
asm volatile ( "mwait"
|
||||
:: "a" (eax), "c" (ecx) );
|
||||
}
|
||||
|
||||
#define GET_HW_RES_IN_NS(msr, val) \
|
||||
do { rdmsrl(msr, val); val = tsc_ticks2ns(val); } while( 0 )
|
||||
#define GET_MC6_RES(val) GET_HW_RES_IN_NS(0x664, val)
|
||||
@@ -482,7 +495,7 @@ void mwait_idle_with_hints(unsigned int eax, unsigned int ecx)
|
||||
mb();
|
||||
}
|
||||
|
||||
__monitor(monitor_addr, 0, 0);
|
||||
monitor(monitor_addr, 0, 0);
|
||||
smp_mb();
|
||||
|
||||
/*
|
||||
@@ -496,7 +509,7 @@ void mwait_idle_with_hints(unsigned int eax, unsigned int ecx)
|
||||
cpumask_set_cpu(cpu, &cpuidle_mwait_flags);
|
||||
|
||||
spec_ctrl_enter_idle(info);
|
||||
__mwait(eax, ecx);
|
||||
mwait(eax, ecx);
|
||||
spec_ctrl_exit_idle(info);
|
||||
|
||||
cpumask_clear_cpu(cpu, &cpuidle_mwait_flags);
|
||||
@@ -927,9 +940,9 @@ void cf_check acpi_dead_idle(void)
|
||||
*/
|
||||
mb();
|
||||
clflush(mwait_ptr);
|
||||
__monitor(mwait_ptr, 0, 0);
|
||||
monitor(mwait_ptr, 0, 0);
|
||||
mb();
|
||||
__mwait(cx->address, 0);
|
||||
mwait(cx->address, 0);
|
||||
}
|
||||
}
|
||||
else if ( (current_cpu_data.x86_vendor &
|
||||
|
||||
@@ -312,23 +312,6 @@ static always_inline void set_in_cr4 (unsigned long mask)
|
||||
write_cr4(read_cr4() | mask);
|
||||
}
|
||||
|
||||
static always_inline void __monitor(const void *eax, unsigned long ecx,
|
||||
unsigned long edx)
|
||||
{
|
||||
/* "monitor %eax,%ecx,%edx;" */
|
||||
asm volatile (
|
||||
".byte 0x0f,0x01,0xc8;"
|
||||
: : "a" (eax), "c" (ecx), "d"(edx) );
|
||||
}
|
||||
|
||||
static always_inline void __mwait(unsigned long eax, unsigned long ecx)
|
||||
{
|
||||
/* "mwait %eax,%ecx;" */
|
||||
asm volatile (
|
||||
".byte 0x0f,0x01,0xc9;"
|
||||
: : "a" (eax), "c" (ecx) );
|
||||
}
|
||||
|
||||
#define IOBMP_BYTES 8192
|
||||
#define IOBMP_INVALID_OFFSET 0x8000
|
||||
|
||||
|
||||