From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: groug@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
lvivier@redhat.com,
Suraj Jitindar Singh <sjitindarsingh@gmail.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PULL 09/60] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS
Date: Sun, 10 Mar 2019 19:26:12 +1100 [thread overview]
Message-ID: <20190310082703.1245-10-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20190310082703.1245-1-david@gibson.dropbear.id.au>
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
The spapr_cap SPAPR_CAP_IBS is used to indicate the level of capability
for mitigations for indirect branch speculation. Currently the available
values are broken (default), fixed-ibs (fixed by serialising indirect
branches) and fixed-ccd (fixed by diabling the count cache).
Introduce a new value for this capability denoted workaround, meaning that
software can work around the issue by flushing the count cache on
context switch. This option is available if the hypervisor sets the
H_CPU_BEHAV_FLUSH_COUNT_CACHE flag in the cpu behaviours returned from
the KVM_PPC_GET_CPU_CHAR ioctl.
Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301031912.28809-1-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr_caps.c | 21 ++++++++++-----------
hw/ppc/spapr_hcall.c | 5 +++++
include/hw/ppc/spapr.h | 7 +++++++
target/ppc/kvm.c | 8 +++++++-
4 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 920224d0c2..74a48a423a 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -276,11 +276,13 @@ static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val,
}
sPAPRCapPossible cap_ibs_possible = {
- .num = 4,
+ .num = 5,
/* Note workaround only maintained for compatibility */
- .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd"},
- .help = "broken - no protection, fixed-ibs - indirect branch serialisation,"
- " fixed-ccd - cache count disabled",
+ .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na"},
+ .help = "broken - no protection, workaround - count cache flush"
+ ", fixed-ibs - indirect branch serialisation,"
+ " fixed-ccd - cache count disabled,"
+ " fixed-na - fixed in hardware (no longer applicable)",
};
static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
@@ -288,15 +290,11 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
{
uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch();
- if (val == SPAPR_CAP_WORKAROUND) { /* Can only be Broken or Fixed */
- error_setg(errp,
-"Requested safe indirect branch capability level \"workaround\" not valid, try cap-ibs=%s",
- cap_ibs_possible.vals[kvm_val]);
- } else if (tcg_enabled() && val) {
+ if (tcg_enabled() && val) {
/* TODO - for now only allow broken for TCG */
error_setg(errp,
"Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs");
- } else if (kvm_enabled() && val && (val != kvm_val)) {
+ } else if (kvm_enabled() && (val > kvm_val)) {
error_setg(errp,
"Requested safe indirect branch capability level not supported by kvm, try cap-ibs=%s",
cap_ibs_possible.vals[kvm_val]);
@@ -489,7 +487,8 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
[SPAPR_CAP_IBS] = {
.name = "ibs",
.description =
- "Indirect Branch Speculation (broken, fixed-ibs, fixed-ccd)",
+ "Indirect Branch Speculation (broken, workaround, fixed-ibs,"
+ "fixed-ccd, fixed-na)",
.index = SPAPR_CAP_IBS,
.get = spapr_cap_get_string,
.set = spapr_cap_set_string,
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 476bad6271..4aa8036fc0 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1723,12 +1723,17 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
}
switch (safe_indirect_branch) {
+ case SPAPR_CAP_FIXED_NA:
+ break;
case SPAPR_CAP_FIXED_CCD:
characteristics |= H_CPU_CHAR_CACHE_COUNT_DIS;
break;
case SPAPR_CAP_FIXED_IBS:
characteristics |= H_CPU_CHAR_BCCTRL_SERIALISED;
break;
+ case SPAPR_CAP_WORKAROUND:
+ behaviour |= H_CPU_BEHAV_FLUSH_COUNT_CACHE;
+ break;
default: /* broken */
assert(safe_indirect_branch == SPAPR_CAP_BROKEN);
break;
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 8efc5e0779..a7f3b1bfdd 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -85,12 +85,17 @@ typedef enum {
/* Bool Caps */
#define SPAPR_CAP_OFF 0x00
#define SPAPR_CAP_ON 0x01
+
/* Custom Caps */
+
+/* Generic */
#define SPAPR_CAP_BROKEN 0x00
#define SPAPR_CAP_WORKAROUND 0x01
#define SPAPR_CAP_FIXED 0x02
+/* SPAPR_CAP_IBS (cap-ibs) */
#define SPAPR_CAP_FIXED_IBS 0x02
#define SPAPR_CAP_FIXED_CCD 0x03
+#define SPAPR_CAP_FIXED_NA 0x10 /* Lets leave a bit of a gap... */
typedef struct sPAPRCapabilities sPAPRCapabilities;
struct sPAPRCapabilities {
@@ -339,9 +344,11 @@ struct sPAPRMachineState {
#define H_CPU_CHAR_HON_BRANCH_HINTS PPC_BIT(5)
#define H_CPU_CHAR_THR_RECONF_TRIG PPC_BIT(6)
#define H_CPU_CHAR_CACHE_COUNT_DIS PPC_BIT(7)
+#define H_CPU_CHAR_BCCTR_FLUSH_ASSIST PPC_BIT(9)
#define H_CPU_BEHAV_FAVOUR_SECURITY PPC_BIT(0)
#define H_CPU_BEHAV_L1D_FLUSH_PR PPC_BIT(1)
#define H_CPU_BEHAV_BNDS_CHK_SPEC_BAR PPC_BIT(2)
+#define H_CPU_BEHAV_FLUSH_COUNT_CACHE PPC_BIT(5)
/* Each control block has to be on a 4K boundary */
#define H_CB_ALIGNMENT 4096
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 3f650c8fc4..7a7a5adee3 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2391,7 +2391,13 @@ static int parse_cap_ppc_safe_bounds_check(struct kvm_ppc_cpu_char c)
static int parse_cap_ppc_safe_indirect_branch(struct kvm_ppc_cpu_char c)
{
- if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) {
+ if ((~c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) &&
+ (~c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) &&
+ (~c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED)) {
+ return SPAPR_CAP_FIXED_NA;
+ } else if (c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) {
+ return SPAPR_CAP_WORKAROUND;
+ } else if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) {
return SPAPR_CAP_FIXED_CCD;
} else if (c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED) {
return SPAPR_CAP_FIXED_IBS;
--
2.20.1
next prev parent reply other threads:[~2019-03-10 8:27 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-10 8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 02/60] vfio/spapr: Rename local systempagesize variable David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 03/60] spapr: Simulate CAS for qtest David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest" David Gibson
2019-03-11 10:52 ` Greg Kurz
2019-03-12 1:08 ` David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 05/60] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 06/60] target/ppc: Implement large decrementer support for TCG David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 07/60] target/ppc: Implement large decrementer support for KVM David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 08/60] target/ppc/spapr: Enable the large decrementer for pseries-4.0 David Gibson
2019-03-10 8:26 ` David Gibson [this message]
2019-03-10 8:26 ` [Qemu-devel] [PULL 10/60] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 11/60] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 12/60] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 13/60] target/ppc: Move exception vector offset computation into a function David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 14/60] target/ppc: Move handling of hardware breakpoints to a separate function David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 15/60] target/ppc: Refactor kvm_handle_debug David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 16/60] PPC: E500: Update u-boot to v2019.01 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 17/60] target/ppc/spapr: Clear partition table entry when allocating hash table David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 18/60] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit) David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 19/60] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 20/60] PPC: E500: Add FSL I2C controller and integrate RTC with it David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 21/60] ppc/xive: hardwire the Physical CAM line of the thread context David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 22/60] ppc: externalize ppc_get_vcpu_by_pir() David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 23/60] ppc/xive: export the TIMA memory accessors David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 24/60] ppc/pnv: export the xive_router_notify() routine David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 25/60] ppc/pnv: change the CPU machine_data presenter type to Object * David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 26/60] ppc/pnv: add a XIVE interrupt controller model for POWER9 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 27/60] ppc/pnv: introduce a new dt_populate() operation to the chip model David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 28/60] ppc/pnv: introduce a new pic_print_info() " David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 29/60] ppc/xive: activate HV support David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 30/60] ppc/pnv: fix logging primitives using Ox David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 31/60] ppc/pnv: psi: add a PSIHB_REG macro David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 32/60] ppc/pnv: psi: add a reset handler David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 33/60] spapr_iommu: Do not replay mappings from just created DMA window David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 34/60] target/ppc: introduce single fpr_offset() function David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 35/60] target/ppc: introduce single vsrl_offset() function David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 36/60] target/ppc: move Vsr* macros from internal.h to cpu.h David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 37/60] target/ppc: introduce avr_full_offset() function David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 38/60] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64() David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 39/60] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 40/60] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}() David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 41/60] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 42/60] mac_newworld: " David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 43/60] ppc/pnv: add a PSI bridge class model David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 44/60] ppc/pnv: add a PSI bridge model for POWER9 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 45/60] ppc/pnv: lpc: fix OPB address ranges David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 46/60] ppc/pnv: add a LPC Controller class model David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 47/60] ppc/pnv: add a 'dt_isa_nodename' to the chip David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 48/60] ppc/pnv: add a LPC Controller model for POWER9 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 49/60] ppc/pnv: add SerIRQ routing registers David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 50/60] ppc/pnv: add a OCC model class David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 51/60] ppc/pnv: add a OCC model for POWER9 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 52/60] ppc/pnv: extend XSCOM core support " David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 53/60] ppc/pnv: POWER9 XSCOM quad support David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 54/60] ppc/pnv: activate XSCOM tests for POWER9 David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 55/60] ppc/pnv: add more dummy XSCOM addresses David Gibson
2019-03-10 8:26 ` [Qemu-devel] [PULL 56/60] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9 David Gibson
2019-03-10 8:27 ` [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9 David Gibson
[not found] ` <20190312150115.6zuaid43gr7hklt5@unused>
[not found] ` <58de43c6-31d5-a0a3-b443-54a33f11d75a@kaod.org>
[not found] ` <20190312191409.vxnpscrephtk6otv@dhcp-17-165.bos.redhat.com>
[not found] ` <1746025955.7399905.1552419034356.JavaMail.zimbra@redhat.com>
[not found] ` <154364d7-fe5b-4f40-b976-b85ff9060ee0@kaod.org>
2019-06-28 13:20 ` Philippe Mathieu-Daudé
2019-07-01 5:04 ` David Gibson
2019-07-01 9:45 ` Philippe Mathieu-Daudé
2019-07-02 0:14 ` David Gibson
2019-07-02 6:13 ` Cédric Le Goater
2019-07-02 9:22 ` Philippe Mathieu-Daudé
2019-03-10 8:27 ` [Qemu-devel] [PULL 58/60] target/ppc: Optimize xviexpdp() using deposit_i64() David Gibson
2019-03-10 8:27 ` [Qemu-devel] [PULL 59/60] target/ppc: Optimize x[sv]xsigdp " David Gibson
2019-03-10 8:27 ` [Qemu-devel] [PULL 60/60] spapr: Use CamelCase properly David Gibson
2019-03-10 9:23 ` [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 no-reply
2019-03-10 16:06 ` Peter Maydell
2019-03-11 10:40 ` Alex Bennée
2019-03-12 0:26 ` David Gibson
2019-03-12 0:44 ` David Gibson
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=20190310082703.1245-10-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=groug@kaod.org \
--cc=lvivier@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=sjitindarsingh@gmail.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).