1/* 2 * 3 * Copyright (c) 2009, Microsoft Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 16 * Place - Suite 330, Boston, MA 02111-1307 USA. 17 * 18 * Authors: 19 * Haiyang Zhang <haiyangz@microsoft.com> 20 * Hank Janssen <hjanssen@microsoft.com> 21 * 22 */ 23#ifndef __HV_API_H 24#define __HV_API_H 25 26 27/* Status codes for hypervisor operations. */ 28 29/* 30 * HV_STATUS_SUCCESS 31 * The specified hypercall succeeded 32 */ 33#define HV_STATUS_SUCCESS ((u16)0x0000) 34 35/* 36 * HV_STATUS_INVALID_HYPERCALL_CODE 37 * The hypervisor does not support the operation because the specified 38 * hypercall code is not supported. 39 */ 40#define HV_STATUS_INVALID_HYPERCALL_CODE ((u16)0x0002) 41 42/* 43 * HV_STATUS_INVALID_HYPERCALL_INPUT 44 * The hypervisor does not support the operation because the encoding for the 45 * hypercall input register is not supported. 46 */ 47#define HV_STATUS_INVALID_HYPERCALL_INPUT ((u16)0x0003) 48 49/* 50 * HV_STATUS_INVALID_ALIGNMENT 51 * The hypervisor could not perform the operation beacuse a parameter has an 52 * invalid alignment. 53 */ 54#define HV_STATUS_INVALID_ALIGNMENT ((u16)0x0004) 55 56/* 57 * HV_STATUS_INVALID_PARAMETER 58 * The hypervisor could not perform the operation beacuse an invalid parameter 59 * was specified. 60 */ 61#define HV_STATUS_INVALID_PARAMETER ((u16)0x0005) 62 63/* 64 * HV_STATUS_ACCESS_DENIED 65 * Access to the specified object was denied. 66 */ 67#define HV_STATUS_ACCESS_DENIED ((u16)0x0006) 68 69/* 70 * HV_STATUS_INVALID_PARTITION_STATE 71 * The hypervisor could not perform the operation because the partition is 72 * entering or in an invalid state. 73 */ 74#define HV_STATUS_INVALID_PARTITION_STATE ((u16)0x0007) 75 76/* 77 * HV_STATUS_OPERATION_DENIED 78 * The operation is not allowed in the current state. 79 */ 80#define HV_STATUS_OPERATION_DENIED ((u16)0x0008) 81 82/* 83 * HV_STATUS_UNKNOWN_PROPERTY 84 * The hypervisor does not recognize the specified partition property. 85 */ 86#define HV_STATUS_UNKNOWN_PROPERTY ((u16)0x0009) 87 88/* 89 * HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE 90 * The specified value of a partition property is out of range or violates an 91 * invariant. 92 */ 93#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE ((u16)0x000A) 94 95/* 96 * HV_STATUS_INSUFFICIENT_MEMORY 97 * There is not enough memory in the hypervisor pool to complete the operation. 98 */ 99#define HV_STATUS_INSUFFICIENT_MEMORY ((u16)0x000B) 100 101/* 102 * HV_STATUS_PARTITION_TOO_DEEP 103 * The maximum partition depth has been exceeded for the partition hierarchy. 104 */ 105#define HV_STATUS_PARTITION_TOO_DEEP ((u16)0x000C) 106 107/* 108 * HV_STATUS_INVALID_PARTITION_ID 109 * A partition with the specified partition Id does not exist. 110 */ 111#define HV_STATUS_INVALID_PARTITION_ID ((u16)0x000D) 112 113/* 114 * HV_STATUS_INVALID_VP_INDEX 115 * The hypervisor could not perform the operation because the specified VP 116 * index is invalid. 117 */ 118#define HV_STATUS_INVALID_VP_INDEX ((u16)0x000E) 119 120/* 121 * HV_STATUS_NOT_FOUND 122 * The iteration is complete; no addition items in the iteration could be 123 * found. 124 */ 125#define HV_STATUS_NOT_FOUND ((u16)0x0010) 126 127/* 128 * HV_STATUS_INVALID_PORT_ID 129 * The hypervisor could not perform the operation because the specified port 130 * identifier is invalid. 131 */ 132#define HV_STATUS_INVALID_PORT_ID ((u16)0x0011) 133 134/* 135 * HV_STATUS_INVALID_CONNECTION_ID 136 * The hypervisor could not perform the operation because the specified 137 * connection identifier is invalid. 138 */ 139#define HV_STATUS_INVALID_CONNECTION_ID ((u16)0x0012) 140 141/* 142 * HV_STATUS_INSUFFICIENT_BUFFERS 143 * You did not supply enough message buffers to send a message. 144 */ 145#define HV_STATUS_INSUFFICIENT_BUFFERS ((u16)0x0013) 146 147/* 148 * HV_STATUS_NOT_ACKNOWLEDGED 149 * The previous virtual interrupt has not been acknowledged. 150 */ 151#define HV_STATUS_NOT_ACKNOWLEDGED ((u16)0x0014) 152 153/* 154 * HV_STATUS_INVALID_VP_STATE 155 * A virtual processor is not in the correct state for the performance of the 156 * indicated operation. 157 */ 158#define HV_STATUS_INVALID_VP_STATE ((u16)0x0015) 159 160/* 161 * HV_STATUS_ACKNOWLEDGED 162 * The previous virtual interrupt has already been acknowledged. 163 */ 164#define HV_STATUS_ACKNOWLEDGED ((u16)0x0016) 165 166/* 167 * HV_STATUS_INVALID_SAVE_RESTORE_STATE 168 * The indicated partition is not in a valid state for saving or restoring. 169 */ 170#define HV_STATUS_INVALID_SAVE_RESTORE_STATE ((u16)0x0017) 171 172/* 173 * HV_STATUS_INVALID_SYNIC_STATE 174 * The hypervisor could not complete the operation because a required feature 175 * of the synthetic interrupt controller (SynIC) was disabled. 176 */ 177#define HV_STATUS_INVALID_SYNIC_STATE ((u16)0x0018) 178 179/* 180 * HV_STATUS_OBJECT_IN_USE 181 * The hypervisor could not perform the operation because the object or value 182 * was either already in use or being used for a purpose that would not permit 183 * completing the operation. 184 */ 185#define HV_STATUS_OBJECT_IN_USE ((u16)0x0019) 186 187/* 188 * HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO 189 * The proximity domain information is invalid. 190 */ 191#define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO ((u16)0x001A) 192 193/* 194 * HV_STATUS_NO_DATA 195 * An attempt to retrieve debugging data failed because none was available. 196 */ 197#define HV_STATUS_NO_DATA ((u16)0x001B) 198 199/* 200 * HV_STATUS_INACTIVE 201 * The physical connection being used for debuggging has not recorded any 202 * receive activity since the last operation. 203 */ 204#define HV_STATUS_INACTIVE ((u16)0x001C) 205 206/* 207 * HV_STATUS_NO_RESOURCES 208 * There are not enough resources to complete the operation. 209 */ 210#define HV_STATUS_NO_RESOURCES ((u16)0x001D) 211 212/* 213 * HV_STATUS_FEATURE_UNAVAILABLE 214 * A hypervisor feature is not available to the user. 215 */ 216#define HV_STATUS_FEATURE_UNAVAILABLE ((u16)0x001E) 217 218/* 219 * HV_STATUS_UNSUCCESSFUL 220 * {Operation Failed} The requested operation was unsuccessful. 221 */ 222#define HV_STATUS_UNSUCCESSFUL ((u16)0x1001) 223 224/* 225 * HV_STATUS_INSUFFICIENT_BUFFER 226 * The specified buffer was too small to contain all of the requested data. 227 */ 228#define HV_STATUS_INSUFFICIENT_BUFFER ((u16)0x1002) 229 230/* 231 * HV_STATUS_GPA_NOT_PRESENT 232 * The guest physical address is not currently associated with a system 233 * physical address. 234 */ 235#define HV_STATUS_GPA_NOT_PRESENT ((u16)0x1003) 236 237/* 238 * HV_STATUS_GUEST_PAGE_FAULT 239 * The operation would have resulted in a page fault in the guest. 240 */ 241#define HV_STATUS_GUEST_PAGE_FAULT ((u16)0x1004) 242 243/* 244 * HV_STATUS_RUNDOWN_DISABLED 245 * The operation cannot proceed as the rundown object was marked disabled. 246 */ 247#define HV_STATUS_RUNDOWN_DISABLED ((u16)0x1005) 248 249/* 250 * HV_STATUS_KEY_ALREADY_EXISTS 251 * The entry cannot be added as another entry with the same key already exists. 252 */ 253#define HV_STATUS_KEY_ALREADY_EXISTS ((u16)0x1006) 254 255/* 256 * HV_STATUS_GPA_INTERCEPT 257 * The operation resulted an intercept on a region of guest physical memory. 258 */ 259#define HV_STATUS_GPA_INTERCEPT ((u16)0x1007) 260 261/* 262 * HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT 263 * The operation would have resulted in a general protection fault in the 264 * guest. 265 */ 266#define HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT ((u16)0x1008) 267 268/* 269 * HV_STATUS_GUEST_STACK_FAULT 270 * The operation would have resulted in a stack fault in the guest. 271 */ 272#define HV_STATUS_GUEST_STACK_FAULT ((u16)0x1009) 273 274/* 275 * HV_STATUS_GUEST_INVALID_OPCODE_FAULT 276 * The operation would have resulted in an invalid opcode fault in the guest. 277 */ 278#define HV_STATUS_GUEST_INVALID_OPCODE_FAULT ((u16)0x100A) 279 280/* 281 * HV_STATUS_FINALIZE_INCOMPLETE 282 * The partition is not completely finalized. 283 */ 284#define HV_STATUS_FINALIZE_INCOMPLETE ((u16)0x100B) 285 286/* 287 * HV_STATUS_GUEST_MACHINE_CHECK_ABORT 288 * The operation would have resulted in an machine check abort in the guest. 289 */ 290#define HV_STATUS_GUEST_MACHINE_CHECK_ABORT ((u16)0x100C) 291 292/* 293 * HV_STATUS_ILLEGAL_OVERLAY_ACCESS 294 * An illegal access was attempted to an overlay page. 295 */ 296#define HV_STATUS_ILLEGAL_OVERLAY_ACCESS ((u16)0x100D) 297 298/* 299 * HV_STATUS_INSUFFICIENT_SYSTEM_VA 300 * There is not enough system VA space available to satisfy the request, 301 */ 302#define HV_STATUS_INSUFFICIENT_SYSTEM_VA ((u16)0x100E) 303 304/* 305 * HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED 306 * The passed virtual address was not mapped in the hypervisor address space. 307 */ 308#define HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED ((u16)0x100F) 309 310/* 311 * HV_STATUS_NOT_IMPLEMENTED 312 * The requested operation is not implemented in this version of the 313 * hypervisor. 314 */ 315#define HV_STATUS_NOT_IMPLEMENTED ((u16)0x1010) 316 317/* 318 * HV_STATUS_VMX_INSTRUCTION_FAILED 319 * The requested VMX instruction failed to complete successfully. 320 */ 321#define HV_STATUS_VMX_INSTRUCTION_FAILED ((u16)0x1011) 322 323/* 324 * HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS 325 * The requested VMX instruction failed to complete successfully indicating 326 * status. 327 */ 328#define HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS ((u16)0x1012) 329 330/* 331 * HV_STATUS_MSR_ACCESS_FAILED 332 * The requested access to the model specific register failed. 333 */ 334#define HV_STATUS_MSR_ACCESS_FAILED ((u16)0x1013) 335 336/* 337 * HV_STATUS_CR_ACCESS_FAILED 338 * The requested access to the control register failed. 339 */ 340#define HV_STATUS_CR_ACCESS_FAILED ((u16)0x1014) 341 342/* 343 * HV_STATUS_TIMEOUT 344 * The specified timeout expired before the operation completed. 345 */ 346#define HV_STATUS_TIMEOUT ((u16)0x1016) 347 348/* 349 * HV_STATUS_MSR_INTERCEPT 350 * The requested access to the model specific register generated an intercept. 351 */ 352#define HV_STATUS_MSR_INTERCEPT ((u16)0x1017) 353 354/* 355 * HV_STATUS_CPUID_INTERCEPT 356 * The CPUID instruction generated an intercept. 357 */ 358#define HV_STATUS_CPUID_INTERCEPT ((u16)0x1018) 359 360/* 361 * HV_STATUS_REPEAT_INSTRUCTION 362 * The current instruction should be repeated and the instruction pointer not 363 * advanced. 364 */ 365#define HV_STATUS_REPEAT_INSTRUCTION ((u16)0x1019) 366 367/* 368 * HV_STATUS_PAGE_PROTECTION_VIOLATION 369 * The current instruction should be repeated and the instruction pointer not 370 * advanced. 371 */ 372#define HV_STATUS_PAGE_PROTECTION_VIOLATION ((u16)0x101A) 373 374/* 375 * HV_STATUS_PAGE_TABLE_INVALID 376 * The current instruction should be repeated and the instruction pointer not 377 * advanced. 378 */ 379#define HV_STATUS_PAGE_TABLE_INVALID ((u16)0x101B) 380 381/* 382 * HV_STATUS_PAGE_NOT_PRESENT 383 * The current instruction should be repeated and the instruction pointer not 384 * advanced. 385 */ 386#define HV_STATUS_PAGE_NOT_PRESENT ((u16)0x101C) 387 388/* 389 * HV_STATUS_IO_INTERCEPT 390 * The requested access to the I/O port generated an intercept. 391 */ 392#define HV_STATUS_IO_INTERCEPT ((u16)0x101D) 393 394/* 395 * HV_STATUS_NOTHING_TO_DO 396 * There is nothing to do. 397 */ 398#define HV_STATUS_NOTHING_TO_DO ((u16)0x101E) 399 400/* 401 * HV_STATUS_THREAD_TERMINATING 402 * The requested thread is terminating. 403 */ 404#define HV_STATUS_THREAD_TERMINATING ((u16)0x101F) 405 406/* 407 * HV_STATUS_SECTION_ALREADY_CONSTRUCTED 408 * The specified section was already constructed. 409 */ 410#define HV_STATUS_SECTION_ALREADY_CONSTRUCTED ((u16)0x1020) 411 412/* HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED 413 * The specified section was not already constructed. 414 */ 415#define HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED ((u16)0x1021) 416 417/* 418 * HV_STATUS_PAGE_ALREADY_COMMITTED 419 * The specified virtual address was already backed by physical memory. 420 */ 421#define HV_STATUS_PAGE_ALREADY_COMMITTED ((u16)0x1022) 422 423/* 424 * HV_STATUS_PAGE_NOT_ALREADY_COMMITTED 425 * The specified virtual address was not already backed by physical memory. 426 */ 427#define HV_STATUS_PAGE_NOT_ALREADY_COMMITTED ((u16)0x1023) 428 429/* 430 * HV_STATUS_COMMITTED_PAGES_REMAIN 431 * Committed pages remain in the section. 432 */ 433#define HV_STATUS_COMMITTED_PAGES_REMAIN ((u16)0x1024) 434 435/* 436 * HV_STATUS_NO_REMAINING_COMMITTED_PAGES 437 * No additional committed pages beyond the specified page exist in the 438 * section. 439 */ 440#define HV_STATUS_NO_REMAINING_COMMITTED_PAGES ((u16)0x1025) 441 442/* 443 * HV_STATUS_INSUFFICIENT_COMPARTMENT_VA 444 * The VA space of the compartment is exhausted. 445 */ 446#define HV_STATUS_INSUFFICIENT_COMPARTMENT_VA ((u16)0x1026) 447 448/* 449 * HV_STATUS_DEREF_SPA_LIST_FULL 450 * The SPA dereference list is full, and there are additional entries to be 451 * added to it. 452 */ 453#define HV_STATUS_DEREF_SPA_LIST_FULL ((u16)0x1027) 454 455/* 456 * HV_STATUS_GPA_OUT_OF_RANGE 457 * The supplied GPA is out of range. 458 */ 459#define HV_STATUS_GPA_OUT_OF_RANGE ((u16)0x1027) 460 461/* 462 * HV_STATUS_NONVOLATILE_XMM_STALE 463 * The XMM register that was being accessed is stale. 464 */ 465#define HV_STATUS_NONVOLATILE_XMM_STALE ((u16)0x1028) 466 467/* HV_STATUS_UNSUPPORTED_PROCESSOR 468 * The hypervisor does not support the processors in this system. 469 */ 470#define HV_STATUS_UNSUPPORTED_PROCESSOR ((u16)0x1029) 471 472/* 473 * HV_STATUS_INSUFFICIENT_CROM_SPACE 474 * Insufficient space existed for copying over the CROM contents. 475 */ 476#define HV_STATUS_INSUFFICIENT_CROM_SPACE ((u16)0x2000) 477 478/* 479 * HV_STATUS_BAD_CROM_FORMAT 480 * The contents of the CROM failed validation attempts. 481 */ 482#define HV_STATUS_BAD_CROM_FORMAT ((u16)0x2001) 483 484/* 485 * HV_STATUS_UNSUPPORTED_CROM_FORMAT 486 * The contents of the CROM contain contents the parser doesn't support. 487 */ 488#define HV_STATUS_UNSUPPORTED_CROM_FORMAT ((u16)0x2002) 489 490/* 491 * HV_STATUS_UNSUPPORTED_CONTROLLER 492 * The register format of the OHCI controller specified for debugging is not 493 * supported. 494 */ 495#define HV_STATUS_UNSUPPORTED_CONTROLLER ((u16)0x2003) 496 497/* 498 * HV_STATUS_CROM_TOO_LARGE 499 * The CROM contents were to large to copy over. 500 */ 501#define HV_STATUS_CROM_TOO_LARGE ((u16)0x2004) 502 503/* 504 * HV_STATUS_CONTROLLER_IN_USE 505 * The OHCI controller specified for debugging cannot be used as it is already 506 * in use. 507 */ 508#define HV_STATUS_CONTROLLER_IN_USE ((u16)0x2005) 509 510 511/* 512 * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent 513 * is set by CPUID(HvCpuIdFunctionVersionAndFeatures). 514 */ 515enum hv_cpuid_function { 516 HvCpuIdFunctionVersionAndFeatures = 0x00000001, 517 HvCpuIdFunctionHvVendorAndMaxFunction = 0x40000000, 518 HvCpuIdFunctionHvInterface = 0x40000001, 519 520 /* 521 * The remaining functions depend on the value of 522 * HvCpuIdFunctionInterface 523 */ 524 HvCpuIdFunctionMsHvVersion = 0x40000002, 525 HvCpuIdFunctionMsHvFeatures = 0x40000003, 526 HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004, 527 HvCpuIdFunctionMsHvImplementationLimits = 0x40000005, 528}; 529 530/* Define the virtual APIC registers */ 531#define HV_X64_MSR_EOI (0x40000070) 532#define HV_X64_MSR_ICR (0x40000071) 533#define HV_X64_MSR_TPR (0x40000072) 534#define HV_X64_MSR_APIC_ASSIST_PAGE (0x40000073) 535 536/* Define version of the synthetic interrupt controller. */ 537#define HV_SYNIC_VERSION (1) 538 539/* Define synthetic interrupt controller model specific registers. */ 540#define HV_X64_MSR_SCONTROL (0x40000080) 541#define HV_X64_MSR_SVERSION (0x40000081) 542#define HV_X64_MSR_SIEFP (0x40000082) 543#define HV_X64_MSR_SIMP (0x40000083) 544#define HV_X64_MSR_EOM (0x40000084) 545#define HV_X64_MSR_SINT0 (0x40000090) 546#define HV_X64_MSR_SINT1 (0x40000091) 547#define HV_X64_MSR_SINT2 (0x40000092) 548#define HV_X64_MSR_SINT3 (0x40000093) 549#define HV_X64_MSR_SINT4 (0x40000094) 550#define HV_X64_MSR_SINT5 (0x40000095) 551#define HV_X64_MSR_SINT6 (0x40000096) 552#define HV_X64_MSR_SINT7 (0x40000097) 553#define HV_X64_MSR_SINT8 (0x40000098) 554#define HV_X64_MSR_SINT9 (0x40000099) 555#define HV_X64_MSR_SINT10 (0x4000009A) 556#define HV_X64_MSR_SINT11 (0x4000009B) 557#define HV_X64_MSR_SINT12 (0x4000009C) 558#define HV_X64_MSR_SINT13 (0x4000009D) 559#define HV_X64_MSR_SINT14 (0x4000009E) 560#define HV_X64_MSR_SINT15 (0x4000009F) 561 562/* Define the expected SynIC version. */ 563#define HV_SYNIC_VERSION_1 (0x1) 564 565/* Define synthetic interrupt controller message constants. */ 566#define HV_MESSAGE_SIZE (256) 567#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) 568#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) 569#define HV_ANY_VP (0xFFFFFFFF) 570 571/* Define synthetic interrupt controller flag constants. */ 572#define HV_EVENT_FLAGS_COUNT (256 * 8) 573#define HV_EVENT_FLAGS_BYTE_COUNT (256) 574#define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(u32)) 575 576/* Define hypervisor message types. */ 577enum hv_message_type { 578 HvMessageTypeNone = 0x00000000, 579 580 /* Memory access messages. */ 581 HvMessageTypeUnmappedGpa = 0x80000000, 582 HvMessageTypeGpaIntercept = 0x80000001, 583 584 /* Timer notification messages. */ 585 HvMessageTimerExpired = 0x80000010, 586 587 /* Error messages. */ 588 HvMessageTypeInvalidVpRegisterValue = 0x80000020, 589 HvMessageTypeUnrecoverableException = 0x80000021, 590 HvMessageTypeUnsupportedFeature = 0x80000022, 591 592 /* Trace buffer complete messages. */ 593 HvMessageTypeEventLogBufferComplete = 0x80000040, 594 595 /* Platform-specific processor intercept messages. */ 596 HvMessageTypeX64IoPortIntercept = 0x80010000, 597 HvMessageTypeX64MsrIntercept = 0x80010001, 598 HvMessageTypeX64CpuidIntercept = 0x80010002, 599 HvMessageTypeX64ExceptionIntercept = 0x80010003, 600 HvMessageTypeX64ApicEoi = 0x80010004, 601 HvMessageTypeX64LegacyFpError = 0x80010005 602}; 603 604/* Define the number of synthetic interrupt sources. */ 605#define HV_SYNIC_SINT_COUNT (16) 606#define HV_SYNIC_STIMER_COUNT (4) 607 608/* Define invalid partition identifier. */ 609#define HV_PARTITION_ID_INVALID ((u64)0x0) 610 611/* Define connection identifier type. */ 612union hv_connection_id { 613 u32 Asu32; 614 struct { 615 u32 Id:24; 616 u32 Reserved:8; 617 } u; 618}; 619 620/* Define port identifier type. */ 621union hv_port_id { 622 u32 Asu32; 623 struct { 624 u32 Id:24; 625 u32 Reserved:8; 626 } u ; 627}; 628 629/* Define port type. */ 630enum hv_port_type { 631 HvPortTypeMessage = 1, 632 HvPortTypeEvent = 2, 633 HvPortTypeMonitor = 3 634}; 635 636/* Define port information structure. */ 637struct hv_port_info { 638 enum hv_port_type PortType; 639 u32 Padding; 640 union { 641 struct { 642 u32 TargetSint; 643 u32 TargetVp; 644 u64 RsvdZ; 645 } MessagePortInfo; 646 struct { 647 u32 TargetSint; 648 u32 TargetVp; 649 u16 BaseFlagNumber; 650 u16 FlagCount; 651 u32 RsvdZ; 652 } EventPortInfo; 653 struct { 654 u64 MonitorAddress; 655 u64 RsvdZ; 656 } MonitorPortInfo; 657 }; 658}; 659 660struct hv_connection_info { 661 enum hv_port_type PortType; 662 u32 Padding; 663 union { 664 struct { 665 u64 RsvdZ; 666 } MessageConnectionInfo; 667 struct { 668 u64 RsvdZ; 669 } EventConnectionInfo; 670 struct { 671 u64 MonitorAddress; 672 } MonitorConnectionInfo; 673 }; 674}; 675 676/* Define synthetic interrupt controller message flags. */ 677union hv_message_flags { 678 u8 Asu8; 679 struct { 680 u8 MessagePending:1; 681 u8 Reserved:7; 682 }; 683}; 684 685/* Define synthetic interrupt controller message header. */ 686struct hv_message_header { 687 enum hv_message_type MessageType; 688 u8 PayloadSize; 689 union hv_message_flags MessageFlags; 690 u8 Reserved[2]; 691 union { 692 u64 Sender; 693 union hv_port_id Port; 694 }; 695}; 696 697/* Define timer message payload structure. */ 698struct hv_timer_message_payload { 699 u32 TimerIndex; 700 u32 Reserved; 701 u64 ExpirationTime; /* When the timer expired */ 702 u64 DeliveryTime; /* When the message was delivered */ 703}; 704 705/* Define synthetic interrupt controller message format. */ 706struct hv_message { 707 struct hv_message_header Header; 708 union { 709 u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; 710 } u ; 711}; 712 713/* Define the number of message buffers associated with each port. */ 714#define HV_PORT_MESSAGE_BUFFER_COUNT (16) 715 716/* Define the synthetic interrupt message page layout. */ 717struct hv_message_page { 718 struct hv_message SintMessage[HV_SYNIC_SINT_COUNT]; 719}; 720 721/* Define the synthetic interrupt controller event flags format. */ 722union hv_synic_event_flags { 723 u8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT]; 724 u32 Flags32[HV_EVENT_FLAGS_DWORD_COUNT]; 725}; 726 727/* Define the synthetic interrupt flags page layout. */ 728struct hv_synic_event_flags_page { 729 union hv_synic_event_flags SintEventFlags[HV_SYNIC_SINT_COUNT]; 730}; 731 732/* Define SynIC control register. */ 733union hv_synic_scontrol { 734 u64 AsUINT64; 735 struct { 736 u64 Enable:1; 737 u64 Reserved:63; 738 }; 739}; 740 741/* Define synthetic interrupt source. */ 742union hv_synic_sint { 743 u64 AsUINT64; 744 struct { 745 u64 Vector:8; 746 u64 Reserved1:8; 747 u64 Masked:1; 748 u64 AutoEoi:1; 749 u64 Reserved2:46; 750 }; 751}; 752 753/* Define the format of the SIMP register */ 754union hv_synic_simp { 755 u64 AsUINT64; 756 struct { 757 u64 SimpEnabled:1; 758 u64 Preserved:11; 759 u64 BaseSimpGpa:52; 760 }; 761}; 762 763/* Define the format of the SIEFP register */ 764union hv_synic_siefp { 765 u64 AsUINT64; 766 struct { 767 u64 SiefpEnabled:1; 768 u64 Preserved:11; 769 u64 BaseSiefpGpa:52; 770 }; 771}; 772 773/* Definitions for the monitored notification facility */ 774union hv_monitor_trigger_group { 775 u64 AsUINT64; 776 struct { 777 u32 Pending; 778 u32 Armed; 779 }; 780}; 781 782struct hv_monitor_parameter { 783 union hv_connection_id ConnectionId; 784 u16 FlagNumber; 785 u16 RsvdZ; 786}; 787 788union hv_monitor_trigger_state { 789 u32 Asu32; 790 791 struct { 792 u32 GroupEnable:4; 793 u32 RsvdZ:28; 794 }; 795}; 796 797/* struct hv_monitor_page Layout */ 798/* ------------------------------------------------------ */ 799/* | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) | */ 800/* | 8 | TriggerGroup[0] | */ 801/* | 10 | TriggerGroup[1] | */ 802/* | 18 | TriggerGroup[2] | */ 803/* | 20 | TriggerGroup[3] | */ 804/* | 28 | Rsvd2[0] | */ 805/* | 30 | Rsvd2[1] | */ 806/* | 38 | Rsvd2[2] | */ 807/* | 40 | NextCheckTime[0][0] | NextCheckTime[0][1] | */ 808/* | ... | */ 809/* | 240 | Latency[0][0..3] | */ 810/* | 340 | Rsvz3[0] | */ 811/* | 440 | Parameter[0][0] | */ 812/* | 448 | Parameter[0][1] | */ 813/* | ... | */ 814/* | 840 | Rsvd4[0] | */ 815/* ------------------------------------------------------ */ 816struct hv_monitor_page { 817 union hv_monitor_trigger_state TriggerState; 818 u32 RsvdZ1; 819 820 union hv_monitor_trigger_group TriggerGroup[4]; 821 u64 RsvdZ2[3]; 822 823 s32 NextCheckTime[4][32]; 824 825 u16 Latency[4][32]; 826 u64 RsvdZ3[32]; 827 828 struct hv_monitor_parameter Parameter[4][32]; 829 830 u8 RsvdZ4[1984]; 831}; 832 833/* Declare the various hypercall operations. */ 834enum hv_call_code { 835 HvCallPostMessage = 0x005c, 836 HvCallSignalEvent = 0x005d, 837}; 838 839/* Definition of the HvPostMessage hypercall input structure. */ 840struct hv_input_post_message { 841 union hv_connection_id ConnectionId; 842 u32 Reserved; 843 enum hv_message_type MessageType; 844 u32 PayloadSize; 845 u64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT]; 846}; 847 848/* Definition of the HvSignalEvent hypercall input structure. */ 849struct hv_input_signal_event { 850 union hv_connection_id ConnectionId; 851 u16 FlagNumber; 852 u16 RsvdZ; 853}; 854 855/* 856 * Versioning definitions used for guests reporting themselves to the 857 * hypervisor, and visa versa. 858 */ 859 860/* Version info reported by guest OS's */ 861enum hv_guest_os_vendor { 862 HvGuestOsVendorMicrosoft = 0x0001 863}; 864 865enum hv_guest_os_microsoft_ids { 866 HvGuestOsMicrosoftUndefined = 0x00, 867 HvGuestOsMicrosoftMSDOS = 0x01, 868 HvGuestOsMicrosoftWindows3x = 0x02, 869 HvGuestOsMicrosoftWindows9x = 0x03, 870 HvGuestOsMicrosoftWindowsNT = 0x04, 871 HvGuestOsMicrosoftWindowsCE = 0x05 872}; 873 874/* 875 * Declare the MSR used to identify the guest OS. 876 */ 877#define HV_X64_MSR_GUEST_OS_ID 0x40000000 878 879union hv_x64_msr_guest_os_id_contents { 880 u64 AsUINT64; 881 struct { 882 u64 BuildNumber:16; 883 u64 ServiceVersion:8; /* Service Pack, etc. */ 884 u64 MinorVersion:8; 885 u64 MajorVersion:8; 886 u64 OsId:8; /* enum hv_guest_os_microsoft_ids (if Vendor=MS) */ 887 u64 VendorId:16; /* enum hv_guest_os_vendor */ 888 }; 889}; 890 891/* 892 * Declare the MSR used to setup pages used to communicate with the hypervisor. 893 */ 894#define HV_X64_MSR_HYPERCALL 0x40000001 895 896union hv_x64_msr_hypercall_contents { 897 u64 AsUINT64; 898 struct { 899 u64 Enable:1; 900 u64 Reserved:11; 901 u64 GuestPhysicalAddress:52; 902 }; 903}; 904 905#endif 906