xref: /openbmc/qemu/include/hw/hyperv/hyperv.h (revision 256f0166580d991d8759a1e71d7aca17a23c55f2)
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"
144cbaf3c1SRoman Kagan #include "hw/hyperv/hyperv-proto.h"
15701189e3SRoman Kagan 
16701189e3SRoman Kagan typedef struct HvSintRoute HvSintRoute;
174cbaf3c1SRoman Kagan 
184cbaf3c1SRoman Kagan /*
194cbaf3c1SRoman Kagan  * Callback executed in a bottom-half when the status of posting the message
204cbaf3c1SRoman Kagan  * becomes known, before unblocking the connection for further messages
214cbaf3c1SRoman Kagan  */
224cbaf3c1SRoman Kagan typedef void (*HvSintMsgCb)(void *data, int status);
23701189e3SRoman Kagan 
24701189e3SRoman Kagan HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint,
254cbaf3c1SRoman 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 
314cbaf3c1SRoman Kagan /*
324cbaf3c1SRoman Kagan  * Submit a message to be posted in vcpu context.  If the submission succeeds,
334cbaf3c1SRoman Kagan  * the status of posting the message is reported via the callback associated
344cbaf3c1SRoman Kagan  * with the @sint_route; until then no more messages are accepted.
354cbaf3c1SRoman Kagan  */
364cbaf3c1SRoman Kagan int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg);
37f5642f8bSRoman Kagan /*
38f5642f8bSRoman Kagan  * Set event flag @eventno, and signal the SINT if the flag has changed.
39f5642f8bSRoman Kagan  */
40f5642f8bSRoman Kagan int hyperv_set_event_flag(HvSintRoute *sint_route, unsigned eventno);
414cbaf3c1SRoman Kagan 
42e6ea9f45SRoman Kagan /*
4376036a5fSRoman Kagan  * Handler for messages arriving from the guest via HV_POST_MESSAGE hypercall.
4476036a5fSRoman Kagan  * Executed in vcpu context.
4576036a5fSRoman Kagan  */
4676036a5fSRoman Kagan typedef uint16_t (*HvMsgHandler)(const struct hyperv_post_message_input *msg,
4776036a5fSRoman Kagan                                  void *data);
4876036a5fSRoman Kagan /*
4976036a5fSRoman Kagan  * Associate @handler with the message connection @conn_id, such that @handler
5076036a5fSRoman Kagan  * is called with @data when the guest executes HV_POST_MESSAGE hypercall on
5176036a5fSRoman Kagan  * @conn_id.  If @handler is NULL clear the association.
5276036a5fSRoman Kagan  */
5376036a5fSRoman Kagan int hyperv_set_msg_handler(uint32_t conn_id, HvMsgHandler handler, void *data);
5476036a5fSRoman Kagan /*
55e6ea9f45SRoman Kagan  * Associate @notifier with the event connection @conn_id, such that @notifier
56e6ea9f45SRoman Kagan  * is signaled when the guest executes HV_SIGNAL_EVENT hypercall on @conn_id.
57e6ea9f45SRoman Kagan  * If @notifier is NULL clear the association.
58e6ea9f45SRoman Kagan  */
59e6ea9f45SRoman Kagan int hyperv_set_event_flag_handler(uint32_t conn_id, EventNotifier *notifier);
60e6ea9f45SRoman Kagan 
61e6ea9f45SRoman Kagan /*
6276036a5fSRoman Kagan  * Process HV_POST_MESSAGE hypercall: parse the data in the guest memory as
6376036a5fSRoman Kagan  * specified in @param, and call the HvMsgHandler associated with the
6476036a5fSRoman Kagan  * connection on the message contained therein.
6576036a5fSRoman Kagan  */
6676036a5fSRoman Kagan uint16_t hyperv_hcall_post_message(uint64_t param, bool fast);
6776036a5fSRoman Kagan /*
68e6ea9f45SRoman Kagan  * Process HV_SIGNAL_EVENT hypercall: signal the EventNotifier associated with
69e6ea9f45SRoman Kagan  * the connection as specified in @param.
70e6ea9f45SRoman Kagan  */
71e6ea9f45SRoman Kagan uint16_t hyperv_hcall_signal_event(uint64_t param, bool fast);
72e6ea9f45SRoman Kagan 
hyperv_vp_index(CPUState * cs)73701189e3SRoman Kagan static inline uint32_t hyperv_vp_index(CPUState *cs)
74701189e3SRoman Kagan {
75701189e3SRoman Kagan     return cs->cpu_index;
76701189e3SRoman Kagan }
77701189e3SRoman Kagan 
78606c34bfSRoman Kagan void hyperv_synic_add(CPUState *cs);
79606c34bfSRoman Kagan void hyperv_synic_reset(CPUState *cs);
80606c34bfSRoman Kagan void hyperv_synic_update(CPUState *cs, bool enable,
81606c34bfSRoman Kagan                          hwaddr msg_page_addr, hwaddr event_page_addr);
82d42cd961SJon Doron bool hyperv_is_synic_enabled(void);
83606c34bfSRoman Kagan 
8473d24074SJon Doron /*
8573d24074SJon Doron  * Process HVCALL_RESET_DEBUG_SESSION hypercall.
8673d24074SJon Doron  */
8773d24074SJon Doron uint16_t hyperv_hcall_reset_dbg_session(uint64_t outgpa);
8873d24074SJon Doron /*
8973d24074SJon Doron  * Process HVCALL_RETREIVE_DEBUG_DATA hypercall.
9073d24074SJon Doron  */
9173d24074SJon Doron uint16_t hyperv_hcall_retreive_dbg_data(uint64_t ingpa, uint64_t outgpa,
9273d24074SJon Doron                                         bool fast);
9373d24074SJon Doron /*
9473d24074SJon Doron  * Process HVCALL_POST_DEBUG_DATA hypercall.
9573d24074SJon Doron  */
9673d24074SJon Doron uint16_t hyperv_hcall_post_dbg_data(uint64_t ingpa, uint64_t outgpa, bool fast);
9773d24074SJon Doron 
9873d24074SJon Doron uint32_t hyperv_syndbg_send(uint64_t ingpa, uint32_t count);
9973d24074SJon Doron uint32_t hyperv_syndbg_recv(uint64_t ingpa, uint32_t count);
10073d24074SJon Doron void hyperv_syndbg_set_pending_page(uint64_t ingpa);
10173d24074SJon Doron uint64_t hyperv_syndbg_query_options(void);
10273d24074SJon Doron 
10373d24074SJon Doron typedef enum HvSynthDbgMsgType {
10473d24074SJon Doron     HV_SYNDBG_MSG_CONNECTION_INFO,
10573d24074SJon Doron     HV_SYNDBG_MSG_SEND,
10673d24074SJon Doron     HV_SYNDBG_MSG_RECV,
10773d24074SJon Doron     HV_SYNDBG_MSG_SET_PENDING_PAGE,
10873d24074SJon Doron     HV_SYNDBG_MSG_QUERY_OPTIONS
10973d24074SJon Doron } HvDbgSynthMsgType;
11073d24074SJon Doron 
11173d24074SJon Doron typedef struct HvSynDbgMsg {
11273d24074SJon Doron     HvDbgSynthMsgType type;
11373d24074SJon Doron     union {
11473d24074SJon Doron         struct {
11573d24074SJon Doron             uint32_t host_ip;
11673d24074SJon Doron             uint16_t host_port;
11773d24074SJon Doron         } connection_info;
11873d24074SJon Doron         struct {
11973d24074SJon Doron             uint64_t buf_gpa;
12073d24074SJon Doron             uint32_t count;
12173d24074SJon Doron             uint32_t pending_count;
12273d24074SJon Doron             bool is_raw;
12373d24074SJon Doron         } send;
12473d24074SJon Doron         struct {
12573d24074SJon Doron             uint64_t buf_gpa;
12673d24074SJon Doron             uint32_t count;
12773d24074SJon Doron             uint32_t options;
12873d24074SJon Doron             uint64_t timeout;
12973d24074SJon Doron             uint32_t retrieved_count;
13073d24074SJon Doron             bool is_raw;
13173d24074SJon Doron         } recv;
13273d24074SJon Doron         struct {
13373d24074SJon Doron             uint64_t buf_gpa;
13473d24074SJon Doron         } pending_page;
13573d24074SJon Doron         struct {
13673d24074SJon Doron             uint64_t options;
13773d24074SJon Doron         } query_options;
13873d24074SJon Doron     } u;
13973d24074SJon Doron } HvSynDbgMsg;
14073d24074SJon Doron typedef uint16_t (*HvSynDbgHandler)(void *context, HvSynDbgMsg *msg);
14173d24074SJon Doron void hyperv_set_syndbg_handler(HvSynDbgHandler handler, void *context);
142*6093637bSMaciej S. Szmigiero 
143*6093637bSMaciej S. Szmigiero bool hyperv_are_vmbus_recommended_features_enabled(void);
144*6093637bSMaciej S. Szmigiero void hyperv_set_vmbus_recommended_features_enabled(void);
145*6093637bSMaciej S. Szmigiero 
146701189e3SRoman Kagan #endif
147