Blame SOURCES/kvm-target-ppc-spapr-Add-H-Call-H_GET_CPU_CHARACTERISTIC.patch

4a2fec
From d47dcee27b473fd94b4afdb21433d735ff9e51cd Mon Sep 17 00:00:00 2001
4a2fec
From: Suraj Jitindar Singh <sursingh@redhat.com>
4a2fec
Date: Tue, 13 Feb 2018 04:12:29 +0100
4a2fec
Subject: [PATCH 12/15] target/ppc/spapr: Add H-Call H_GET_CPU_CHARACTERISTICS
4a2fec
4a2fec
RH-Author: Suraj Jitindar Singh <sursingh@redhat.com>
4a2fec
Message-id: <1518495150-24134-9-git-send-email-sursingh@redhat.com>
4a2fec
Patchwork-id: 78986
4a2fec
O-Subject: [RHEL7.5 qemu-kvm-rhev PATCH 8/9] target/ppc/spapr: Add H-Call H_GET_CPU_CHARACTERISTICS
4a2fec
Bugzilla: 1532050
4a2fec
RH-Acked-by: David Gibson <dgibson@redhat.com>
4a2fec
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
4a2fec
RH-Acked-by: Thomas Huth <thuth@redhat.com>
4a2fec
4a2fec
From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
4a2fec
4a2fec
The new H-Call H_GET_CPU_CHARACTERISTICS is used by the guest to query
4a2fec
behaviours and available characteristics of the cpu.
4a2fec
4a2fec
Implement the handler for this new H-Call which formulates its response
4a2fec
based on the setting of the spapr_caps cap-cfpc, cap-sbbc and cap-ibs.
4a2fec
4a2fec
Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
4a2fec
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
4a2fec
(cherry picked from commit c59704b254734182c3202e0c261589ea2ccf485e)
4a2fec
4a2fec
Conflicts: none
4a2fec
4a2fec
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1532050
4a2fec
4a2fec
Signed-off-by: Suraj Jitindar Singh <sursingh@redhat.com>
4a2fec
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
---
4a2fec
 hw/ppc/spapr_hcall.c   | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++
4a2fec
 include/hw/ppc/spapr.h |  1 +
4a2fec
 2 files changed, 59 insertions(+)
4a2fec
4a2fec
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
4a2fec
index 217358d..21247cd 100644
4a2fec
--- a/hw/ppc/spapr_hcall.c
4a2fec
+++ b/hw/ppc/spapr_hcall.c
4a2fec
@@ -1629,6 +1629,60 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
4a2fec
     return H_SUCCESS;
4a2fec
 }
4a2fec
 
4a2fec
+static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
4a2fec
+                                              sPAPRMachineState *spapr,
4a2fec
+                                              target_ulong opcode,
4a2fec
+                                              target_ulong *args)
4a2fec
+{
4a2fec
+    uint64_t characteristics = H_CPU_CHAR_HON_BRANCH_HINTS &
4a2fec
+                               ~H_CPU_CHAR_THR_RECONF_TRIG;
4a2fec
+    uint64_t behaviour = H_CPU_BEHAV_FAVOUR_SECURITY;
4a2fec
+    uint8_t safe_cache = spapr_get_cap(spapr, SPAPR_CAP_CFPC);
4a2fec
+    uint8_t safe_bounds_check = spapr_get_cap(spapr, SPAPR_CAP_SBBC);
4a2fec
+    uint8_t safe_indirect_branch = spapr_get_cap(spapr, SPAPR_CAP_IBS);
4a2fec
+
4a2fec
+    switch (safe_cache) {
4a2fec
+    case SPAPR_CAP_WORKAROUND:
4a2fec
+        characteristics |= H_CPU_CHAR_L1D_FLUSH_ORI30;
4a2fec
+        characteristics |= H_CPU_CHAR_L1D_FLUSH_TRIG2;
4a2fec
+        characteristics |= H_CPU_CHAR_L1D_THREAD_PRIV;
4a2fec
+        behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR;
4a2fec
+        break;
4a2fec
+    case SPAPR_CAP_FIXED:
4a2fec
+        break;
4a2fec
+    default: /* broken */
4a2fec
+        assert(safe_cache == SPAPR_CAP_BROKEN);
4a2fec
+        behaviour |= H_CPU_BEHAV_L1D_FLUSH_PR;
4a2fec
+        break;
4a2fec
+    }
4a2fec
+
4a2fec
+    switch (safe_bounds_check) {
4a2fec
+    case SPAPR_CAP_WORKAROUND:
4a2fec
+        characteristics |= H_CPU_CHAR_SPEC_BAR_ORI31;
4a2fec
+        behaviour |= H_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
4a2fec
+        break;
4a2fec
+    case SPAPR_CAP_FIXED:
4a2fec
+        break;
4a2fec
+    default: /* broken */
4a2fec
+        assert(safe_bounds_check == SPAPR_CAP_BROKEN);
4a2fec
+        behaviour |= H_CPU_BEHAV_BNDS_CHK_SPEC_BAR;
4a2fec
+        break;
4a2fec
+    }
4a2fec
+
4a2fec
+    switch (safe_indirect_branch) {
4a2fec
+    case SPAPR_CAP_FIXED:
4a2fec
+        characteristics |= H_CPU_CHAR_BCCTRL_SERIALISED;
4a2fec
+    default: /* broken */
4a2fec
+        assert(safe_indirect_branch == SPAPR_CAP_BROKEN);
4a2fec
+        break;
4a2fec
+    }
4a2fec
+
4a2fec
+    args[0] = characteristics;
4a2fec
+    args[1] = behaviour;
4a2fec
+
4a2fec
+    return H_SUCCESS;
4a2fec
+}
4a2fec
+
4a2fec
 static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
4a2fec
 static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - KVMPPC_HCALL_BASE + 1];
4a2fec
 
4a2fec
@@ -1708,6 +1762,10 @@ static void hypercall_register_types(void)
4a2fec
     spapr_register_hypercall(H_INVALIDATE_PID, h_invalidate_pid);
4a2fec
     spapr_register_hypercall(H_REGISTER_PROC_TBL, h_register_process_table);
4a2fec
 
4a2fec
+    /* hcall-get-cpu-characteristics */
4a2fec
+    spapr_register_hypercall(H_GET_CPU_CHARACTERISTICS,
4a2fec
+                             h_get_cpu_characteristics);
4a2fec
+
4a2fec
     /* "debugger" hcalls (also used by SLOF). Note: We do -not- differenciate
4a2fec
      * here between the "CI" and the "CACHE" variants, they will use whatever
4a2fec
      * mapping attributes qemu is using. When using KVM, the kernel will
4a2fec
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
4a2fec
index f7f01f3..375b2ba 100644
4a2fec
--- a/include/hw/ppc/spapr.h
4a2fec
+++ b/include/hw/ppc/spapr.h
4a2fec
@@ -406,6 +406,7 @@ struct sPAPRMachineState {
4a2fec
 #define H_GET_HCA_INFO          0x1B8
4a2fec
 #define H_GET_PERF_COUNT        0x1BC
4a2fec
 #define H_MANAGE_TRACE          0x1C0
4a2fec
+#define H_GET_CPU_CHARACTERISTICS 0x1C8
4a2fec
 #define H_FREE_LOGICAL_LAN_BUFFER 0x1D4
4a2fec
 #define H_QUERY_INT_STATE       0x1E4
4a2fec
 #define H_POLL_PENDING          0x1D8
4a2fec
-- 
4a2fec
1.8.3.1
4a2fec