linux/include/asm-generic/hyperv-tlfs.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2
   3/*
   4 * This file contains definitions from Hyper-V Hypervisor Top-Level Functional
   5 * Specification (TLFS):
   6 * https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs
   7 */
   8
   9#ifndef _ASM_GENERIC_HYPERV_TLFS_H
  10#define _ASM_GENERIC_HYPERV_TLFS_H
  11
  12#include <linux/types.h>
  13#include <linux/bits.h>
  14#include <linux/time64.h>
  15
  16/*
  17 * While not explicitly listed in the TLFS, Hyper-V always runs with a page size
  18 * of 4096. These definitions are used when communicating with Hyper-V using
  19 * guest physical pages and guest physical page addresses, since the guest page
  20 * size may not be 4096 on all architectures.
  21 */
  22#define HV_HYP_PAGE_SHIFT      12
  23#define HV_HYP_PAGE_SIZE       BIT(HV_HYP_PAGE_SHIFT)
  24#define HV_HYP_PAGE_MASK       (~(HV_HYP_PAGE_SIZE - 1))
  25
  26/*
  27 * Hyper-V provides two categories of flags relevant to guest VMs.  The
  28 * "Features" category indicates specific functionality that is available
  29 * to guests on this particular instance of Hyper-V. The "Features"
  30 * are presented in four groups, each of which is 32 bits. The group A
  31 * and B definitions are common across architectures and are listed here.
  32 * However, not all flags are relevant on all architectures.
  33 *
  34 * Groups C and D vary across architectures and are listed in the
  35 * architecture specific portion of hyperv-tlfs.h. Some of these flags exist
  36 * on multiple architectures, but the bit positions are different so they
  37 * cannot appear in the generic portion of hyperv-tlfs.h.
  38 *
  39 * The "Enlightenments" category provides recommendations on whether to use
  40 * specific enlightenments that are available. The Enlighenments are a single
  41 * group of 32 bits, but they vary across architectures and are listed in
  42 * the architecture specific portion of hyperv-tlfs.h.
  43 */
  44
  45/*
  46 * Group A Features.
  47 */
  48
  49/* VP Runtime register available */
  50#define HV_MSR_VP_RUNTIME_AVAILABLE             BIT(0)
  51/* Partition Reference Counter available*/
  52#define HV_MSR_TIME_REF_COUNT_AVAILABLE         BIT(1)
  53/* Basic SynIC register available */
  54#define HV_MSR_SYNIC_AVAILABLE                  BIT(2)
  55/* Synthetic Timer registers available */
  56#define HV_MSR_SYNTIMER_AVAILABLE               BIT(3)
  57/* Virtual APIC assist and VP assist page registers available */
  58#define HV_MSR_APIC_ACCESS_AVAILABLE            BIT(4)
  59/* Hypercall and Guest OS ID registers available*/
  60#define HV_MSR_HYPERCALL_AVAILABLE              BIT(5)
  61/* Access virtual processor index register available*/
  62#define HV_MSR_VP_INDEX_AVAILABLE               BIT(6)
  63/* Virtual system reset register available*/
  64#define HV_MSR_RESET_AVAILABLE                  BIT(7)
  65/* Access statistics page registers available */
  66#define HV_MSR_STAT_PAGES_AVAILABLE             BIT(8)
  67/* Partition reference TSC register is available */
  68#define HV_MSR_REFERENCE_TSC_AVAILABLE          BIT(9)
  69/* Partition Guest IDLE register is available */
  70#define HV_MSR_GUEST_IDLE_AVAILABLE             BIT(10)
  71/* Partition local APIC and TSC frequency registers available */
  72#define HV_ACCESS_FREQUENCY_MSRS                BIT(11)
  73/* AccessReenlightenmentControls privilege */
  74#define HV_ACCESS_REENLIGHTENMENT               BIT(13)
  75/* AccessTscInvariantControls privilege */
  76#define HV_ACCESS_TSC_INVARIANT                 BIT(15)
  77
  78/*
  79 * Group B features.
  80 */
  81#define HV_CREATE_PARTITIONS                    BIT(0)
  82#define HV_ACCESS_PARTITION_ID                  BIT(1)
  83#define HV_ACCESS_MEMORY_POOL                   BIT(2)
  84#define HV_ADJUST_MESSAGE_BUFFERS               BIT(3)
  85#define HV_POST_MESSAGES                        BIT(4)
  86#define HV_SIGNAL_EVENTS                        BIT(5)
  87#define HV_CREATE_PORT                          BIT(6)
  88#define HV_CONNECT_PORT                         BIT(7)
  89#define HV_ACCESS_STATS                         BIT(8)
  90#define HV_DEBUGGING                            BIT(11)
  91#define HV_CPU_MANAGEMENT                       BIT(12)
  92#define HV_ENABLE_EXTENDED_HYPERCALLS           BIT(20)
  93#define HV_ISOLATION                            BIT(22)
  94
  95/*
  96 * TSC page layout.
  97 */
  98struct ms_hyperv_tsc_page {
  99        volatile u32 tsc_sequence;
 100        u32 reserved1;
 101        volatile u64 tsc_scale;
 102        volatile s64 tsc_offset;
 103} __packed;
 104
 105/*
 106 * The guest OS needs to register the guest ID with the hypervisor.
 107 * The guest ID is a 64 bit entity and the structure of this ID is
 108 * specified in the Hyper-V specification:
 109 *
 110 * msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
 111 *
 112 * While the current guideline does not specify how Linux guest ID(s)
 113 * need to be generated, our plan is to publish the guidelines for
 114 * Linux and other guest operating systems that currently are hosted
 115 * on Hyper-V. The implementation here conforms to this yet
 116 * unpublished guidelines.
 117 *
 118 *
 119 * Bit(s)
 120 * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
 121 * 62:56 - Os Type; Linux is 0x100
 122 * 55:48 - Distro specific identification
 123 * 47:16 - Linux kernel version number
 124 * 15:0  - Distro specific identification
 125 *
 126 *
 127 */
 128
 129#define HV_LINUX_VENDOR_ID              0x8100
 130
 131/*
 132 * Crash notification flags.
 133 */
 134#define HV_CRASH_CTL_CRASH_NOTIFY_MSG           BIT_ULL(62)
 135#define HV_CRASH_CTL_CRASH_NOTIFY               BIT_ULL(63)
 136
 137/* Declare the various hypercall operations. */
 138#define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE      0x0002
 139#define HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST       0x0003
 140#define HVCALL_NOTIFY_LONG_SPIN_WAIT            0x0008
 141#define HVCALL_SEND_IPI                         0x000b
 142#define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX   0x0013
 143#define HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST_EX    0x0014
 144#define HVCALL_SEND_IPI_EX                      0x0015
 145#define HVCALL_GET_PARTITION_ID                 0x0046
 146#define HVCALL_DEPOSIT_MEMORY                   0x0048
 147#define HVCALL_CREATE_VP                        0x004e
 148#define HVCALL_GET_VP_REGISTERS                 0x0050
 149#define HVCALL_SET_VP_REGISTERS                 0x0051
 150#define HVCALL_POST_MESSAGE                     0x005c
 151#define HVCALL_SIGNAL_EVENT                     0x005d
 152#define HVCALL_POST_DEBUG_DATA                  0x0069
 153#define HVCALL_RETRIEVE_DEBUG_DATA              0x006a
 154#define HVCALL_RESET_DEBUG_SESSION              0x006b
 155#define HVCALL_ADD_LOGICAL_PROCESSOR            0x0076
 156#define HVCALL_MAP_DEVICE_INTERRUPT             0x007c
 157#define HVCALL_UNMAP_DEVICE_INTERRUPT           0x007d
 158#define HVCALL_RETARGET_INTERRUPT               0x007e
 159#define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af
 160#define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0
 161
 162/* Extended hypercalls */
 163#define HV_EXT_CALL_QUERY_CAPABILITIES          0x8001
 164#define HV_EXT_CALL_MEMORY_HEAT_HINT            0x8003
 165
 166#define HV_FLUSH_ALL_PROCESSORS                 BIT(0)
 167#define HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES     BIT(1)
 168#define HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY       BIT(2)
 169#define HV_FLUSH_USE_EXTENDED_RANGE_FORMAT      BIT(3)
 170
 171/* Extended capability bits */
 172#define HV_EXT_CAPABILITY_MEMORY_COLD_DISCARD_HINT BIT(8)
 173
 174enum HV_GENERIC_SET_FORMAT {
 175        HV_GENERIC_SET_SPARSE_4K,
 176        HV_GENERIC_SET_ALL,
 177};
 178
 179#define HV_PARTITION_ID_SELF            ((u64)-1)
 180#define HV_VP_INDEX_SELF                ((u32)-2)
 181
 182#define HV_HYPERCALL_RESULT_MASK        GENMASK_ULL(15, 0)
 183#define HV_HYPERCALL_FAST_BIT           BIT(16)
 184#define HV_HYPERCALL_VARHEAD_OFFSET     17
 185#define HV_HYPERCALL_REP_COMP_OFFSET    32
 186#define HV_HYPERCALL_REP_COMP_1         BIT_ULL(32)
 187#define HV_HYPERCALL_REP_COMP_MASK      GENMASK_ULL(43, 32)
 188#define HV_HYPERCALL_REP_START_OFFSET   48
 189#define HV_HYPERCALL_REP_START_MASK     GENMASK_ULL(59, 48)
 190
 191/* hypercall status code */
 192#define HV_STATUS_SUCCESS                       0
 193#define HV_STATUS_INVALID_HYPERCALL_CODE        2
 194#define HV_STATUS_INVALID_HYPERCALL_INPUT       3
 195#define HV_STATUS_INVALID_ALIGNMENT             4
 196#define HV_STATUS_INVALID_PARAMETER             5
 197#define HV_STATUS_ACCESS_DENIED                 6
 198#define HV_STATUS_OPERATION_DENIED              8
 199#define HV_STATUS_INSUFFICIENT_MEMORY           11
 200#define HV_STATUS_INVALID_PORT_ID               17
 201#define HV_STATUS_INVALID_CONNECTION_ID         18
 202#define HV_STATUS_INSUFFICIENT_BUFFERS          19
 203
 204/*
 205 * The Hyper-V TimeRefCount register and the TSC
 206 * page provide a guest VM clock with 100ns tick rate
 207 */
 208#define HV_CLOCK_HZ (NSEC_PER_SEC/100)
 209
 210/* Define the number of synthetic interrupt sources. */
 211#define HV_SYNIC_SINT_COUNT             (16)
 212/* Define the expected SynIC version. */
 213#define HV_SYNIC_VERSION_1              (0x1)
 214/* Valid SynIC vectors are 16-255. */
 215#define HV_SYNIC_FIRST_VALID_VECTOR     (16)
 216
 217#define HV_SYNIC_CONTROL_ENABLE         (1ULL << 0)
 218#define HV_SYNIC_SIMP_ENABLE            (1ULL << 0)
 219#define HV_SYNIC_SIEFP_ENABLE           (1ULL << 0)
 220#define HV_SYNIC_SINT_MASKED            (1ULL << 16)
 221#define HV_SYNIC_SINT_AUTO_EOI          (1ULL << 17)
 222#define HV_SYNIC_SINT_VECTOR_MASK       (0xFF)
 223
 224#define HV_SYNIC_STIMER_COUNT           (4)
 225
 226/* Define synthetic interrupt controller message constants. */
 227#define HV_MESSAGE_SIZE                 (256)
 228#define HV_MESSAGE_PAYLOAD_BYTE_COUNT   (240)
 229#define HV_MESSAGE_PAYLOAD_QWORD_COUNT  (30)
 230
 231/*
 232 * Define hypervisor message types. Some of the message types
 233 * are x86/x64 specific, but there's no good way to separate
 234 * them out into the arch-specific version of hyperv-tlfs.h
 235 * because C doesn't provide a way to extend enum types.
 236 * Keeping them all in the arch neutral hyperv-tlfs.h seems
 237 * the least messy compromise.
 238 */
 239enum hv_message_type {
 240        HVMSG_NONE                      = 0x00000000,
 241
 242        /* Memory access messages. */
 243        HVMSG_UNMAPPED_GPA              = 0x80000000,
 244        HVMSG_GPA_INTERCEPT             = 0x80000001,
 245
 246        /* Timer notification messages. */
 247        HVMSG_TIMER_EXPIRED             = 0x80000010,
 248
 249        /* Error messages. */
 250        HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020,
 251        HVMSG_UNRECOVERABLE_EXCEPTION   = 0x80000021,
 252        HVMSG_UNSUPPORTED_FEATURE       = 0x80000022,
 253
 254        /* Trace buffer complete messages. */
 255        HVMSG_EVENTLOG_BUFFERCOMPLETE   = 0x80000040,
 256
 257        /* Platform-specific processor intercept messages. */
 258        HVMSG_X64_IOPORT_INTERCEPT      = 0x80010000,
 259        HVMSG_X64_MSR_INTERCEPT         = 0x80010001,
 260        HVMSG_X64_CPUID_INTERCEPT       = 0x80010002,
 261        HVMSG_X64_EXCEPTION_INTERCEPT   = 0x80010003,
 262        HVMSG_X64_APIC_EOI              = 0x80010004,
 263        HVMSG_X64_LEGACY_FP_ERROR       = 0x80010005
 264};
 265
 266/* Define synthetic interrupt controller message flags. */
 267union hv_message_flags {
 268        __u8 asu8;
 269        struct {
 270                __u8 msg_pending:1;
 271                __u8 reserved:7;
 272        } __packed;
 273};
 274
 275/* Define port identifier type. */
 276union hv_port_id {
 277        __u32 asu32;
 278        struct {
 279                __u32 id:24;
 280                __u32 reserved:8;
 281        } __packed u;
 282};
 283
 284/* Define synthetic interrupt controller message header. */
 285struct hv_message_header {
 286        __u32 message_type;
 287        __u8 payload_size;
 288        union hv_message_flags message_flags;
 289        __u8 reserved[2];
 290        union {
 291                __u64 sender;
 292                union hv_port_id port;
 293        };
 294} __packed;
 295
 296/* Define synthetic interrupt controller message format. */
 297struct hv_message {
 298        struct hv_message_header header;
 299        union {
 300                __u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
 301        } u;
 302} __packed;
 303
 304/* Define the synthetic interrupt message page layout. */
 305struct hv_message_page {
 306        struct hv_message sint_message[HV_SYNIC_SINT_COUNT];
 307} __packed;
 308
 309/* Define timer message payload structure. */
 310struct hv_timer_message_payload {
 311        __u32 timer_index;
 312        __u32 reserved;
 313        __u64 expiration_time;  /* When the timer expired */
 314        __u64 delivery_time;    /* When the message was delivered */
 315} __packed;
 316
 317
 318/* Define synthetic interrupt controller flag constants. */
 319#define HV_EVENT_FLAGS_COUNT            (256 * 8)
 320#define HV_EVENT_FLAGS_LONG_COUNT       (256 / sizeof(unsigned long))
 321
 322/*
 323 * Synthetic timer configuration.
 324 */
 325union hv_stimer_config {
 326        u64 as_uint64;
 327        struct {
 328                u64 enable:1;
 329                u64 periodic:1;
 330                u64 lazy:1;
 331                u64 auto_enable:1;
 332                u64 apic_vector:8;
 333                u64 direct_mode:1;
 334                u64 reserved_z0:3;
 335                u64 sintx:4;
 336                u64 reserved_z1:44;
 337        } __packed;
 338};
 339
 340
 341/* Define the synthetic interrupt controller event flags format. */
 342union hv_synic_event_flags {
 343        unsigned long flags[HV_EVENT_FLAGS_LONG_COUNT];
 344};
 345
 346/* Define SynIC control register. */
 347union hv_synic_scontrol {
 348        u64 as_uint64;
 349        struct {
 350                u64 enable:1;
 351                u64 reserved:63;
 352        } __packed;
 353};
 354
 355/* Define synthetic interrupt source. */
 356union hv_synic_sint {
 357        u64 as_uint64;
 358        struct {
 359                u64 vector:8;
 360                u64 reserved1:8;
 361                u64 masked:1;
 362                u64 auto_eoi:1;
 363                u64 polling:1;
 364                u64 reserved2:45;
 365        } __packed;
 366};
 367
 368/* Define the format of the SIMP register */
 369union hv_synic_simp {
 370        u64 as_uint64;
 371        struct {
 372                u64 simp_enabled:1;
 373                u64 preserved:11;
 374                u64 base_simp_gpa:52;
 375        } __packed;
 376};
 377
 378/* Define the format of the SIEFP register */
 379union hv_synic_siefp {
 380        u64 as_uint64;
 381        struct {
 382                u64 siefp_enabled:1;
 383                u64 preserved:11;
 384                u64 base_siefp_gpa:52;
 385        } __packed;
 386};
 387
 388struct hv_vpset {
 389        u64 format;
 390        u64 valid_bank_mask;
 391        u64 bank_contents[];
 392} __packed;
 393
 394/* HvCallSendSyntheticClusterIpi hypercall */
 395struct hv_send_ipi {
 396        u32 vector;
 397        u32 reserved;
 398        u64 cpu_mask;
 399} __packed;
 400
 401/* HvCallSendSyntheticClusterIpiEx hypercall */
 402struct hv_send_ipi_ex {
 403        u32 vector;
 404        u32 reserved;
 405        struct hv_vpset vp_set;
 406} __packed;
 407
 408/* HvFlushGuestPhysicalAddressSpace hypercalls */
 409struct hv_guest_mapping_flush {
 410        u64 address_space;
 411        u64 flags;
 412} __packed;
 413
 414/*
 415 *  HV_MAX_FLUSH_PAGES = "additional_pages" + 1. It's limited
 416 *  by the bitwidth of "additional_pages" in union hv_gpa_page_range.
 417 */
 418#define HV_MAX_FLUSH_PAGES (2048)
 419#define HV_GPA_PAGE_RANGE_PAGE_SIZE_2MB         0
 420#define HV_GPA_PAGE_RANGE_PAGE_SIZE_1GB         1
 421
 422/* HvFlushGuestPhysicalAddressList, HvExtCallMemoryHeatHint hypercall */
 423union hv_gpa_page_range {
 424        u64 address_space;
 425        struct {
 426                u64 additional_pages:11;
 427                u64 largepage:1;
 428                u64 basepfn:52;
 429        } page;
 430        struct {
 431                u64 reserved:12;
 432                u64 page_size:1;
 433                u64 reserved1:8;
 434                u64 base_large_pfn:43;
 435        };
 436};
 437
 438/*
 439 * All input flush parameters should be in single page. The max flush
 440 * count is equal with how many entries of union hv_gpa_page_range can
 441 * be populated into the input parameter page.
 442 */
 443#define HV_MAX_FLUSH_REP_COUNT ((HV_HYP_PAGE_SIZE - 2 * sizeof(u64)) /  \
 444                                sizeof(union hv_gpa_page_range))
 445
 446struct hv_guest_mapping_flush_list {
 447        u64 address_space;
 448        u64 flags;
 449        union hv_gpa_page_range gpa_list[HV_MAX_FLUSH_REP_COUNT];
 450};
 451
 452/* HvFlushVirtualAddressSpace, HvFlushVirtualAddressList hypercalls */
 453struct hv_tlb_flush {
 454        u64 address_space;
 455        u64 flags;
 456        u64 processor_mask;
 457        u64 gva_list[];
 458} __packed;
 459
 460/* HvFlushVirtualAddressSpaceEx, HvFlushVirtualAddressListEx hypercalls */
 461struct hv_tlb_flush_ex {
 462        u64 address_space;
 463        u64 flags;
 464        struct hv_vpset hv_vp_set;
 465        u64 gva_list[];
 466} __packed;
 467
 468/* HvGetPartitionId hypercall (output only) */
 469struct hv_get_partition_id {
 470        u64 partition_id;
 471} __packed;
 472
 473/* HvDepositMemory hypercall */
 474struct hv_deposit_memory {
 475        u64 partition_id;
 476        u64 gpa_page_list[];
 477} __packed;
 478
 479struct hv_proximity_domain_flags {
 480        u32 proximity_preferred : 1;
 481        u32 reserved : 30;
 482        u32 proximity_info_valid : 1;
 483} __packed;
 484
 485/* Not a union in windows but useful for zeroing */
 486union hv_proximity_domain_info {
 487        struct {
 488                u32 domain_id;
 489                struct hv_proximity_domain_flags flags;
 490        };
 491        u64 as_uint64;
 492} __packed;
 493
 494struct hv_lp_startup_status {
 495        u64 hv_status;
 496        u64 substatus1;
 497        u64 substatus2;
 498        u64 substatus3;
 499        u64 substatus4;
 500        u64 substatus5;
 501        u64 substatus6;
 502} __packed;
 503
 504/* HvAddLogicalProcessor hypercall */
 505struct hv_add_logical_processor_in {
 506        u32 lp_index;
 507        u32 apic_id;
 508        union hv_proximity_domain_info proximity_domain_info;
 509        u64 flags;
 510} __packed;
 511
 512struct hv_add_logical_processor_out {
 513        struct hv_lp_startup_status startup_status;
 514} __packed;
 515
 516enum HV_SUBNODE_TYPE
 517{
 518    HvSubnodeAny = 0,
 519    HvSubnodeSocket = 1,
 520    HvSubnodeAmdNode = 2,
 521    HvSubnodeL3 = 3,
 522    HvSubnodeCount = 4,
 523    HvSubnodeInvalid = -1
 524};
 525
 526/* HvCreateVp hypercall */
 527struct hv_create_vp {
 528        u64 partition_id;
 529        u32 vp_index;
 530        u8 padding[3];
 531        u8 subnode_type;
 532        u64 subnode_id;
 533        union hv_proximity_domain_info proximity_domain_info;
 534        u64 flags;
 535} __packed;
 536
 537enum hv_interrupt_source {
 538        HV_INTERRUPT_SOURCE_MSI = 1, /* MSI and MSI-X */
 539        HV_INTERRUPT_SOURCE_IOAPIC,
 540};
 541
 542union hv_msi_address_register {
 543        u32 as_uint32;
 544        struct {
 545                u32 reserved1:2;
 546                u32 destination_mode:1;
 547                u32 redirection_hint:1;
 548                u32 reserved2:8;
 549                u32 destination_id:8;
 550                u32 msi_base:12;
 551        };
 552} __packed;
 553
 554union hv_msi_data_register {
 555        u32 as_uint32;
 556        struct {
 557                u32 vector:8;
 558                u32 delivery_mode:3;
 559                u32 reserved1:3;
 560                u32 level_assert:1;
 561                u32 trigger_mode:1;
 562                u32 reserved2:16;
 563        };
 564} __packed;
 565
 566/* HvRetargetDeviceInterrupt hypercall */
 567union hv_msi_entry {
 568        u64 as_uint64;
 569        struct {
 570                union hv_msi_address_register address;
 571                union hv_msi_data_register data;
 572        } __packed;
 573};
 574
 575union hv_ioapic_rte {
 576        u64 as_uint64;
 577
 578        struct {
 579                u32 vector:8;
 580                u32 delivery_mode:3;
 581                u32 destination_mode:1;
 582                u32 delivery_status:1;
 583                u32 interrupt_polarity:1;
 584                u32 remote_irr:1;
 585                u32 trigger_mode:1;
 586                u32 interrupt_mask:1;
 587                u32 reserved1:15;
 588
 589                u32 reserved2:24;
 590                u32 destination_id:8;
 591        };
 592
 593        struct {
 594                u32 low_uint32;
 595                u32 high_uint32;
 596        };
 597} __packed;
 598
 599struct hv_interrupt_entry {
 600        u32 source;
 601        u32 reserved1;
 602        union {
 603                union hv_msi_entry msi_entry;
 604                union hv_ioapic_rte ioapic_rte;
 605        };
 606} __packed;
 607
 608/*
 609 * flags for hv_device_interrupt_target.flags
 610 */
 611#define HV_DEVICE_INTERRUPT_TARGET_MULTICAST            1
 612#define HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET        2
 613
 614struct hv_device_interrupt_target {
 615        u32 vector;
 616        u32 flags;
 617        union {
 618                u64 vp_mask;
 619                struct hv_vpset vp_set;
 620        };
 621} __packed;
 622
 623struct hv_retarget_device_interrupt {
 624        u64 partition_id;               /* use "self" */
 625        u64 device_id;
 626        struct hv_interrupt_entry int_entry;
 627        u64 reserved2;
 628        struct hv_device_interrupt_target int_target;
 629} __packed __aligned(8);
 630
 631
 632/* HvGetVpRegisters hypercall input with variable size reg name list*/
 633struct hv_get_vp_registers_input {
 634        struct {
 635                u64 partitionid;
 636                u32 vpindex;
 637                u8  inputvtl;
 638                u8  padding[3];
 639        } header;
 640        struct input {
 641                u32 name0;
 642                u32 name1;
 643        } element[];
 644} __packed;
 645
 646
 647/* HvGetVpRegisters returns an array of these output elements */
 648struct hv_get_vp_registers_output {
 649        union {
 650                struct {
 651                        u32 a;
 652                        u32 b;
 653                        u32 c;
 654                        u32 d;
 655                } as32 __packed;
 656                struct {
 657                        u64 low;
 658                        u64 high;
 659                } as64 __packed;
 660        };
 661};
 662
 663/* HvSetVpRegisters hypercall with variable size reg name/value list*/
 664struct hv_set_vp_registers_input {
 665        struct {
 666                u64 partitionid;
 667                u32 vpindex;
 668                u8  inputvtl;
 669                u8  padding[3];
 670        } header;
 671        struct {
 672                u32 name;
 673                u32 padding1;
 674                u64 padding2;
 675                u64 valuelow;
 676                u64 valuehigh;
 677        } element[];
 678} __packed;
 679
 680enum hv_device_type {
 681        HV_DEVICE_TYPE_LOGICAL = 0,
 682        HV_DEVICE_TYPE_PCI = 1,
 683        HV_DEVICE_TYPE_IOAPIC = 2,
 684        HV_DEVICE_TYPE_ACPI = 3,
 685};
 686
 687typedef u16 hv_pci_rid;
 688typedef u16 hv_pci_segment;
 689typedef u64 hv_logical_device_id;
 690union hv_pci_bdf {
 691        u16 as_uint16;
 692
 693        struct {
 694                u8 function:3;
 695                u8 device:5;
 696                u8 bus;
 697        };
 698} __packed;
 699
 700union hv_pci_bus_range {
 701        u16 as_uint16;
 702
 703        struct {
 704                u8 subordinate_bus;
 705                u8 secondary_bus;
 706        };
 707} __packed;
 708
 709union hv_device_id {
 710        u64 as_uint64;
 711
 712        struct {
 713                u64 reserved0:62;
 714                u64 device_type:2;
 715        };
 716
 717        /* HV_DEVICE_TYPE_LOGICAL */
 718        struct {
 719                u64 id:62;
 720                u64 device_type:2;
 721        } logical;
 722
 723        /* HV_DEVICE_TYPE_PCI */
 724        struct {
 725                union {
 726                        hv_pci_rid rid;
 727                        union hv_pci_bdf bdf;
 728                };
 729
 730                hv_pci_segment segment;
 731                union hv_pci_bus_range shadow_bus_range;
 732
 733                u16 phantom_function_bits:2;
 734                u16 source_shadow:1;
 735
 736                u16 rsvdz0:11;
 737                u16 device_type:2;
 738        } pci;
 739
 740        /* HV_DEVICE_TYPE_IOAPIC */
 741        struct {
 742                u8 ioapic_id;
 743                u8 rsvdz0;
 744                u16 rsvdz1;
 745                u16 rsvdz2;
 746
 747                u16 rsvdz3:14;
 748                u16 device_type:2;
 749        } ioapic;
 750
 751        /* HV_DEVICE_TYPE_ACPI */
 752        struct {
 753                u32 input_mapping_base;
 754                u32 input_mapping_count:30;
 755                u32 device_type:2;
 756        } acpi;
 757} __packed;
 758
 759enum hv_interrupt_trigger_mode {
 760        HV_INTERRUPT_TRIGGER_MODE_EDGE = 0,
 761        HV_INTERRUPT_TRIGGER_MODE_LEVEL = 1,
 762};
 763
 764struct hv_device_interrupt_descriptor {
 765        u32 interrupt_type;
 766        u32 trigger_mode;
 767        u32 vector_count;
 768        u32 reserved;
 769        struct hv_device_interrupt_target target;
 770} __packed;
 771
 772struct hv_input_map_device_interrupt {
 773        u64 partition_id;
 774        u64 device_id;
 775        u64 flags;
 776        struct hv_interrupt_entry logical_interrupt_entry;
 777        struct hv_device_interrupt_descriptor interrupt_descriptor;
 778} __packed;
 779
 780struct hv_output_map_device_interrupt {
 781        struct hv_interrupt_entry interrupt_entry;
 782} __packed;
 783
 784struct hv_input_unmap_device_interrupt {
 785        u64 partition_id;
 786        u64 device_id;
 787        struct hv_interrupt_entry interrupt_entry;
 788} __packed;
 789
 790#define HV_SOURCE_SHADOW_NONE               0x0
 791#define HV_SOURCE_SHADOW_BRIDGE_BUS_RANGE   0x1
 792
 793/*
 794 * The whole argument should fit in a page to be able to pass to the hypervisor
 795 * in one hypercall.
 796 */
 797#define HV_MEMORY_HINT_MAX_GPA_PAGE_RANGES  \
 798        ((HV_HYP_PAGE_SIZE - sizeof(struct hv_memory_hint)) / \
 799                sizeof(union hv_gpa_page_range))
 800
 801/* HvExtCallMemoryHeatHint hypercall */
 802#define HV_EXT_MEMORY_HEAT_HINT_TYPE_COLD_DISCARD       2
 803struct hv_memory_hint {
 804        u64 type:2;
 805        u64 reserved:62;
 806        union hv_gpa_page_range ranges[];
 807} __packed;
 808
 809#endif
 810