[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging-4.18] x86/idle: Move monitor()/mwait() wrappers into cpu-idle.c
commit e9d112ea101ec43976a47d29acf7ca75fec3ec84 Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Tue Apr 1 14:59:01 2025 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Mon Jul 7 22:52:10 2025 +0100 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@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> (cherry picked from commit 61e10fc28ccddff7c72c14acec56dc7ef2b155d1) --- xen/arch/x86/acpi/cpu_idle.c | 21 +++++++++++++++++---- xen/arch/x86/include/asm/processor.h | 17 ----------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c index 040bab60b6..ec2d570dc2 100644 --- a/xen/arch/x86/acpi/cpu_idle.c +++ b/xen/arch/x86/acpi/cpu_idle.c @@ -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 & diff --git a/xen/arch/x86/include/asm/processor.h b/xen/arch/x86/include/asm/processor.h index 1bba4c5002..c5e5c72341 100644 --- a/xen/arch/x86/include/asm/processor.h +++ b/xen/arch/x86/include/asm/processor.h @@ -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 -- generated by git-patchbot for /home/xen/git/xen.git#staging-4.18
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |