@@ -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));
+ } else {
+ CPUState *cpu0 = qemu_get_cpu(0);
+ env->g_pcycle_base = cpu_env(cpu0)->g_pcycle_base;
+ }
mcc->parent_realize(dev, errp);
}
@@ -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();
+ *(env->g_pcycle_base) = cycles;
+
+ CPUState *cs;
+ CPU_FOREACH(cs) {
+ CPUHexagonState *env_ = cpu_env(cs);
+ env_->t_cycle_count = 0;
+ }
}
static void set_wait_mode(CPUHexagonState *env)