1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef _HYPERV_H
26#define _HYPERV_H
27
28#include <linux/types.h>
29
30
31
32
33
34
35#define VSS_OP_REGISTER 128
36
37enum hv_vss_op {
38 VSS_OP_CREATE = 0,
39 VSS_OP_DELETE,
40 VSS_OP_HOT_BACKUP,
41 VSS_OP_GET_DM_INFO,
42 VSS_OP_BU_COMPLETE,
43
44
45
46 VSS_OP_FREEZE,
47 VSS_OP_THAW,
48 VSS_OP_AUTO_RECOVER,
49 VSS_OP_COUNT
50};
51
52
53
54
55
56struct hv_vss_hdr {
57 __u8 operation;
58 __u8 reserved[7];
59} __attribute__((packed));
60
61
62
63
64
65
66#define VSS_HBU_NO_AUTO_RECOVERY 0x00000005
67
68struct hv_vss_check_feature {
69 __u32 flags;
70} __attribute__((packed));
71
72struct hv_vss_check_dm_info {
73 __u32 flags;
74} __attribute__((packed));
75
76struct hv_vss_msg {
77 union {
78 struct hv_vss_hdr vss_hdr;
79 int error;
80 };
81 union {
82 struct hv_vss_check_feature vss_cf;
83 struct hv_vss_check_dm_info dm_info;
84 };
85} __attribute__((packed));
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115#define HV_KVP_EXCHANGE_MAX_VALUE_SIZE (2048)
116
117
118
119
120
121
122
123#define HV_KVP_EXCHANGE_MAX_KEY_SIZE (512)
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178#define REG_SZ 1
179#define REG_U32 4
180#define REG_U64 8
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211#define KVP_OP_REGISTER 4
212
213
214
215
216
217
218
219
220#define KVP_OP_REGISTER1 100
221
222enum hv_kvp_exchg_op {
223 KVP_OP_GET = 0,
224 KVP_OP_SET,
225 KVP_OP_DELETE,
226 KVP_OP_ENUMERATE,
227 KVP_OP_GET_IP_INFO,
228 KVP_OP_SET_IP_INFO,
229 KVP_OP_COUNT
230};
231
232enum hv_kvp_exchg_pool {
233 KVP_POOL_EXTERNAL = 0,
234 KVP_POOL_GUEST,
235 KVP_POOL_AUTO,
236 KVP_POOL_AUTO_EXTERNAL,
237 KVP_POOL_AUTO_INTERNAL,
238 KVP_POOL_COUNT
239};
240
241
242
243
244
245#define HV_S_OK 0x00000000
246#define HV_E_FAIL 0x80004005
247#define HV_S_CONT 0x80070103
248#define HV_ERROR_NOT_SUPPORTED 0x80070032
249#define HV_ERROR_MACHINE_LOCKED 0x800704F7
250#define HV_ERROR_DEVICE_NOT_CONNECTED 0x8007048F
251#define HV_INVALIDARG 0x80070057
252#define HV_GUID_NOTFOUND 0x80041002
253
254#define ADDR_FAMILY_NONE 0x00
255#define ADDR_FAMILY_IPV4 0x01
256#define ADDR_FAMILY_IPV6 0x02
257
258#define MAX_ADAPTER_ID_SIZE 128
259#define MAX_IP_ADDR_SIZE 1024
260#define MAX_GATEWAY_SIZE 512
261
262
263struct hv_kvp_ipaddr_value {
264 __u16 adapter_id[MAX_ADAPTER_ID_SIZE];
265 __u8 addr_family;
266 __u8 dhcp_enabled;
267 __u16 ip_addr[MAX_IP_ADDR_SIZE];
268 __u16 sub_net[MAX_IP_ADDR_SIZE];
269 __u16 gate_way[MAX_GATEWAY_SIZE];
270 __u16 dns_addr[MAX_IP_ADDR_SIZE];
271} __attribute__((packed));
272
273
274struct hv_kvp_hdr {
275 __u8 operation;
276 __u8 pool;
277 __u16 pad;
278} __attribute__((packed));
279
280struct hv_kvp_exchg_msg_value {
281 __u32 value_type;
282 __u32 key_size;
283 __u32 value_size;
284 __u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
285 union {
286 __u8 value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE];
287 __u32 value_u32;
288 __u64 value_u64;
289 };
290} __attribute__((packed));
291
292struct hv_kvp_msg_enumerate {
293 __u32 index;
294 struct hv_kvp_exchg_msg_value data;
295} __attribute__((packed));
296
297struct hv_kvp_msg_get {
298 struct hv_kvp_exchg_msg_value data;
299};
300
301struct hv_kvp_msg_set {
302 struct hv_kvp_exchg_msg_value data;
303};
304
305struct hv_kvp_msg_delete {
306 __u32 key_size;
307 __u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
308};
309
310struct hv_kvp_register {
311 __u8 version[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
312};
313
314struct hv_kvp_msg {
315 union {
316 struct hv_kvp_hdr kvp_hdr;
317 int error;
318 };
319 union {
320 struct hv_kvp_msg_get kvp_get;
321 struct hv_kvp_msg_set kvp_set;
322 struct hv_kvp_msg_delete kvp_delete;
323 struct hv_kvp_msg_enumerate kvp_enum_data;
324 struct hv_kvp_ipaddr_value kvp_ip_val;
325 struct hv_kvp_register kvp_register;
326 } body;
327} __attribute__((packed));
328
329struct hv_kvp_ip_msg {
330 __u8 operation;
331 __u8 pool;
332 struct hv_kvp_ipaddr_value kvp_ip_val;
333} __attribute__((packed));
334
335#ifdef __KERNEL__
336#include <linux/scatterlist.h>
337#include <linux/list.h>
338#include <linux/uuid.h>
339#include <linux/timer.h>
340#include <linux/workqueue.h>
341#include <linux/completion.h>
342#include <linux/device.h>
343#include <linux/mod_devicetable.h>
344
345
346#define MAX_PAGE_BUFFER_COUNT 19
347#define MAX_MULTIPAGE_BUFFER_COUNT 32
348
349#pragma pack(push, 1)
350
351
352struct hv_page_buffer {
353 u32 len;
354 u32 offset;
355 u64 pfn;
356};
357
358
359struct hv_multipage_buffer {
360
361 u32 len;
362 u32 offset;
363 u64 pfn_array[MAX_MULTIPAGE_BUFFER_COUNT];
364};
365
366
367#define MAX_PAGE_BUFFER_PACKET (0x18 + \
368 (sizeof(struct hv_page_buffer) * \
369 MAX_PAGE_BUFFER_COUNT))
370#define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + \
371 sizeof(struct hv_multipage_buffer))
372
373
374#pragma pack(pop)
375
376struct hv_ring_buffer {
377
378 u32 write_index;
379
380
381 u32 read_index;
382
383 u32 interrupt_mask;
384
385
386
387
388
389
390
391
392
393
394 u32 pending_send_sz;
395
396 u32 reserved1[12];
397
398 union {
399 struct {
400 u32 feat_pending_send_sz:1;
401 };
402 u32 value;
403 } feature_bits;
404
405
406 u8 reserved2[4028];
407
408
409
410
411
412 u8 buffer[0];
413} __packed;
414
415struct hv_ring_buffer_info {
416 struct hv_ring_buffer *ring_buffer;
417 u32 ring_size;
418 spinlock_t ring_lock;
419
420 u32 ring_datasize;
421 u32 ring_data_startoffset;
422};
423
424struct hv_ring_buffer_debug_info {
425 u32 current_interrupt_mask;
426 u32 current_read_index;
427 u32 current_write_index;
428 u32 bytes_avail_toread;
429 u32 bytes_avail_towrite;
430};
431
432
433
434
435
436
437
438
439
440static inline void
441hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi,
442 u32 *read, u32 *write)
443{
444 u32 read_loc, write_loc, dsize;
445
446 smp_read_barrier_depends();
447
448
449 read_loc = rbi->ring_buffer->read_index;
450 write_loc = rbi->ring_buffer->write_index;
451 dsize = rbi->ring_datasize;
452
453 *write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
454 read_loc - write_loc;
455 *read = dsize - *write;
456}
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477#define HV_DRV_VERSION "3.1"
478
479
480
481
482
483
484
485
486
487
488#define VERSION_WS2008 ((0 << 16) | (13))
489#define VERSION_WIN7 ((1 << 16) | (1))
490#define VERSION_WIN8 ((2 << 16) | (4))
491
492#define VERSION_INVAL -1
493
494#define VERSION_CURRENT VERSION_WIN8
495
496
497#define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384)
498
499
500#define VMBUS_PIPE_TYPE_BYTE 0x00000000
501#define VMBUS_PIPE_TYPE_MESSAGE 0x00000004
502
503
504#define MAX_USER_DEFINED_BYTES 120
505
506
507#define MAX_PIPE_USER_DEFINED_BYTES 116
508
509
510
511
512
513struct vmbus_channel_offer {
514 uuid_le if_type;
515 uuid_le if_instance;
516
517
518
519
520 u64 reserved1;
521 u64 reserved2;
522
523 u16 chn_flags;
524 u16 mmio_megabytes;
525
526 union {
527
528 struct {
529 unsigned char user_def[MAX_USER_DEFINED_BYTES];
530 } std;
531
532
533
534
535
536
537
538
539 struct {
540 u32 pipe_mode;
541 unsigned char user_def[MAX_PIPE_USER_DEFINED_BYTES];
542 } pipe;
543 } u;
544
545
546
547 u16 sub_channel_index;
548 u16 reserved3;
549} __packed;
550
551
552#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
553#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
554#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 4
555#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
556#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
557#define VMBUS_CHANNEL_PARENT_OFFER 0x200
558#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
559
560struct vmpacket_descriptor {
561 u16 type;
562 u16 offset8;
563 u16 len8;
564 u16 flags;
565 u64 trans_id;
566} __packed;
567
568struct vmpacket_header {
569 u32 prev_pkt_start_offset;
570 struct vmpacket_descriptor descriptor;
571} __packed;
572
573struct vmtransfer_page_range {
574 u32 byte_count;
575 u32 byte_offset;
576} __packed;
577
578struct vmtransfer_page_packet_header {
579 struct vmpacket_descriptor d;
580 u16 xfer_pageset_id;
581 u8 sender_owns_set;
582 u8 reserved;
583 u32 range_cnt;
584 struct vmtransfer_page_range ranges[1];
585} __packed;
586
587struct vmgpadl_packet_header {
588 struct vmpacket_descriptor d;
589 u32 gpadl;
590 u32 reserved;
591} __packed;
592
593struct vmadd_remove_transfer_page_set {
594 struct vmpacket_descriptor d;
595 u32 gpadl;
596 u16 xfer_pageset_id;
597 u16 reserved;
598} __packed;
599
600
601
602
603
604struct gpa_range {
605 u32 byte_count;
606 u32 byte_offset;
607 u64 pfn_array[0];
608};
609
610
611
612
613
614
615
616
617struct vmestablish_gpadl {
618 struct vmpacket_descriptor d;
619 u32 gpadl;
620 u32 range_cnt;
621 struct gpa_range range[1];
622} __packed;
623
624
625
626
627
628struct vmteardown_gpadl {
629 struct vmpacket_descriptor d;
630 u32 gpadl;
631 u32 reserved;
632} __packed;
633
634
635
636
637
638struct vmdata_gpa_direct {
639 struct vmpacket_descriptor d;
640 u32 reserved;
641 u32 range_cnt;
642 struct gpa_range range[1];
643} __packed;
644
645
646struct vmadditional_data {
647 struct vmpacket_descriptor d;
648 u64 total_bytes;
649 u32 offset;
650 u32 byte_cnt;
651 unsigned char data[1];
652} __packed;
653
654union vmpacket_largest_possible_header {
655 struct vmpacket_descriptor simple_hdr;
656 struct vmtransfer_page_packet_header xfer_page_hdr;
657 struct vmgpadl_packet_header gpadl_hdr;
658 struct vmadd_remove_transfer_page_set add_rm_xfer_page_hdr;
659 struct vmestablish_gpadl establish_gpadl_hdr;
660 struct vmteardown_gpadl teardown_gpadl_hdr;
661 struct vmdata_gpa_direct data_gpa_direct_hdr;
662};
663
664#define VMPACKET_DATA_START_ADDRESS(__packet) \
665 (void *)(((unsigned char *)__packet) + \
666 ((struct vmpacket_descriptor)__packet)->offset8 * 8)
667
668#define VMPACKET_DATA_LENGTH(__packet) \
669 ((((struct vmpacket_descriptor)__packet)->len8 - \
670 ((struct vmpacket_descriptor)__packet)->offset8) * 8)
671
672#define VMPACKET_TRANSFER_MODE(__packet) \
673 (((struct IMPACT)__packet)->type)
674
675enum vmbus_packet_type {
676 VM_PKT_INVALID = 0x0,
677 VM_PKT_SYNCH = 0x1,
678 VM_PKT_ADD_XFER_PAGESET = 0x2,
679 VM_PKT_RM_XFER_PAGESET = 0x3,
680 VM_PKT_ESTABLISH_GPADL = 0x4,
681 VM_PKT_TEARDOWN_GPADL = 0x5,
682 VM_PKT_DATA_INBAND = 0x6,
683 VM_PKT_DATA_USING_XFER_PAGES = 0x7,
684 VM_PKT_DATA_USING_GPADL = 0x8,
685 VM_PKT_DATA_USING_GPA_DIRECT = 0x9,
686 VM_PKT_CANCEL_REQUEST = 0xa,
687 VM_PKT_COMP = 0xb,
688 VM_PKT_DATA_USING_ADDITIONAL_PKT = 0xc,
689 VM_PKT_ADDITIONAL_DATA = 0xd
690};
691
692#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
693
694
695
696enum vmbus_channel_message_type {
697 CHANNELMSG_INVALID = 0,
698 CHANNELMSG_OFFERCHANNEL = 1,
699 CHANNELMSG_RESCIND_CHANNELOFFER = 2,
700 CHANNELMSG_REQUESTOFFERS = 3,
701 CHANNELMSG_ALLOFFERS_DELIVERED = 4,
702 CHANNELMSG_OPENCHANNEL = 5,
703 CHANNELMSG_OPENCHANNEL_RESULT = 6,
704 CHANNELMSG_CLOSECHANNEL = 7,
705 CHANNELMSG_GPADL_HEADER = 8,
706 CHANNELMSG_GPADL_BODY = 9,
707 CHANNELMSG_GPADL_CREATED = 10,
708 CHANNELMSG_GPADL_TEARDOWN = 11,
709 CHANNELMSG_GPADL_TORNDOWN = 12,
710 CHANNELMSG_RELID_RELEASED = 13,
711 CHANNELMSG_INITIATE_CONTACT = 14,
712 CHANNELMSG_VERSION_RESPONSE = 15,
713 CHANNELMSG_UNLOAD = 16,
714#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
715 CHANNELMSG_VIEWRANGE_ADD = 17,
716 CHANNELMSG_VIEWRANGE_REMOVE = 18,
717#endif
718 CHANNELMSG_COUNT
719};
720
721struct vmbus_channel_message_header {
722 enum vmbus_channel_message_type msgtype;
723 u32 padding;
724} __packed;
725
726
727struct vmbus_channel_query_vmbus_version {
728 struct vmbus_channel_message_header header;
729 u32 version;
730} __packed;
731
732
733struct vmbus_channel_version_supported {
734 struct vmbus_channel_message_header header;
735 u8 version_supported;
736} __packed;
737
738
739struct vmbus_channel_offer_channel {
740 struct vmbus_channel_message_header header;
741 struct vmbus_channel_offer offer;
742 u32 child_relid;
743 u8 monitorid;
744
745
746
747 u8 monitor_allocated:1;
748 u8 reserved:7;
749
750
751
752
753
754
755
756
757
758
759
760 u16 is_dedicated_interrupt:1;
761 u16 reserved1:15;
762 u32 connection_id;
763} __packed;
764
765
766struct vmbus_channel_rescind_offer {
767 struct vmbus_channel_message_header header;
768 u32 child_relid;
769} __packed;
770
771
772
773
774
775
776
777
778
779
780
781struct vmbus_channel_open_channel {
782 struct vmbus_channel_message_header header;
783
784
785 u32 child_relid;
786
787
788 u32 openid;
789
790
791 u32 ringbuffer_gpadlhandle;
792
793
794
795
796
797
798
799
800
801 u32 target_vp;
802
803
804
805
806
807
808 u32 downstream_ringbuffer_pageoffset;
809
810
811 unsigned char userdata[MAX_USER_DEFINED_BYTES];
812} __packed;
813
814
815struct vmbus_channel_open_result {
816 struct vmbus_channel_message_header header;
817 u32 child_relid;
818 u32 openid;
819 u32 status;
820} __packed;
821
822
823struct vmbus_channel_close_channel {
824 struct vmbus_channel_message_header header;
825 u32 child_relid;
826} __packed;
827
828
829#define GPADL_TYPE_RING_BUFFER 1
830#define GPADL_TYPE_SERVER_SAVE_AREA 2
831#define GPADL_TYPE_TRANSACTION 8
832
833
834
835
836
837
838
839struct vmbus_channel_gpadl_header {
840 struct vmbus_channel_message_header header;
841 u32 child_relid;
842 u32 gpadl;
843 u16 range_buflen;
844 u16 rangecount;
845 struct gpa_range range[0];
846} __packed;
847
848
849struct vmbus_channel_gpadl_body {
850 struct vmbus_channel_message_header header;
851 u32 msgnumber;
852 u32 gpadl;
853 u64 pfn[0];
854} __packed;
855
856struct vmbus_channel_gpadl_created {
857 struct vmbus_channel_message_header header;
858 u32 child_relid;
859 u32 gpadl;
860 u32 creation_status;
861} __packed;
862
863struct vmbus_channel_gpadl_teardown {
864 struct vmbus_channel_message_header header;
865 u32 child_relid;
866 u32 gpadl;
867} __packed;
868
869struct vmbus_channel_gpadl_torndown {
870 struct vmbus_channel_message_header header;
871 u32 gpadl;
872} __packed;
873
874#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
875struct vmbus_channel_view_range_add {
876 struct vmbus_channel_message_header header;
877 PHYSICAL_ADDRESS viewrange_base;
878 u64 viewrange_length;
879 u32 child_relid;
880} __packed;
881
882struct vmbus_channel_view_range_remove {
883 struct vmbus_channel_message_header header;
884 PHYSICAL_ADDRESS viewrange_base;
885 u32 child_relid;
886} __packed;
887#endif
888
889struct vmbus_channel_relid_released {
890 struct vmbus_channel_message_header header;
891 u32 child_relid;
892} __packed;
893
894struct vmbus_channel_initiate_contact {
895 struct vmbus_channel_message_header header;
896 u32 vmbus_version_requested;
897 u32 padding2;
898 u64 interrupt_page;
899 u64 monitor_page1;
900 u64 monitor_page2;
901} __packed;
902
903struct vmbus_channel_version_response {
904 struct vmbus_channel_message_header header;
905 u8 version_supported;
906} __packed;
907
908enum vmbus_channel_state {
909 CHANNEL_OFFER_STATE,
910 CHANNEL_OPENING_STATE,
911 CHANNEL_OPEN_STATE,
912 CHANNEL_OPENED_STATE,
913};
914
915struct vmbus_channel_debug_info {
916 u32 relid;
917 enum vmbus_channel_state state;
918 uuid_le interfacetype;
919 uuid_le interface_instance;
920 u32 monitorid;
921 u32 servermonitor_pending;
922 u32 servermonitor_latency;
923 u32 servermonitor_connectionid;
924 u32 clientmonitor_pending;
925 u32 clientmonitor_latency;
926 u32 clientmonitor_connectionid;
927
928 struct hv_ring_buffer_debug_info inbound;
929 struct hv_ring_buffer_debug_info outbound;
930};
931
932
933
934
935
936struct vmbus_channel_msginfo {
937
938 struct list_head msglistentry;
939
940
941 struct list_head submsglist;
942
943
944 struct completion waitevent;
945 union {
946 struct vmbus_channel_version_supported version_supported;
947 struct vmbus_channel_open_result open_result;
948 struct vmbus_channel_gpadl_torndown gpadl_torndown;
949 struct vmbus_channel_gpadl_created gpadl_created;
950 struct vmbus_channel_version_response version_response;
951 } response;
952
953 u32 msgsize;
954
955
956
957
958 unsigned char msg[0];
959};
960
961struct vmbus_close_msg {
962 struct vmbus_channel_msginfo info;
963 struct vmbus_channel_close_channel msg;
964};
965
966
967union hv_connection_id {
968 u32 asu32;
969 struct {
970 u32 id:24;
971 u32 reserved:8;
972 } u;
973};
974
975
976struct hv_input_signal_event {
977 union hv_connection_id connectionid;
978 u16 flag_number;
979 u16 rsvdz;
980};
981
982struct hv_input_signal_event_buffer {
983 u64 align8;
984 struct hv_input_signal_event event;
985};
986
987struct vmbus_channel {
988 struct list_head listentry;
989
990 struct hv_device *device_obj;
991
992 struct work_struct work;
993
994 enum vmbus_channel_state state;
995
996 struct vmbus_channel_offer_channel offermsg;
997
998
999
1000
1001 u8 monitor_grp;
1002 u8 monitor_bit;
1003
1004 u32 ringbuffer_gpadlhandle;
1005
1006
1007 void *ringbuffer_pages;
1008 u32 ringbuffer_pagecount;
1009 struct hv_ring_buffer_info outbound;
1010 struct hv_ring_buffer_info inbound;
1011 spinlock_t inbound_lock;
1012 struct workqueue_struct *controlwq;
1013
1014 struct vmbus_close_msg close_msg;
1015
1016
1017
1018
1019 void (*onchannel_callback)(void *context);
1020 void *channel_callback_context;
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 bool batched_reading;
1036
1037 bool is_dedicated_interrupt;
1038 struct hv_input_signal_event_buffer sig_buf;
1039 struct hv_input_signal_event *sig_event;
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049 u32 target_vp;
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070 void (*sc_creation_callback)(struct vmbus_channel *new_sc);
1071
1072 spinlock_t sc_lock;
1073
1074
1075
1076 struct list_head sc_list;
1077
1078
1079
1080
1081 struct vmbus_channel *primary_channel;
1082};
1083
1084static inline void set_channel_read_state(struct vmbus_channel *c, bool state)
1085{
1086 c->batched_reading = state;
1087}
1088
1089void vmbus_onmessage(void *context);
1090
1091int vmbus_request_offers(void);
1092
1093
1094
1095
1096
1097void vmbus_set_sc_create_callback(struct vmbus_channel *primary_channel,
1098 void (*sc_cr_cb)(struct vmbus_channel *new_sc));
1099
1100
1101
1102
1103
1104
1105
1106struct vmbus_channel *vmbus_get_outgoing_channel(struct vmbus_channel *primary);
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119bool vmbus_are_subchannels_present(struct vmbus_channel *primary);
1120
1121
1122struct vmbus_channel_packet_page_buffer {
1123 u16 type;
1124 u16 dataoffset8;
1125 u16 length8;
1126 u16 flags;
1127 u64 transactionid;
1128 u32 reserved;
1129 u32 rangecount;
1130 struct hv_page_buffer range[MAX_PAGE_BUFFER_COUNT];
1131} __packed;
1132
1133
1134struct vmbus_channel_packet_multipage_buffer {
1135 u16 type;
1136 u16 dataoffset8;
1137 u16 length8;
1138 u16 flags;
1139 u64 transactionid;
1140 u32 reserved;
1141 u32 rangecount;
1142 struct hv_multipage_buffer range;
1143} __packed;
1144
1145
1146extern int vmbus_open(struct vmbus_channel *channel,
1147 u32 send_ringbuffersize,
1148 u32 recv_ringbuffersize,
1149 void *userdata,
1150 u32 userdatalen,
1151 void(*onchannel_callback)(void *context),
1152 void *context);
1153
1154extern void vmbus_close(struct vmbus_channel *channel);
1155
1156extern int vmbus_sendpacket(struct vmbus_channel *channel,
1157 const void *buffer,
1158 u32 bufferLen,
1159 u64 requestid,
1160 enum vmbus_packet_type type,
1161 u32 flags);
1162
1163extern int vmbus_sendpacket_pagebuffer(struct vmbus_channel *channel,
1164 struct hv_page_buffer pagebuffers[],
1165 u32 pagecount,
1166 void *buffer,
1167 u32 bufferlen,
1168 u64 requestid);
1169
1170extern int vmbus_sendpacket_multipagebuffer(struct vmbus_channel *channel,
1171 struct hv_multipage_buffer *mpb,
1172 void *buffer,
1173 u32 bufferlen,
1174 u64 requestid);
1175
1176extern int vmbus_establish_gpadl(struct vmbus_channel *channel,
1177 void *kbuffer,
1178 u32 size,
1179 u32 *gpadl_handle);
1180
1181extern int vmbus_teardown_gpadl(struct vmbus_channel *channel,
1182 u32 gpadl_handle);
1183
1184extern int vmbus_recvpacket(struct vmbus_channel *channel,
1185 void *buffer,
1186 u32 bufferlen,
1187 u32 *buffer_actual_len,
1188 u64 *requestid);
1189
1190extern int vmbus_recvpacket_raw(struct vmbus_channel *channel,
1191 void *buffer,
1192 u32 bufferlen,
1193 u32 *buffer_actual_len,
1194 u64 *requestid);
1195
1196
1197extern void vmbus_get_debug_info(struct vmbus_channel *channel,
1198 struct vmbus_channel_debug_info *debug);
1199
1200extern void vmbus_ontimer(unsigned long data);
1201
1202struct hv_dev_port_info {
1203 u32 int_mask;
1204 u32 read_idx;
1205 u32 write_idx;
1206 u32 bytes_avail_toread;
1207 u32 bytes_avail_towrite;
1208};
1209
1210
1211struct hv_driver {
1212 const char *name;
1213
1214
1215 uuid_le dev_type;
1216 const struct hv_vmbus_device_id *id_table;
1217
1218 struct device_driver driver;
1219
1220 int (*probe)(struct hv_device *, const struct hv_vmbus_device_id *);
1221 int (*remove)(struct hv_device *);
1222 void (*shutdown)(struct hv_device *);
1223
1224};
1225
1226
1227struct hv_device {
1228
1229 uuid_le dev_type;
1230
1231
1232 uuid_le dev_instance;
1233
1234 struct device device;
1235
1236 struct vmbus_channel *channel;
1237};
1238
1239
1240static inline struct hv_device *device_to_hv_device(struct device *d)
1241{
1242 return container_of(d, struct hv_device, device);
1243}
1244
1245static inline struct hv_driver *drv_to_hv_drv(struct device_driver *d)
1246{
1247 return container_of(d, struct hv_driver, driver);
1248}
1249
1250static inline void hv_set_drvdata(struct hv_device *dev, void *data)
1251{
1252 dev_set_drvdata(&dev->device, data);
1253}
1254
1255static inline void *hv_get_drvdata(struct hv_device *dev)
1256{
1257 return dev_get_drvdata(&dev->device);
1258}
1259
1260
1261#define vmbus_driver_register(driver) \
1262 __vmbus_driver_register(driver, THIS_MODULE, KBUILD_MODNAME)
1263int __must_check __vmbus_driver_register(struct hv_driver *hv_driver,
1264 struct module *owner,
1265 const char *mod_name);
1266void vmbus_driver_unregister(struct hv_driver *hv_driver);
1267
1268
1269
1270
1271
1272
1273
1274#define VMBUS_DEVICE(g0, g1, g2, g3, g4, g5, g6, g7, \
1275 g8, g9, ga, gb, gc, gd, ge, gf) \
1276 .guid = { g0, g1, g2, g3, g4, g5, g6, g7, \
1277 g8, g9, ga, gb, gc, gd, ge, gf },
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287#define HV_NIC_GUID \
1288 .guid = { \
1289 0x63, 0x51, 0x61, 0xf8, 0x3e, 0xdf, 0xc5, 0x46, \
1290 0x91, 0x3f, 0xf2, 0xd2, 0xf9, 0x65, 0xed, 0x0e \
1291 }
1292
1293
1294
1295
1296
1297#define HV_IDE_GUID \
1298 .guid = { \
1299 0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \
1300 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5 \
1301 }
1302
1303
1304
1305
1306
1307#define HV_SCSI_GUID \
1308 .guid = { \
1309 0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \
1310 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f \
1311 }
1312
1313
1314
1315
1316
1317#define HV_SHUTDOWN_GUID \
1318 .guid = { \
1319 0x31, 0x60, 0x0b, 0x0e, 0x13, 0x52, 0x34, 0x49, \
1320 0x81, 0x8b, 0x38, 0xd9, 0x0c, 0xed, 0x39, 0xdb \
1321 }
1322
1323
1324
1325
1326
1327#define HV_TS_GUID \
1328 .guid = { \
1329 0x30, 0xe6, 0x27, 0x95, 0xae, 0xd0, 0x7b, 0x49, \
1330 0xad, 0xce, 0xe8, 0x0a, 0xb0, 0x17, 0x5c, 0xaf \
1331 }
1332
1333
1334
1335
1336
1337#define HV_HEART_BEAT_GUID \
1338 .guid = { \
1339 0x39, 0x4f, 0x16, 0x57, 0x15, 0x91, 0x78, 0x4e, \
1340 0xab, 0x55, 0x38, 0x2f, 0x3b, 0xd5, 0x42, 0x2d \
1341 }
1342
1343
1344
1345
1346
1347#define HV_KVP_GUID \
1348 .guid = { \
1349 0xe7, 0xf4, 0xa0, 0xa9, 0x45, 0x5a, 0x96, 0x4d, \
1350 0xb8, 0x27, 0x8a, 0x84, 0x1e, 0x8c, 0x3, 0xe6 \
1351 }
1352
1353
1354
1355
1356
1357#define HV_DM_GUID \
1358 .guid = { \
1359 0xdc, 0x74, 0x50, 0X52, 0x85, 0x89, 0xe2, 0x46, \
1360 0x80, 0x57, 0xa3, 0x07, 0xdc, 0x18, 0xa5, 0x02 \
1361 }
1362
1363
1364
1365
1366
1367#define HV_MOUSE_GUID \
1368 .guid = { \
1369 0x9e, 0xb6, 0xa8, 0xcf, 0x4a, 0x5b, 0xc0, 0x4c, \
1370 0xb9, 0x8b, 0x8b, 0xa1, 0xa1, 0xf3, 0xf9, 0x5a \
1371 }
1372
1373
1374
1375
1376#define HV_VSS_GUID \
1377 .guid = { \
1378 0x29, 0x2e, 0xfa, 0x35, 0x23, 0xea, 0x36, 0x42, \
1379 0x96, 0xae, 0x3a, 0x6e, 0xba, 0xcb, 0xa4, 0x40 \
1380 }
1381
1382
1383
1384
1385#define HV_SYNTHVID_GUID \
1386 .guid = { \
1387 0x02, 0x78, 0x0a, 0xda, 0x77, 0xe3, 0xac, 0x4a, \
1388 0x8e, 0x77, 0x05, 0x58, 0xeb, 0x10, 0x73, 0xf8 \
1389 }
1390
1391
1392
1393
1394
1395#define HV_SYNTHFC_GUID \
1396 .guid = { \
1397 0x4A, 0xCC, 0x9B, 0x2F, 0x69, 0x00, 0xF3, 0x4A, \
1398 0xB7, 0x6B, 0x6F, 0xD0, 0xBE, 0x52, 0x8C, 0xDA \
1399 }
1400
1401
1402
1403
1404
1405#define ICMSGTYPE_NEGOTIATE 0
1406#define ICMSGTYPE_HEARTBEAT 1
1407#define ICMSGTYPE_KVPEXCHANGE 2
1408#define ICMSGTYPE_SHUTDOWN 3
1409#define ICMSGTYPE_TIMESYNC 4
1410#define ICMSGTYPE_VSS 5
1411
1412#define ICMSGHDRFLAG_TRANSACTION 1
1413#define ICMSGHDRFLAG_REQUEST 2
1414#define ICMSGHDRFLAG_RESPONSE 4
1415
1416
1417
1418
1419
1420
1421
1422
1423struct hv_util_service {
1424 u8 *recv_buffer;
1425 void (*util_cb)(void *);
1426 int (*util_init)(struct hv_util_service *);
1427 void (*util_deinit)(void);
1428};
1429
1430struct vmbuspipe_hdr {
1431 u32 flags;
1432 u32 msgsize;
1433} __packed;
1434
1435struct ic_version {
1436 u16 major;
1437 u16 minor;
1438} __packed;
1439
1440struct icmsg_hdr {
1441 struct ic_version icverframe;
1442 u16 icmsgtype;
1443 struct ic_version icvermsg;
1444 u16 icmsgsize;
1445 u32 status;
1446 u8 ictransaction_id;
1447 u8 icflags;
1448 u8 reserved[2];
1449} __packed;
1450
1451struct icmsg_negotiate {
1452 u16 icframe_vercnt;
1453 u16 icmsg_vercnt;
1454 u32 reserved;
1455 struct ic_version icversion_data[1];
1456} __packed;
1457
1458struct shutdown_msg_data {
1459 u32 reason_code;
1460 u32 timeout_seconds;
1461 u32 flags;
1462 u8 display_message[2048];
1463} __packed;
1464
1465struct heartbeat_msg_data {
1466 u64 seq_num;
1467 u32 reserved[8];
1468} __packed;
1469
1470
1471#define ICTIMESYNCFLAG_PROBE 0
1472#define ICTIMESYNCFLAG_SYNC 1
1473#define ICTIMESYNCFLAG_SAMPLE 2
1474
1475#ifdef __x86_64__
1476#define WLTIMEDELTA 116444736000000000L
1477#else
1478#define WLTIMEDELTA 116444736000000000LL
1479#endif
1480
1481struct ictimesync_data {
1482 u64 parenttime;
1483 u64 childtime;
1484 u64 roundtriptime;
1485 u8 flags;
1486} __packed;
1487
1488struct hyperv_service_callback {
1489 u8 msg_type;
1490 char *log_msg;
1491 uuid_le data;
1492 struct vmbus_channel *channel;
1493 void (*callback) (void *context);
1494};
1495
1496#define MAX_SRV_VER 0x7ffffff
1497extern void vmbus_prep_negotiate_resp(struct icmsg_hdr *,
1498 struct icmsg_negotiate *, u8 *, int,
1499 int);
1500
1501int hv_kvp_init(struct hv_util_service *);
1502void hv_kvp_deinit(void);
1503void hv_kvp_onchannelcallback(void *);
1504
1505int hv_vss_init(struct hv_util_service *);
1506void hv_vss_deinit(void);
1507void hv_vss_onchannelcallback(void *);
1508
1509
1510
1511
1512
1513extern __u32 vmbus_proto_version;
1514
1515#endif
1516#endif
1517