#ifndef HV_VCPU_H #define HV_VCPU_H #include "hv/types.h" enum vcpu_run_state { VCPU_CREATED = 0, VCPU_READY, VCPU_RUNNING, VCPU_PAUSED, VCPU_PANICKED, }; struct el1_sysreg_shadow { uint64_t sctlr_el1; uint64_t ttbr0_el1; uint64_t ttbr1_el1; uint64_t tcr_el1; uint64_t mair_el1; uint64_t vbar_el1; uint64_t contextidr_el1; uint64_t tpidr_el1; uint64_t tpidrro_el0; uint64_t cntv_ctl_el0; uint64_t cntv_tval_el0; uint64_t cntv_cval_el0; uint64_t cntkctl_el1; uint64_t cpacr_el1; uint64_t mdscr_el1; uint64_t csselr_el1; uint64_t elr_el1; uint64_t spsr_el1; uint64_t esr_el1; uint64_t far_el1; }; struct vcpu_stats { uint64_t traps; uint64_t sysreg_traps; uint64_t hvc_calls; uint64_t smc_denied; uint64_t wfx_traps; uint64_t data_aborts; uint64_t instruction_aborts; uint64_t unknown_exceptions; uint64_t injected_undefs; uint64_t virtual_irqs_injected; uint64_t virtual_irqs_completed; uint64_t timer_syncs; uint64_t timer_last_delta; }; struct vcpu { uint64_t x[31]; uint64_t sp_el0; uint64_t sp_el1; uint64_t pc; uint64_t pstate; struct el1_sysreg_shadow sysregs; uint64_t pending_virtual_irq; uint64_t active_virtual_irq; uint32_t id; enum vcpu_run_state state; uint64_t last_esr; uint64_t last_far; uint64_t last_hpfar; struct vcpu_stats stats; }; struct trap_frame { uint64_t x[31]; uint64_t sp_el0; uint64_t sp_el1; uint64_t elr_el2; uint64_t spsr_el2; uint64_t esr_el2; uint64_t far_el2; uint64_t hpfar_el2; }; void vcpu_init(struct vcpu *vcpu, uint32_t id, uint64_t entry, uint64_t stack_top); void vcpu_load_frame(struct vcpu *vcpu, const struct trap_frame *frame); void vcpu_store_frame(const struct vcpu *vcpu, struct trap_frame *frame); uint64_t vcpu_read_gpr(const struct vcpu *vcpu, uint32_t rt); void vcpu_write_gpr(struct vcpu *vcpu, uint32_t rt, uint64_t value); void vcpu_set_pending_irq(struct vcpu *vcpu, uint32_t intid); void vcpu_clear_pending_irq(struct vcpu *vcpu, uint32_t intid); struct vcpu *vcpu_current(void); void vcpu_set_current(struct vcpu *vcpu); void vcpu_dump(const struct vcpu *vcpu); bool vcpu_frame_selftest(void); #endif