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