551 lines · 12.8 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 *//* * Type definitions for the Microsoft Hypervisor. */#ifndef _HV_HVHDK_MINI_H#define _HV_HVHDK_MINI_H #include "hvgdk_mini.h" #define HV_MAX_CONTIGUOUS_ALLOCATION_PAGES	8 /* * Doorbell connection_info flags. */#define HV_DOORBELL_FLAG_TRIGGER_SIZE_MASK  0x00000007#define HV_DOORBELL_FLAG_TRIGGER_SIZE_ANY   0x00000000#define HV_DOORBELL_FLAG_TRIGGER_SIZE_BYTE  0x00000001#define HV_DOORBELL_FLAG_TRIGGER_SIZE_WORD  0x00000002#define HV_DOORBELL_FLAG_TRIGGER_SIZE_DWORD 0x00000003#define HV_DOORBELL_FLAG_TRIGGER_SIZE_QWORD 0x00000004#define HV_DOORBELL_FLAG_TRIGGER_ANY_VALUE  0x80000000 /* Each generic set contains 64 elements */#define HV_GENERIC_SET_SHIFT		(6)#define HV_GENERIC_SET_MASK		(63) enum hv_generic_set_format {	HV_GENERIC_SET_SPARSE_4K,	HV_GENERIC_SET_ALL,};#define HV_GENERIC_SET_FORMAT hv_generic_set_format enum hv_scheduler_type {	HV_SCHEDULER_TYPE_LP		= 1, /* Classic scheduler w/o SMT */	HV_SCHEDULER_TYPE_LP_SMT	= 2, /* Classic scheduler w/ SMT */	HV_SCHEDULER_TYPE_CORE_SMT	= 3, /* Core scheduler */	HV_SCHEDULER_TYPE_ROOT		= 4, /* Root / integrated scheduler */	HV_SCHEDULER_TYPE_MAX}; /* HV_STATS_AREA_TYPE */enum hv_stats_area_type {	HV_STATS_AREA_SELF = 0,	HV_STATS_AREA_PARENT = 1,	HV_STATS_AREA_INTERNAL = 2,	HV_STATS_AREA_COUNT}; enum hv_stats_object_type {	HV_STATS_OBJECT_HYPERVISOR		= 0x00000001,	HV_STATS_OBJECT_LOGICAL_PROCESSOR	= 0x00000002,	HV_STATS_OBJECT_PARTITION		= 0x00010001,	HV_STATS_OBJECT_VP			= 0x00010002}; union hv_stats_object_identity {	/* hv_stats_hypervisor */	struct {		u8 reserved[15];		u8 stats_area_type;	} __packed hv; 	/* hv_stats_logical_processor */	struct {		u32 lp_index;		u8 reserved[11];		u8 stats_area_type;	} __packed lp; 	/* hv_stats_partition */	struct {		u64 partition_id;		u8  reserved[7];		u8  stats_area_type;	} __packed partition; 	/* hv_stats_vp */	struct {		u64 partition_id;		u32 vp_index;		u16 flags;		u8  reserved;		u8  stats_area_type;	} __packed vp;}; enum hv_partition_property_code {	/* Privilege properties */	HV_PARTITION_PROPERTY_PRIVILEGE_FLAGS			= 0x00010000,	HV_PARTITION_PROPERTY_SYNTHETIC_PROC_FEATURES		= 0x00010001, 	/* Integrated scheduling properties */	HV_PARTITION_PROPERTY_INTEGRATED_SCHEDULER_ENABLED	= 0x00020005, 	/* Resource properties */	HV_PARTITION_PROPERTY_GPA_PAGE_ACCESS_TRACKING		= 0x00050005,	HV_PARTITION_PROPERTY_UNIMPLEMENTED_MSR_ACTION		= 0x00050017, 	/* Compatibility properties */	HV_PARTITION_PROPERTY_PROCESSOR_XSAVE_FEATURES		= 0x00060002,	HV_PARTITION_PROPERTY_XSAVE_STATES                      = 0x00060007,	HV_PARTITION_PROPERTY_MAX_XSAVE_DATA_SIZE		= 0x00060008,	HV_PARTITION_PROPERTY_PROCESSOR_CLOCK_FREQUENCY		= 0x00060009, 	/* Extended properties with larger property values */	HV_PARTITION_PROPERTY_VMM_CAPABILITIES			= 0x00090007,}; #define HV_PARTITION_VMM_CAPABILITIES_BANK_COUNT		1#define HV_PARTITION_VMM_CAPABILITIES_RESERVED_BITFIELD_COUNT	57 struct hv_partition_property_vmm_capabilities {	u16 bank_count;	u16 reserved[3];	union {		u64 as_uint64[HV_PARTITION_VMM_CAPABILITIES_BANK_COUNT];		struct {			u64 map_gpa_preserve_adjustable: 1;			u64 vmm_can_provide_overlay_gpfn: 1;			u64 vp_affinity_property: 1;#if IS_ENABLED(CONFIG_ARM64)			u64 vmm_can_provide_gic_overlay_locations: 1;#else			u64 reservedbit3: 1;#endif			u64 assignable_synthetic_proc_features: 1;			u64 reservedbit5: 1;			u64 vmm_enable_integrated_scheduler : 1;			u64 reserved0: HV_PARTITION_VMM_CAPABILITIES_RESERVED_BITFIELD_COUNT;		} __packed;	};} __packed; enum hv_snp_status {	HV_SNP_STATUS_NONE = 0,	HV_SNP_STATUS_AVAILABLE = 1,	HV_SNP_STATUS_INCOMPATIBLE = 2,	HV_SNP_STATUS_PSP_UNAVAILABLE = 3,	HV_SNP_STATUS_PSP_INIT_FAILED = 4,	HV_SNP_STATUS_PSP_BAD_FW_VERSION = 5,	HV_SNP_STATUS_BAD_CONFIGURATION = 6,	HV_SNP_STATUS_PSP_FW_UPDATE_IN_PROGRESS = 7,	HV_SNP_STATUS_PSP_RB_INIT_FAILED = 8,	HV_SNP_STATUS_PSP_PLATFORM_STATUS_FAILED = 9,	HV_SNP_STATUS_PSP_INIT_LATE_FAILED = 10,}; enum hv_system_property {	/* Add more values when needed */	HV_SYSTEM_PROPERTY_SLEEP_STATE = 3,	HV_SYSTEM_PROPERTY_SCHEDULER_TYPE = 15,	HV_DYNAMIC_PROCESSOR_FEATURE_PROPERTY = 21,	HV_SYSTEM_PROPERTY_CRASHDUMPAREA = 47,}; #define HV_PFN_RANGE_PGBITS 24  /* HV_SPA_PAGE_RANGE_ADDITIONAL_PAGES_BITS */union hv_pfn_range {            /* HV_SPA_PAGE_RANGE */	u64 as_uint64;	struct {		/* 39:0: base pfn.  63:40: additional pages */		u64 base_pfn : 64 - HV_PFN_RANGE_PGBITS;		u64 add_pfns : HV_PFN_RANGE_PGBITS;	} __packed;}; enum hv_sleep_state {	HV_SLEEP_STATE_S1 = 1,	HV_SLEEP_STATE_S2 = 2,	HV_SLEEP_STATE_S3 = 3,	HV_SLEEP_STATE_S4 = 4,	HV_SLEEP_STATE_S5 = 5,	/*	 * After hypervisor has received this, any follow up sleep	 * state registration requests will be rejected.	 */	HV_SLEEP_STATE_LOCK = 6}; enum hv_dynamic_processor_feature_property {	/* Add more values when needed */	HV_X64_DYNAMIC_PROCESSOR_FEATURE_MAX_ENCRYPTED_PARTITIONS = 13,	HV_X64_DYNAMIC_PROCESSOR_FEATURE_SNP_STATUS = 16,}; struct hv_input_get_system_property {	u32 property_id; /* enum hv_system_property */	u32 reserved;	union {		u64 as_uint64;#if IS_ENABLED(CONFIG_X86)		/* enum hv_dynamic_processor_feature_property */		u32 hv_processor_feature;#endif		/* More fields to be filled in when needed */	};} __packed; struct hv_output_get_system_property {	union {		u32 scheduler_type; /* enum hv_scheduler_type */#if IS_ENABLED(CONFIG_X86)		u64 hv_processor_feature_value;#endif		union hv_pfn_range hv_cda_info; /* CrashdumpAreaAddress */		u64 hv_tramp_pa;                /* CrashdumpTrampolineAddress */	};} __packed; struct hv_sleep_state_info {	u32 sleep_state; /* enum hv_sleep_state */	u8 pm1a_slp_typ;	u8 pm1b_slp_typ;} __packed; struct hv_input_set_system_property {	u32 property_id; /* enum hv_system_property */	u32 reserved;	union {		/* More fields to be filled in when needed */		struct hv_sleep_state_info set_sleep_state_info; 		/*		 * Add a reserved field to ensure the union is 8-byte aligned as		 * existing members may not be. This is a temporary measure		 * until all remaining members are added.		 */		 u64 reserved0[8];	};} __packed; struct hv_input_enter_sleep_state {     /* HV_INPUT_ENTER_SLEEP_STATE */	u32 sleep_state;        /* enum hv_sleep_state */} __packed; struct hv_input_map_stats_page {	u32 type; /* enum hv_stats_object_type */	u32 padding;	union hv_stats_object_identity identity;} __packed; struct hv_input_map_stats_page2 {	u32 type; /* enum hv_stats_object_type */	u32 padding;	union hv_stats_object_identity identity;	u64 map_location;} __packed; struct hv_output_map_stats_page {	u64 map_location;} __packed; struct hv_input_unmap_stats_page {	u32 type; /* enum hv_stats_object_type */	u32 padding;	union hv_stats_object_identity identity;} __packed; struct hv_proximity_domain_flags {	u32 proximity_preferred : 1;	u32 reserved : 30;	u32 proximity_info_valid : 1;} __packed; struct hv_proximity_domain_info {	u32 domain_id;	struct hv_proximity_domain_flags flags;} __packed; /* HvDepositMemory hypercall */struct hv_deposit_memory {	/* HV_INPUT_DEPOSIT_MEMORY */	u64 partition_id;	u64 gpa_page_list[];} __packed; struct hv_input_withdraw_memory {	u64 partition_id;	struct hv_proximity_domain_info proximity_domain_info;} __packed; struct hv_output_withdraw_memory {	DECLARE_FLEX_ARRAY(u64, gpa_page_list);} __packed; /* HV Map GPA (Guest Physical Address) Flags */#define HV_MAP_GPA_PERMISSIONS_NONE	       0x0#define HV_MAP_GPA_READABLE		       0x1#define HV_MAP_GPA_WRITABLE		       0x2#define HV_MAP_GPA_KERNEL_EXECUTABLE	       0x4#define HV_MAP_GPA_USER_EXECUTABLE	       0x8#define HV_MAP_GPA_EXECUTABLE		       0xC#define HV_MAP_GPA_PERMISSIONS_MASK	       0xF#define HV_MAP_GPA_ADJUSTABLE		    0x8000#define HV_MAP_GPA_NO_ACCESS		   0x10000#define HV_MAP_GPA_NOT_CACHED		  0x200000#define HV_MAP_GPA_LARGE_PAGE		0x80000000 struct hv_input_map_gpa_pages {	u64 target_partition_id;	u64 target_gpa_base;	u32 map_flags;	u32 padding;	u64 source_gpa_page_list[];} __packed; union hv_gpa_page_access_state_flags {	struct {		u64 clear_accessed : 1;		u64 set_accessed : 1;		u64 clear_dirty : 1;		u64 set_dirty : 1;		u64 reserved : 60;	} __packed;	u64 as_uint64;}; struct hv_input_get_gpa_pages_access_state {	u64  partition_id;	union hv_gpa_page_access_state_flags flags;	u64 hv_gpa_page_number;} __packed; union hv_gpa_page_access_state {	struct {		u8 accessed : 1;		u8 dirty : 1;		u8 reserved: 6;	};	u8 as_uint8;} __packed; enum hv_crashdump_action {	HV_CRASHDUMP_NONE = 0,	HV_CRASHDUMP_SUSPEND_ALL_VPS,	HV_CRASHDUMP_PREPARE_FOR_STATE_SAVE,	HV_CRASHDUMP_STATE_SAVED,	HV_CRASHDUMP_ENTRY,}; struct hv_partition_event_root_crashdump_input {	u32 crashdump_action; /* enum hv_crashdump_action */} __packed; struct hv_input_disable_hyp_ex {   /* HV_X64_INPUT_DISABLE_HYPERVISOR_EX */	u64 rip;	u64 arg;} __packed; struct hv_crashdump_area {	   /* HV_CRASHDUMP_AREA */	u32 version;	union {		u32 flags_as_uint32;		struct {			u32 cda_valid : 1;			u32 cda_unused : 31;		} __packed;	};	/* more unused fields */} __packed; union hv_partition_event_input {	struct hv_partition_event_root_crashdump_input crashdump_input;}; enum hv_partition_event {	HV_PARTITION_EVENT_ROOT_CRASHDUMP = 2,	HV_PARTITION_ALL_LOGICAL_PROCESSORS_STARTED = 4,}; struct hv_input_notify_partition_event {	u32 event;      /* enum hv_partition_event */	union hv_partition_event_input input;} __packed; struct hv_input_get_logical_processor_run_time {	u32 lp_index;} __packed; struct hv_output_get_logical_processor_run_time {	u64 global_time;	u64 local_run_time;	u64 rsvdz0;	u64 hypervisor_time;} __packed; struct hv_lp_startup_status {	u64 hv_status;	u64 substatus1;	u64 substatus2;	u64 substatus3;	u64 substatus4;	u64 substatus5;	u64 substatus6;} __packed; struct hv_input_add_logical_processor {	u32 lp_index;	u32 apic_id;	struct hv_proximity_domain_info proximity_domain_info;} __packed; struct hv_output_add_logical_processor {	struct hv_lp_startup_status startup_status;} __packed; enum {	/* HV_SUBNODE_TYPE */	HV_SUBNODE_ANY		= 0,	HV_SUBNODE_SOCKET,	HV_SUBNODE_CLUSTER,	HV_SUBNODE_L3,	HV_SUBNODE_COUNT,	HV_SUBNODE_INVALID	= -1}; struct hv_create_vp {	/* HV_INPUT_CREATE_VP */	u64 partition_id;	u32 vp_index;	u8 padding[3];	u8 subnode_type;	u64 subnode_id;	struct hv_proximity_domain_info proximity_domain_info;	u64 flags;} __packed; /* HV_INTERRUPT_TRIGGER_MODE */enum hv_interrupt_trigger_mode {	HV_INTERRUPT_TRIGGER_MODE_EDGE	= 0,	HV_INTERRUPT_TRIGGER_MODE_LEVEL	= 1,}; /* HV_DEVICE_INTERRUPT_DESCRIPTOR */struct hv_device_interrupt_descriptor {	u32 interrupt_type;	u32 trigger_mode;	u32 vector_count;	u32 reserved;	struct hv_device_interrupt_target target;} __packed; /* HV_INPUT_MAP_DEVICE_INTERRUPT */struct hv_input_map_device_interrupt {	u64 partition_id;	u64 device_id;	u32 flags;	u32 base_irt_idx;	struct hv_interrupt_entry logical_interrupt_entry;	struct hv_device_interrupt_descriptor interrupt_descriptor;} __packed; /* HV_OUTPUT_MAP_DEVICE_INTERRUPT */struct hv_output_map_device_interrupt {	struct hv_interrupt_entry interrupt_entry;	u64 ext_status_deprecated[5];} __packed; /* HV_INPUT_UNMAP_DEVICE_INTERRUPT */struct hv_input_unmap_device_interrupt {	u64 partition_id;	u64 device_id;	struct hv_interrupt_entry interrupt_entry;	u32 flags;} __packed; #define HV_SOURCE_SHADOW_NONE		    0x0#define HV_SOURCE_SHADOW_BRIDGE_BUS_RANGE   0x1 struct hv_send_ipi_ex { /* HV_INPUT_SEND_SYNTHETIC_CLUSTER_IPI_EX */	u32 vector;	u32 reserved;	struct hv_vpset vp_set;} __packed; typedef u16 hv_pci_rid;		/* HV_PCI_RID */typedef u16 hv_pci_segment;	/* HV_PCI_SEGMENT */typedef u64 hv_logical_device_id;union hv_pci_bdf {	/* HV_PCI_BDF */	u16 as_uint16; 	struct {		u8 function : 3;		u8 device : 5;		u8 bus;	};} __packed; union hv_pci_bus_range {	u16 as_uint16; 	struct {		u8 subordinate_bus;		u8 secondary_bus;	};} __packed; enum hv_device_type {		/* HV_DEVICE_TYPE */	HV_DEVICE_TYPE_LOGICAL	= 0,	HV_DEVICE_TYPE_PCI	= 1,	HV_DEVICE_TYPE_IOAPIC	= 2,	HV_DEVICE_TYPE_ACPI	= 3,}; 

Lines 1–500 of 551.