1 /* 2 * Copyright (c) 2009, Microsoft Corporation. 3 * 4 * This program is free software; you can redistribute it and/or modify it 5 * under the terms and conditions of the GNU General Public License, 6 * version 2, as published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * more details. 12 * 13 * You should have received a copy of the GNU General Public License along with 14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 15 * Place - Suite 330, Boston, MA 02111-1307 USA. 16 * 17 * Authors: 18 * Haiyang Zhang <haiyangz@microsoft.com> 19 * Hank Janssen <hjanssen@microsoft.com> 20 */ 21 #ifndef __HV_UTILS_H_ 22 #define __HV_UTILS_H_ 23 24 /* 25 * Common header for Hyper-V ICs 26 */ 27 #define ICMSGTYPE_NEGOTIATE 0 28 #define ICMSGTYPE_HEARTBEAT 1 29 #define ICMSGTYPE_KVPEXCHANGE 2 30 #define ICMSGTYPE_SHUTDOWN 3 31 #define ICMSGTYPE_TIMESYNC 4 32 #define ICMSGTYPE_VSS 5 33 34 #define ICMSGHDRFLAG_TRANSACTION 1 35 #define ICMSGHDRFLAG_REQUEST 2 36 #define ICMSGHDRFLAG_RESPONSE 4 37 38 #define HV_S_OK 0x00000000 39 #define HV_E_FAIL 0x80004005 40 #define HV_ERROR_NOT_SUPPORTED 0x80070032 41 #define HV_ERROR_MACHINE_LOCKED 0x800704F7 42 43 struct vmbuspipe_hdr { 44 u32 flags; 45 u32 msgsize; 46 } __packed; 47 48 struct ic_version { 49 u16 major; 50 u16 minor; 51 } __packed; 52 53 struct icmsg_hdr { 54 struct ic_version icverframe; 55 u16 icmsgtype; 56 struct ic_version icvermsg; 57 u16 icmsgsize; 58 u32 status; 59 u8 ictransaction_id; 60 u8 icflags; 61 u8 reserved[2]; 62 } __packed; 63 64 struct icmsg_negotiate { 65 u16 icframe_vercnt; 66 u16 icmsg_vercnt; 67 u32 reserved; 68 struct ic_version icversion_data[1]; /* any size array */ 69 } __packed; 70 71 struct shutdown_msg_data { 72 u32 reason_code; 73 u32 timeout_seconds; 74 u32 flags; 75 u8 display_message[2048]; 76 } __packed; 77 78 struct heartbeat_msg_data { 79 u64 seq_num; 80 u32 reserved[8]; 81 } __packed; 82 83 /* Time Sync IC defs */ 84 #define ICTIMESYNCFLAG_PROBE 0 85 #define ICTIMESYNCFLAG_SYNC 1 86 #define ICTIMESYNCFLAG_SAMPLE 2 87 88 #ifdef __x86_64__ 89 #define WLTIMEDELTA 116444736000000000L /* in 100ns unit */ 90 #else 91 #define WLTIMEDELTA 116444736000000000LL 92 #endif 93 94 struct ictimesync_data{ 95 u64 parenttime; 96 u64 childtime; 97 u64 roundtriptime; 98 u8 flags; 99 } __packed; 100 101 /* Index for each IC struct in array hv_cb_utils[] */ 102 #define HV_SHUTDOWN_MSG 0 103 #define HV_TIMESYNC_MSG 1 104 #define HV_HEARTBEAT_MSG 2 105 #define HV_KVP_MSG 3 106 107 struct hyperv_service_callback { 108 u8 msg_type; 109 char *log_msg; 110 unsigned char data[16]; 111 struct vmbus_channel *channel; 112 void (*callback) (void *context); 113 }; 114 115 extern void prep_negotiate_resp(struct icmsg_hdr *, 116 struct icmsg_negotiate *, u8 *); 117 extern void chn_cb_negotiate(void *); 118 extern struct hyperv_service_callback hv_cb_utils[]; 119 120 #endif /* __HV_UTILS_H_ */ 121