On 3/19/2025 1:49 PM, ltaylorsimp...@gmail.com wrote:

-----Original Message-----
From: Brian Cain <brian.c...@oss.qualcomm.com>
Sent: Friday, February 28, 2025 11:29 PM
To: qemu-devel@nongnu.org
Cc: brian.c...@oss.qualcomm.com; richard.hender...@linaro.org;
phi...@linaro.org; quic_mathb...@quicinc.com; a...@rev.ng; a...@rev.ng;
quic_mlie...@quicinc.com; ltaylorsimp...@gmail.com;
alex.ben...@linaro.org; quic_mbur...@quicinc.com;
sidn...@quicinc.com
Subject: [PATCH 39/39] target/hexagon: Add pcycle setting functionality

Signed-off-by: Brian Cain <brian.c...@oss.qualcomm.com>
Signed-off-by: Matheus Tavares Bernardino <quic_mathb...@quicinc.com>
---
  target/hexagon/cpu.c        | 10 +++++++---
  target/hexagon/cpu_helper.c | 17 ++++++++++++++---
  2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c index
80f5e23794..4ca6add834 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -440,19 +440,23 @@ static void hexagon_cpu_realize(DeviceState *dev,
Error **errp)  #endif

      qemu_init_vcpu(cs);
-#ifndef CONFIG_USER_ONLY
      CPUHexagonState *env = cpu_env(cs);
+#ifndef CONFIG_USER_ONLY
      hex_mmu_realize(env);
      if (cs->cpu_index == 0) {
          env->g_sreg = g_new0(target_ulong, NUM_SREGS);
-        env->g_pcycle_base = g_malloc0(sizeof(*env->g_pcycle_base));
      } else {
          CPUState *cpu0 = qemu_get_cpu(0);
          CPUHexagonState *env0 = cpu_env(cpu0);
          env->g_sreg = env0->g_sreg;
-        env->g_pcycle_base = env0->g_pcycle_base;
      }
  #endif
+    if (cs->cpu_index == 0) {
+        env->g_pcycle_base = g_malloc0(sizeof(*env->g_pcycle_base));
Another shared resource ...

+    } else {
+        CPUState *cpu0 = qemu_get_cpu(0);
+        env->g_pcycle_base = cpu_env(cpu0)->g_pcycle_base;
+    }

      mcc->parent_realize(dev, errp);
  }
diff --git a/target/hexagon/cpu_helper.c b/target/hexagon/cpu_helper.c
index 9c44cb7950..08c749e9fa 100644
--- a/target/hexagon/cpu_helper.c
+++ b/target/hexagon/cpu_helper.c
@@ -70,18 +70,29 @@ uint32_t
hexagon_get_sys_pcycle_count_low(CPUHexagonState *env)  void
hexagon_set_sys_pcycle_count_high(CPUHexagonState *env,
          uint32_t cycles_hi)
  {
-    g_assert_not_reached();
+    uint64_t cur_cycles = hexagon_get_sys_pcycle_count(env);
+    uint64_t cycles =
+        ((uint64_t)cycles_hi << 32) | extract64(cur_cycles, 0, 32);
+    hexagon_set_sys_pcycle_count(env, cycles);
  }

  void hexagon_set_sys_pcycle_count_low(CPUHexagonState *env,
          uint32_t cycles_lo)
  {
-    g_assert_not_reached();
+    uint64_t cur_cycles = hexagon_get_sys_pcycle_count(env);
+    uint64_t cycles = extract64(cur_cycles, 32, 32) | cycles_lo;
+    hexagon_set_sys_pcycle_count(env, cycles);
  }

  void hexagon_set_sys_pcycle_count(CPUHexagonState *env, uint64_t
cycles)  {
-    g_assert_not_reached();
Do we need a lock here?
I will address the lack of locking here in v3, seems like an appropriate change.
+    *(env->g_pcycle_base) = cycles;
+
+    CPUState *cs;
+    CPU_FOREACH(cs) {
+        CPUHexagonState *env_ = cpu_env(cs);
This underscore is easy to miss.  Just
     cpu_env(cs)->t_cycle_count = 0;




Reply via email to