qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-ppc] [QEMU-PPC] [PATCH 1/2] ppc/spapr: Add implementation of hcall


From: Suraj Jitindar Singh
Subject: [Qemu-ppc] [QEMU-PPC] [PATCH 1/2] ppc/spapr: Add implementation of hcall H_PURR
Date: Mon, 24 Jun 2019 15:58:11 +1000

The hcall H_PURR is used by a guest to read the PURR (processor
utilisation of resources register). A guest expects that this register
will count at a rate of timebase scaled by the number of guest vcpus
present in the vcore. That is the per vcpu purr will count at a rate of
timebase / # vcpus per vcore.

Implement a handler for the H_PURR hcall and return the purr value
divided by smp_threads so that the sum of the purr deltas across the
vcpus of a vcore equals the timebase delta

Signed-off-by: Suraj Jitindar Singh <address@hidden>
---
 hw/ppc/spapr_hcall.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index aae9fd2b3e..88b3343f04 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1819,6 +1819,27 @@ static target_ulong h_update_dt(PowerPCCPU *cpu, 
SpaprMachineState *spapr,
     return H_SUCCESS;
 }
 
+static target_ulong h_purr(PowerPCCPU *cpu, SpaprMachineState *spapr,
+                           target_ulong opcode, target_ulong *args)
+{
+    CPUPPCState *env = &cpu->env;
+    target_ulong purr;
+
+    if (kvm_enabled()) {
+        cpu_synchronize_state(CPU(cpu));
+        /*
+         * Divide by smp_threads so that the sum of the purr deltas across the
+         * vcpus of a vcore equal the timebase delta.
+         */
+        purr = env->spr[SPR_PURR] / smp_threads;
+    } else {
+        purr = cpu_ppc_load_purr(env);
+    }
+    args[0] = purr;
+
+    return H_SUCCESS;
+}
+
 static spapr_hcall_fn papr_hypercall_table[(MAX_HCALL_OPCODE / 4) + 1];
 static spapr_hcall_fn kvmppc_hypercall_table[KVMPPC_HCALL_MAX - 
KVMPPC_HCALL_BASE + 1];
 
@@ -1915,6 +1936,9 @@ static void hypercall_register_types(void)
     spapr_register_hypercall(H_LOGICAL_DCBF, h_logical_dcbf);
     spapr_register_hypercall(KVMPPC_H_LOGICAL_MEMOP, h_logical_memop);
 
+    /* hcall-purr */
+    spapr_register_hypercall(H_PURR, h_purr);
+
     /* qemu/KVM-PPC specific hcalls */
     spapr_register_hypercall(KVMPPC_H_RTAS, h_rtas);
 
-- 
2.13.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]