xref: /qemu/include/hw/hyperv/hyperv.h (revision 4cbaf3c13300b79d0386b567630f8e9c91ac5099)
1701189e3SRoman Kagan /*
2701189e3SRoman Kagan  * Hyper-V guest/hypervisor interaction
3701189e3SRoman Kagan  *
4701189e3SRoman Kagan  * Copyright (c) 2015-2018 Virtuozzo International GmbH.
5701189e3SRoman Kagan  *
6701189e3SRoman Kagan  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7701189e3SRoman Kagan  * See the COPYING file in the top-level directory.
8701189e3SRoman Kagan  */
9701189e3SRoman Kagan 
10701189e3SRoman Kagan #ifndef HW_HYPERV_HYPERV_H
11701189e3SRoman Kagan #define HW_HYPERV_HYPERV_H
12701189e3SRoman Kagan 
13701189e3SRoman Kagan #include "cpu-qom.h"
14*4cbaf3c1SRoman Kagan #include "hw/hyperv/hyperv-proto.h"
15701189e3SRoman Kagan 
16701189e3SRoman Kagan typedef struct HvSintRoute HvSintRoute;
17*4cbaf3c1SRoman Kagan 
18*4cbaf3c1SRoman Kagan /*
19*4cbaf3c1SRoman Kagan  * Callback executed in a bottom-half when the status of posting the message
20*4cbaf3c1SRoman Kagan  * becomes known, before unblocking the connection for further messages
21*4cbaf3c1SRoman Kagan  */
22*4cbaf3c1SRoman Kagan typedef void (*HvSintMsgCb)(void *data, int status);
23701189e3SRoman Kagan 
24701189e3SRoman Kagan HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint,
25*4cbaf3c1SRoman Kagan                                    HvSintMsgCb cb, void *cb_data);
26701189e3SRoman Kagan void hyperv_sint_route_ref(HvSintRoute *sint_route);
27701189e3SRoman Kagan void hyperv_sint_route_unref(HvSintRoute *sint_route);
28701189e3SRoman Kagan 
29701189e3SRoman Kagan int hyperv_sint_route_set_sint(HvSintRoute *sint_route);
30701189e3SRoman Kagan 
31*4cbaf3c1SRoman Kagan /*
32*4cbaf3c1SRoman Kagan  * Submit a message to be posted in vcpu context.  If the submission succeeds,
33*4cbaf3c1SRoman Kagan  * the status of posting the message is reported via the callback associated
34*4cbaf3c1SRoman Kagan  * with the @sint_route; until then no more messages are accepted.
35*4cbaf3c1SRoman Kagan  */
36*4cbaf3c1SRoman Kagan int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg);
37*4cbaf3c1SRoman Kagan 
38701189e3SRoman Kagan static inline uint32_t hyperv_vp_index(CPUState *cs)
39701189e3SRoman Kagan {
40701189e3SRoman Kagan     return cs->cpu_index;
41701189e3SRoman Kagan }
42701189e3SRoman Kagan 
43606c34bfSRoman Kagan void hyperv_synic_add(CPUState *cs);
44606c34bfSRoman Kagan void hyperv_synic_reset(CPUState *cs);
45606c34bfSRoman Kagan void hyperv_synic_update(CPUState *cs, bool enable,
46606c34bfSRoman Kagan                          hwaddr msg_page_addr, hwaddr event_page_addr);
47606c34bfSRoman Kagan 
48701189e3SRoman Kagan #endif
49