1 /***************************************************************************** 2 * 3 * include/xen/viridian.h 4 * 5 * Copyright (c) 2008 Citrix Corp. 6 * 7 */ 8 9 #ifndef __ASM_X86_HVM_VIRIDIAN_H__ 10 #define __ASM_X86_HVM_VIRIDIAN_H__ 11 12 #include <asm/guest/hyperv-tlfs.h> 13 14 struct viridian_page 15 { 16 union hv_vp_assist_page_msr msr; 17 void *ptr; 18 }; 19 20 struct viridian_stimer { 21 struct vcpu *v; 22 struct timer timer; 23 union hv_stimer_config config; 24 uint64_t count; 25 uint64_t expiration; 26 bool started; 27 }; 28 29 struct viridian_vcpu 30 { 31 struct viridian_page vp_assist; 32 bool apic_assist_pending; 33 bool polled; 34 uint64_t scontrol; 35 uint64_t siefp; 36 struct viridian_page simp; 37 union hv_synic_sint sint[16]; 38 uint8_t vector_to_sintx[256]; 39 struct viridian_stimer stimer[4]; 40 unsigned int stimer_enabled; 41 unsigned int stimer_pending; 42 uint64_t crash_param[5]; 43 }; 44 45 struct viridian_time_ref_count 46 { 47 unsigned long flags; 48 49 #define _TRC_accessed 0 50 #define TRC_accessed (1 << _TRC_accessed) 51 #define _TRC_running 1 52 #define TRC_running (1 << _TRC_running) 53 54 uint64_t val; 55 int64_t off; 56 }; 57 58 enum { 59 _HCALL_spin_wait, 60 _HCALL_flush, 61 _HCALL_flush_ex, 62 _HCALL_ipi, 63 _HCALL_ipi_ex, 64 _HCALL_nr /* must be last */ 65 }; 66 67 struct viridian_domain 68 { 69 union hv_guest_os_id guest_os_id; 70 union hv_vp_assist_page_msr hypercall_gpa; 71 DECLARE_BITMAP(hypercall_flags, _HCALL_nr); 72 struct viridian_time_ref_count time_ref_count; 73 struct viridian_page reference_tsc; 74 }; 75 76 void cpuid_viridian_leaves(const struct vcpu *v, uint32_t leaf, 77 uint32_t subleaf, struct cpuid_leaf *res); 78 79 int guest_wrmsr_viridian(struct vcpu *v, uint32_t idx, uint64_t val); 80 int guest_rdmsr_viridian(const struct vcpu *v, uint32_t idx, uint64_t *val); 81 82 int 83 viridian_hypercall(struct cpu_user_regs *regs); 84 85 void viridian_time_domain_freeze(const struct domain *d); 86 void viridian_time_domain_thaw(const struct domain *d); 87 88 int viridian_vcpu_init(struct vcpu *v); 89 int viridian_domain_init(struct domain *d); 90 91 void viridian_vcpu_deinit(struct vcpu *v); 92 void viridian_domain_deinit(struct domain *d); 93 94 void viridian_apic_assist_set(const struct vcpu *v); 95 bool viridian_apic_assist_completed(const struct vcpu *v); 96 void viridian_apic_assist_clear(const struct vcpu *v); 97 98 void viridian_synic_poll(struct vcpu *v); 99 bool viridian_synic_is_auto_eoi_sint(const struct vcpu *v, 100 unsigned int vector); 101 102 #endif /* __ASM_X86_HVM_VIRIDIAN_H__ */ 103 104 /* 105 * Local variables: 106 * mode: C 107 * c-file-style: "BSD" 108 * c-basic-offset: 4 109 * tab-width: 4 110 * indent-tabs-mode: nil 111 * End: 112 */ 113