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 43struct vmbuspipe_hdr { 44 u32 flags; 45 u32 msgsize; 46} __attribute__((packed)); 47 48struct ic_version { 49 u16 major; 50 u16 minor; 51} __attribute__((packed)); 52 53struct 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} __attribute__((packed)); 63 64struct icmsg_negotiate { 65 u16 icframe_vercnt; 66 u16 icmsg_vercnt; 67 u32 reserved; 68 struct ic_version icversion_data[1]; /* any size array */ 69} __attribute__((packed)); 70 71struct shutdown_msg_data { 72 u32 reason_code; 73 u32 timeout_seconds; 74 u32 flags; 75 u8 display_message[2048]; 76} __attribute__((packed)); 77 78struct heartbeat_msg_data { 79 u64 seq_num; 80 u32 reserved[8]; 81} __attribute__((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 94struct ictimesync_data{ 95 u64 parenttime; 96 u64 childtime; 97 u64 roundtriptime; 98 u8 flags; 99} __attribute__((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 106struct hyperv_service_callback { 107 u8 msg_type; 108 char *log_msg; 109 unsigned char data[16]; 110 struct vmbus_channel *channel; 111 void (*callback) (void *context); 112}; 113 114extern void prep_negotiate_resp(struct icmsg_hdr *, 115 struct icmsg_negotiate *, u8 *); 116extern void chn_cb_negotiate(void *); 117extern struct hyperv_service_callback hv_cb_utils[]; 118 119#endif /* __HV_UTILS_H_ */ 120