int arch_guest_init(struct vmm_guest *guest) { struct riscv_guest_priv *priv; if (!guest->reset_count) { guest->arch_priv = vmm_malloc(sizeof(struct riscv_guest_priv)); if (!guest->arch_priv) { return VMM_ENOMEM; } priv = riscv_guest_priv(guest); priv->time_offset = vmm_manager_guest_reset_timestamp(guest); priv->time_offset = priv->time_offset * vmm_timer_clocksource_frequency(); priv->time_offset = udiv64(priv->time_offset, 1000000000ULL); priv->pgtbl = cpu_mmu_pgtbl_alloc(PGTBL_STAGE2); if (!priv->pgtbl) { vmm_free(guest->arch_priv); guest->arch_priv = NULL; return VMM_ENOMEM; } } return VMM_OK; }
void generic_timer_vcpu_context_restore(void *vcpu_ptr, void *context) { struct vmm_vcpu *vcpu = vcpu_ptr; struct generic_timer_context *cntx = context; if (!cntx) { return; } vmm_timer_event_stop(&cntx->phys_ev); vmm_timer_event_stop(&cntx->virt_ev); if (!cntx->cntvoff) { cntx->cntvoff = vmm_manager_guest_reset_timestamp(vcpu->guest); cntx->cntvoff = cntx->cntvoff * generic_timer_hz; cntx->cntvoff = udiv64(cntx->cntvoff, 1000000000ULL); } }