15116122aSRoman Kagan /* 25116122aSRoman Kagan * Definitions for Hyper-V guest/hypervisor interaction 35116122aSRoman Kagan * 45116122aSRoman Kagan * Copyright (c) 2017-2018 Virtuozzo International GmbH. 55116122aSRoman Kagan * 65116122aSRoman Kagan * This work is licensed under the terms of the GNU GPL, version 2 or later. 75116122aSRoman Kagan * See the COPYING file in the top-level directory. 85116122aSRoman Kagan */ 95116122aSRoman Kagan 105116122aSRoman Kagan #ifndef HW_HYPERV_HYPERV_PROTO_H 115116122aSRoman Kagan #define HW_HYPERV_HYPERV_PROTO_H 125116122aSRoman Kagan 135116122aSRoman Kagan #include "qemu/bitmap.h" 145116122aSRoman Kagan 155116122aSRoman Kagan /* 165116122aSRoman Kagan * Hypercall status code 175116122aSRoman Kagan */ 185116122aSRoman Kagan #define HV_STATUS_SUCCESS 0 195116122aSRoman Kagan #define HV_STATUS_INVALID_HYPERCALL_CODE 2 205116122aSRoman Kagan #define HV_STATUS_INVALID_HYPERCALL_INPUT 3 215116122aSRoman Kagan #define HV_STATUS_INVALID_ALIGNMENT 4 225116122aSRoman Kagan #define HV_STATUS_INVALID_PARAMETER 5 235116122aSRoman Kagan #define HV_STATUS_INSUFFICIENT_MEMORY 11 24e6ea9f45SRoman Kagan #define HV_STATUS_INVALID_PORT_ID 17 255116122aSRoman Kagan #define HV_STATUS_INVALID_CONNECTION_ID 18 265116122aSRoman Kagan #define HV_STATUS_INSUFFICIENT_BUFFERS 19 27ccbdf5e8SJon Doron #define HV_STATUS_NOT_ACKNOWLEDGED 20 28ccbdf5e8SJon Doron #define HV_STATUS_NO_DATA 27 295116122aSRoman Kagan 305116122aSRoman Kagan /* 315116122aSRoman Kagan * Hypercall numbers 325116122aSRoman Kagan */ 335116122aSRoman Kagan #define HV_POST_MESSAGE 0x005c 345116122aSRoman Kagan #define HV_SIGNAL_EVENT 0x005d 35ccbdf5e8SJon Doron #define HV_POST_DEBUG_DATA 0x0069 36ccbdf5e8SJon Doron #define HV_RETRIEVE_DEBUG_DATA 0x006a 37ccbdf5e8SJon Doron #define HV_RESET_DEBUG_SESSION 0x006b 385116122aSRoman Kagan #define HV_HYPERCALL_FAST (1u << 16) 395116122aSRoman Kagan 405116122aSRoman Kagan /* 415116122aSRoman Kagan * Message size 425116122aSRoman Kagan */ 435116122aSRoman Kagan #define HV_MESSAGE_PAYLOAD_SIZE 240 445116122aSRoman Kagan 455116122aSRoman Kagan /* 465116122aSRoman Kagan * Message types 475116122aSRoman Kagan */ 485116122aSRoman Kagan #define HV_MESSAGE_NONE 0x00000000 495116122aSRoman Kagan #define HV_MESSAGE_VMBUS 0x00000001 505116122aSRoman Kagan #define HV_MESSAGE_UNMAPPED_GPA 0x80000000 515116122aSRoman Kagan #define HV_MESSAGE_GPA_INTERCEPT 0x80000001 525116122aSRoman Kagan #define HV_MESSAGE_TIMER_EXPIRED 0x80000010 535116122aSRoman Kagan #define HV_MESSAGE_INVALID_VP_REGISTER_VALUE 0x80000020 545116122aSRoman Kagan #define HV_MESSAGE_UNRECOVERABLE_EXCEPTION 0x80000021 555116122aSRoman Kagan #define HV_MESSAGE_UNSUPPORTED_FEATURE 0x80000022 565116122aSRoman Kagan #define HV_MESSAGE_EVENTLOG_BUFFERCOMPLETE 0x80000040 575116122aSRoman Kagan #define HV_MESSAGE_X64_IOPORT_INTERCEPT 0x80010000 585116122aSRoman Kagan #define HV_MESSAGE_X64_MSR_INTERCEPT 0x80010001 595116122aSRoman Kagan #define HV_MESSAGE_X64_CPUID_INTERCEPT 0x80010002 605116122aSRoman Kagan #define HV_MESSAGE_X64_EXCEPTION_INTERCEPT 0x80010003 615116122aSRoman Kagan #define HV_MESSAGE_X64_APIC_EOI 0x80010004 625116122aSRoman Kagan #define HV_MESSAGE_X64_LEGACY_FP_ERROR 0x80010005 635116122aSRoman Kagan 645116122aSRoman Kagan /* 65*003d35adSPierrick Bouvier * Hyper-V Synthetic debug options MSR 66*003d35adSPierrick Bouvier */ 67*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_CONTROL 0x400000F1 68*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_STATUS 0x400000F2 69*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_SEND_BUFFER 0x400000F3 70*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_RECV_BUFFER 0x400000F4 71*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_PENDING_BUFFER 0x400000F5 72*003d35adSPierrick Bouvier #define HV_X64_MSR_SYNDBG_OPTIONS 0x400000FF 73*003d35adSPierrick Bouvier 74*003d35adSPierrick Bouvier #define HV_X64_SYNDBG_OPTION_USE_HCALLS BIT(2) 75*003d35adSPierrick Bouvier 76*003d35adSPierrick Bouvier /* 775116122aSRoman Kagan * Message flags 785116122aSRoman Kagan */ 795116122aSRoman Kagan #define HV_MESSAGE_FLAG_PENDING 0x1 805116122aSRoman Kagan 815116122aSRoman Kagan /* 825116122aSRoman Kagan * Number of synthetic interrupts 835116122aSRoman Kagan */ 845116122aSRoman Kagan #define HV_SINT_COUNT 16 855116122aSRoman Kagan 865116122aSRoman Kagan /* 875116122aSRoman Kagan * Event flags number per SINT 885116122aSRoman Kagan */ 895116122aSRoman Kagan #define HV_EVENT_FLAGS_COUNT (256 * 8) 905116122aSRoman Kagan 915116122aSRoman Kagan /* 925116122aSRoman Kagan * Connection id valid bits 935116122aSRoman Kagan */ 945116122aSRoman Kagan #define HV_CONNECTION_ID_MASK 0x00ffffff 955116122aSRoman Kagan 965116122aSRoman Kagan /* 975116122aSRoman Kagan * Input structure for POST_MESSAGE hypercall 985116122aSRoman Kagan */ 995116122aSRoman Kagan struct hyperv_post_message_input { 1005116122aSRoman Kagan uint32_t connection_id; 1015116122aSRoman Kagan uint32_t _reserved; 1025116122aSRoman Kagan uint32_t message_type; 1035116122aSRoman Kagan uint32_t payload_size; 1045116122aSRoman Kagan uint8_t payload[HV_MESSAGE_PAYLOAD_SIZE]; 1055116122aSRoman Kagan }; 1065116122aSRoman Kagan 1075116122aSRoman Kagan /* 1085116122aSRoman Kagan * Input structure for SIGNAL_EVENT hypercall 1095116122aSRoman Kagan */ 1105116122aSRoman Kagan struct hyperv_signal_event_input { 1115116122aSRoman Kagan uint32_t connection_id; 1125116122aSRoman Kagan uint16_t flag_number; 1135116122aSRoman Kagan uint16_t _reserved_zero; 1145116122aSRoman Kagan }; 1155116122aSRoman Kagan 1165116122aSRoman Kagan /* 1175116122aSRoman Kagan * SynIC message structures 1185116122aSRoman Kagan */ 1195116122aSRoman Kagan struct hyperv_message_header { 1205116122aSRoman Kagan uint32_t message_type; 1215116122aSRoman Kagan uint8_t payload_size; 1225116122aSRoman Kagan uint8_t message_flags; /* HV_MESSAGE_FLAG_XX */ 1235116122aSRoman Kagan uint8_t _reserved[2]; 1245116122aSRoman Kagan uint64_t sender; 1255116122aSRoman Kagan }; 1265116122aSRoman Kagan 1275116122aSRoman Kagan struct hyperv_message { 1285116122aSRoman Kagan struct hyperv_message_header header; 1295116122aSRoman Kagan uint8_t payload[HV_MESSAGE_PAYLOAD_SIZE]; 1305116122aSRoman Kagan }; 1315116122aSRoman Kagan 1325116122aSRoman Kagan struct hyperv_message_page { 1335116122aSRoman Kagan struct hyperv_message slot[HV_SINT_COUNT]; 1345116122aSRoman Kagan }; 1355116122aSRoman Kagan 1365116122aSRoman Kagan /* 1375116122aSRoman Kagan * SynIC event flags structures 1385116122aSRoman Kagan */ 1395116122aSRoman Kagan struct hyperv_event_flags { 1405116122aSRoman Kagan DECLARE_BITMAP(flags, HV_EVENT_FLAGS_COUNT); 1415116122aSRoman Kagan }; 1425116122aSRoman Kagan 1435116122aSRoman Kagan struct hyperv_event_flags_page { 1445116122aSRoman Kagan struct hyperv_event_flags slot[HV_SINT_COUNT]; 1455116122aSRoman Kagan }; 1465116122aSRoman Kagan 147ccbdf5e8SJon Doron /* 148ccbdf5e8SJon Doron * Kernel debugger structures 149ccbdf5e8SJon Doron */ 150ccbdf5e8SJon Doron 151ccbdf5e8SJon Doron /* Options flags for hyperv_reset_debug_session */ 152ccbdf5e8SJon Doron #define HV_DEBUG_PURGE_INCOMING_DATA 0x00000001 153ccbdf5e8SJon Doron #define HV_DEBUG_PURGE_OUTGOING_DATA 0x00000002 154ccbdf5e8SJon Doron struct hyperv_reset_debug_session_input { 155ccbdf5e8SJon Doron uint32_t options; 156ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 157ccbdf5e8SJon Doron 158ccbdf5e8SJon Doron struct hyperv_reset_debug_session_output { 159ccbdf5e8SJon Doron uint32_t host_ip; 160ccbdf5e8SJon Doron uint32_t target_ip; 161ccbdf5e8SJon Doron uint16_t host_port; 162ccbdf5e8SJon Doron uint16_t target_port; 163ccbdf5e8SJon Doron uint8_t host_mac[6]; 164ccbdf5e8SJon Doron uint8_t target_mac[6]; 165ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 166ccbdf5e8SJon Doron 167ccbdf5e8SJon Doron /* Options for hyperv_post_debug_data */ 168ccbdf5e8SJon Doron #define HV_DEBUG_POST_LOOP 0x00000001 169ccbdf5e8SJon Doron 170ccbdf5e8SJon Doron struct hyperv_post_debug_data_input { 171ccbdf5e8SJon Doron uint32_t count; 172ccbdf5e8SJon Doron uint32_t options; 173ccbdf5e8SJon Doron /*uint8_t data[HV_HYP_PAGE_SIZE - 2 * sizeof(uint32_t)];*/ 174ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 175ccbdf5e8SJon Doron 176ccbdf5e8SJon Doron struct hyperv_post_debug_data_output { 177ccbdf5e8SJon Doron uint32_t pending_count; 178ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 179ccbdf5e8SJon Doron 180ccbdf5e8SJon Doron /* Options for hyperv_retrieve_debug_data */ 181ccbdf5e8SJon Doron #define HV_DEBUG_RETRIEVE_LOOP 0x00000001 182ccbdf5e8SJon Doron #define HV_DEBUG_RETRIEVE_TEST_ACTIVITY 0x00000002 183ccbdf5e8SJon Doron 184ccbdf5e8SJon Doron struct hyperv_retrieve_debug_data_input { 185ccbdf5e8SJon Doron uint32_t count; 186ccbdf5e8SJon Doron uint32_t options; 187ccbdf5e8SJon Doron uint64_t timeout; 188ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 189ccbdf5e8SJon Doron 190ccbdf5e8SJon Doron struct hyperv_retrieve_debug_data_output { 191ccbdf5e8SJon Doron uint32_t retrieved_count; 192ccbdf5e8SJon Doron uint32_t remaining_count; 193ccbdf5e8SJon Doron } __attribute__ ((__packed__)); 1945116122aSRoman Kagan #endif 195