From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Jingqi Liu <jingqi.liu@intel.com>, Tao Xu <tao3.xu@intel.com>
Subject: [PULL 25/39] x86/cpu: Add support for UMONITOR/UMWAIT/TPAUSE
Date: Thu, 24 Oct 2019 16:03:41 +0200 [thread overview]
Message-ID: <1571925835-31930-26-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1571925835-31930-1-git-send-email-pbonzini@redhat.com>
From: Tao Xu <tao3.xu@intel.com>
UMONITOR, UMWAIT and TPAUSE are a set of user wait instructions.
This patch adds support for user wait instructions in KVM. Availability
of the user wait instructions is indicated by the presence of the CPUID
feature flag WAITPKG CPUID.0x07.0x0:ECX[5]. User wait instructions may
be executed at any privilege level, and use IA32_UMWAIT_CONTROL MSR to
set the maximum time.
The patch enable the umonitor, umwait and tpause features in KVM.
Because umwait and tpause can put a (psysical) CPU into a power saving
state, by default we dont't expose it to kvm and enable it only when
guest CPUID has it. And use QEMU command-line "-overcommit cpu-pm=on"
(enable_cpu_pm is enabled), a VM can use UMONITOR, UMWAIT and TPAUSE
instructions. If the instruction causes a delay, the amount of time
delayed is called here the physical delay. The physical delay is first
computed by determining the virtual delay (the time to delay relative to
the VM’s timestamp counter). Otherwise, UMONITOR, UMWAIT and TPAUSE cause
an invalid-opcode exception(#UD).
The release document ref below link:
https://software.intel.com/sites/default/files/\
managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf
Co-developed-by: Jingqi Liu <jingqi.liu@intel.com>
Signed-off-by: Jingqi Liu <jingqi.liu@intel.com>
Signed-off-by: Tao Xu <tao3.xu@intel.com>
Message-Id: <20191011074103.30393-2-tao3.xu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target/i386/cpu.c | 2 +-
target/i386/cpu.h | 2 ++
target/i386/kvm.c | 6 ++++++
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 6c87c99..b635302 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -1058,7 +1058,7 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
.type = CPUID_FEATURE_WORD,
.feat_names = {
NULL, "avx512vbmi", "umip", "pku",
- NULL /* ospke */, NULL, "avx512vbmi2", NULL,
+ NULL /* ospke */, "waitpkg", "avx512vbmi2", NULL,
"gfni", "vaes", "vpclmulqdq", "avx512vnni",
"avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
"la57", NULL, NULL, NULL,
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index c50a9c7..112f867 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -731,6 +731,8 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
#define CPUID_7_0_ECX_PKU (1U << 3)
/* OS Enable Protection Keys */
#define CPUID_7_0_ECX_OSPKE (1U << 4)
+/* UMONITOR/UMWAIT/TPAUSE Instructions */
+#define CPUID_7_0_ECX_WAITPKG (1U << 5)
/* Additional AVX-512 Vector Byte Manipulation Instruction */
#define CPUID_7_0_ECX_AVX512_VBMI2 (1U << 6)
/* Galois Field New Instructions */
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 49a3011..94c2339 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -401,6 +401,12 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
if (host_tsx_blacklisted()) {
ret &= ~(CPUID_7_0_EBX_RTM | CPUID_7_0_EBX_HLE);
}
+ } else if (function == 7 && index == 0 && reg == R_ECX) {
+ if (enable_cpu_pm) {
+ ret |= CPUID_7_0_ECX_WAITPKG;
+ } else {
+ ret &= ~CPUID_7_0_ECX_WAITPKG;
+ }
} else if (function == 7 && index == 0 && reg == R_EDX) {
/*
* Linux v4.17-v4.20 incorrectly return ARCH_CAPABILITIES on SVM hosts.
--
1.8.3.1
next prev parent reply other threads:[~2019-10-24 15:29 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-24 14:03 [PULL 00/39] Misc (mostly x86) patches for 2019-10-24 Paolo Bonzini
2019-10-24 14:03 ` [PULL 01/39] target/i386: log MCE guest and host addresses Paolo Bonzini
2019-10-24 14:03 ` [PULL 02/39] mc146818rtc: fix timer interrupt reinjection Paolo Bonzini
2019-10-24 14:03 ` [PULL 03/39] Updated Bulgarian translation (19) - 4.1.0 Paolo Bonzini
2019-10-24 19:54 ` Aleksandar Markovic
2019-10-24 20:19 ` Paolo Bonzini
2019-10-24 14:03 ` [PULL 04/39] i386/kvm: add NoNonArchitecturalCoreSharing Hyper-V enlightenment Paolo Bonzini
2019-10-24 14:03 ` [PULL 05/39] Do not use %m in common code to print error messages Paolo Bonzini
2019-10-24 14:03 ` [PULL 06/39] memory-device: simplify Makefile.objs conditions Paolo Bonzini
2019-10-24 14:03 ` [PULL 07/39] hw/virtio: Factorize virtio-mmio headers Paolo Bonzini
2019-10-24 14:03 ` [PULL 08/39] hw/i386/pc: rename functions shared with non-PC machines Paolo Bonzini
2019-10-24 14:03 ` [PULL 09/39] hw/i386/pc: fix code style issues on functions that will be moved out Paolo Bonzini
2019-10-24 14:03 ` [PULL 10/39] hw/i386/pc: replace use of strtol with qemu_strtoui in x86_load_linux() Paolo Bonzini
2019-10-24 14:03 ` [PULL 11/39] hw/i386/pc: avoid an assignment in if condition " Paolo Bonzini
2019-10-24 14:03 ` [PULL 12/39] hw/i386/pc: remove commented out code from x86_load_linux() Paolo Bonzini
2019-10-24 14:03 ` [PULL 13/39] hw/i386/pc: move shared x86 functions to x86.c and export them Paolo Bonzini
2019-10-24 14:03 ` [PULL 14/39] hw/i386: split PCMachineState deriving X86MachineState from it Paolo Bonzini
2019-10-24 14:03 ` [PULL 15/39] hw/i386: make x86.c independent from PCMachineState Paolo Bonzini
2019-10-24 14:03 ` [PULL 16/39] fw_cfg: add "modify" functions for all types Paolo Bonzini
2019-10-24 14:03 ` [PULL 17/39] hw/intc/apic: reject pic ints if isa_pic == NULL Paolo Bonzini
2019-10-24 14:03 ` [PULL 18/39] roms: add microvm-bios (qboot) as binary and git submodule Paolo Bonzini
2019-10-24 14:03 ` [PULL 19/39] docs/microvm.rst: document the new microvm machine type Paolo Bonzini
2019-10-24 14:03 ` [PULL 20/39] hw/i386: Introduce the " Paolo Bonzini
2019-11-12 10:18 ` Peter Maydell
2019-11-12 11:57 ` Sergio Lopez
2019-10-24 14:03 ` [PULL 21/39] MAINTAINERS: add microvm related files Paolo Bonzini
2019-10-24 14:03 ` [PULL 22/39] checkpatch: suggest qemu_real_host_page_size instead of getpagesize() or sysconf(_SC_PAGESIZE) Paolo Bonzini
2019-10-24 14:03 ` [PULL 23/39] runstate: ignore exit request in finish migrate state Paolo Bonzini
2019-10-24 14:03 ` [PULL 24/39] hw/timer/mc146818rtc: Only include qapi-commands-misc on I386 Paolo Bonzini
2019-10-24 14:03 ` Paolo Bonzini [this message]
2019-10-24 14:03 ` [PULL 26/39] target/i386: Add support for save/load IA32_UMWAIT_CONTROL MSR Paolo Bonzini
2019-10-24 14:03 ` [PULL 27/39] hw/i386/pc: Extract pc_gsi_create() Paolo Bonzini
2019-10-24 14:03 ` [PULL 28/39] hw/i386/pc: Move gsi_state creation code Paolo Bonzini
2019-10-24 14:03 ` [PULL 29/39] hw/i386/pc: Extract pc_i8259_create() Paolo Bonzini
2019-10-24 14:03 ` [PULL 30/39] hw/i386/pc: Remove kvm_i386.h include Paolo Bonzini
2019-10-24 14:03 ` [PULL 31/39] mc146818rtc: move structure to header file Paolo Bonzini
2019-10-24 14:03 ` [PULL 32/39] mc146818rtc: Move RTC_ISA_IRQ definition Paolo Bonzini
2019-10-24 14:03 ` [PULL 33/39] mc146818rtc: Include mc146818rtc_regs.h directly in mc146818rtc.c Paolo Bonzini
2019-10-24 14:03 ` [PULL 34/39] mc146818rtc: always register rtc to rtc list Paolo Bonzini
2019-10-24 14:03 ` [PULL 35/39] audio: fix missing break Paolo Bonzini
2019-10-24 15:14 ` Philippe Mathieu-Daudé
2019-10-24 16:02 ` Paolo Bonzini
2019-10-24 14:03 ` [PULL 36/39] core: replace getpagesize() with qemu_real_host_page_size Paolo Bonzini
2019-10-24 14:03 ` [PULL 37/39] target/i386: move FERR handling to target/i386 Paolo Bonzini
2019-10-24 14:03 ` [PULL 38/39] target/i386: introduce cpu_set_fpus Paolo Bonzini
2019-10-24 14:03 ` [PULL 39/39] i386: implement IGNNE Paolo Bonzini
2019-10-25 8:43 ` [PULL 00/39] Misc (mostly x86) patches for 2019-10-24 no-reply
2019-10-25 10:46 ` Peter Maydell
2019-10-25 11:17 ` Paolo Bonzini
2019-10-26 13:20 ` Philippe Mathieu-Daudé
2019-10-26 13:39 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1571925835-31930-26-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=jingqi.liu@intel.com \
--cc=qemu-devel@nongnu.org \
--cc=tao3.xu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).